summaryrefslogtreecommitdiffstats
path: root/services/markup
diff options
context:
space:
mode:
authorDaniel Baumann <daniel@debian.org>2024-10-18 20:33:49 +0200
committerDaniel Baumann <daniel@debian.org>2024-12-12 23:57:56 +0100
commite68b9d00a6e05b3a941f63ffb696f91e554ac5ec (patch)
tree97775d6c13b0f416af55314eb6a89ef792474615 /services/markup
parentInitial commit. (diff)
downloadforgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.tar.xz
forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.zip
Adding upstream version 9.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to '')
-rw-r--r--services/markup/main_test.go16
-rw-r--r--services/markup/processorhelper.go87
-rw-r--r--services/markup/processorhelper_test.go55
3 files changed, 158 insertions, 0 deletions
diff --git a/services/markup/main_test.go b/services/markup/main_test.go
new file mode 100644
index 0000000..89fe3e7
--- /dev/null
+++ b/services/markup/main_test.go
@@ -0,0 +1,16 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package markup
+
+import (
+ "testing"
+
+ "code.gitea.io/gitea/models/unittest"
+)
+
+func TestMain(m *testing.M) {
+ unittest.MainTest(m, &unittest.TestOptions{
+ FixtureFiles: []string{"user.yml"},
+ })
+}
diff --git a/services/markup/processorhelper.go b/services/markup/processorhelper.go
new file mode 100644
index 0000000..40bf1d6
--- /dev/null
+++ b/services/markup/processorhelper.go
@@ -0,0 +1,87 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package markup
+
+import (
+ "context"
+ "fmt"
+
+ "code.gitea.io/gitea/models/perm/access"
+ "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/models/unit"
+ "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/gitrepo"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/markup"
+ gitea_context "code.gitea.io/gitea/services/context"
+ file_service "code.gitea.io/gitea/services/repository/files"
+)
+
+func ProcessorHelper() *markup.ProcessorHelper {
+ return &markup.ProcessorHelper{
+ ElementDir: "auto", // set dir="auto" for necessary (eg: <p>, <h?>, etc) tags
+ IsUsernameMentionable: func(ctx context.Context, username string) bool {
+ mentionedUser, err := user.GetUserByName(ctx, username)
+ if err != nil {
+ return false
+ }
+
+ giteaCtx, ok := ctx.(*gitea_context.Context)
+ if !ok {
+ // when using general context, use user's visibility to check
+ return mentionedUser.Visibility.IsPublic()
+ }
+
+ // when using gitea context (web context), use user's visibility and user's permission to check
+ return user.IsUserVisibleToViewer(giteaCtx, mentionedUser, giteaCtx.Doer)
+ },
+ GetRepoFileBlob: func(ctx context.Context, ownerName, repoName, commitSha, filePath string, language *string) (*git.Blob, error) {
+ repo, err := repo.GetRepositoryByOwnerAndName(ctx, ownerName, repoName)
+ if err != nil {
+ return nil, err
+ }
+
+ var user *user.User
+
+ giteaCtx, ok := ctx.(*gitea_context.Context)
+ if ok {
+ user = giteaCtx.Doer
+ }
+
+ perms, err := access.GetUserRepoPermission(ctx, repo, user)
+ if err != nil {
+ return nil, err
+ }
+ if !perms.CanRead(unit.TypeCode) {
+ return nil, fmt.Errorf("cannot access repository code")
+ }
+
+ gitRepo, err := gitrepo.OpenRepository(ctx, repo)
+ if err != nil {
+ return nil, err
+ }
+ defer gitRepo.Close()
+
+ commit, err := gitRepo.GetCommit(commitSha)
+ if err != nil {
+ return nil, err
+ }
+
+ if language != nil {
+ *language, err = file_service.TryGetContentLanguage(gitRepo, commitSha, filePath)
+ if err != nil {
+ log.Error("Unable to get file language for %-v:%s. Error: %v", repo, filePath, err)
+ }
+ }
+
+ blob, err := commit.GetBlobByPath(filePath)
+ if err != nil {
+ return nil, err
+ }
+
+ return blob, nil
+ },
+ }
+}
diff --git a/services/markup/processorhelper_test.go b/services/markup/processorhelper_test.go
new file mode 100644
index 0000000..fafde74
--- /dev/null
+++ b/services/markup/processorhelper_test.go
@@ -0,0 +1,55 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package markup
+
+import (
+ "context"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/models/unittest"
+ "code.gitea.io/gitea/models/user"
+ gitea_context "code.gitea.io/gitea/services/context"
+ "code.gitea.io/gitea/services/contexttest"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestProcessorHelper(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ userPublic := "user1"
+ userPrivate := "user31"
+ userLimited := "user33"
+ userNoSuch := "no-such-user"
+
+ unittest.AssertCount(t, &user.User{Name: userPublic}, 1)
+ unittest.AssertCount(t, &user.User{Name: userPrivate}, 1)
+ unittest.AssertCount(t, &user.User{Name: userLimited}, 1)
+ unittest.AssertCount(t, &user.User{Name: userNoSuch}, 0)
+
+ // when using general context, use user's visibility to check
+ assert.True(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userPublic))
+ assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userLimited))
+ assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userPrivate))
+ assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userNoSuch))
+
+ // when using web context, use user.IsUserVisibleToViewer to check
+ req, err := http.NewRequest("GET", "/", nil)
+ require.NoError(t, err)
+ base, baseCleanUp := gitea_context.NewBaseContext(httptest.NewRecorder(), req)
+ defer baseCleanUp()
+ giteaCtx := gitea_context.NewWebContext(base, &contexttest.MockRender{}, nil)
+
+ assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPublic))
+ assert.False(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate))
+
+ giteaCtx.Doer, err = user.GetUserByName(db.DefaultContext, userPrivate)
+ require.NoError(t, err)
+ assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPublic))
+ assert.True(t, ProcessorHelper().IsUsernameMentionable(giteaCtx, userPrivate))
+}