loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 <6543@obermui.de>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>

authored by

KN4CK3R
6543
Lunny Xiao
and committed by
GitHub
1b630ff7 a1963024

+109 -5
+12
models/fixtures/access.yml
··· 124 124 repo_id: 24 125 125 mode: 1 126 126 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 +
+5
models/fixtures/follow.yml
··· 12 12 id: 3 13 13 user_id: 2 14 14 follow_id: 8 15 + 16 + - 17 + id: 4 18 + user_id: 31 19 + follow_id: 33
+6
models/fixtures/org_user.yml
··· 69 69 uid: 2 70 70 org_id: 17 71 71 is_public: true 72 + 73 + - 74 + id: 13 75 + uid: 31 76 + org_id: 19 77 + is_public: true
+1 -1
models/fixtures/team.yml
··· 55 55 name: Owners 56 56 authorize: 4 # owner 57 57 num_repos: 2 58 - num_members: 1 58 + num_members: 2 59 59 can_create_org_repo: true 60 60 61 61 -
+6
models/fixtures/team_user.yml
··· 87 87 org_id: 17 88 88 team_id: 9 89 89 uid: 29 90 + 91 + - 92 + id: 16 93 + org_id: 19 94 + team_id: 6 95 + uid: 31
+23 -1
models/fixtures/user.yml
··· 345 345 avatar_email: user19@example.com 346 346 num_repos: 2 347 347 is_active: true 348 - num_members: 1 348 + num_members: 2 349 349 num_teams: 1 350 350 351 351 - ··· 572 572 avatar: avatar31 573 573 avatar_email: user31@example.com 574 574 num_repos: 0 575 + num_followers: 0 576 + num_following: 1 575 577 is_active: true 576 578 577 579 - ··· 590 592 avatar_email: user30@example.com 591 593 num_repos: 0 592 594 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 + email: user33@example.com 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: user33@example.com 611 + num_repos: 0 612 + num_followers: 1 613 + num_following: 0 614 + is_active: true
+2 -2
models/user/user.go
··· 1267 1267 1268 1268 // IsUserVisibleToViewer check if viewer is able to see user profile 1269 1269 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) { 1271 1271 return true 1272 1272 } 1273 1273 ··· 1306 1306 return false 1307 1307 } 1308 1308 1309 - if count < 0 { 1309 + if count == 0 { 1310 1310 // No common organization 1311 1311 return false 1312 1312 }
+53
models/user/user_test.go
··· 400 400 401 401 unittest.CheckConsistencyFor(t, &user_model.User{}) 402 402 } 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 + }
+1 -1
tests/integration/api_nodeinfo_test.go
··· 32 32 DecodeJSON(t, resp, &nodeinfo) 33 33 assert.True(t, nodeinfo.OpenRegistrations) 34 34 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) 36 36 assert.Equal(t, 17, nodeinfo.Usage.LocalPosts) 37 37 assert.Equal(t, 2, nodeinfo.Usage.LocalComments) 38 38 })