mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-02-17 11:55:32 +02:00
Fix recursive presets detection
This commit is contained in:
parent
fb028170b3
commit
c84dc020ba
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
### Fix
|
### Fix
|
||||||
- Fix loading animated images with a huge number of frames.
|
- Fix loading animated images with a huge number of frames.
|
||||||
|
- Fix recursive presets detection.
|
||||||
- (pro) Fix `video_thumbnail_tile` option behavior when the video has a single keyframe.
|
- (pro) Fix `video_thumbnail_tile` option behavior when the video has a single keyframe.
|
||||||
- (pro) Fix the `trim` argument of the `video_thumbnail_tile` processing option.
|
- (pro) Fix the `trim` argument of the `video_thumbnail_tile` processing option.
|
||||||
- (pro) Fix `video_thumbnail_tile` behavior when the `step` argument value is less than frame duration.
|
- (pro) Fix `video_thumbnail_tile` behavior when the `step` argument value is less than frame duration.
|
||||||
|
@ -59,7 +59,7 @@ func parsePreset(presetStr string) error {
|
|||||||
func ValidatePresets() error {
|
func ValidatePresets() error {
|
||||||
for name, opts := range presets {
|
for name, opts := range presets {
|
||||||
po := NewProcessingOptions()
|
po := NewProcessingOptions()
|
||||||
if err := applyURLOptions(po, opts); err != nil {
|
if err := applyURLOptions(po, opts, name); err != nil {
|
||||||
return fmt.Errorf("Error in preset `%s`: %s", name, err)
|
return fmt.Errorf("Error in preset `%s`: %s", name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ func (s *PresetsTestSuite) TestParsePresetComment() {
|
|||||||
|
|
||||||
func (s *PresetsTestSuite) TestValidatePresets() {
|
func (s *PresetsTestSuite) TestValidatePresets() {
|
||||||
presets = map[string]urlOptions{
|
presets = map[string]urlOptions{
|
||||||
"test": urlOptions{
|
"test": {
|
||||||
urlOption{Name: "resize", Args: []string{"fit", "100", "200"}},
|
urlOption{Name: "resize", Args: []string{"fit", "100", "200"}},
|
||||||
urlOption{Name: "sharpen", Args: []string{"2"}},
|
urlOption{Name: "sharpen", Args: []string{"2"}},
|
||||||
},
|
},
|
||||||
@ -89,7 +89,7 @@ func (s *PresetsTestSuite) TestValidatePresets() {
|
|||||||
|
|
||||||
func (s *PresetsTestSuite) TestValidatePresetsInvalid() {
|
func (s *PresetsTestSuite) TestValidatePresetsInvalid() {
|
||||||
presets = map[string]urlOptions{
|
presets = map[string]urlOptions{
|
||||||
"test": urlOptions{
|
"test": {
|
||||||
urlOption{Name: "resize", Args: []string{"fit", "-1", "-2"}},
|
urlOption{Name: "resize", Args: []string{"fit", "-1", "-2"}},
|
||||||
urlOption{Name: "sharpen", Args: []string{"2"}},
|
urlOption{Name: "sharpen", Args: []string{"2"}},
|
||||||
},
|
},
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -177,15 +178,6 @@ func (po *ProcessingOptions) GetQuality() int {
|
|||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
func (po *ProcessingOptions) isPresetUsed(name string) bool {
|
|
||||||
for _, usedName := range po.UsedPresets {
|
|
||||||
if usedName == name {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (po *ProcessingOptions) Diff() structdiff.Entries {
|
func (po *ProcessingOptions) Diff() structdiff.Entries {
|
||||||
return structdiff.Diff(NewProcessingOptions(), po)
|
return structdiff.Diff(NewProcessingOptions(), po)
|
||||||
}
|
}
|
||||||
@ -689,17 +681,17 @@ func applyPixelateOption(po *ProcessingOptions, args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyPresetOption(po *ProcessingOptions, args []string) error {
|
func applyPresetOption(po *ProcessingOptions, args []string, usedPresets ...string) error {
|
||||||
for _, preset := range args {
|
for _, preset := range args {
|
||||||
if p, ok := presets[preset]; ok {
|
if p, ok := presets[preset]; ok {
|
||||||
if po.isPresetUsed(preset) {
|
if slices.Contains(usedPresets, preset) {
|
||||||
log.Warningf("Recursive preset usage is detected: %s", preset)
|
log.Warningf("Recursive preset usage is detected: %s", preset)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
po.UsedPresets = append(po.UsedPresets, preset)
|
po.UsedPresets = append(po.UsedPresets, preset)
|
||||||
|
|
||||||
if err := applyURLOptions(po, p); err != nil {
|
if err := applyURLOptions(po, p, append(usedPresets, preset)...); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -976,7 +968,7 @@ func applyMaxAnimationFrameResolutionOption(po *ProcessingOptions, args []string
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyURLOption(po *ProcessingOptions, name string, args []string) error {
|
func applyURLOption(po *ProcessingOptions, name string, args []string, usedPresets ...string) error {
|
||||||
switch name {
|
switch name {
|
||||||
case "resize", "rs":
|
case "resize", "rs":
|
||||||
return applyResizeOption(po, args)
|
return applyResizeOption(po, args)
|
||||||
@ -1056,7 +1048,7 @@ func applyURLOption(po *ProcessingOptions, name string, args []string) error {
|
|||||||
return applyReturnAttachmentOption(po, args)
|
return applyReturnAttachmentOption(po, args)
|
||||||
// Presets
|
// Presets
|
||||||
case "preset", "pr":
|
case "preset", "pr":
|
||||||
return applyPresetOption(po, args)
|
return applyPresetOption(po, args, usedPresets...)
|
||||||
// Security
|
// Security
|
||||||
case "max_src_resolution", "msr":
|
case "max_src_resolution", "msr":
|
||||||
return applyMaxSrcResolutionOption(po, args)
|
return applyMaxSrcResolutionOption(po, args)
|
||||||
@ -1071,9 +1063,9 @@ func applyURLOption(po *ProcessingOptions, name string, args []string) error {
|
|||||||
return fmt.Errorf("Unknown processing option: %s", name)
|
return fmt.Errorf("Unknown processing option: %s", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyURLOptions(po *ProcessingOptions, options urlOptions) error {
|
func applyURLOptions(po *ProcessingOptions, options urlOptions, usedPresets ...string) error {
|
||||||
for _, opt := range options {
|
for _, opt := range options {
|
||||||
if err := applyURLOption(po, opt.Name, opt.Args); err != nil {
|
if err := applyURLOption(po, opt.Name, opt.Args, usedPresets...); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -377,14 +377,15 @@ func (s *ProcessingOptionsTestSuite) TestParsePathPresetDefault() {
|
|||||||
func (s *ProcessingOptionsTestSuite) TestParsePathPresetLoopDetection() {
|
func (s *ProcessingOptionsTestSuite) TestParsePathPresetLoopDetection() {
|
||||||
presets["test1"] = urlOptions{
|
presets["test1"] = urlOptions{
|
||||||
urlOption{Name: "resizing_type", Args: []string{"fill"}},
|
urlOption{Name: "resizing_type", Args: []string{"fill"}},
|
||||||
|
urlOption{Name: "preset", Args: []string{"test2"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
presets["test2"] = urlOptions{
|
presets["test2"] = urlOptions{
|
||||||
urlOption{Name: "blur", Args: []string{"0.2"}},
|
urlOption{Name: "blur", Args: []string{"0.2"}},
|
||||||
urlOption{Name: "quality", Args: []string{"50"}},
|
urlOption{Name: "preset", Args: []string{"test1"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
path := "/preset:test1:test2:test1/plain/http://images.dev/lorem/ipsum.jpg"
|
path := "/preset:test1/plain/http://images.dev/lorem/ipsum.jpg"
|
||||||
po, _, err := ParsePath(path, make(http.Header))
|
po, _, err := ParsePath(path, make(http.Header))
|
||||||
|
|
||||||
require.Nil(s.T(), err)
|
require.Nil(s.T(), err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user