Skip to content

Commit 88a03a6

Browse files
yardenshohamwxiaoguanglunny
authored
Link mentioned user in markdown only if they are visible to viewer (#21554)
We need to make sure a user can't confirm the existence of a user with private visibility * Follow up on #21533 ### Before #### User ![image](https://user-images.githubusercontent.com/20454870/197357580-340911d7-1659-4fc9-a9f6-7ed6bc3476b4.png) #### Admin ![image](https://user-images.githubusercontent.com/20454870/197357676-a8f0ae63-8f80-4221-a9b5-b6311552910a.png) ### After #### User ![image](https://user-images.githubusercontent.com/20454870/197357536-05616edb-7821-469d-8e51-6f8cb84c1362.png) #### Admin ![image](https://user-images.githubusercontent.com/20454870/197357703-071fe984-de79-43aa-a77c-a85b046292a4.png) Signed-off-by: Yarden Shoham <[email protected]> Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: Lunny Xiao <[email protected]>
1 parent afebbf2 commit 88a03a6

File tree

2 files changed

+47
-10
lines changed

2 files changed

+47
-10
lines changed

Diff for: services/markup/processorhelper.go

+12-8
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,26 @@ import (
88
"context"
99

1010
"code.gitea.io/gitea/models/user"
11-
"code.gitea.io/gitea/modules/log"
11+
gitea_context "code.gitea.io/gitea/modules/context"
1212
"code.gitea.io/gitea/modules/markup"
1313
)
1414

1515
func ProcessorHelper() *markup.ProcessorHelper {
1616
return &markup.ProcessorHelper{
1717
IsUsernameMentionable: func(ctx context.Context, username string) bool {
18-
// TODO: cast ctx to modules/context.Context and use IsUserVisibleToViewer
19-
20-
// Only link if the user actually exists
21-
userExists, err := user.IsUserExist(ctx, 0, username)
18+
mentionedUser, err := user.GetUserByName(ctx, username)
2219
if err != nil {
23-
log.Error("Failed to validate user in mention %q exists, assuming it does", username)
24-
userExists = true
20+
return false
21+
}
22+
23+
giteaCtx, ok := ctx.(*gitea_context.Context)
24+
if !ok {
25+
// when using general context, use user's visibility to check
26+
return mentionedUser.Visibility.IsPublic()
2527
}
26-
return userExists
28+
29+
// when using gitea context (web context), use user's visibility and user's permission to check
30+
return user.IsUserVisibleToViewer(giteaCtx, mentionedUser, giteaCtx.Doer)
2731
},
2832
}
2933
}

Diff for: services/markup/processorhelper_test.go

+35-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,48 @@ package markup
66

77
import (
88
"context"
9+
"net/http"
910
"testing"
1011

12+
"code.gitea.io/gitea/models/db"
1113
"code.gitea.io/gitea/models/unittest"
14+
"code.gitea.io/gitea/models/user"
15+
gitea_context "code.gitea.io/gitea/modules/context"
1216

1317
"github.com/stretchr/testify/assert"
1418
)
1519

1620
func TestProcessorHelper(t *testing.T) {
1721
assert.NoError(t, unittest.PrepareTestDatabase())
18-
assert.True(t, ProcessorHelper().IsUsernameMentionable(context.Background(), "user10"))
19-
assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), "no-such-user"))
22+
23+
userPublic := "user1"
24+
userPrivate := "user31"
25+
userLimited := "user33"
26+
userNoSuch := "no-such-user"
27+
28+
unittest.AssertCount(t, &user.User{Name: userPublic}, 1)
29+
unittest.AssertCount(t, &user.User{Name: userPrivate}, 1)
30+
unittest.AssertCount(t, &user.User{Name: userLimited}, 1)
31+
unittest.AssertCount(t, &user.User{Name: userNoSuch}, 0)
32+
33+
// when using general context, use user's visibility to check
34+
assert.True(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userPublic))
35+
assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userLimited))
36+
assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userPrivate))
37+
assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userNoSuch))
38+
39+
// when using web context, use user.IsUserVisibleToViewer to check
40+
var err error
41+
giteaCtx := &gitea_context.Context{}
42+
giteaCtx.Req, err = http.NewRequest("GET", "/", nil)
43+
assert.NoError(t, err)
44+
45+
giteaCtx.Doer = nil
46+
assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPublic))
47+
assert.False(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate))
48+
49+
giteaCtx.Doer, err = user.GetUserByName(db.DefaultContext, userPrivate)
50+
assert.NoError(t, err)
51+
assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPublic))
52+
assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate))
2053
}

0 commit comments

Comments
 (0)