2022-10-22 20:15:52 +03:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2022-10-22 20:15:52 +03:00
package markup
import (
"context"
2024-03-15 15:44:42 +03:00
"fmt"
2024-03-25 18:05:01 +03:00
2024-03-15 15:44:42 +03:00
"code.gitea.io/gitea/models/perm/access"
"code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
2022-10-22 20:15:52 +03:00
"code.gitea.io/gitea/models/user"
2024-03-25 18:05:01 +03:00
"code.gitea.io/gitea/modules/git"
2024-03-15 15:44:42 +03:00
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/log"
2022-10-22 20:15:52 +03:00
"code.gitea.io/gitea/modules/markup"
2024-02-27 10:12:22 +03:00
gitea_context "code.gitea.io/gitea/services/context"
2024-03-15 15:44:42 +03:00
file_service "code.gitea.io/gitea/services/repository/files"
2022-10-22 20:15:52 +03:00
)
func ProcessorHelper ( ) * markup . ProcessorHelper {
return & markup . ProcessorHelper {
2023-05-21 00:02:52 +03:00
ElementDir : "auto" , // set dir="auto" for necessary (eg: <p>, <h?>, etc) tags
2022-10-22 20:15:52 +03:00
IsUsernameMentionable : func ( ctx context . Context , username string ) bool {
2022-10-23 12:13:52 +03:00
mentionedUser , err := user . GetUserByName ( ctx , username )
2022-10-22 20:15:52 +03:00
if err != nil {
2022-10-23 12:13:52 +03:00
return false
}
giteaCtx , ok := ctx . ( * gitea_context . Context )
if ! ok {
// when using general context, use user's visibility to check
return mentionedUser . Visibility . IsPublic ( )
2022-10-22 20:15:52 +03:00
}
2022-10-23 12:13:52 +03:00
// when using gitea context (web context), use user's visibility and user's permission to check
return user . IsUserVisibleToViewer ( giteaCtx , mentionedUser , giteaCtx . Doer )
2022-10-22 20:15:52 +03:00
} ,
2024-03-25 18:05:01 +03:00
GetRepoFileBlob : func ( ctx context . Context , ownerName , repoName , commitSha , filePath string , language * string ) ( * git . Blob , error ) {
2024-03-15 15:44:42 +03:00
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
}
2024-03-27 20:25:37 +03:00
defer gitRepo . Close ( )
2024-03-15 15:44:42 +03:00
commit , err := gitRepo . GetCommit ( commitSha )
if err != nil {
return nil , err
}
2024-03-25 18:05:01 +03:00
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 )
}
2024-03-15 15:44:42 +03:00
}
blob , err := commit . GetBlobByPath ( filePath )
if err != nil {
return nil , err
}
2024-03-25 18:05:01 +03:00
return blob , nil
2024-03-15 15:44:42 +03:00
} ,
2022-10-22 20:15:52 +03:00
}
}