Skip to content

Commit 6f9a52f

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: Avoid MoreThanOne Error (go-gitea#19557) [skip ci] Updated licenses and gitignores Simplify loops to copy (go-gitea#19569) Use middleware to open gitRepo (go-gitea#19559) Added X-Mailer header to outgoing emails (go-gitea#19562) fix go-gitea#19545 (go-gitea#19563) [skip ci] Updated translations via Crowdin Respect DefaultUserIsRestricted system default when creating new user (go-gitea#19310) Mute link in diff header (go-gitea#19556) Add API to query collaborators permission for a repository (go-gitea#18761) Permalink files In PR diff (go-gitea#19534) Fix Pull Request comment filename word breaks (go-gitea#19535) Don't error when branch's commit doesn't exist (go-gitea#19547)
2 parents 38e0262 + edff571 commit 6f9a52f

File tree

37 files changed

+984
-113
lines changed

37 files changed

+984
-113
lines changed

cmd/admin.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
repo_module "code.gitea.io/gitea/modules/repository"
2626
"code.gitea.io/gitea/modules/setting"
2727
"code.gitea.io/gitea/modules/storage"
28+
"code.gitea.io/gitea/modules/util"
2829
auth_service "code.gitea.io/gitea/services/auth"
2930
"code.gitea.io/gitea/services/auth/source/oauth2"
3031
"code.gitea.io/gitea/services/auth/source/smtp"
@@ -114,6 +115,10 @@ var (
114115
Name: "access-token",
115116
Usage: "Generate access token for the user",
116117
},
118+
cli.BoolFlag{
119+
Name: "restricted",
120+
Usage: "Make a restricted user account",
121+
},
117122
},
118123
}
119124

@@ -559,17 +564,26 @@ func runCreateUser(c *cli.Context) error {
559564
changePassword = c.Bool("must-change-password")
560565
}
561566

567+
restricted := util.OptionalBoolNone
568+
569+
if c.IsSet("restricted") {
570+
restricted = util.OptionalBoolOf(c.Bool("restricted"))
571+
}
572+
562573
u := &user_model.User{
563574
Name: username,
564575
Email: c.String("email"),
565576
Passwd: password,
566-
IsActive: true,
567577
IsAdmin: c.Bool("admin"),
568578
MustChangePassword: changePassword,
569-
Theme: setting.UI.DefaultTheme,
570579
}
571580

572-
if err := user_model.CreateUser(u); err != nil {
581+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
582+
IsActive: util.OptionalBoolTrue,
583+
IsRestricted: restricted,
584+
}
585+
586+
if err := user_model.CreateUser(u, overwriteDefault); err != nil {
573587
return fmt.Errorf("CreateUser: %v", err)
574588
}
575589

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package integrations
6+
7+
import (
8+
"net/http"
9+
"net/url"
10+
"testing"
11+
12+
"code.gitea.io/gitea/models/perm"
13+
repo_model "code.gitea.io/gitea/models/repo"
14+
"code.gitea.io/gitea/models/unittest"
15+
user_model "code.gitea.io/gitea/models/user"
16+
api "code.gitea.io/gitea/modules/structs"
17+
18+
"github.com/stretchr/testify/assert"
19+
)
20+
21+
func TestAPIRepoCollaboratorPermission(t *testing.T) {
22+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
23+
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
24+
repo2Owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo2.OwnerID}).(*user_model.User)
25+
26+
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User)
27+
user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User)
28+
user10 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10}).(*user_model.User)
29+
user11 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 11}).(*user_model.User)
30+
31+
session := loginUser(t, repo2Owner.Name)
32+
testCtx := NewAPITestContext(t, repo2Owner.Name, repo2.Name)
33+
34+
t.Run("RepoOwnerShouldBeOwner", func(t *testing.T) {
35+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, repo2Owner.Name, testCtx.Token)
36+
resp := session.MakeRequest(t, req, http.StatusOK)
37+
38+
var repoPermission api.RepoCollaboratorPermission
39+
DecodeJSON(t, resp, &repoPermission)
40+
41+
assert.Equal(t, "owner", repoPermission.Permission)
42+
})
43+
44+
t.Run("CollaboratorWithReadAccess", func(t *testing.T) {
45+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeRead))
46+
47+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, user4.Name, testCtx.Token)
48+
resp := session.MakeRequest(t, req, http.StatusOK)
49+
50+
var repoPermission api.RepoCollaboratorPermission
51+
DecodeJSON(t, resp, &repoPermission)
52+
53+
assert.Equal(t, "read", repoPermission.Permission)
54+
})
55+
56+
t.Run("CollaboratorWithWriteAccess", func(t *testing.T) {
57+
t.Run("AddUserAsCollaboratorWithWriteAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeWrite))
58+
59+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, user4.Name, testCtx.Token)
60+
resp := session.MakeRequest(t, req, http.StatusOK)
61+
62+
var repoPermission api.RepoCollaboratorPermission
63+
DecodeJSON(t, resp, &repoPermission)
64+
65+
assert.Equal(t, "write", repoPermission.Permission)
66+
})
67+
68+
t.Run("CollaboratorWithAdminAccess", func(t *testing.T) {
69+
t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeAdmin))
70+
71+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, user4.Name, testCtx.Token)
72+
resp := session.MakeRequest(t, req, http.StatusOK)
73+
74+
var repoPermission api.RepoCollaboratorPermission
75+
DecodeJSON(t, resp, &repoPermission)
76+
77+
assert.Equal(t, "admin", repoPermission.Permission)
78+
})
79+
80+
t.Run("CollaboratorNotFound", func(t *testing.T) {
81+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, "non-existent-user", testCtx.Token)
82+
session.MakeRequest(t, req, http.StatusNotFound)
83+
})
84+
85+
t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
86+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
87+
88+
_session := loginUser(t, user5.Name)
89+
_testCtx := NewAPITestContext(t, user5.Name, repo2.Name)
90+
91+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, user5.Name, _testCtx.Token)
92+
resp := _session.MakeRequest(t, req, http.StatusOK)
93+
94+
var repoPermission api.RepoCollaboratorPermission
95+
DecodeJSON(t, resp, &repoPermission)
96+
97+
assert.Equal(t, "read", repoPermission.Permission)
98+
})
99+
100+
t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
101+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
102+
103+
_session := loginUser(t, user5.Name)
104+
_testCtx := NewAPITestContext(t, user5.Name, repo2.Name)
105+
106+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, user5.Name, _testCtx.Token)
107+
resp := _session.MakeRequest(t, req, http.StatusOK)
108+
109+
var repoPermission api.RepoCollaboratorPermission
110+
DecodeJSON(t, resp, &repoPermission)
111+
112+
assert.Equal(t, "read", repoPermission.Permission)
113+
})
114+
115+
t.Run("RepoAdminCanQueryACollaboratorsPermissions", func(t *testing.T) {
116+
t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user10.Name, perm.AccessModeAdmin))
117+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user11.Name, perm.AccessModeRead))
118+
119+
_session := loginUser(t, user10.Name)
120+
_testCtx := NewAPITestContext(t, user10.Name, repo2.Name)
121+
122+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission?token=%s", repo2Owner.Name, repo2.Name, user11.Name, _testCtx.Token)
123+
resp := _session.MakeRequest(t, req, http.StatusOK)
124+
125+
var repoPermission api.RepoCollaboratorPermission
126+
DecodeJSON(t, resp, &repoPermission)
127+
128+
assert.Equal(t, "read", repoPermission.Permission)
129+
})
130+
})
131+
}

0 commit comments

Comments
 (0)