Skip to content

Commit 45ffedd

Browse files
committed
Fix bug
1 parent 07d1a37 commit 45ffedd

File tree

9 files changed

+66
-48
lines changed

9 files changed

+66
-48
lines changed

models/repo/transfer.go

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,10 @@ func (r *RepoTransfer) LoadAttributes(ctx context.Context) error {
135135
return nil
136136
}
137137

138-
// CanUserAcceptTransfer checks if the user has the rights to accept/decline a repo transfer.
138+
// CanUserAcceptOrRejectTransfer checks if the user has the rights to accept/decline a repo transfer.
139139
// For user, it checks if it's himself
140140
// For organizations, it checks if the user is able to create repos
141-
func (r *RepoTransfer) CanUserAcceptTransfer(ctx context.Context, u *user_model.User) bool {
141+
func (r *RepoTransfer) CanUserAcceptOrRejectTransfer(ctx context.Context, u *user_model.User) bool {
142142
if err := r.LoadAttributes(ctx); err != nil {
143143
log.Error("LoadAttributes: %v", err)
144144
return false
@@ -157,32 +157,6 @@ func (r *RepoTransfer) CanUserAcceptTransfer(ctx context.Context, u *user_model.
157157
return allowed
158158
}
159159

160-
func (r *RepoTransfer) CanUserCancelTransfer(ctx context.Context, u *user_model.User) bool {
161-
if r.DoerID == u.ID { // sender can cancel the transfer
162-
return true
163-
}
164-
if err := r.Repo.LoadOwner(ctx); err != nil {
165-
log.Error("LoadOwner: %v", err)
166-
return false
167-
}
168-
if !r.Repo.Owner.IsOrganization() {
169-
if u.ID == r.Repo.OwnerID { // owner can cancel the transfer
170-
return true
171-
}
172-
} else {
173-
allowed, err := organization.CanCreateOrgRepo(ctx, r.Repo.OwnerID, u.ID)
174-
if err != nil {
175-
log.Error("CanCreateOrgRepo: %v", err)
176-
return false
177-
}
178-
if allowed {
179-
return true
180-
}
181-
}
182-
183-
return r.CanUserAcceptTransfer(ctx, u) // the user who can accept the transfer can also reject it
184-
}
185-
186160
type PendingRepositoryTransferOptions struct {
187161
RepoID int64
188162
SenderID int64

routers/api/v1/repo/transfer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func RejectTransfer(ctx *context.APIContext) {
204204
// "404":
205205
// "$ref": "#/responses/notFound"
206206

207-
err := repo_service.CancelRepositoryTransfer(ctx, ctx.Repo.Repository, ctx.Doer)
207+
err := repo_service.RejectRepositoryTransfer(ctx, ctx.Repo.Repository, ctx.Doer)
208208
if err != nil {
209209
switch {
210210
case repo_model.IsErrNoPendingTransfer(err):

routers/web/repo/repo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ func Action(ctx *context.Context) {
328328
}
329329
ctx.Redirect(ctx.Repo.Repository.Link())
330330
case "reject_transfer":
331-
err = repo_service.CancelRepositoryTransfer(ctx, ctx.Repo.Repository, ctx.Doer)
331+
err = repo_service.RejectRepositoryTransfer(ctx, ctx.Repo.Repository, ctx.Doer)
332332
if err == nil {
333333
ctx.Flash.Success(ctx.Tr("repo.settings.transfer.rejected"))
334334
}

routers/web/repo/setting/setting.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ func SettingsPost(ctx *context.Context) {
829829
return
830830
}
831831

832-
if err := repo_service.CancelRepositoryTransfer(ctx, ctx.Repo.Repository, ctx.Doer); err != nil {
832+
if err := repo_service.CancelRepositoryTransfer(ctx, repoTransfer, ctx.Doer); err != nil {
833833
ctx.ServerError("CancelRepositoryTransfer", err)
834834
return
835835
}

services/context/repo.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,8 @@ func RepoAssignment(ctx *Context) {
674674

675675
ctx.Data["RepoTransfer"] = repoTransfer
676676
if ctx.Doer != nil {
677-
ctx.Data["CanUserAcceptTransfer"] = repoTransfer.CanUserAcceptTransfer(ctx, ctx.Doer)
677+
ctx.Data["CanUserAcceptTransfer"] = repoTransfer.CanUserAcceptOrRejectTransfer(ctx, ctx.Doer)
678+
ctx.Data["CanUserRejectTransfer"] = ctx.Data["CanUserAcceptTransfer"]
678679
}
679680
}
680681

services/repository/transfer.go

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

services/repository/transfer_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestRepositoryTransfer(t *testing.T) {
9393
assert.NotNil(t, transfer)
9494

9595
// Cancel transfer
96-
assert.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo, doer))
96+
assert.NoError(t, CancelRepositoryTransfer(db.DefaultContext, transfer, doer))
9797

9898
transfer, err = repo_model.GetPendingRepositoryTransfer(db.DefaultContext, repo)
9999
assert.Error(t, err)
@@ -121,7 +121,7 @@ func TestRepositoryTransfer(t *testing.T) {
121121
err = repo_model.CreatePendingRepositoryTransfer(db.DefaultContext, doer, &user_model.User{ID: 1000, LowerName: "user1000"}, repo2.ID, nil)
122122
assert.Error(t, err)
123123

124-
// Cancel transfer
125-
err = CancelRepositoryTransfer(db.DefaultContext, repo2, doer)
124+
// Reject transfer
125+
err = RejectRepositoryTransfer(db.DefaultContext, repo2, doer)
126126
assert.True(t, repo_model.IsErrNoPendingTransfer(err))
127127
}

services/user/block.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,7 @@ func cancelRepositoryTransfers(ctx context.Context, doer, sender, recipient *use
202202
}
203203

204204
for _, transfer := range transfers {
205-
repo, err := repo_model.GetRepositoryByID(ctx, transfer.RepoID)
206-
if err != nil {
207-
return err
208-
}
209-
210-
if err := repo_service.CancelRepositoryTransfer(ctx, repo, doer); err != nil {
205+
if err := repo_service.CancelRepositoryTransfer(ctx, transfer, doer); err != nil {
211206
return err
212207
}
213208
}

templates/repo/header.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@
4747
</form>
4848
<form method="post" action="{{$.RepoLink}}/action/reject_transfer?redirect_to={{$.RepoLink}}">
4949
{{$.CsrfTokenHtml}}
50-
<div data-tooltip-content="{{if $.CanUserAcceptTransfer}}{{ctx.Locale.Tr "repo.transfer.reject_desc" $.RepoTransfer.Recipient.DisplayName}}{{else}}{{ctx.Locale.Tr "repo.transfer.no_permission_to_reject"}}{{end}}">
51-
<button type="submit" class="ui basic button {{if $.CanUserAcceptTransfer}}red {{end}}ok small"{{if not $.CanUserAcceptTransfer}} disabled{{end}}>
50+
<div data-tooltip-content="{{if $.CanUserRejectTransfer}}{{ctx.Locale.Tr "repo.transfer.reject_desc" $.RepoTransfer.Recipient.DisplayName}}{{else}}{{ctx.Locale.Tr "repo.transfer.no_permission_to_reject"}}{{end}}">
51+
<button type="submit" class="ui basic button {{if $.CanUserRejectTransfer}}red {{end}}ok small"{{if not $.CanUserRejectTransfer}} disabled{{end}}>
5252
{{ctx.Locale.Tr "repo.transfer.reject"}}
5353
</button>
5454
</div>

0 commit comments

Comments
 (0)