use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::time::Duration;
use super::{AuthenticatedUser, ClientTransportsRecord, SentinelCredsRecord};
use crate::client::SessionAuth;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdminSessionState {
pub trellis_url: String,
pub nats_servers: String,
pub session_seed: String,
pub session_key: String,
pub contract_digest: String,
pub sentinel_jwt: String,
pub sentinel_seed: String,
pub expires: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct BoundSession {
#[serde(rename = "inboxPrefix")]
pub inbox_prefix: String,
pub expires: String,
pub nats_servers: String,
pub sentinel: SentinelCredsRecord,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct BindResponseBound {
#[serde(rename = "inboxPrefix")]
pub inbox_prefix: String,
pub expires: String,
pub sentinel: SentinelCredsRecord,
pub transports: ClientTransportsRecord,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub(crate) enum BindResponse {
Bound(BindResponseBound),
ApprovalRequired {
approval: Value,
},
ApprovalDenied {
approval: Value,
},
InsufficientCapabilities {
approval: Value,
#[serde(rename = "missingCapabilities")]
missing_capabilities: Vec<String>,
},
}
pub struct AgentLoginChallenge {
pub(crate) flow_id: String,
pub(crate) login_url: String,
pub(crate) session_seed: String,
pub(crate) contract_digest: String,
pub(crate) auth: SessionAuth,
}
pub struct StartAgentLoginOpts<'a> {
pub trellis_url: &'a str,
pub contract_json: &'a str,
}
pub struct AdminLoginOutcome {
pub state: AdminSessionState,
pub user: AuthenticatedUser,
}
pub enum AdminReauthOutcome {
Bound(AdminLoginOutcome),
Flow(AgentLoginChallenge),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeviceIdentity {
#[serde(rename = "identitySeedBase64url")]
pub identity_seed_base64url: String,
#[serde(rename = "publicIdentityKey")]
pub public_identity_key: String,
#[serde(rename = "activationKeyBase64url")]
pub activation_key_base64url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeviceActivationPayload {
pub v: u8,
#[serde(rename = "publicIdentityKey")]
pub public_identity_key: String,
pub nonce: String,
#[serde(rename = "qrMac")]
pub qr_mac: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeviceActivationWaitRequest {
#[serde(rename = "flowId")]
pub flow_id: String,
#[serde(rename = "publicIdentityKey")]
pub public_identity_key: String,
#[serde(rename = "contractDigest", skip_serializing_if = "Option::is_none")]
pub contract_digest: Option<String>,
pub nonce: String,
pub iat: u64,
pub sig: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DeviceConnectInfoRequest {
pub public_identity_key: String,
pub contract_digest: String,
pub iat: u64,
pub sig: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DeviceConnectInfoNativeTransport {
pub nats_servers: Vec<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct DeviceConnectInfoTransports {
pub native: Option<DeviceConnectInfoNativeTransport>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct DeviceConnectInfoSentinel {
pub jwt: String,
pub seed: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct DeviceConnectInfoTransport {
pub sentinel: DeviceConnectInfoSentinel,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum DeviceConnectInfoAuthMode {
DeviceIdentity,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DeviceConnectInfoAuth {
pub mode: DeviceConnectInfoAuthMode,
pub iat_skew_seconds: i64,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DeviceConnectInfo {
pub instance_id: String,
pub deployment_id: String,
pub contract_id: String,
pub contract_digest: String,
pub transports: DeviceConnectInfoTransports,
pub transport: DeviceConnectInfoTransport,
pub auth: DeviceConnectInfoAuth,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DeviceConnectInfoResponse {
pub status: String,
pub connect_info: DeviceConnectInfo,
}
pub struct GetDeviceConnectInfoOpts<'a> {
pub trellis_url: &'a str,
pub public_identity_key: &'a str,
pub identity_seed_base64url: &'a str,
pub contract_digest: &'a str,
pub iat: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeviceActivationActivatedResponse {
pub status: String,
#[serde(rename = "activatedAt")]
pub activated_at: String,
#[serde(rename = "confirmationCode", skip_serializing_if = "Option::is_none")]
pub confirmation_code: Option<String>,
#[serde(rename = "connectInfo")]
pub connect_info: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeviceActivationRejectedResponse {
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeviceActivationPendingResponse {
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "status", rename_all = "lowercase")]
pub enum WaitForDeviceActivationResponse {
Activated {
#[serde(rename = "activatedAt")]
activated_at: String,
#[serde(rename = "confirmationCode", skip_serializing_if = "Option::is_none")]
confirmation_code: Option<String>,
#[serde(rename = "connectInfo")]
connect_info: serde_json::Value,
},
Rejected {
#[serde(skip_serializing_if = "Option::is_none")]
reason: Option<String>,
},
Pending,
}
pub struct WaitForDeviceActivationOpts<'a> {
pub trellis_url: &'a str,
pub flow_id: &'a str,
pub public_identity_key: &'a str,
pub nonce: &'a str,
pub identity_seed_base64url: &'a str,
pub contract_digest: Option<&'a str>,
pub poll_interval: Duration,
}