feat(压缩能力): 完善图像压缩与蒙版保护
build.yaml / build (push) Successful in 53s

This commit is contained in:
xiaoqidun committed 2026-10-13 09:30:34 +08:00
1 parent a3594d1280
commit 7df35ac122
1 file changed
+17 -3
+17 -3
View File
@@ -26,6 +26,7 @@ import (
"image" "image"
"io" "io"
"maps" "maps"
"path"
"slices" "slices"
"strings" "strings"
"unicode/utf8" "unicode/utf8"
@@ -216,14 +217,18 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo)
return nil, false, err return nil, false, err
} }
buffer := bufio.NewReader(imageInput{ReadCloser: input, context: ctx}) buffer := bufio.NewReader(imageInput{ReadCloser: input, context: ctx})
header, _ := buffer.Peek(512) found, err := editorXMLPrefix(buffer)
header = bytes.TrimSpace(bytes.TrimPrefix(header, []byte{0xef, 0xbb, 0xbf})) if err != nil || !found && (structured || strings.EqualFold(path.Ext(name), ".xml")) {
if structured || len(header) > 0 && header[0] == '<' { safe = false
}
if safe && found {
decoder := xml.NewDecoder(buffer) decoder := xml.NewDecoder(buffer)
var stack []xml.Name var stack []xml.Name
seen := false
for { for {
token, err := decoder.Token() token, err := decoder.Token()
if err == io.EOF { if err == io.EOF {
safe = seen && len(stack) == 0
break break
} }
if err != nil { if err != nil {
@@ -232,6 +237,11 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo)
} }
switch element := token.(type) { switch element := token.(type) {
case xml.StartElement: case xml.StartElement:
if len(stack) == 0 && seen {
safe = false
break
}
seen = true
if len(stack) != 0 && classifyOFDNamespace(element.Name.Space) == ofdXMLUnknown && element.Name.Space != stack[len(stack)-1].Space { if len(stack) != 0 && classifyOFDNamespace(element.Name.Space) == ofdXMLUnknown && element.Name.Space != stack[len(stack)-1].Space {
safe = false safe = false
break break
@@ -267,6 +277,10 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo)
} }
case xml.EndElement: case xml.EndElement:
stack = stack[:len(stack)-1] stack = stack[:len(stack)-1]
case xml.CharData:
if len(stack) == 0 && len(bytes.Trim(element, " \t\r\n")) != 0 {
safe = false
}
case xml.Directive: case xml.Directive:
safe = false safe = false
} }