Initial release: Go Jdenticon library v0.1.0

- Core library with SVG and PNG generation
- CLI tool with generate and batch commands
- Cross-platform path handling for Windows compatibility
- Comprehensive test suite with integration tests
This commit is contained in:
Kevin McIntyre
2026-01-02 23:56:48 -05:00
parent f84b511895
commit d9e84812ff
292 changed files with 19725 additions and 38884 deletions

85
jdenticon/validation.go Normal file
View File

@@ -0,0 +1,85 @@
package jdenticon
import (
"github.com/ungluedlabs/go-jdenticon/internal/engine"
)
// validation.go contains helper functions for input validation and DoS protection.
// validateInputs performs common validation for input string and size parameters.
// This provides centralized validation logic used across all public API functions.
func validateInputs(input string, size int, config Config) error {
// Validate input string length
if maxLen := config.effectiveMaxInputLength(); maxLen != -1 && len(input) > maxLen {
return NewErrValueTooLarge("InputLength", maxLen, len(input))
}
// Validate that input is not empty
if input == "" {
return NewErrInvalidInput("input", input, "cannot be empty")
}
// Validate base icon size (must be positive)
if size <= 0 {
return ErrInvalidSize(size)
}
// Validate icon size against configured limit
if maxSize := config.effectiveMaxIconSize(); maxSize != -1 && size > maxSize {
return NewErrValueTooLarge("IconSize", maxSize, size)
}
return nil
}
// validateComplexity performs complexity validation for an input string.
// This should be called after basic input validation and hash computation.
func validateComplexity(hash string, config Config) error {
if maxComplexity := config.effectiveMaxComplexity(); maxComplexity != -1 {
// Create a temporary engine generator to calculate complexity
// This is needed to access the CalculateComplexity method
engineConfig := engine.DefaultGeneratorConfig()
engineConfig.ColorConfig = engine.ColorConfig{
IconPadding: config.Padding,
ColorSaturation: config.ColorSaturation,
GrayscaleSaturation: config.GrayscaleSaturation,
ColorLightness: engine.LightnessRange{
Min: config.ColorLightnessRange[0],
Max: config.ColorLightnessRange[1],
},
GrayscaleLightness: engine.LightnessRange{
Min: config.GrayscaleLightnessRange[0],
Max: config.GrayscaleLightnessRange[1],
},
Hues: config.HueRestrictions,
BackColor: nil, // Not needed for complexity calculation
}
tempGenerator, err := engine.NewGeneratorWithConfig(engineConfig)
if err != nil {
return err
}
complexity, err := tempGenerator.CalculateComplexity(hash)
if err != nil {
return err
}
if complexity > maxComplexity {
return NewErrComplexityLimitExceeded(maxComplexity, complexity, hash)
}
}
return nil
}
// validatePNGSize performs additional validation for PNG functions that use supersampling.
// This checks the effective size (size * supersampling) against configured limits.
func validatePNGSize(size int, config Config) error {
// Check effective size for PNG with supersampling
effectiveSize := size * config.PNGSupersampling
if maxSize := config.effectiveMaxIconSize(); maxSize != -1 && effectiveSize > maxSize {
return NewErrEffectiveSizeTooLarge(maxSize, effectiveSize, size, config.PNGSupersampling)
}
return nil
}