diff --git a/python/protoc_gen_validate/validator.py b/python/protoc_gen_validate/validator.py index db42847d9..6903513e9 100644 --- a/python/protoc_gen_validate/validator.py +++ b/python/protoc_gen_validate/validator.py @@ -377,7 +377,7 @@ def string_template(option_value, name): {%- endif -%} {%- if s['pattern'] %} if re.search(r\'{{ s['pattern'] }}\', {{ name }}) is None: - raise ValidationFailed(\"{{ name }} pattern does not match {{ s['pattern'] }}\") + raise ValidationFailed(\"{{ name }} pattern does not match \" + r\'{{ s['pattern'] }}\') {%- endif -%} {%- if s['prefix'] %} if not {{ name }}.startswith(\"{{ s['prefix'] }}\"): diff --git a/templates/java/register.go b/templates/java/register.go index baf6b7a68..64736179b 100644 --- a/templates/java/register.go +++ b/templates/java/register.go @@ -444,7 +444,7 @@ func (fns javaFuncs) javaStringEscape(s string) string { s = s[1 : len(s)-1] s = strings.ReplaceAll(s, `\u00`, `\x`) s = strings.ReplaceAll(s, `\x`, `\\x`) - // s = strings.ReplaceAll(s, `\`, `\\`) + s = strings.ReplaceAll(s, `\`, `\\`) s = strings.ReplaceAll(s, `"`, `\"`) return `"` + s + `"` } diff --git a/tests/harness/cases/strings.proto b/tests/harness/cases/strings.proto index 19fe29e61..15641617d 100644 --- a/tests/harness/cases/strings.proto +++ b/tests/harness/cases/strings.proto @@ -20,6 +20,8 @@ message StringMinMaxBytes { string val = 1 [(validate.rules).string = {min_by message StringEqualMinMaxBytes { string val = 1 [(validate.rules).string = {min_bytes: 4, max_bytes: 8}]; } message StringPattern { string val = 1 [(validate.rules).string.pattern = "(?i)^[a-z0-9]+$"]; } message StringPatternEscapes { string val = 1 [(validate.rules).string.pattern = "\\* \\\\ \\w"]; } +message StringPatternQuote { string val = 1 [(validate.rules).string.pattern = "^[^\"]*$"]; } +message StringPatternHex { string val = 1 [(validate.rules).string.pattern = "^\\x41+$"]; } message StringPrefix { string val = 1 [(validate.rules).string.prefix = "foo"]; } message StringContains { string val = 1 [(validate.rules).string.contains = "bar"]; } message StringNotContains { string val = 1 [(validate.rules).string.not_contains = "bar"]; } diff --git a/tests/harness/executor/cases.go b/tests/harness/executor/cases.go index c8eb26583..b9ae6a77d 100644 --- a/tests/harness/executor/cases.go +++ b/tests/harness/executor/cases.go @@ -805,6 +805,12 @@ var stringCases = []TestCase{ {"string - pattern (escapes) - invalid", &cases.StringPatternEscapes{Val: "invalid"}, 1}, {"string - pattern (escapes) - invalid (empty)", &cases.StringPatternEscapes{Val: ""}, 1}, + {"string - pattern (quote) - valid", &cases.StringPatternQuote{Val: "no quotes"}, 0}, + {"string - pattern (quote) - invalid", &cases.StringPatternQuote{Val: "has\"quote"}, 1}, + + {"string - pattern (hex) - valid", &cases.StringPatternHex{Val: "AAA"}, 0}, + {"string - pattern (hex) - invalid", &cases.StringPatternHex{Val: "BBB"}, 1}, + {"string - prefix - valid", &cases.StringPrefix{Val: "foobar"}, 0}, {"string - prefix - valid (only)", &cases.StringPrefix{Val: "foo"}, 0}, {"string - prefix - invalid", &cases.StringPrefix{Val: "bar"}, 1},