synpad 0.1.0

A full-featured Matrix chat client built with Dioxus
use matrix_sdk::Client;

/// Cross-signing setup state.
#[derive(Clone, Debug, PartialEq)]
pub enum CrossSigningState {
    /// Cross-signing not set up
    NotSetUp,
    /// Cross-signing setup in progress
    Setting,
    /// Cross-signing is active
    Active,
    /// Error setting up cross-signing
    Error(String),
}

impl Default for CrossSigningState {
    fn default() -> Self {
        Self::NotSetUp
    }
}

/// Check the current cross-signing status.
pub async fn get_cross_signing_status(client: &Client) -> CrossSigningState {
    let encryption = client.encryption();
    match encryption.cross_signing_status().await {
        Some(status) => {
            if status.has_master && status.has_self_signing && status.has_user_signing {
                CrossSigningState::Active
            } else {
                CrossSigningState::NotSetUp
            }
        }
        None => CrossSigningState::NotSetUp,
    }
}

/// Bootstrap cross-signing keys.
///
/// This will create the master, self-signing, and user-signing keys
/// and upload them to the homeserver.
pub async fn bootstrap_cross_signing(client: &Client) -> Result<(), String> {
    let encryption = client.encryption();

    tracing::info!("Bootstrapping cross-signing...");

    encryption
        .bootstrap_cross_signing(None)
        .await
        .map_err(|e| format!("Failed to bootstrap cross-signing: {e}"))?;

    tracing::info!("Cross-signing bootstrapped successfully");
    Ok(())
}