From d37f85faa9de0a3a39a0590905383f51262a1279 Mon Sep 17 00:00:00 2001 From: Karan Lathiya <2810karanlathiya@gmail.com> Date: Fri, 28 Nov 2025 12:59:49 +0530 Subject: [PATCH 1/4] Fix: enhance validation for printable ASCII and ASCII characters --- baked_in.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/baked_in.go b/baked_in.go index 0ae59f0b..317e9b23 100644 --- a/baked_in.go +++ b/baked_in.go @@ -534,12 +534,20 @@ func hasMultiByteCharacter(fl FieldLevel) bool { // isPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character. func isPrintableASCII(fl FieldLevel) bool { - return printableASCIIRegex().MatchString(fl.Field().String()) + field := fl.Field() + if field.Kind() == reflect.String { + return printableASCIIRegex().MatchString(field.String()) + } + panic(fmt.Sprintf("Bad field type %T", field.Interface())) } // isASCII is the validation function for validating if the field's value is a valid ASCII character. func isASCII(fl FieldLevel) bool { - return aSCIIRegex().MatchString(fl.Field().String()) + field := fl.Field() + if field.Kind() == reflect.String { + return aSCIIRegex().MatchString(field.String()) + } + panic(fmt.Sprintf("Bad field type %T", field.Interface())) } // isUUID5 is the validation function for validating if the field's value is a valid v5 UUID. From 880ef4ecb2168977960886b457644380718f5626 Mon Sep 17 00:00:00 2001 From: Karan Lathiya <2810karanlathiya@gmail.com> Date: Fri, 28 Nov 2025 15:12:43 +0530 Subject: [PATCH 2/4] Fix: improve error message for invalid field types in ASCII validation --- baked_in.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/baked_in.go b/baked_in.go index 317e9b23..7aedc967 100644 --- a/baked_in.go +++ b/baked_in.go @@ -538,7 +538,7 @@ func isPrintableASCII(fl FieldLevel) bool { if field.Kind() == reflect.String { return printableASCIIRegex().MatchString(field.String()) } - panic(fmt.Sprintf("Bad field type %T", field.Interface())) + panic(fmt.Sprintf("Bad field type %s", field.Type())) } // isASCII is the validation function for validating if the field's value is a valid ASCII character. @@ -547,7 +547,7 @@ func isASCII(fl FieldLevel) bool { if field.Kind() == reflect.String { return aSCIIRegex().MatchString(field.String()) } - panic(fmt.Sprintf("Bad field type %T", field.Interface())) + panic(fmt.Sprintf("Bad field type %s", field.Type())) } // isUUID5 is the validation function for validating if the field's value is a valid v5 UUID. From 4ca2bfb12510eff4277a014ba304d5a4269390a4 Mon Sep 17 00:00:00 2001 From: Karan Lathiya <2810karanlathiya@gmail.com> Date: Fri, 28 Nov 2025 15:18:09 +0530 Subject: [PATCH 3/4] add panic tests for invalid field types in printable ASCII and ASCII validation --- validator_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/validator_test.go b/validator_test.go index 7a528ec8..73e6fb63 100644 --- a/validator_test.go +++ b/validator_test.go @@ -3940,6 +3940,8 @@ func TestPrintableASCIIValidation(t *testing.T) { } } } + PanicMatches(t, func() { _ = validate.Var([]int{3000}, "printascii") }, "Bad field type []int") + PanicMatches(t, func() { _ = validate.Var(1, "printascii") }, "Bad field type int") } func TestASCIIValidation(t *testing.T) { @@ -3979,6 +3981,8 @@ func TestASCIIValidation(t *testing.T) { } } } + PanicMatches(t, func() { _ = validate.Var([]int{3000}, "ascii") }, "Bad field type []int") + PanicMatches(t, func() { _ = validate.Var(1, "ascii") }, "Bad field type int") } func TestUUID5Validation(t *testing.T) { From ba73c96c7ceae3a326a8674502a5e45818723d59 Mon Sep 17 00:00:00 2001 From: Karan Lathiya <2810karanlathiya@gmail.com> Date: Mon, 1 Dec 2025 10:07:42 +0530 Subject: [PATCH 4/4] Fix: update validation functions to return false for invalid field types instead of panicking --- baked_in.go | 4 ++-- validator_test.go | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/baked_in.go b/baked_in.go index 7aedc967..c408d547 100644 --- a/baked_in.go +++ b/baked_in.go @@ -538,7 +538,7 @@ func isPrintableASCII(fl FieldLevel) bool { if field.Kind() == reflect.String { return printableASCIIRegex().MatchString(field.String()) } - panic(fmt.Sprintf("Bad field type %s", field.Type())) + return false } // isASCII is the validation function for validating if the field's value is a valid ASCII character. @@ -547,7 +547,7 @@ func isASCII(fl FieldLevel) bool { if field.Kind() == reflect.String { return aSCIIRegex().MatchString(field.String()) } - panic(fmt.Sprintf("Bad field type %s", field.Type())) + return false } // isUUID5 is the validation function for validating if the field's value is a valid v5 UUID. diff --git a/validator_test.go b/validator_test.go index 73e6fb63..d4160bfd 100644 --- a/validator_test.go +++ b/validator_test.go @@ -3904,7 +3904,7 @@ func TestMultibyteValidation(t *testing.T) { func TestPrintableASCIIValidation(t *testing.T) { tests := []struct { - param string + param interface{} expected bool }{ {"", true}, @@ -3918,6 +3918,8 @@ func TestPrintableASCIIValidation(t *testing.T) { {"1234abcDEF", true}, {"newline\n", false}, {"\x19test\x7F", false}, + {[]int{3000}, false}, + {1, false}, } validate := New() @@ -3940,13 +3942,11 @@ func TestPrintableASCIIValidation(t *testing.T) { } } } - PanicMatches(t, func() { _ = validate.Var([]int{3000}, "printascii") }, "Bad field type []int") - PanicMatches(t, func() { _ = validate.Var(1, "printascii") }, "Bad field type int") } func TestASCIIValidation(t *testing.T) { tests := []struct { - param string + param interface{} expected bool }{ {"", true}, @@ -3959,6 +3959,8 @@ func TestASCIIValidation(t *testing.T) { {"test@example.com", true}, {"1234abcDEF", true}, {"", true}, + {[]int{3000}, false}, + {1, false}, } validate := New() @@ -3981,8 +3983,6 @@ func TestASCIIValidation(t *testing.T) { } } } - PanicMatches(t, func() { _ = validate.Var([]int{3000}, "ascii") }, "Bad field type []int") - PanicMatches(t, func() { _ = validate.Var(1, "ascii") }, "Bad field type int") } func TestUUID5Validation(t *testing.T) {