From 2405da65d23bdfd578c60eb1782506bc512ab4d9 Mon Sep 17 00:00:00 2001 From: Katrina Verey Date: Tue, 17 Jan 2023 23:16:03 -0500 Subject: [PATCH] repospec: support ssh urls with ssh certificates --- api/internal/git/repospec.go | 9 +++++---- api/internal/git/repospec_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/api/internal/git/repospec.go b/api/internal/git/repospec.go index 3d50e412a..5d05586e1 100644 --- a/api/internal/git/repospec.go +++ b/api/internal/git/repospec.go @@ -8,6 +8,7 @@ import ( "log" "net/url" "path/filepath" + "regexp" "strconv" "strings" "time" @@ -370,8 +371,10 @@ func extractScheme(s string) (string, string) { } func extractUsername(s string) (string, string) { - if trimmed, found := trimPrefixIgnoreCase(s, gitUsername); found { - return gitUsername, trimmed + var userRegexp = regexp.MustCompile(`^([a-zA-Z][a-zA-Z0-9-]*)@`) + if m := userRegexp.FindStringSubmatch(s); m != nil { + username := m[1] + "@" + return username, s[len(username):] } return "", s } @@ -402,8 +405,6 @@ func findPathSeparator(hostPath string, acceptSCP bool) int { return sepIndex } -const gitUsername = "git@" - func normalizeGithubHostParts(scheme, username string) (string, string, string) { if strings.HasPrefix(scheme, sshScheme) || username != "" { return "", username, "github.com:" diff --git a/api/internal/git/repospec_test.go b/api/internal/git/repospec_test.go index aec3c31ae..20ad4cabe 100644 --- a/api/internal/git/repospec_test.go +++ b/api/internal/git/repospec_test.go @@ -33,6 +33,8 @@ func TestNewRepoSpecFromUrl_Permute(t *testing.T) { {"git@github.com:", "git@github.com:"}, {"git@github.com/", "git@github.com:"}, {"git::git@github.com:", "git@github.com:"}, + {"org-12345@github.com:", "org-12345@github.com:"}, + {"org-12345@github.com/", "org-12345@github.com:"}, } var repoPaths = []string{"someOrg/someRepo", "kubernetes/website"} var pathNames = []string{"README.md", "foo/krusty.txt", ""} @@ -623,6 +625,28 @@ func TestNewRepoSpecFromUrl_Smoke(t *testing.T) { GitSuffix: "", }, }, + { + name: "ssh on github with custom username for custom ssh certificate authority", + input: "ssh://org-12345@github.com/kubernetes-sigs/kustomize", + cloneSpec: "org-12345@github.com:kubernetes-sigs/kustomize.git", + absPath: notCloned.String(), + repoSpec: RepoSpec{ + Host: "org-12345@github.com:", + RepoPath: "kubernetes-sigs/kustomize", + GitSuffix: ".git", + }, + }, + { + name: "scp on github with custom username for custom ssh certificate authority", + input: "org-12345@github.com/kubernetes-sigs/kustomize", + cloneSpec: "org-12345@github.com:kubernetes-sigs/kustomize.git", + absPath: notCloned.String(), + repoSpec: RepoSpec{ + Host: "org-12345@github.com:", + RepoPath: "kubernetes-sigs/kustomize", + GitSuffix: ".git", + }, + }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) {