use ic_agent::identity::SignedDelegation;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct InternetIdentityAuthRequest {
pub kind: String,
pub session_public_key: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_time_to_live: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_pin_authentication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub derivation_origin: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AuthResponseSuccess {
pub delegations: Vec<SignedDelegation>,
pub user_public_key: Vec<u8>,
pub authn_method: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IdentityServiceResponseMessage {
kind: String,
delegations: Option<Vec<SignedDelegation>>,
user_public_key: Option<Vec<u8>>,
authn_method: Option<String>,
text: Option<String>,
}
impl IdentityServiceResponseMessage {
pub fn kind(&self) -> Result<IdentityServiceResponseKind, String> {
match self.kind.as_str() {
"authorize-ready" => Ok(IdentityServiceResponseKind::Ready),
"authorize-client-success" => Ok(IdentityServiceResponseKind::AuthSuccess(
AuthResponseSuccess {
delegations: self.delegations.clone().unwrap_or_default(),
user_public_key: self.user_public_key.clone().unwrap_or_default(),
authn_method: self.authn_method.clone().unwrap_or_default(),
},
)),
"authorize-client-failure" => Ok(IdentityServiceResponseKind::AuthFailure(
self.text.clone().unwrap_or_default(),
)),
other => Err(format!("Unknown response kind: {}", other)),
}
}
}
#[derive(Debug, Clone)]
pub enum IdentityServiceResponseKind {
Ready,
AuthSuccess(AuthResponseSuccess),
AuthFailure(String),
}