// Copyright 2023 Buf Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto2"; package validate; option go_package = "github.com/envoyproxy/protoc-gen-validate/validate"; option java_package = "io.envoyproxy.pgv.validate"; import "google/protobuf/descriptor.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; // Validation rules applied at the message level extend google.protobuf.MessageOptions { // Disabled nullifies any validation rules for this message, including any // message fields associated with it that do support validation. optional bool disabled = 1071; // Ignore skips generation of validation methods for this message. optional bool ignored = 1072; } // Validation rules applied at the oneof level extend google.protobuf.OneofOptions { // Required ensures that exactly one the field options in a oneof is set; // validation fails if no fields in the oneof are set. optional bool required = 1071; } // Validation rules applied at the field level extend google.protobuf.FieldOptions { // Rules specify the validations to be performed on this field. By default, // no validation is performed against a field. optional FieldRules rules = 1071; } // FieldRules encapsulates the rules for each type of field. Depending on the // field, the correct set should be used to ensure proper validations. message FieldRules { optional MessageRules message = 17; oneof type { // Scalar Field Types FloatRules float = 1; DoubleRules double = 2; Int32Rules int32 = 3; Int64Rules int64 = 4; UInt32Rules uint32 = 5; UInt64Rules uint64 = 6; SInt32Rules sint32 = 7; SInt64Rules sint64 = 8; Fixed32Rules fixed32 = 9; Fixed64Rules fixed64 = 10; SFixed32Rules sfixed32 = 11; SFixed64Rules sfixed64 = 12; BoolRules bool = 13; StringRules string = 14; BytesRules bytes = 15; // Complex Field Types EnumRules enum = 16; RepeatedRules repeated = 18; MapRules map = 19; // Well-Known Field Types AnyRules any = 20; DurationRules duration = 21; TimestampRules timestamp = 22; } } // FloatRules describes the constraints applied to `float` values message FloatRules { // Const specifies that this field must be exactly the specified value optional float const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional float lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional float lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional float gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional float gte = 5; // In specifies that this field must be equal to one of the specified // values repeated float in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated float not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // DoubleRules describes the constraints applied to `double` values message DoubleRules { // Const specifies that this field must be exactly the specified value optional double const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional double lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional double lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional double gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional double gte = 5; // In specifies that this field must be equal to one of the specified // values repeated double in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated double not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // Int32Rules describes the constraints applied to `int32` values message Int32Rules { // Const specifies that this field must be exactly the specified value optional int32 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional int32 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional int32 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional int32 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional int32 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated int32 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated int32 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // Int64Rules describes the constraints applied to `int64` values message Int64Rules { // Const specifies that this field must be exactly the specified value optional int64 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional int64 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional int64 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional int64 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional int64 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated int64 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated int64 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // UInt32Rules describes the constraints applied to `uint32` values message UInt32Rules { // Const specifies that this field must be exactly the specified value optional uint32 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional uint32 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional uint32 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional uint32 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional uint32 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated uint32 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated uint32 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // UInt64Rules describes the constraints applied to `uint64` values message UInt64Rules { // Const specifies that this field must be exactly the specified value optional uint64 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional uint64 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional uint64 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional uint64 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional uint64 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated uint64 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated uint64 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // SInt32Rules describes the constraints applied to `sint32` values message SInt32Rules { // Const specifies that this field must be exactly the specified value optional sint32 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional sint32 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional sint32 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional sint32 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional sint32 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated sint32 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated sint32 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // SInt64Rules describes the constraints applied to `sint64` values message SInt64Rules { // Const specifies that this field must be exactly the specified value optional sint64 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional sint64 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional sint64 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional sint64 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional sint64 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated sint64 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated sint64 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // Fixed32Rules describes the constraints applied to `fixed32` values message Fixed32Rules { // Const specifies that this field must be exactly the specified value optional fixed32 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional fixed32 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional fixed32 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional fixed32 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional fixed32 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated fixed32 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated fixed32 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // Fixed64Rules describes the constraints applied to `fixed64` values message Fixed64Rules { // Const specifies that this field must be exactly the specified value optional fixed64 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional fixed64 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional fixed64 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional fixed64 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional fixed64 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated fixed64 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated fixed64 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // SFixed32Rules describes the constraints applied to `sfixed32` values message SFixed32Rules { // Const specifies that this field must be exactly the specified value optional sfixed32 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional sfixed32 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional sfixed32 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional sfixed32 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional sfixed32 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated sfixed32 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated sfixed32 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // SFixed64Rules describes the constraints applied to `sfixed64` values message SFixed64Rules { // Const specifies that this field must be exactly the specified value optional sfixed64 const = 1; // Lt specifies that this field must be less than the specified value, // exclusive optional sfixed64 lt = 2; // Lte specifies that this field must be less than or equal to the // specified value, inclusive optional sfixed64 lte = 3; // Gt specifies that this field must be greater than the specified value, // exclusive. If the value of Gt is larger than a specified Lt or Lte, the // range is reversed. optional sfixed64 gt = 4; // Gte specifies that this field must be greater than or equal to the // specified value, inclusive. If the value of Gte is larger than a // specified Lt or Lte, the range is reversed. optional sfixed64 gte = 5; // In specifies that this field must be equal to one of the specified // values repeated sfixed64 in = 6; // NotIn specifies that this field cannot be equal to one of the specified // values repeated sfixed64 not_in = 7; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 8; } // BoolRules describes the constraints applied to `bool` values message BoolRules { // Const specifies that this field must be exactly the specified value optional bool const = 1; } // StringRules describe the constraints applied to `string` values message StringRules { // Const specifies that this field must be exactly the specified value optional string const = 1; // Len specifies that this field must be the specified number of // characters (Unicode code points). Note that the number of // characters may differ from the number of bytes in the string. optional uint64 len = 19; // MinLen specifies that this field must be the specified number of // characters (Unicode code points) at a minimum. Note that the number of // characters may differ from the number of bytes in the string. optional uint64 min_len = 2; // MaxLen specifies that this field must be the specified number of // characters (Unicode code points) at a maximum. Note that the number of // characters may differ from the number of bytes in the string. optional uint64 max_len = 3; // LenBytes specifies that this field must be the specified number of bytes optional uint64 len_bytes = 20; // MinBytes specifies that this field must be the specified number of bytes // at a minimum optional uint64 min_bytes = 4; // MaxBytes specifies that this field must be the specified number of bytes // at a maximum optional uint64 max_bytes = 5; // Pattern specifies that this field must match against the specified // regular expression (RE2 syntax). The included expression should elide // any delimiters. optional string pattern = 6; // Prefix specifies that this field must have the specified substring at // the beginning of the string. optional string prefix = 7; // Suffix specifies that this field must have the specified substring at // the end of the string. optional string suffix = 8; // Contains specifies that this field must have the specified substring // anywhere in the string. optional string contains = 9; // NotContains specifies that this field cannot have the specified substring // anywhere in the string. optional string not_contains = 23; // In specifies that this field must be equal to one of the specified // values repeated string in = 10; // NotIn specifies that this field cannot be equal to one of the specified // values repeated string not_in = 11; // WellKnown rules provide advanced constraints against common string // patterns oneof well_known { // Email specifies that the field must be a valid email address as // defined by RFC 5322 bool email = 12; // Hostname specifies that the field must be a valid hostname as // defined by RFC 1034. This constraint does not support // internationalized domain names (IDNs). bool hostname = 13; // Ip specifies that the field must be a valid IP (v4 or v6) address. // Valid IPv6 addresses should not include surrounding square brackets. bool ip = 14; // Ipv4 specifies that the field must be a valid IPv4 address. bool ipv4 = 15; // Ipv6 specifies that the field must be a valid IPv6 address. Valid // IPv6 addresses should not include surrounding square brackets. bool ipv6 = 16; // Uri specifies that the field must be a valid, absolute URI as defined // by RFC 3986 bool uri = 17; // UriRef specifies that the field must be a valid URI as defined by RFC // 3986 and may be relative or absolute. bool uri_ref = 18; // Address specifies that the field must be either a valid hostname as // defined by RFC 1034 (which does not support internationalized domain // names or IDNs), or it can be a valid IP (v4 or v6). bool address = 21; // Uuid specifies that the field must be a valid UUID as defined by // RFC 4122 bool uuid = 22; // WellKnownRegex specifies a common well known pattern defined as a regex. KnownRegex well_known_regex = 24; } // This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable // strict header validation. // By default, this is true, and HTTP header validations are RFC-compliant. // Setting to false will enable a looser validations that only disallows // \r\n\0 characters, which can be used to bypass header matching rules. optional bool strict = 25 [default = true]; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 26; } // WellKnownRegex contain some well-known patterns. enum KnownRegex { UNKNOWN = 0; // HTTP header name as defined by RFC 7230. HTTP_HEADER_NAME = 1; // HTTP header value as defined by RFC 7230. HTTP_HEADER_VALUE = 2; } // BytesRules describe the constraints applied to `bytes` values message BytesRules { // Const specifies that this field must be exactly the specified value optional bytes const = 1; // Len specifies that this field must be the specified number of bytes optional uint64 len = 13; // MinLen specifies that this field must be the specified number of bytes // at a minimum optional uint64 min_len = 2; // MaxLen specifies that this field must be the specified number of bytes // at a maximum optional uint64 max_len = 3; // Pattern specifies that this field must match against the specified // regular expression (RE2 syntax). The included expression should elide // any delimiters. optional string pattern = 4; // Prefix specifies that this field must have the specified bytes at the // beginning of the string. optional bytes prefix = 5; // Suffix specifies that this field must have the specified bytes at the // end of the string. optional bytes suffix = 6; // Contains specifies that this field must have the specified bytes // anywhere in the string. optional bytes contains = 7; // In specifies that this field must be equal to one of the specified // values repeated bytes in = 8; // NotIn specifies that this field cannot be equal to one of the specified // values repeated bytes not_in = 9; // WellKnown rules provide advanced constraints against common byte // patterns oneof well_known { // Ip specifies that the field must be a valid IP (v4 or v6) address in // byte format bool ip = 10; // Ipv4 specifies that the field must be a valid IPv4 address in byte // format bool ipv4 = 11; // Ipv6 specifies that the field must be a valid IPv6 address in byte // format bool ipv6 = 12; } // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 14; } // EnumRules describe the constraints applied to enum values message EnumRules { // Const specifies that this field must be exactly the specified value optional int32 const = 1; // DefinedOnly specifies that this field must be only one of the defined // values for this enum, failing on any undefined value. optional bool defined_only = 2; // In specifies that this field must be equal to one of the specified // values repeated int32 in = 3; // NotIn specifies that this field cannot be equal to one of the specified // values repeated int32 not_in = 4; } // MessageRules describe the constraints applied to embedded message values. // For message-type fields, validation is performed recursively. message MessageRules { // Skip specifies that the validation rules of this field should not be // evaluated optional bool skip = 1; // Required specifies that this field must be set optional bool required = 2; } // RepeatedRules describe the constraints applied to `repeated` values message RepeatedRules { // MinItems specifies that this field must have the specified number of // items at a minimum optional uint64 min_items = 1; // MaxItems specifies that this field must have the specified number of // items at a maximum optional uint64 max_items = 2; // Unique specifies that all elements in this field must be unique. This // constraint is only applicable to scalar and enum types (messages are not // supported). optional bool unique = 3; // Items specifies the constraints to be applied to each item in the field. // Repeated message fields will still execute validation against each item // unless skip is specified here. optional FieldRules items = 4; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 5; } // MapRules describe the constraints applied to `map` values message MapRules { // MinPairs specifies that this field must have the specified number of // KVs at a minimum optional uint64 min_pairs = 1; // MaxPairs specifies that this field must have the specified number of // KVs at a maximum optional uint64 max_pairs = 2; // NoSparse specifies values in this field cannot be unset. This only // applies to map's with message value types. optional bool no_sparse = 3; // Keys specifies the constraints to be applied to each key in the field. optional FieldRules keys = 4; // Values specifies the constraints to be applied to the value of each key // in the field. Message values will still have their validations evaluated // unless skip is specified here. optional FieldRules values = 5; // IgnoreEmpty specifies that the validation rules of this field should be // evaluated only if the field is not empty optional bool ignore_empty = 6; } // AnyRules describe constraints applied exclusively to the // `google.protobuf.Any` well-known type message AnyRules { // Required specifies that this field must be set optional bool required = 1; // In specifies that this field's `type_url` must be equal to one of the // specified values. repeated string in = 2; // NotIn specifies that this field's `type_url` must not be equal to any of // the specified values. repeated string not_in = 3; } // DurationRules describe the constraints applied exclusively to the // `google.protobuf.Duration` well-known type message DurationRules { // Required specifies that this field must be set optional bool required = 1; // Const specifies that this field must be exactly the specified value optional google.protobuf.Duration const = 2; // Lt specifies that this field must be less than the specified value, // exclusive optional google.protobuf.Duration lt = 3; // Lt specifies that this field must be less than the specified value, // inclusive optional google.protobuf.Duration lte = 4; // Gt specifies that this field must be greater than the specified value, // exclusive optional google.protobuf.Duration gt = 5; // Gte specifies that this field must be greater than the specified value, // inclusive optional google.protobuf.Duration gte = 6; // In specifies that this field must be equal to one of the specified // values repeated google.protobuf.Duration in = 7; // NotIn specifies that this field cannot be equal to one of the specified // values repeated google.protobuf.Duration not_in = 8; } // TimestampRules describe the constraints applied exclusively to the // `google.protobuf.Timestamp` well-known type message TimestampRules { // Required specifies that this field must be set optional bool required = 1; // Const specifies that this field must be exactly the specified value optional google.protobuf.Timestamp const = 2; // Lt specifies that this field must be less than the specified value, // exclusive optional google.protobuf.Timestamp lt = 3; // Lte specifies that this field must be less than the specified value, // inclusive optional google.protobuf.Timestamp lte = 4; // Gt specifies that this field must be greater than the specified value, // exclusive optional google.protobuf.Timestamp gt = 5; // Gte specifies that this field must be greater than the specified value, // inclusive optional google.protobuf.Timestamp gte = 6; // LtNow specifies that this must be less than the current time. LtNow // can only be used with the Within rule. optional bool lt_now = 7; // GtNow specifies that this must be greater than the current time. GtNow // can only be used with the Within rule. optional bool gt_now = 8; // Within specifies that this field must be within this duration of the // current time. This constraint can be used alone or with the LtNow and // GtNow rules. optional google.protobuf.Duration within = 9; }