forgejo/services/markup/processorhelper.go
Mai-Lapyst 22aedc6c96
[v7.0/forgejo] Render inline file permalinks
Backport: https://codeberg.org/forgejo/forgejo/pulls/2669

(cherry picked from commit 1d3240887c519a04c13bcd7e852c6d6ad1cb00b5)
(cherry picked from commit 781a37fbe18c223763f51968862f1c8f61e7e260)
(cherry picked from commit 8309f008c2721e313e1949ce42ed410e844c16e7)
(cherry picked from commit fae8d9f70d31704af91cbf37bcefcc4772830695)
(cherry picked from commit 6721cba75b4997448b618a4b00ef25f142924de0)
(cherry picked from commit 562e5cdf324597882b7e6971be1b9a148bbc7839)
(cherry picked from commit d789d33229b3998bb33f1505d122504c8039f23d)
(cherry picked from commit 8218e80bfc3a1f9ba02ce60f1acafdc0e57c5ae0)
(cherry picked from commit 10bca456a9140519e95559aa7bac2221e1156c5b)
(cherry picked from commit db6f6281fcf568ae8e35330a4a93c9be1cb46efd)
(cherry picked from commit ed8e8a792e75b930074cd3cf1bab580a09ff8485)
(cherry picked from commit d6428f92ce7ce67d127cbd5bb4977aa92abf071c)
(cherry picked from commit 069d87b80f909e91626249afbb240a1df339a8fd)
(cherry picked from commit 2b6546adc954d450a9c6befccd407ce2ca1636a0)
(cherry picked from commit 4c7cb0a5d20e8973b03e35d91119cf917eed125e)
(cherry picked from commit 7e0014dd1391e123d95f2537c3b2165fef7122ef)
(cherry picked from commit 16a8658878a2656cb131453b728b65a89271f11f)
(cherry picked from commit 6e98bacbbd3c089b2ccfa725c58184f4dfe5e7fe)
2024-04-01 16:15:58 +02:00

87 lines
2.3 KiB
Go

// 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
},
}
}