mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Double check CloneURL is acceptable (#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 <art27@cantab.net>
This commit is contained in:
		| @@ -560,6 +560,10 @@ func (g *RepositoryDumper) Finish() error { | ||||
|  | ||||
| // DumpRepository dump repository according MigrateOptions to a local directory | ||||
| func DumpRepository(ctx context.Context, baseDir, ownerName string, opts base.MigrateOptions) error { | ||||
| 	doer, err := user_model.GetAdminUser() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	downloader, err := newDownloader(ctx, ownerName, opts) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -569,7 +573,7 @@ func DumpRepository(ctx context.Context, baseDir, ownerName string, opts base.Mi | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := migrateRepository(downloader, uploader, opts, nil); err != nil { | ||||
| 	if err := migrateRepository(doer, downloader, uploader, opts, nil); err != nil { | ||||
| 		if err1 := uploader.Rollback(); err1 != nil { | ||||
| 			log.Error("rollback failed: %v", err1) | ||||
| 		} | ||||
| @@ -641,7 +645,7 @@ func RestoreRepository(ctx context.Context, baseDir, ownerName, repoName string, | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err = migrateRepository(downloader, uploader, migrateOpts, nil); err != nil { | ||||
| 	if err = migrateRepository(doer, downloader, uploader, migrateOpts, nil); err != nil { | ||||
| 		if err1 := uploader.Rollback(); err1 != nil { | ||||
| 			log.Error("rollback failed: %v", err1) | ||||
| 		} | ||||
|   | ||||
| @@ -46,7 +46,7 @@ func TestGiteaUploadRepo(t *testing.T) { | ||||
| 		uploader   = NewGiteaLocalUploader(graceful.GetManager().HammerContext(), user, user.Name, repoName) | ||||
| 	) | ||||
|  | ||||
| 	err := migrateRepository(downloader, uploader, base.MigrateOptions{ | ||||
| 	err := migrateRepository(user, downloader, uploader, base.MigrateOptions{ | ||||
| 		CloneAddr:    "https://github.com/go-xorm/builder", | ||||
| 		RepoName:     repoName, | ||||
| 		AuthUsername: "", | ||||
|   | ||||
| @@ -128,7 +128,7 @@ func MigrateRepository(ctx context.Context, doer *user_model.User, ownerName str | ||||
| 	uploader := NewGiteaLocalUploader(ctx, doer, ownerName, opts.RepoName) | ||||
| 	uploader.gitServiceType = opts.GitServiceType | ||||
|  | ||||
| 	if err := migrateRepository(downloader, uploader, opts, messenger); err != nil { | ||||
| 	if err := migrateRepository(doer, downloader, uploader, opts, messenger); err != nil { | ||||
| 		if err1 := uploader.Rollback(); err1 != nil { | ||||
| 			log.Error("rollback failed: %v", err1) | ||||
| 		} | ||||
| @@ -177,7 +177,7 @@ func newDownloader(ctx context.Context, ownerName string, opts base.MigrateOptio | ||||
| // migrateRepository will download information and then upload it to Uploader, this is a simple | ||||
| // process for small repository. For a big repository, save all the data to disk | ||||
| // before upload is better | ||||
| func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions, messenger base.Messenger) error { | ||||
| func migrateRepository(doer *user_model.User, downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions, messenger base.Messenger) error { | ||||
| 	if messenger == nil { | ||||
| 		messenger = base.NilMessenger | ||||
| 	} | ||||
| @@ -198,6 +198,21 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// If the downloader is not a RepositoryRestorer then we need to recheck the CloneURL | ||||
| 	if _, ok := downloader.(*RepositoryRestorer); !ok { | ||||
| 		// Now the clone URL can be rewritten by the downloader so we must recheck | ||||
| 		if err := IsMigrateURLAllowed(repo.CloneURL, doer); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		// And so can the original URL too so again we must recheck | ||||
| 		if repo.OriginalURL != "" { | ||||
| 			if err := IsMigrateURLAllowed(repo.OriginalURL, doer); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	log.Trace("migrating git data from %s", repo.CloneURL) | ||||
| 	messenger("repo.migrate.migrating_git") | ||||
| 	if err = uploader.CreateRepo(repo, opts); err != nil { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user