caracal 0.2.0

Nostr client for Gemini
use crate::Url;
use crate::nips::nip96;
use nostr::Keys;
use nostr_sdk::prelude::*;
use openssl::hash::MessageDigest;
use openssl::x509::X509;
use windmark_titanesque::context::TitanResource;

pub fn fingerprint(cert: &X509) -> Option<String> {
    use std::fmt::Write;

    match cert.digest(MessageDigest::sha256()) {
        Ok(dbytes) => {
            let digest: String =
                dbytes.iter().fold(String::new(), |mut out, x| {
                    let _ = write!(out, "{:02x}", x);
                    out
                });

            Some(digest)
        }
        Err(_error) => None,
    }
}

/// Upload a file received via the titan protocol to a random NIP-96 server
pub async fn titan96(
    titan_rsc: Option<TitanResource>,
    keys: &Keys,
) -> Option<Url> {
    if let Some(titan) = titan_rsc {
        (nip96::upload_file_data(
            None,
            titan.content,
            titan.mime,
            keys,
        )
        .await).ok()
    } else {
        None
    }
}