mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	fix github migration error when using multiple tokens (#34144)
Git authorization was not taking into account multiple token feature, leading to auth failures Closes: https://github.com/go-gitea/gitea/issues/34141 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -133,7 +133,7 @@ func (g *GithubDownloaderV3) LogString() string { | |||||||
| func (g *GithubDownloaderV3) addClient(client *http.Client, baseURL string) { | func (g *GithubDownloaderV3) addClient(client *http.Client, baseURL string) { | ||||||
| 	githubClient := github.NewClient(client) | 	githubClient := github.NewClient(client) | ||||||
| 	if baseURL != "https://github.com" { | 	if baseURL != "https://github.com" { | ||||||
| 		githubClient, _ = github.NewClient(client).WithEnterpriseURLs(baseURL, baseURL) | 		githubClient, _ = githubClient.WithEnterpriseURLs(baseURL, baseURL) | ||||||
| 	} | 	} | ||||||
| 	g.clients = append(g.clients, githubClient) | 	g.clients = append(g.clients, githubClient) | ||||||
| 	g.rates = append(g.rates, nil) | 	g.rates = append(g.rates, nil) | ||||||
| @@ -872,3 +872,18 @@ func (g *GithubDownloaderV3) GetReviews(ctx context.Context, reviewable base.Rev | |||||||
| 	} | 	} | ||||||
| 	return allReviews, nil | 	return allReviews, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // FormatCloneURL add authentication into remote URLs | ||||||
|  | func (g *GithubDownloaderV3) FormatCloneURL(opts MigrateOptions, remoteAddr string) (string, error) { | ||||||
|  | 	u, err := url.Parse(remoteAddr) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	if len(opts.AuthToken) > 0 { | ||||||
|  | 		// "multiple tokens" are used to benefit more "API rate limit quota" | ||||||
|  | 		// git clone doesn't count for rate limits, so only use the first token. | ||||||
|  | 		// source: https://github.com/orgs/community/discussions/44515 | ||||||
|  | 		u.User = url.UserPassword("oauth2", strings.Split(opts.AuthToken, ",")[0]) | ||||||
|  | 	} | ||||||
|  | 	return u.String(), nil | ||||||
|  | } | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import ( | |||||||
| 	base "code.gitea.io/gitea/modules/migration" | 	base "code.gitea.io/gitea/modules/migration" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
|  | 	"github.com/stretchr/testify/require" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestGitHubDownloadRepo(t *testing.T) { | func TestGitHubDownloadRepo(t *testing.T) { | ||||||
| @@ -429,3 +430,36 @@ func TestGitHubDownloadRepo(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	}, reviews) | 	}, reviews) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestGithubMultiToken(t *testing.T) { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		desc             string | ||||||
|  | 		token            string | ||||||
|  | 		expectedCloneURL string | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			desc:             "Single Token", | ||||||
|  | 			token:            "single_token", | ||||||
|  | 			expectedCloneURL: "https://oauth2:single_token@github.com", | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:             "Multi Token", | ||||||
|  | 			token:            "token1,token2", | ||||||
|  | 			expectedCloneURL: "https://oauth2:token1@github.com", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	factory := GithubDownloaderV3Factory{} | ||||||
|  |  | ||||||
|  | 	for _, tC := range testCases { | ||||||
|  | 		t.Run(tC.desc, func(t *testing.T) { | ||||||
|  | 			opts := base.MigrateOptions{CloneAddr: "https://github.com/go-gitea/gitea", AuthToken: tC.token} | ||||||
|  | 			client, err := factory.New(t.Context(), opts) | ||||||
|  | 			require.NoError(t, err) | ||||||
|  |  | ||||||
|  | 			cloneURL, err := client.FormatCloneURL(opts, "https://github.com") | ||||||
|  | 			require.NoError(t, err) | ||||||
|  |  | ||||||
|  | 			assert.Equal(t, tC.expectedCloneURL, cloneURL) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user