use crate::error::Result;
use crate::ids::{DeviceId, IdentityId};
use chrono::{DateTime, Utc};
use std::collections::HashMap;
use tokio::sync::mpsc;
pub use rvoip_core_traits::identity::{
Credential, CredentialKind, DeviceKind, IdentityAssurance, IdentityKind, Jwk,
};
#[derive(Clone, Debug)]
pub struct Identity {
pub id: IdentityId,
pub display_name: Option<String>,
pub kind: IdentityKind,
pub external_refs: HashMap<String, String>,
pub signing_keys: Vec<Jwk>,
pub assurance: IdentityAssurance,
}
#[derive(Clone, Debug)]
pub struct Device {
pub id: DeviceId,
pub identity_id: IdentityId,
pub kind: DeviceKind,
pub platform: String,
pub registered_at: DateTime<Utc>,
pub device_signing_key: Option<Jwk>,
}
#[derive(Clone, Debug)]
pub struct ReachabilityHint {
pub transport: crate::connection::Transport,
pub address: String,
pub device_id: DeviceId,
pub priority: u16,
pub expires_at: Option<DateTime<Utc>>,
}
#[derive(Clone, Debug)]
pub struct ReachabilityChange {
pub identity_id: IdentityId,
pub kind: ReachabilityChangeKind,
pub hint: ReachabilityHint,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ReachabilityChangeKind {
Added,
Removed,
Updated,
Expired,
}
#[derive(Clone, Debug)]
pub struct DtlsFingerprint {
pub algorithm: String,
pub value: String,
}
pub use crate::adapter::SignatureHeaders;
#[async_trait::async_trait]
pub trait IdentityProvider: Send + Sync {
async fn resolve(&self, identity_ref: &str) -> Result<Identity>;
async fn devices(&self, identity_id: IdentityId) -> Result<Vec<Device>>;
async fn reachable_via(&self, identity_id: IdentityId) -> Result<Vec<ReachabilityHint>>;
async fn authenticate(&self, credential: Credential)
-> Result<(IdentityId, IdentityAssurance)>;
async fn assurance_level(&self, id: IdentityId) -> Result<IdentityAssurance>;
fn subscribe_reachability(&self) -> mpsc::Receiver<ReachabilityChange>;
async fn register_agent_key(&self, _id: IdentityId, _key: Jwk) -> Result<()> {
Err(crate::error::RvoipError::NotImplemented(
"IdentityProvider::register_agent_key",
))
}
async fn verify_signature(
&self,
_id: IdentityId,
_sig: SignatureHeaders,
_body: &[u8],
) -> Result<IdentityAssurance> {
Err(crate::error::RvoipError::NotImplemented(
"IdentityProvider::verify_signature",
))
}
async fn derive_dtls_fingerprint(
&self,
_id: IdentityId,
) -> Result<Option<DtlsFingerprint>> {
Err(crate::error::RvoipError::NotImplemented(
"IdentityProvider::derive_dtls_fingerprint",
))
}
}