Skip to content

Commit 9e8b1c6

Browse files
authored
Double check CloneURL is acceptable (go-gitea#20869) (go-gitea#20892)
Backport go-gitea#20869 Some Migration Downloaders provide re-writing of CloneURLs that may point to unallowed urls. Recheck after the CloneURL is rewritten. Signed-off-by: Andrew Thornton <[email protected]> Signed-off-by: Andrew Thornton <[email protected]>
1 parent eee51d8 commit 9e8b1c6

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

Diff for: services/migrations/dump.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,10 @@ func (g *RepositoryDumper) Finish() error {
560560

561561
// DumpRepository dump repository according MigrateOptions to a local directory
562562
func DumpRepository(ctx context.Context, baseDir, ownerName string, opts base.MigrateOptions) error {
563+
doer, err := user_model.GetAdminUser()
564+
if err != nil {
565+
return err
566+
}
563567
downloader, err := newDownloader(ctx, ownerName, opts)
564568
if err != nil {
565569
return err
@@ -569,7 +573,7 @@ func DumpRepository(ctx context.Context, baseDir, ownerName string, opts base.Mi
569573
return err
570574
}
571575

572-
if err := migrateRepository(downloader, uploader, opts, nil); err != nil {
576+
if err := migrateRepository(doer, downloader, uploader, opts, nil); err != nil {
573577
if err1 := uploader.Rollback(); err1 != nil {
574578
log.Error("rollback failed: %v", err1)
575579
}
@@ -641,7 +645,7 @@ func RestoreRepository(ctx context.Context, baseDir, ownerName, repoName string,
641645
return err
642646
}
643647

644-
if err = migrateRepository(downloader, uploader, migrateOpts, nil); err != nil {
648+
if err = migrateRepository(doer, downloader, uploader, migrateOpts, nil); err != nil {
645649
if err1 := uploader.Rollback(); err1 != nil {
646650
log.Error("rollback failed: %v", err1)
647651
}

Diff for: services/migrations/gitea_uploader_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestGiteaUploadRepo(t *testing.T) {
4646
uploader = NewGiteaLocalUploader(graceful.GetManager().HammerContext(), user, user.Name, repoName)
4747
)
4848

49-
err := migrateRepository(downloader, uploader, base.MigrateOptions{
49+
err := migrateRepository(user, downloader, uploader, base.MigrateOptions{
5050
CloneAddr: "https://github.com/go-xorm/builder",
5151
RepoName: repoName,
5252
AuthUsername: "",

Diff for: services/migrations/migrate.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func MigrateRepository(ctx context.Context, doer *user_model.User, ownerName str
125125
uploader := NewGiteaLocalUploader(ctx, doer, ownerName, opts.RepoName)
126126
uploader.gitServiceType = opts.GitServiceType
127127

128-
if err := migrateRepository(downloader, uploader, opts, messenger); err != nil {
128+
if err := migrateRepository(doer, downloader, uploader, opts, messenger); err != nil {
129129
if err1 := uploader.Rollback(); err1 != nil {
130130
log.Error("rollback failed: %v", err1)
131131
}
@@ -174,7 +174,7 @@ func newDownloader(ctx context.Context, ownerName string, opts base.MigrateOptio
174174
// migrateRepository will download information and then upload it to Uploader, this is a simple
175175
// process for small repository. For a big repository, save all the data to disk
176176
// before upload is better
177-
func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions, messenger base.Messenger) error {
177+
func migrateRepository(doer *user_model.User, downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions, messenger base.Messenger) error {
178178
if messenger == nil {
179179
messenger = base.NilMessenger
180180
}
@@ -195,6 +195,21 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
195195
return err
196196
}
197197

198+
// If the downloader is not a RepositoryRestorer then we need to recheck the CloneURL
199+
if _, ok := downloader.(*RepositoryRestorer); !ok {
200+
// Now the clone URL can be rewritten by the downloader so we must recheck
201+
if err := IsMigrateURLAllowed(repo.CloneURL, doer); err != nil {
202+
return err
203+
}
204+
205+
// And so can the original URL too so again we must recheck
206+
if repo.OriginalURL != "" {
207+
if err := IsMigrateURLAllowed(repo.OriginalURL, doer); err != nil {
208+
return err
209+
}
210+
}
211+
}
212+
198213
log.Trace("migrating git data from %s", repo.CloneURL)
199214
messenger("repo.migrate.migrating_git")
200215
if err = uploader.CreateRepo(repo, opts); err != nil {

0 commit comments

Comments
 (0)