src/api2/types.rs: add CERT_FINGERPRINT_SHA256_SCHEMA
This commit is contained in:
		| @ -53,6 +53,8 @@ const_regex!{ | ||||
|     pub DNS_NAME_OR_IP_REGEX = concat!(r"^", DNS_NAME!(), "|",  IPRE!(), r"$"); | ||||
|  | ||||
|     pub PROXMOX_USER_ID_REGEX = concat!(r"^",  USER_NAME_REGEX_STR!(), r"@", PROXMOX_SAFE_ID_REGEX_STR!(), r"$"); | ||||
|  | ||||
|     pub CERT_FINGERPRINT_SHA256_REGEX = r"^(?:[0-9a-fA-F][0-9a-fA-F])(?::[0-9a-fA-F][0-9a-fA-F]){31}$"; | ||||
| } | ||||
|  | ||||
| pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat = | ||||
| @ -64,6 +66,9 @@ pub const IP_FORMAT: ApiStringFormat = | ||||
| pub const PVE_CONFIG_DIGEST_FORMAT: ApiStringFormat = | ||||
|     ApiStringFormat::Pattern(&SHA256_HEX_REGEX); | ||||
|  | ||||
| pub const CERT_FINGERPRINT_SHA256_FORMAT: ApiStringFormat = | ||||
|     ApiStringFormat::Pattern(&CERT_FINGERPRINT_SHA256_REGEX); | ||||
|  | ||||
| pub const PROXMOX_SAFE_ID_FORMAT: ApiStringFormat = | ||||
|     ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); | ||||
|  | ||||
| @ -86,6 +91,13 @@ pub const PASSWORD_FORMAT: ApiStringFormat = | ||||
|     ApiStringFormat::Pattern(&PASSWORD_REGEX); | ||||
|  | ||||
|  | ||||
|  | ||||
| pub const CERT_FINGERPRINT_SHA256_SCHEMA: Schema = StringSchema::new( | ||||
|     "X509 certificate fingerprint (sha256)." | ||||
| ) | ||||
|     .format(&CERT_FINGERPRINT_SHA256_FORMAT) | ||||
|     .schema(); | ||||
|  | ||||
| pub const PROXMOX_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new(r#"\ | ||||
| Prevent changes if current configuration file has different SHA256 digest. | ||||
| This can be used to prevent concurrent modifications. | ||||
| @ -332,6 +344,47 @@ pub struct StorageStatus { | ||||
|  | ||||
| // Regression tests | ||||
|  | ||||
| #[test] | ||||
| fn test_cert_fingerprint_schema() -> Result<(), Error> { | ||||
|  | ||||
|     let schema = CERT_FINGERPRINT_SHA256_SCHEMA; | ||||
|  | ||||
|     let invalid_fingerprints = [ | ||||
|         "86:88:7c:be:26:77:a5:62:67:d9:06:f5:e4::61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|         "88:7C:BE:26:77:a5:62:67:D9:06:f5:e4:14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|         "86:88:7c:be:26:77:a5:62:67:d9:06:f5:e4::14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8:ff", | ||||
|         "XX:88:7c:be:26:77:a5:62:67:d9:06:f5:e4::14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|         "86:88:Y4:be:26:77:a5:62:67:d9:06:f5:e4:14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|         "86:88:0:be:26:77:a5:62:67:d9:06:f5:e4:14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|     ]; | ||||
|  | ||||
|     for fingerprint in invalid_fingerprints.iter() { | ||||
|         if let Ok(_) = parse_simple_value(fingerprint, &schema) { | ||||
|             bail!("test fingerprint '{}' failed -  got Ok() while expection an error.", fingerprint); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     let valid_fingerprints = [ | ||||
|         "86:88:7c:be:26:77:a5:62:67:d9:06:f5:e4:14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|         "86:88:7C:BE:26:77:a5:62:67:D9:06:f5:e4:14:61:3e:20:dc:cd:43:92:07:7f:fb:65:54:6c:ff:d2:96:36:f8", | ||||
|     ]; | ||||
|  | ||||
|     for fingerprint in valid_fingerprints.iter() { | ||||
|         let v = match parse_simple_value(fingerprint, &schema) { | ||||
|             Ok(v) => v, | ||||
|             Err(err) => { | ||||
|                 bail!("unable to parse fingerprint '{}' - {}", fingerprint, err); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         if v != serde_json::json!(fingerprint) { | ||||
|             bail!("unable to parse fingerprint '{}' - got wrong value {:?}", fingerprint, v); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| #[test] | ||||
| fn test_proxmox_user_id_schema() -> Result<(), Error> { | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user