feat(编辑能力): 完善资源扫描与裁剪保护
build.yaml / build (push) Successful in 50s

This commit is contained in:
xiaoqidun committed 2026-10-13 09:04:16 +08:00
1 parent 078c4e0736
commit a3594d1280
3 files changed
+16 -3

No files matched your search

+8
View File
@@ -144,6 +144,10 @@ func (s *editorReferenceScan) accept(token xml.Token) bool {
return false return false
} }
if len(s.stack) == 0 { if len(s.stack) == 0 {
if s.seen {
s.safe = false
return false
}
s.seen = true s.seen = true
if token.Name.Local == "Document" { if token.Name.Local == "Document" {
if s.refs.documents == nil { if s.refs.documents == nil {
@@ -216,6 +220,10 @@ func (s *editorReferenceScan) accept(token xml.Token) bool {
s.capture = true s.capture = true
} }
case xml.CharData: case xml.CharData:
if len(s.stack) == 0 && len(bytes.Trim(token, " \t\r\n")) != 0 {
s.safe = false
return false
}
if s.capture { if s.capture {
s.text.Write(token) s.text.Write(token)
} }
+7 -2
View File
@@ -15,6 +15,7 @@
package ofdgo package ofdgo
import ( import (
"bufio"
"bytes" "bytes"
"context" "context"
"encoding/xml" "encoding/xml"
@@ -49,7 +50,11 @@ func editorResourceDefinitions(ctx context.Context, data []byte, name string, so
result.definitions = make(map[string]*editorResourceRefs) result.definitions = make(map[string]*editorResourceRefs)
outer := &editorResourceRefs{ids: make(map[string]bool), files: make(map[string]bool), fonts: make(map[string]*editorFontUsage)} outer := &editorResourceRefs{ids: make(map[string]bool), files: make(map[string]bool), fonts: make(map[string]*editorFontUsage)}
scan := editorReferenceScan{refs: outer, name: name, safe: true} scan := editorReferenceScan{refs: outer, name: name, safe: true}
decoder := xml.NewDecoder(imageInput{ReadCloser: io.NopCloser(bytes.NewReader(data)), context: ctx}) input := bufio.NewReader(imageInput{ReadCloser: io.NopCloser(bytes.NewReader(data)), context: ctx})
if found, err := editorXMLPrefix(input); err != nil || !found {
return nil, err
}
decoder := xml.NewDecoder(input)
for { for {
if err := ctx.Err(); err != nil { if err := ctx.Err(); err != nil {
return nil, err return nil, err
@@ -66,7 +71,7 @@ func editorResourceDefinitions(ctx context.Context, data []byte, name string, so
} }
depth := len(scan.stack) depth := len(scan.stack)
if node, ok := token.(xml.StartElement); ok { if node, ok := token.(xml.StartElement); ok {
if depth == 0 && (scan.seen || node.Name.Local != "Res") || depth == 1 && editorResourceElement(node.Name.Local) == "" { if depth == 0 && node.Name.Local != "Res" || depth == 1 && editorResourceElement(node.Name.Local) == "" {
return nil, nil return nil, nil
} }
if depth == 2 { if depth == 2 {
+1 -1
View File
@@ -328,7 +328,7 @@ func (r *editorResourceRefs) scan(input io.Reader, name string) (bool, bool) {
for { for {
token, err := decoder.Token() token, err := decoder.Token()
if err == io.EOF { if err == io.EOF {
return scan.resource, len(scan.stack) == 0 return scan.resource, scan.seen && len(scan.stack) == 0
} }
if err != nil { if err != nil {
return false, false return false, false