svg.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package imagemeta
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "fmt"
  6. "io"
  7. "strings"
  8. "github.com/imgproxy/imgproxy/v3/config"
  9. "golang.org/x/text/encoding/charmap"
  10. )
  11. type svgHeader struct {
  12. XMLName xml.Name
  13. }
  14. func xmlCharsetReader(charset string, input io.Reader) (io.Reader, error) {
  15. if strings.EqualFold(charset, "iso-8859-1") {
  16. return charmap.ISO8859_1.NewDecoder().Reader(input), nil
  17. }
  18. return nil, fmt.Errorf("Unknown SVG charset: %s", charset)
  19. }
  20. func IsSVG(r io.Reader) (bool, error) {
  21. maxBytes := config.MaxSvgCheckBytes
  22. var h svgHeader
  23. buf := make([]byte, 0, maxBytes)
  24. b := make([]byte, 1024)
  25. rr := bytes.NewReader(buf)
  26. for {
  27. n, err := r.Read(b)
  28. if err != nil && err != io.EOF {
  29. return false, err
  30. }
  31. if n <= 0 {
  32. return false, nil
  33. }
  34. buf = append(buf, b[:n]...)
  35. rr.Reset(buf)
  36. dec := xml.NewDecoder(rr)
  37. dec.Strict = false
  38. dec.CharsetReader = xmlCharsetReader
  39. if dec.Decode(&h); h.XMLName.Local == "svg" {
  40. return true, nil
  41. }
  42. if len(buf) >= maxBytes {
  43. break
  44. }
  45. }
  46. return false, nil
  47. }