@@ -48,7 +48,7 @@ func AcceptTransferOwnership(ctx context.Context, repo *repo_model.Repository, d
4848 return err
4949 }
5050
51- if ! repoTransfer .CanUserAcceptTransfer (ctx , doer ) {
51+ if ! repoTransfer .CanUserAcceptOrRejectTransfer (ctx , doer ) {
5252 return util .ErrPermissionDenied
5353 }
5454
@@ -452,10 +452,10 @@ func StartRepositoryTransfer(ctx context.Context, doer, newOwner *user_model.Use
452452 return nil
453453}
454454
455- // CancelRepositoryTransfer marks the repository as ready and remove pending transfer entry,
455+ // RejectRepositoryTransfer marks the repository as ready and remove pending transfer entry,
456456// thus cancel the transfer process.
457- // Both the sender and the accepter can cancel the transfer.
458- func CancelRepositoryTransfer (ctx context.Context , repo * repo_model.Repository , doer * user_model.User ) error {
457+ // The accepter can reject the transfer.
458+ func RejectRepositoryTransfer (ctx context.Context , repo * repo_model.Repository , doer * user_model.User ) error {
459459 return db .WithTx (ctx , func (ctx context.Context ) error {
460460 repoTransfer , err := repo_model .GetPendingRepositoryTransfer (ctx , repo )
461461 if err != nil {
@@ -466,7 +466,7 @@ func CancelRepositoryTransfer(ctx context.Context, repo *repo_model.Repository,
466466 return err
467467 }
468468
469- if ! repoTransfer .CanUserCancelTransfer (ctx , doer ) {
469+ if ! repoTransfer .CanUserAcceptOrRejectTransfer (ctx , doer ) {
470470 return util .ErrPermissionDenied
471471 }
472472
@@ -478,3 +478,51 @@ func CancelRepositoryTransfer(ctx context.Context, repo *repo_model.Repository,
478478 return repo_model .DeleteRepositoryTransfer (ctx , repo .ID )
479479 })
480480}
481+
482+ func canUserCancelTransfer (ctx context.Context , r * repo_model.RepoTransfer , u * user_model.User ) bool {
483+ if u .ID == r .DoerID {
484+ return true
485+ }
486+
487+ if err := r .LoadAttributes (ctx ); err != nil {
488+ log .Error ("LoadAttributes: %v" , err )
489+ return false
490+ }
491+
492+ if err := r .Repo .LoadOwner (ctx ); err != nil {
493+ log .Error ("LoadOwner: %v" , err )
494+ return false
495+ }
496+
497+ if ! r .Repo .Owner .IsOrganization () {
498+ return r .Repo .OwnerID == u .ID
499+ }
500+
501+ perm , err := access_model .GetUserRepoPermission (ctx , r .Repo , u )
502+ if err != nil {
503+ log .Error ("GetUserRepoPermission: %v" , err )
504+ return false
505+ }
506+ return perm .IsAdmin ()
507+ }
508+
509+ // CancelRepositoryTransfer cancels the repository transfer process. The sender or
510+ // the users who have admin permission of the original repository can cancel the transfer
511+ func CancelRepositoryTransfer (ctx context.Context , repoTransfer * repo_model.RepoTransfer , doer * user_model.User ) error {
512+ return db .WithTx (ctx , func (ctx context.Context ) error {
513+ if err := repoTransfer .LoadAttributes (ctx ); err != nil {
514+ return err
515+ }
516+
517+ if ! canUserCancelTransfer (ctx , repoTransfer , doer ) {
518+ return util .ErrPermissionDenied
519+ }
520+
521+ repoTransfer .Repo .Status = repo_model .RepositoryReady
522+ if err := repo_model .UpdateRepositoryCols (ctx , repoTransfer .Repo , "status" ); err != nil {
523+ return err
524+ }
525+
526+ return repo_model .DeleteRepositoryTransfer (ctx , repoTransfer .RepoID )
527+ })
528+ }
0 commit comments