Skip to content

Commit 1b630ff

Browse files
KN4CK3R6543lunny
authored
Fix user visible check (#21210)
Fixes #21206 If user and viewer are equal the method should return true. Also the common organization check was wrong as `count` can never be less then 0. Co-authored-by: 6543 <[email protected]> Co-authored-by: Lunny Xiao <[email protected]>
1 parent a196302 commit 1b630ff

File tree

9 files changed

+109
-5
lines changed

9 files changed

+109
-5
lines changed

models/fixtures/access.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,15 @@
124124
repo_id: 24
125125
mode: 1
126126

127+
-
128+
id: 22
129+
user_id: 31
130+
repo_id: 27
131+
mode: 4
132+
133+
-
134+
id: 23
135+
user_id: 31
136+
repo_id: 28
137+
mode: 4
138+

models/fixtures/follow.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@
1212
id: 3
1313
user_id: 2
1414
follow_id: 8
15+
16+
-
17+
id: 4
18+
user_id: 31
19+
follow_id: 33

models/fixtures/org_user.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,9 @@
6969
uid: 2
7070
org_id: 17
7171
is_public: true
72+
73+
-
74+
id: 13
75+
uid: 31
76+
org_id: 19
77+
is_public: true

models/fixtures/team.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
name: Owners
5656
authorize: 4 # owner
5757
num_repos: 2
58-
num_members: 1
58+
num_members: 2
5959
can_create_org_repo: true
6060

6161
-

models/fixtures/team_user.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,9 @@
8787
org_id: 17
8888
team_id: 9
8989
uid: 29
90+
91+
-
92+
id: 16
93+
org_id: 19
94+
team_id: 6
95+
uid: 31

models/fixtures/user.yml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@
345345
avatar_email: [email protected]
346346
num_repos: 2
347347
is_active: true
348-
num_members: 1
348+
num_members: 2
349349
num_teams: 1
350350

351351
-
@@ -572,6 +572,8 @@
572572
avatar: avatar31
573573
avatar_email: [email protected]
574574
num_repos: 0
575+
num_followers: 0
576+
num_following: 1
575577
is_active: true
576578

577579
-
@@ -590,3 +592,23 @@
590592
avatar_email: [email protected]
591593
num_repos: 0
592594
is_active: true
595+
596+
-
597+
id: 33
598+
lower_name: user33
599+
name: user33
600+
login_name: user33
601+
full_name: User 33 (Limited Visibility)
602+
603+
passwd_hash_algo: argon2
604+
passwd: a3d5fcd92bae586c2e3dbe72daea7a0d27833a8d0227aa1704f4bbd775c1f3b03535b76dd93b0d4d8d22a519dca47df1547b # password
605+
type: 0 # individual
606+
salt: ZogKvWdyEx
607+
is_admin: false
608+
visibility: 1
609+
avatar: avatar33
610+
avatar_email: [email protected]
611+
num_repos: 0
612+
num_followers: 1
613+
num_following: 0
614+
is_active: true

models/user/user.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,7 @@ func isUserVisibleToViewerCond(viewer *User) builder.Cond {
12671267

12681268
// IsUserVisibleToViewer check if viewer is able to see user profile
12691269
func IsUserVisibleToViewer(ctx context.Context, u, viewer *User) bool {
1270-
if viewer != nil && viewer.IsAdmin {
1270+
if viewer != nil && (viewer.IsAdmin || viewer.ID == u.ID) {
12711271
return true
12721272
}
12731273

@@ -1306,7 +1306,7 @@ func IsUserVisibleToViewer(ctx context.Context, u, viewer *User) bool {
13061306
return false
13071307
}
13081308

1309-
if count < 0 {
1309+
if count == 0 {
13101310
// No common organization
13111311
return false
13121312
}

models/user/user_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,56 @@ func TestUnfollowUser(t *testing.T) {
400400

401401
unittest.CheckConsistencyFor(t, &user_model.User{})
402402
}
403+
404+
func TestIsUserVisibleToViewer(t *testing.T) {
405+
assert.NoError(t, unittest.PrepareTestDatabase())
406+
407+
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) // admin, public
408+
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // normal, public
409+
user20 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20}) // public, same team as user31
410+
user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29}) // public, is restricted
411+
user31 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 31}) // private, same team as user20
412+
user33 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 33}) // limited, follows 31
413+
414+
test := func(u, viewer *user_model.User, expected bool) {
415+
name := func(u *user_model.User) string {
416+
if u == nil {
417+
return "<nil>"
418+
}
419+
return u.Name
420+
}
421+
assert.Equal(t, expected, user_model.IsUserVisibleToViewer(db.DefaultContext, u, viewer), "user %v should be visible to viewer %v: %v", name(u), name(viewer), expected)
422+
}
423+
424+
// admin viewer
425+
test(user1, user1, true)
426+
test(user20, user1, true)
427+
test(user31, user1, true)
428+
test(user33, user1, true)
429+
430+
// non admin viewer
431+
test(user4, user4, true)
432+
test(user20, user4, true)
433+
test(user31, user4, false)
434+
test(user33, user4, true)
435+
test(user4, nil, true)
436+
437+
// public user
438+
test(user4, user20, true)
439+
test(user4, user31, true)
440+
test(user4, user33, true)
441+
442+
// limited user
443+
test(user33, user33, true)
444+
test(user33, user4, true)
445+
test(user33, user29, false)
446+
test(user33, nil, false)
447+
448+
// private user
449+
test(user31, user31, true)
450+
test(user31, user4, false)
451+
test(user31, user20, true)
452+
test(user31, user29, false)
453+
test(user31, user33, true)
454+
test(user31, nil, false)
455+
}

tests/integration/api_nodeinfo_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestNodeinfo(t *testing.T) {
3232
DecodeJSON(t, resp, &nodeinfo)
3333
assert.True(t, nodeinfo.OpenRegistrations)
3434
assert.Equal(t, "gitea", nodeinfo.Software.Name)
35-
assert.Equal(t, 23, nodeinfo.Usage.Users.Total)
35+
assert.Equal(t, 24, nodeinfo.Usage.Users.Total)
3636
assert.Equal(t, 17, nodeinfo.Usage.LocalPosts)
3737
assert.Equal(t, 2, nodeinfo.Usage.LocalComments)
3838
})

0 commit comments

Comments
 (0)