Skip to content

Commit f374789

Browse files
nils91lunnytechknowlogick
authored
Fix private repo permission problem (#16142)
* Change user access permission * Add string 'transfer_notices_3' * Add 3rd transfer note to transfer dialog * Add test Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
1 parent 440039c commit f374789

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

options/locale/locale_en-US.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1625,6 +1625,7 @@ settings.transfer_form_title = Enter the repository name as confirmation:
16251625
settings.transfer_in_progress = There is currently an ongoing transfer. Please cancel it if you will like to transfer this repository to another user.
16261626
settings.transfer_notices_1 = - You will lose access to the repository if you transfer it to an individual user.
16271627
settings.transfer_notices_2 = - You will keep access to the repository if you transfer it to an organization that you (co-)own.
1628+
settings.transfer_notices_3 = - If the repository is private and is transferred to an individual user, this action makes sure that the user does have at least read permission (and changes permissions if necessary).
16281629
settings.transfer_owner = New Owner
16291630
settings.transfer_perform = Perform Transfer
16301631
settings.transfer_started = This repository has been marked for transfer and awaits confirmation from "%s"

services/repository/transfer.go

+14
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,20 @@ func StartRepositoryTransfer(doer, newOwner *models.User, repo *models.Repositor
9494
}
9595
}
9696

97+
// In case the new owner would not have sufficient access to the repo, give access rights for read
98+
hasAccess, err := models.HasAccess(newOwner.ID, repo)
99+
if err != nil {
100+
return err
101+
}
102+
if !hasAccess {
103+
if err := repo.AddCollaborator(newOwner); err != nil {
104+
return err
105+
}
106+
if err := repo.ChangeCollaborationAccessMode(newOwner.ID, models.AccessModeRead); err != nil {
107+
return err
108+
}
109+
}
110+
97111
// Make repo as pending for transfer
98112
repo.Status = models.RepositoryPendingTransfer
99113
if err := models.CreatePendingRepositoryTransfer(doer, newOwner, repo.ID, teams); err != nil {

services/repository/transfer_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,24 @@ func TestTransferOwnership(t *testing.T) {
5252

5353
models.CheckConsistencyFor(t, &models.Repository{}, &models.User{}, &models.Team{})
5454
}
55+
56+
func TestStartRepositoryTransferSetPermission(t *testing.T) {
57+
assert.NoError(t, models.PrepareTestDatabase())
58+
59+
doer := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User)
60+
recipient := models.AssertExistsAndLoadBean(t, &models.User{ID: 5}).(*models.User)
61+
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository)
62+
repo.Owner = models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
63+
64+
hasAccess, err := models.HasAccess(recipient.ID, repo)
65+
assert.NoError(t, err)
66+
assert.False(t, hasAccess)
67+
68+
assert.NoError(t, StartRepositoryTransfer(doer, recipient, repo, nil))
69+
70+
hasAccess, err = models.HasAccess(recipient.ID, repo)
71+
assert.NoError(t, err)
72+
assert.True(t, hasAccess)
73+
74+
models.CheckConsistencyFor(t, &models.Repository{}, &models.User{}, &models.Team{})
75+
}

templates/repo/settings/options.tmpl

+2-1
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,8 @@
733733
<div class="content">
734734
<div class="ui warning message text left">
735735
{{.i18n.Tr "repo.settings.transfer_notices_1"}} <br>
736-
{{.i18n.Tr "repo.settings.transfer_notices_2"}}
736+
{{.i18n.Tr "repo.settings.transfer_notices_2"}} <br>
737+
{{.i18n.Tr "repo.settings.transfer_notices_3"}}
737738
</div>
738739
<form class="ui form" action="{{.Link}}" method="post">
739740
{{.CsrfTokenHtml}}

0 commit comments

Comments
 (0)