* limit markdown size
Этот коммит содержится в:
Vishal
2023-05-29 19:02:22 +05:30
коммит произвёл GitHub
родитель 834c8982df
Коммит fa1ba4717b
3 изменённых файлов: 80 добавлений и 30 удалений

Просмотреть файл

@@ -2552,6 +2552,7 @@ func (s *SqlPostStore) determineMaxPostSize() int {
} }
// GetMaxPostSize returns the maximum number of runes that may be stored in a post. // GetMaxPostSize returns the maximum number of runes that may be stored in a post.
// For any changes, accordingly update the markdown maxLen here - markdown/inspect.go.
func (s *SqlPostStore) GetMaxPostSize() int { func (s *SqlPostStore) GetMaxPostSize() int {
s.maxPostSizeOnce.Do(func() { s.maxPostSizeOnce.Do(func() {
s.maxPostSizeCached = s.determineMaxPostSize() s.maxPostSizeCached = s.determineMaxPostSize()

Просмотреть файл

@@ -3,9 +3,18 @@
package markdown package markdown
const (
// Assuming 64k maxSize of a post which can be stored in DB.
// Allow scanning upto twice(arbitrary value) the post size.
maxLen = 1024 * 64 * 2
)
// Inspect traverses the markdown tree in depth-first order. If f returns true, Inspect invokes f // Inspect traverses the markdown tree in depth-first order. If f returns true, Inspect invokes f
// recursively for each child of the block or inline, followed by a call of f(nil). // recursively for each child of the block or inline, followed by a call of f(nil).
func Inspect(markdown string, f func(any) bool) { func Inspect(markdown string, f func(any) bool) {
if len(markdown) > maxLen {
return
}
document, referenceDefinitions := Parse(markdown) document, referenceDefinitions := Parse(markdown)
InspectBlock(document, func(block Block) bool { InspectBlock(document, func(block Block) bool {
if !f(block) { if !f(block) {

Просмотреть файл

@@ -12,6 +12,7 @@ import (
) )
func TestInspect(t *testing.T) { func TestInspect(t *testing.T) {
t.Run("base", func(t *testing.T) {
markdown := ` markdown := `
[foo]: bar [foo]: bar
- a - a
@@ -51,6 +52,45 @@ func TestInspect(t *testing.T) {
" Paragraph", " Paragraph",
" Text", " Text",
}, visited) }, visited)
})
t.Run("visit nodes when len is smaller than maxLen", func(t *testing.T) {
n := maxLen / 5
markdown := strings.Repeat(`![`, n) + strings.Repeat(`]()`, n)
visited := []string{}
level := 0
Inspect(markdown, func(blockOrInline any) bool {
if blockOrInline == nil {
level--
} else {
visited = append(visited, strings.Repeat(" ", level*4)+strings.TrimPrefix(fmt.Sprintf("%T", blockOrInline), "*markdown."))
level++
}
return true
})
assert.NotEmpty(t, visited)
})
t.Run("do not visit any nodes when len is greater than maxLen", func(t *testing.T) {
n := (maxLen / 5) + 1
markdown := strings.Repeat(`![`, n) + strings.Repeat(`]()`, n)
visited := []string{}
level := 0
Inspect(markdown, func(blockOrInline any) bool {
if blockOrInline == nil {
level--
} else {
visited = append(visited, strings.Repeat(" ", level*4)+strings.TrimPrefix(fmt.Sprintf("%T", blockOrInline), "*markdown."))
level++
}
return true
})
assert.Empty(t, visited)
})
} }
var counterSink int var counterSink int