feat(protocol): define native session credentials
This commit is contained in:
+179
-9
@@ -1,9 +1,9 @@
|
||||
// Code generated by tools/generate.py; DO NOT EDIT.
|
||||
#![allow(non_snake_case)]
|
||||
pub const SCHEMA_SHA256: &str = "b2bb0a8ac8ef56dbc0e1443eeb5b3028be9e71ec2f5fd8e73928d71b7cd9340c";
|
||||
pub const CURRENT_WIRE_VERSION: &str = "1";
|
||||
pub const N_MINUS_1_WIRE_VERSION: &str = "0";
|
||||
pub const N_MINUS_2_WIRE_VERSION: &str = "-1";
|
||||
pub const SCHEMA_SHA256: &str = "dea3dd210c53d5a2d37050dd6afd8b0ac5bb8edcb7ab25a02e4026489ce8a00f";
|
||||
pub const CURRENT_WIRE_VERSION: &str = "2";
|
||||
pub const N_MINUS_1_WIRE_VERSION: &str = "1";
|
||||
pub const N_MINUS_2_WIRE_VERSION: &str = "0";
|
||||
pub type JsonObject = std::collections::BTreeMap<String, String>;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
@@ -30,6 +30,19 @@ fn valid_base64_url(value: &str) -> bool {
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
fn valid_rfc3339_utc(value: &str) -> bool {
|
||||
let bytes = value.as_bytes();
|
||||
if bytes.len() < 20 || bytes.len() > 30 || bytes[4] != b'-' || bytes[7] != b'-' || bytes[10] != b'T' || bytes[13] != b':' || bytes[16] != b':' || *bytes.last().unwrap() != b'Z' { return false; }
|
||||
let digits = |start: usize, end: usize| -> Option<u32> { bytes.get(start..end)?.iter().try_fold(0u32, |value, byte| if byte.is_ascii_digit() { Some(value * 10 + u32::from(*byte - b'0')) } else { None }) };
|
||||
let (year, month, day, hour, minute, second) = match (digits(0, 4), digits(5, 7), digits(8, 10), digits(11, 13), digits(14, 16), digits(17, 19)) { (Some(year), Some(month), Some(day), Some(hour), Some(minute), Some(second)) => (year, month, day, hour, minute, second), _ => return false };
|
||||
if hour > 23 || minute > 59 || second > 59 { return false; }
|
||||
let leap = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
|
||||
let days = match month { 1 | 3 | 5 | 7 | 8 | 10 | 12 => 31, 4 | 6 | 9 | 11 => 30, 2 if leap => 29, 2 => 28, _ => return false };
|
||||
if day == 0 || day > days { return false; }
|
||||
if bytes.len() == 20 { return true; }
|
||||
let fraction = &bytes[20..bytes.len() - 1];
|
||||
bytes[19] == b'.' && !fraction.is_empty() && fraction.len() <= 9 && fraction.iter().all(u8::is_ascii_digit) && *fraction.last().unwrap() != b'0'
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct AllocationPolicy {
|
||||
@@ -165,6 +178,7 @@ impl BrokerSession {
|
||||
self.policySnapshot.validate().map_err(|_| ValidationError::new("policy_snapshot", "invalid_object"))?;
|
||||
if let Some(value) = &self.reconnectDeadline {
|
||||
if value.len() > 64 { return Err(ValidationError::new("reconnect_deadline", "max_length")); }
|
||||
if !valid_rfc3339_utc(value.as_str()) { return Err(ValidationError::new("reconnect_deadline", "invalid_time")); }
|
||||
}
|
||||
if let Some(value) = &self.outcome {
|
||||
if value.len() > 64 { return Err(ValidationError::new("outcome", "max_length")); }
|
||||
@@ -182,8 +196,10 @@ impl BrokerSession {
|
||||
if !self.correlationId.is_empty() && self.correlationId.len() < 1 { return Err(ValidationError::new("correlation_id", "min_length")); }
|
||||
if self.correlationId.len() > 128 { return Err(ValidationError::new("correlation_id", "max_length")); }
|
||||
if self.requestedAt.len() > 64 { return Err(ValidationError::new("requested_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.requestedAt.as_str()) { return Err(ValidationError::new("requested_at", "invalid_time")); }
|
||||
if let Some(value) = &self.endedAt {
|
||||
if value.len() > 64 { return Err(ValidationError::new("ended_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(value.as_str()) { return Err(ValidationError::new("ended_at", "invalid_time")); }
|
||||
}
|
||||
if self.version < 1 { return Err(ValidationError::new("version", "minimum")); }
|
||||
if let Some(value) = &self.requestedDisplayMode {
|
||||
@@ -213,6 +229,40 @@ impl BrokerSession {
|
||||
pub fn effectiveDisplayMode(&self) -> &Option<DisplayMode> { &self.effectiveDisplayMode }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct BrowserAuthenticatedSession {
|
||||
username: String,
|
||||
provider: String,
|
||||
roles: Vec<String>,
|
||||
role: String,
|
||||
}
|
||||
|
||||
impl BrowserAuthenticatedSession {
|
||||
pub fn new(username: String, provider: String, roles: Vec<String>, role: String) -> Result<Self, ValidationError> {
|
||||
let value = Self { username, provider, roles, role };
|
||||
value.validate()?;
|
||||
Ok(value)
|
||||
}
|
||||
pub fn validate(&self) -> Result<(), ValidationError> {
|
||||
if self.username.is_empty() { return Err(ValidationError::new("username", "required")); }
|
||||
if !self.username.is_empty() && self.username.len() < 1 { return Err(ValidationError::new("username", "min_length")); }
|
||||
if self.username.len() > 256 { return Err(ValidationError::new("username", "max_length")); }
|
||||
if self.provider.is_empty() { return Err(ValidationError::new("provider", "required")); }
|
||||
if !self.provider.is_empty() && self.provider.len() < 1 { return Err(ValidationError::new("provider", "min_length")); }
|
||||
if self.provider.len() > 64 { return Err(ValidationError::new("provider", "max_length")); }
|
||||
if self.roles.len() > 16 { return Err(ValidationError::new("roles", "max_items")); }
|
||||
for item in self.roles.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("roles", "min_item_length")); } }
|
||||
for item in self.roles.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("roles", "max_item_length")); } }
|
||||
for item in self.roles.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("roles", "max_item_bytes")); } }
|
||||
if self.role != "user" && self.role != "admin" { return Err(ValidationError::new("role", "invalid_value")); }
|
||||
Ok(())
|
||||
}
|
||||
pub fn username(&self) -> &String { &self.username }
|
||||
pub fn provider(&self) -> &String { &self.provider }
|
||||
pub fn roles(&self) -> &Vec<String> { &self.roles }
|
||||
pub fn role(&self) -> &String { &self.role }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct CapabilityProfile {
|
||||
transport: String,
|
||||
@@ -428,6 +478,7 @@ impl DeviceChallenge {
|
||||
if !self.challenge.is_empty() && self.challenge.len() < 1 { return Err(ValidationError::new("challenge", "min_length")); }
|
||||
if self.challenge.len() > 256 { return Err(ValidationError::new("challenge", "max_length")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
if self.algorithm != "ed25519" { return Err(ValidationError::new("algorithm", "invalid_value")); }
|
||||
if self.signatureFormat != "ed25519-domain-separated-v1" { return Err(ValidationError::new("signature_format", "invalid_value")); }
|
||||
Ok(())
|
||||
@@ -636,6 +687,7 @@ impl EventEnvelope {
|
||||
if self.version < 1 { return Err(ValidationError::new("version", "minimum")); }
|
||||
self.resource.validate().map_err(|_| ValidationError::new("resource", "invalid_object"))?;
|
||||
if self.occurredAt.len() > 64 { return Err(ValidationError::new("occurred_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.occurredAt.as_str()) { return Err(ValidationError::new("occurred_at", "invalid_time")); }
|
||||
if self.correlationId.is_empty() { return Err(ValidationError::new("correlation_id", "required")); }
|
||||
if !self.correlationId.is_empty() && self.correlationId.len() < 1 { return Err(ValidationError::new("correlation_id", "min_length")); }
|
||||
if self.correlationId.len() > 128 { return Err(ValidationError::new("correlation_id", "max_length")); }
|
||||
@@ -789,6 +841,7 @@ impl GatewayDrain {
|
||||
if !self.reason.is_empty() && self.reason.len() < 1 { return Err(ValidationError::new("reason", "min_length")); }
|
||||
if self.reason.len() > 256 { return Err(ValidationError::new("reason", "max_length")); }
|
||||
if self.deadline.len() > 64 { return Err(ValidationError::new("deadline", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.deadline.as_str()) { return Err(ValidationError::new("deadline", "invalid_time")); }
|
||||
Ok(())
|
||||
}
|
||||
pub fn version(&self) -> &String { &self.version }
|
||||
@@ -823,6 +876,7 @@ impl GatewayHeartbeat {
|
||||
if self.gatewayId.len() > 128 { return Err(ValidationError::new("gateway_id", "max_length")); }
|
||||
if self.sequence < 1 { return Err(ValidationError::new("sequence", "minimum")); }
|
||||
if self.observedAt.len() > 64 { return Err(ValidationError::new("observed_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.observedAt.as_str()) { return Err(ValidationError::new("observed_at", "invalid_time")); }
|
||||
if self.activeConnections < 0 { return Err(ValidationError::new("active_connections", "minimum")); }
|
||||
if self.activeConnections > 1000000 { return Err(ValidationError::new("active_connections", "maximum")); }
|
||||
if self.egressKbps < 0 { return Err(ValidationError::new("egress_kbps", "minimum")); }
|
||||
@@ -893,6 +947,8 @@ impl GatewayRegistration {
|
||||
if self.bandwidthCapacityKbps < 1 { return Err(ValidationError::new("bandwidth_capacity_kbps", "minimum")); }
|
||||
if self.bandwidthCapacityKbps > 1000000000 { return Err(ValidationError::new("bandwidth_capacity_kbps", "maximum")); }
|
||||
if self.features.len() > 64 { return Err(ValidationError::new("features", "max_items")); }
|
||||
for item in self.features.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("features", "min_item_length")); } }
|
||||
for item in self.features.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("features", "max_item_length")); } }
|
||||
self.capabilities.validate().map_err(|_| ValidationError::new("capabilities", "invalid_object"))?;
|
||||
if self.protocolMinVersion > self.protocolMaxVersion { return Err(ValidationError::new("protocol_version", "invalid_order")); }
|
||||
Ok(())
|
||||
@@ -1016,6 +1072,7 @@ impl GrantReference {
|
||||
if !self.opaqueValue.is_empty() && self.opaqueValue.len() < 43 { return Err(ValidationError::new("opaque_value", "min_length")); }
|
||||
if self.opaqueValue.len() > 256 { return Err(ValidationError::new("opaque_value", "max_length")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
if self.audience.is_empty() { return Err(ValidationError::new("audience", "required")); }
|
||||
if !self.audience.is_empty() && self.audience.len() < 1 { return Err(ValidationError::new("audience", "min_length")); }
|
||||
if self.audience.len() > 128 { return Err(ValidationError::new("audience", "max_length")); }
|
||||
@@ -1103,6 +1160,8 @@ impl ManifestGateway {
|
||||
if self.id.len() > 128 { return Err(ValidationError::new("id", "max_length")); }
|
||||
if self.addresses.len() < 1 { return Err(ValidationError::new("addresses", "min_items")); }
|
||||
if self.addresses.len() > 4 { return Err(ValidationError::new("addresses", "max_items")); }
|
||||
for item in self.addresses.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("addresses", "min_item_length")); } }
|
||||
for item in self.addresses.iter() { if item.as_bytes().len() > 256 { return Err(ValidationError::new("addresses", "max_item_length")); } }
|
||||
if self.publicIdentity.is_empty() { return Err(ValidationError::new("public_identity", "required")); }
|
||||
if !self.publicIdentity.is_empty() && self.publicIdentity.len() < 1 { return Err(ValidationError::new("public_identity", "min_length")); }
|
||||
if self.publicIdentity.len() > 256 { return Err(ValidationError::new("public_identity", "max_length")); }
|
||||
@@ -1156,13 +1215,54 @@ impl ManifestTunnel {
|
||||
pub fn validate(&self) -> Result<(), ValidationError> {
|
||||
if self.versions.len() < 1 { return Err(ValidationError::new("versions", "min_items")); }
|
||||
if self.versions.len() > 4 { return Err(ValidationError::new("versions", "max_items")); }
|
||||
for item in self.versions.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("versions", "min_item_length")); } }
|
||||
for item in self.versions.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("versions", "max_item_length")); } }
|
||||
if self.features.len() > 32 { return Err(ValidationError::new("features", "max_items")); }
|
||||
for item in self.features.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("features", "min_item_length")); } }
|
||||
for item in self.features.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("features", "max_item_length")); } }
|
||||
Ok(())
|
||||
}
|
||||
pub fn versions(&self) -> &Vec<String> { &self.versions }
|
||||
pub fn features(&self) -> &Vec<String> { &self.features }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct NativeAuthenticatedSession {
|
||||
username: String,
|
||||
provider: String,
|
||||
roles: Vec<String>,
|
||||
role: String,
|
||||
nativeIdentity: NativeSessionIdentity,
|
||||
}
|
||||
|
||||
impl NativeAuthenticatedSession {
|
||||
pub fn new(username: String, provider: String, roles: Vec<String>, role: String, nativeIdentity: NativeSessionIdentity) -> Result<Self, ValidationError> {
|
||||
let value = Self { username, provider, roles, role, nativeIdentity };
|
||||
value.validate()?;
|
||||
Ok(value)
|
||||
}
|
||||
pub fn validate(&self) -> Result<(), ValidationError> {
|
||||
if self.username.is_empty() { return Err(ValidationError::new("username", "required")); }
|
||||
if !self.username.is_empty() && self.username.len() < 1 { return Err(ValidationError::new("username", "min_length")); }
|
||||
if self.username.len() > 256 { return Err(ValidationError::new("username", "max_length")); }
|
||||
if self.provider.is_empty() { return Err(ValidationError::new("provider", "required")); }
|
||||
if !self.provider.is_empty() && self.provider.len() < 1 { return Err(ValidationError::new("provider", "min_length")); }
|
||||
if self.provider.len() > 64 { return Err(ValidationError::new("provider", "max_length")); }
|
||||
if self.roles.len() > 16 { return Err(ValidationError::new("roles", "max_items")); }
|
||||
for item in self.roles.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("roles", "min_item_length")); } }
|
||||
for item in self.roles.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("roles", "max_item_length")); } }
|
||||
for item in self.roles.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("roles", "max_item_bytes")); } }
|
||||
if self.role != "user" && self.role != "admin" { return Err(ValidationError::new("role", "invalid_value")); }
|
||||
self.nativeIdentity.validate().map_err(|_| ValidationError::new("native_identity", "invalid_object"))?;
|
||||
Ok(())
|
||||
}
|
||||
pub fn username(&self) -> &String { &self.username }
|
||||
pub fn provider(&self) -> &String { &self.provider }
|
||||
pub fn roles(&self) -> &Vec<String> { &self.roles }
|
||||
pub fn role(&self) -> &String { &self.role }
|
||||
pub fn nativeIdentity(&self) -> &NativeSessionIdentity { &self.nativeIdentity }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct NativeCredential {
|
||||
deviceId: Option<String>,
|
||||
@@ -1193,8 +1293,10 @@ impl NativeCredential {
|
||||
if !self.refreshToken.is_empty() && self.refreshToken.len() < 1 { return Err(ValidationError::new("refresh_token", "min_length")); }
|
||||
if self.refreshToken.len() > 256 { return Err(ValidationError::new("refresh_token", "max_length")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
if let Some(value) = &self.refreshExpiresAt {
|
||||
if value.len() > 64 { return Err(ValidationError::new("refresh_expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(value.as_str()) { return Err(ValidationError::new("refresh_expires_at", "invalid_time")); }
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -1206,6 +1308,70 @@ impl NativeCredential {
|
||||
pub fn refreshExpiresAt(&self) -> &Option<String> { &self.refreshExpiresAt }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct NativeSessionIdentity {
|
||||
clientDeviceId: String,
|
||||
deviceKeyId: String,
|
||||
}
|
||||
|
||||
impl NativeSessionIdentity {
|
||||
pub fn new(clientDeviceId: String, deviceKeyId: String) -> Result<Self, ValidationError> {
|
||||
let value = Self { clientDeviceId, deviceKeyId };
|
||||
value.validate()?;
|
||||
Ok(value)
|
||||
}
|
||||
pub fn validate(&self) -> Result<(), ValidationError> {
|
||||
if self.clientDeviceId.is_empty() { return Err(ValidationError::new("client_device_id", "required")); }
|
||||
if !self.clientDeviceId.is_empty() && self.clientDeviceId.len() < 1 { return Err(ValidationError::new("client_device_id", "min_length")); }
|
||||
if self.clientDeviceId.len() > 128 { return Err(ValidationError::new("client_device_id", "max_length")); }
|
||||
if self.deviceKeyId.is_empty() { return Err(ValidationError::new("device_key_id", "required")); }
|
||||
if !self.deviceKeyId.is_empty() && self.deviceKeyId.len() < 1 { return Err(ValidationError::new("device_key_id", "min_length")); }
|
||||
if self.deviceKeyId.len() > 128 { return Err(ValidationError::new("device_key_id", "max_length")); }
|
||||
Ok(())
|
||||
}
|
||||
pub fn clientDeviceId(&self) -> &String { &self.clientDeviceId }
|
||||
pub fn deviceKeyId(&self) -> &String { &self.deviceKeyId }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct NativeTunnelCredential {
|
||||
clientDeviceId: String,
|
||||
deviceKeyId: String,
|
||||
certificateChainPem: String,
|
||||
trustBundlePem: String,
|
||||
expiresAt: String,
|
||||
}
|
||||
|
||||
impl NativeTunnelCredential {
|
||||
pub fn new(clientDeviceId: String, deviceKeyId: String, certificateChainPem: String, trustBundlePem: String, expiresAt: String) -> Result<Self, ValidationError> {
|
||||
let value = Self { clientDeviceId, deviceKeyId, certificateChainPem, trustBundlePem, expiresAt };
|
||||
value.validate()?;
|
||||
Ok(value)
|
||||
}
|
||||
pub fn validate(&self) -> Result<(), ValidationError> {
|
||||
if self.clientDeviceId.is_empty() { return Err(ValidationError::new("client_device_id", "required")); }
|
||||
if !self.clientDeviceId.is_empty() && self.clientDeviceId.len() < 1 { return Err(ValidationError::new("client_device_id", "min_length")); }
|
||||
if self.clientDeviceId.len() > 128 { return Err(ValidationError::new("client_device_id", "max_length")); }
|
||||
if self.deviceKeyId.is_empty() { return Err(ValidationError::new("device_key_id", "required")); }
|
||||
if !self.deviceKeyId.is_empty() && self.deviceKeyId.len() < 1 { return Err(ValidationError::new("device_key_id", "min_length")); }
|
||||
if self.deviceKeyId.len() > 128 { return Err(ValidationError::new("device_key_id", "max_length")); }
|
||||
if self.certificateChainPem.is_empty() { return Err(ValidationError::new("certificate_chain_pem", "required")); }
|
||||
if !self.certificateChainPem.is_empty() && self.certificateChainPem.len() < 1 { return Err(ValidationError::new("certificate_chain_pem", "min_length")); }
|
||||
if self.certificateChainPem.len() > 65536 { return Err(ValidationError::new("certificate_chain_pem", "max_length")); }
|
||||
if self.trustBundlePem.is_empty() { return Err(ValidationError::new("trust_bundle_pem", "required")); }
|
||||
if !self.trustBundlePem.is_empty() && self.trustBundlePem.len() < 1 { return Err(ValidationError::new("trust_bundle_pem", "min_length")); }
|
||||
if self.trustBundlePem.len() > 65536 { return Err(ValidationError::new("trust_bundle_pem", "max_length")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
Ok(())
|
||||
}
|
||||
pub fn clientDeviceId(&self) -> &String { &self.clientDeviceId }
|
||||
pub fn deviceKeyId(&self) -> &String { &self.deviceKeyId }
|
||||
pub fn certificateChainPem(&self) -> &String { &self.certificateChainPem }
|
||||
pub fn trustBundlePem(&self) -> &String { &self.trustBundlePem }
|
||||
pub fn expiresAt(&self) -> &String { &self.expiresAt }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct PageInfo {
|
||||
limit: i64,
|
||||
@@ -1268,6 +1434,7 @@ impl ProviderSessionWork {
|
||||
if self.gatewayId.len() > 128 { return Err(ValidationError::new("gateway_id", "max_length")); }
|
||||
if self.reconnectSequence < 0 { return Err(ValidationError::new("reconnect_sequence", "minimum")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
if self.providerProfile != "apollo" { return Err(ValidationError::new("provider_profile", "invalid_value")); }
|
||||
if self.providerIdentity.is_empty() { return Err(ValidationError::new("provider_identity", "required")); }
|
||||
if !self.providerIdentity.is_empty() && self.providerIdentity.len() < 1 { return Err(ValidationError::new("provider_identity", "min_length")); }
|
||||
@@ -1348,6 +1515,8 @@ impl ProviderState {
|
||||
if self.sessionId.len() > 128 { return Err(ValidationError::new("session_id", "max_length")); }
|
||||
if self.state != "starting" && self.state != "ready" && self.state != "disconnected" && self.state != "terminating" && self.state != "terminated" && self.state != "cleanup_pending" && self.state != "failed" { return Err(ValidationError::new("state", "invalid_value")); }
|
||||
if self.channels.len() > 8 { return Err(ValidationError::new("channels", "max_items")); }
|
||||
for item in self.channels.iter() { if item.as_bytes().len() < 1 { return Err(ValidationError::new("channels", "min_item_length")); } }
|
||||
for item in self.channels.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("channels", "max_item_length")); } }
|
||||
Ok(())
|
||||
}
|
||||
pub fn version(&self) -> &String { &self.version }
|
||||
@@ -1414,6 +1583,7 @@ impl ReauthGrant {
|
||||
if !self.purpose.is_empty() && self.purpose.len() < 1 { return Err(ValidationError::new("purpose", "min_length")); }
|
||||
if self.purpose.len() > 64 { return Err(ValidationError::new("purpose", "max_length")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
Ok(())
|
||||
}
|
||||
pub fn token(&self) -> &String { &self.token }
|
||||
@@ -1630,6 +1800,7 @@ impl SessionAuthority {
|
||||
if self.audience.len() > 256 { return Err(ValidationError::new("audience", "max_length")); }
|
||||
if self.reconnectSequence < 0 { return Err(ValidationError::new("reconnect_sequence", "minimum")); }
|
||||
if self.expiresAt.len() > 64 { return Err(ValidationError::new("expires_at", "max_length")); }
|
||||
if !valid_rfc3339_utc(self.expiresAt.as_str()) { return Err(ValidationError::new("expires_at", "invalid_time")); }
|
||||
self.capabilities.validate().map_err(|_| ValidationError::new("capabilities", "invalid_object"))?;
|
||||
if self.providerProfile != "apollo" { return Err(ValidationError::new("provider_profile", "invalid_value")); }
|
||||
if self.providerIdentity.is_empty() { return Err(ValidationError::new("provider_identity", "required")); }
|
||||
@@ -1654,13 +1825,12 @@ pub struct SessionRequest {
|
||||
deviceKeyId: String,
|
||||
poolId: String,
|
||||
idempotencyKey: String,
|
||||
policySnapshot: AllocationPolicy,
|
||||
requestedDisplayMode: Option<DisplayMode>,
|
||||
}
|
||||
|
||||
impl SessionRequest {
|
||||
pub fn new(clientDeviceId: String, deviceKeyId: String, poolId: String, idempotencyKey: String, policySnapshot: AllocationPolicy, requestedDisplayMode: Option<DisplayMode>) -> Result<Self, ValidationError> {
|
||||
let value = Self { clientDeviceId, deviceKeyId, poolId, idempotencyKey, policySnapshot, requestedDisplayMode };
|
||||
pub fn new(clientDeviceId: String, deviceKeyId: String, poolId: String, idempotencyKey: String, requestedDisplayMode: Option<DisplayMode>) -> Result<Self, ValidationError> {
|
||||
let value = Self { clientDeviceId, deviceKeyId, poolId, idempotencyKey, requestedDisplayMode };
|
||||
value.validate()?;
|
||||
Ok(value)
|
||||
}
|
||||
@@ -1677,7 +1847,6 @@ impl SessionRequest {
|
||||
if self.idempotencyKey.is_empty() { return Err(ValidationError::new("idempotency_key", "required")); }
|
||||
if !self.idempotencyKey.is_empty() && self.idempotencyKey.len() < 1 { return Err(ValidationError::new("idempotency_key", "min_length")); }
|
||||
if self.idempotencyKey.len() > 256 { return Err(ValidationError::new("idempotency_key", "max_length")); }
|
||||
self.policySnapshot.validate().map_err(|_| ValidationError::new("policy_snapshot", "invalid_object"))?;
|
||||
if let Some(value) = &self.requestedDisplayMode {
|
||||
value.validate().map_err(|_| ValidationError::new("requested_display_mode", "invalid_object"))?;
|
||||
}
|
||||
@@ -1687,7 +1856,6 @@ impl SessionRequest {
|
||||
pub fn deviceKeyId(&self) -> &String { &self.deviceKeyId }
|
||||
pub fn poolId(&self) -> &String { &self.poolId }
|
||||
pub fn idempotencyKey(&self) -> &String { &self.idempotencyKey }
|
||||
pub fn policySnapshot(&self) -> &AllocationPolicy { &self.policySnapshot }
|
||||
pub fn requestedDisplayMode(&self) -> &Option<DisplayMode> { &self.requestedDisplayMode }
|
||||
}
|
||||
|
||||
@@ -1799,7 +1967,9 @@ impl VersionNegotiation {
|
||||
pub fn validate(&self) -> Result<(), ValidationError> {
|
||||
if self.supportedVersions.len() < 1 { return Err(ValidationError::new("supported_versions", "min_items")); }
|
||||
if self.supportedVersions.len() > 3 { return Err(ValidationError::new("supported_versions", "max_items")); }
|
||||
for item in self.supportedVersions.iter() { if item.as_bytes().len() > 16 { return Err(ValidationError::new("supported_versions", "max_item_length")); } }
|
||||
if self.features.len() > 64 { return Err(ValidationError::new("features", "max_items")); }
|
||||
for item in self.features.iter() { if item.as_bytes().len() > 64 { return Err(ValidationError::new("features", "max_item_length")); } }
|
||||
Ok(())
|
||||
}
|
||||
pub fn supportedVersions(&self) -> &Vec<String> { &self.supportedVersions }
|
||||
|
||||
Reference in New Issue
Block a user