mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Merge pull request #2406 from bkcsoft/feature/markdown-custom-url-scheme
Feature/markdown custom url scheme
This commit is contained in:
		@@ -41,6 +41,9 @@ ORG_PAGING_NUM = 50
 | 
				
			|||||||
[markdown]
 | 
					[markdown]
 | 
				
			||||||
; Enable hard line break extension
 | 
					; Enable hard line break extension
 | 
				
			||||||
ENABLE_HARD_LINE_BREAK = false
 | 
					ENABLE_HARD_LINE_BREAK = false
 | 
				
			||||||
 | 
					; List of custom URL-Schemes that are allowed as links when rendering Markdown
 | 
				
			||||||
 | 
					; for example git,magnet
 | 
				
			||||||
 | 
					CUSTOM_URL_SCHEMES =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[server]
 | 
					[server]
 | 
				
			||||||
PROTOCOL = http
 | 
					PROTOCOL = http
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,16 +31,10 @@ func isalnum(c byte) bool {
 | 
				
			|||||||
	return (c >= '0' && c <= '9') || isletter(c)
 | 
						return (c >= '0' && c <= '9') || isletter(c)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var validLinks = [][]byte{[]byte("http://"), []byte("https://"), []byte("ftp://"), []byte("mailto://")}
 | 
					var validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isLink(link []byte) bool {
 | 
					func isLink(link []byte) bool {
 | 
				
			||||||
	for _, prefix := range validLinks {
 | 
						return validLinksPattern.Match(link)
 | 
				
			||||||
		if len(link) > len(prefix) && bytes.Equal(bytes.ToLower(link[:len(prefix)]), prefix) && isalnum(link[len(prefix)]) {
 | 
					 | 
				
			||||||
			return true
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func IsMarkdownFile(name string) bool {
 | 
					func IsMarkdownFile(name string) bool {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,17 +31,20 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/setting"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func BuildSanitizer() (p *bluemonday.Policy) {
 | 
					var Sanitizer = bluemonday.UGCPolicy()
 | 
				
			||||||
	p = bluemonday.UGCPolicy()
 | 
					 | 
				
			||||||
	p.AllowAttrs("class").Matching(regexp.MustCompile(`[\p{L}\p{N}\s\-_',:\[\]!\./\\\(\)&]*`)).OnElements("code")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input")
 | 
					func BuildSanitizer() {
 | 
				
			||||||
	p.AllowAttrs("checked", "disabled").OnElements("input")
 | 
						// Normal markdown-stuff
 | 
				
			||||||
	return p
 | 
						Sanitizer.AllowAttrs("class").Matching(regexp.MustCompile(`[\p{L}\p{N}\s\-_',:\[\]!\./\\\(\)&]*`)).OnElements("code")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Checkboxes
 | 
				
			||||||
 | 
						Sanitizer.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input")
 | 
				
			||||||
 | 
						Sanitizer.AllowAttrs("checked", "disabled").OnElements("input")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Custom URL-Schemes
 | 
				
			||||||
 | 
						Sanitizer.AllowURLSchemes(setting.Markdown.CustomURLSchemes...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Sanitizer = BuildSanitizer()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeMD5 encodes string to md5 hex value.
 | 
					// EncodeMD5 encodes string to md5 hex value.
 | 
				
			||||||
func EncodeMD5(str string) string {
 | 
					func EncodeMD5(str string) string {
 | 
				
			||||||
	m := md5.New()
 | 
						m := md5.New()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -118,6 +118,7 @@ var (
 | 
				
			|||||||
	// Markdown sttings
 | 
						// Markdown sttings
 | 
				
			||||||
	Markdown struct {
 | 
						Markdown struct {
 | 
				
			||||||
		EnableHardLineBreak bool
 | 
							EnableHardLineBreak bool
 | 
				
			||||||
 | 
							CustomURLSchemes    []string `ini:"CUSTOM_URL_SCHEMES"`
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Picture settings
 | 
						// Picture settings
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,6 +91,9 @@ func GlobalInit() {
 | 
				
			|||||||
		ssh.Listen(setting.SSHPort)
 | 
							ssh.Listen(setting.SSHPort)
 | 
				
			||||||
		log.Info("SSH server started on :%v", setting.SSHPort)
 | 
							log.Info("SSH server started on :%v", setting.SSHPort)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Build Sanitizer
 | 
				
			||||||
 | 
						base.BuildSanitizer()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func InstallInit(ctx *middleware.Context) {
 | 
					func InstallInit(ctx *middleware.Context) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user