Bläddra i källkod

Add `IMGPROXY_PNG_UNLIMITED` and `IMGPROXY_SVG_UNLIMITED` configs

DarthSim 1 år sedan
förälder
incheckning
c56e9e64b9
5 ändrade filer med 24 tillägg och 7 borttagningar
  1. 1 0
      CHANGELOG.md
  2. 7 0
      config/config.go
  3. 8 3
      vips/vips.c
  4. 6 2
      vips/vips.go
  5. 2 2
      vips/vips.h

+ 1 - 0
CHANGELOG.md

@@ -3,6 +3,7 @@
 ## [Unreleased]
 ### Add
 - Add [IMGPROXY_ALWAYS_RASTERIZE_SVG](https://docs.imgproxy.net/latest/configuration/options#IMGPROXY_ALWAYS_RASTERIZE_SVG) config.
+- Add [IMGPROXY_PNG_UNLIMITED](https://docs.imgproxy.net/latest/configuration/options#IMGPROXY_PNG_UNLIMITED) and [IMGPROXY_SVG_UNLIMITED](https://docs.imgproxy.net/latest/configuration/options#IMGPROXY_SVG_UNLIMITED) configs.
 
 ### Change
 - Respond with 404 when the bucket/container name or object key is empty in an S3, Google Cloud Storage, Azure Blob Storage, or OpenStack Object Storage (Swift) URL.

+ 7 - 0
config/config.go

@@ -44,6 +44,8 @@ var (
 	MaxAnimationFrameResolution int
 	MaxSvgCheckBytes            int
 	MaxRedirects                int
+	PngUnlimited                bool
+	SvgUnlimited                bool
 	AllowSecurityOptions        bool
 
 	JpegProgressive       bool
@@ -235,6 +237,8 @@ func Reset() {
 	MaxAnimationFrameResolution = 0
 	MaxSvgCheckBytes = 32 * 1024
 	MaxRedirects = 10
+	PngUnlimited = false
+	SvgUnlimited = false
 	AllowSecurityOptions = false
 
 	JpegProgressive = false
@@ -433,6 +437,9 @@ func Configure() error {
 	configurators.Bool(&SanitizeSvg, "IMGPROXY_SANITIZE_SVG")
 	configurators.Bool(&AlwaysRasterizeSvg, "IMGPROXY_ALWAYS_RASTERIZE_SVG")
 
+	configurators.Bool(&PngUnlimited, "IMGPROXY_PNG_UNLIMITED")
+	configurators.Bool(&SvgUnlimited, "IMGPROXY_SVG_UNLIMITED")
+
 	configurators.Bool(&AllowSecurityOptions, "IMGPROXY_ALLOW_SECURITY_OPTIONS")
 
 	configurators.Bool(&JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE")

+ 8 - 3
vips/vips.c

@@ -64,9 +64,13 @@ vips_jpegload_go(void *buf, size_t len, int shrink, VipsImage **out)
 }
 
 int
-vips_pngload_go(void *buf, size_t len, VipsImage **out)
+vips_pngload_go(void *buf, size_t len, VipsImage **out, int unlimited)
 {
-  return vips_pngload_buffer(buf, len, out, "access", VIPS_ACCESS_SEQUENTIAL, NULL);
+  return vips_pngload_buffer(
+      buf, len, out,
+      "access", VIPS_ACCESS_SEQUENTIAL,
+      "unlimited", unlimited,
+      NULL);
 }
 
 int
@@ -87,7 +91,7 @@ vips_gifload_go(void *buf, size_t len, int pages, VipsImage **out)
 }
 
 int
-vips_svgload_go(void *buf, size_t len, double scale, VipsImage **out)
+vips_svgload_go(void *buf, size_t len, double scale, VipsImage **out, int unlimited)
 {
   // libvips limits the minimal scale to 0.001, so we have to scale down dpi
   // for lower scale values
@@ -102,6 +106,7 @@ vips_svgload_go(void *buf, size_t len, double scale, VipsImage **out)
       "access", VIPS_ACCESS_SEQUENTIAL,
       "scale", scale,
       "dpi", dpi,
+      "unlimited", unlimited,
       NULL);
 }
 

+ 6 - 2
vips/vips.go

@@ -49,6 +49,8 @@ var vipsConf struct {
 	PngQuantize           C.int
 	PngQuantizationColors C.int
 	AvifSpeed             C.int
+	PngUnlimited          C.int
+	SvgUnlimited          C.int
 }
 
 var badImageErrRe = []*regexp.Regexp{
@@ -96,6 +98,8 @@ func Init() error {
 	vipsConf.PngQuantize = gbool(config.PngQuantize)
 	vipsConf.PngQuantizationColors = C.int(config.PngQuantizationColors)
 	vipsConf.AvifSpeed = C.int(config.AvifSpeed)
+	vipsConf.PngUnlimited = gbool(config.PngUnlimited)
+	vipsConf.SvgUnlimited = gbool(config.SvgUnlimited)
 
 	prometheus.AddGaugeFunc(
 		"vips_memory_bytes",
@@ -327,13 +331,13 @@ func (img *Image) Load(imgdata *imagedata.ImageData, shrink int, scale float64,
 	case imagetype.JPEG:
 		err = C.vips_jpegload_go(data, dataSize, C.int(shrink), &tmp)
 	case imagetype.PNG:
-		err = C.vips_pngload_go(data, dataSize, &tmp)
+		err = C.vips_pngload_go(data, dataSize, &tmp, vipsConf.PngUnlimited)
 	case imagetype.WEBP:
 		err = C.vips_webpload_go(data, dataSize, C.double(scale), C.int(pages), &tmp)
 	case imagetype.GIF:
 		err = C.vips_gifload_go(data, dataSize, C.int(pages), &tmp)
 	case imagetype.SVG:
-		err = C.vips_svgload_go(data, dataSize, C.double(scale), &tmp)
+		err = C.vips_svgload_go(data, dataSize, C.double(scale), &tmp, vipsConf.SvgUnlimited)
 	case imagetype.HEIC, imagetype.AVIF:
 		err = C.vips_heifload_go(data, dataSize, &tmp, C.int(0))
 	case imagetype.TIFF:

+ 2 - 2
vips/vips.h

@@ -16,10 +16,10 @@ int gif_resolution_limit();
 int vips_health();
 
 int vips_jpegload_go(void *buf, size_t len, int shrink, VipsImage **out);
-int vips_pngload_go(void *buf, size_t len, VipsImage **out);
+int vips_pngload_go(void *buf, size_t len, VipsImage **out, int unlimited);
 int vips_webpload_go(void *buf, size_t len, double scale, int pages, VipsImage **out);
 int vips_gifload_go(void *buf, size_t len, int pages, VipsImage **out);
-int vips_svgload_go(void *buf, size_t len, double scale, VipsImage **out);
+int vips_svgload_go(void *buf, size_t len, double scale, VipsImage **out, int unlimited);
 int vips_heifload_go(void *buf, size_t len, VipsImage **out, int thumbnail);
 int vips_tiffload_go(void *buf, size_t len, VipsImage **out);