pubky-homeserver 0.12.0

A Pubky homeserver implementation.
Documentation
use std::sync::Arc;

use dav_server::{fakels::FakeLs, DavHandler};
use dav_server_opendalfs::OpendalFs;

use crate::AppContext;
use crate::ConfigToml;

#[derive(Clone)]
pub(crate) struct AppState {
    pub(crate) context: Arc<AppContext>,
    pub(crate) inner_dav_handler: DavHandler,
}

impl AppState {
    pub fn new(context: Arc<AppContext>) -> Self {
        let webdavfs = OpendalFs::new(context.file_service.opendal.admin_operator.clone());
        let inner_dav_handler = DavHandler::builder()
            .filesystem(webdavfs)
            .locksystem(FakeLs::new())
            .strip_prefix("/dav")
            .autoindex(true)
            .build_handler();
        Self {
            inner_dav_handler,
            context,
        }
    }

    pub(crate) fn admin_password(&self) -> &str {
        &self.context.config_toml.admin.admin_password
    }

    pub(crate) fn public_key(&self) -> String {
        self.context.keypair.public_key().z32()
    }

    pub(crate) fn pkarr_pubky_address(&self) -> Option<String> {
        pkarr_pubky_tls_address(&self.context.config_toml)
    }

    pub(crate) fn pkarr_icann_domain(&self) -> Option<String> {
        pkarr_icann_domain(&self.context.config_toml)
    }

    pub(crate) fn version(&self) -> &'static str {
        env!("CARGO_PKG_VERSION")
    }

    #[cfg(test)]
    pub(crate) fn test_server(context: &Arc<AppContext>) -> axum_test::TestServer {
        axum_test::TestServer::new(super::app::create_app(Self::new(Arc::clone(context)))).unwrap()
    }
}

fn pkarr_pubky_tls_address(config: &ConfigToml) -> Option<String> {
    let port = config
        .pkdns
        .public_pubky_tls_port
        .unwrap_or(config.drive.pubky_listen_socket.port());

    if port == 0 {
        return None;
    }

    Some(format!("{}:{}", config.pkdns.public_ip, port))
}

fn pkarr_icann_domain(config: &ConfigToml) -> Option<String> {
    let domain = config.pkdns.icann_domain.as_ref()?;
    let port = config
        .pkdns
        .public_icann_http_port
        .unwrap_or(config.drive.icann_listen_socket.port());

    if port == 0 {
        return None;
    }

    Some(format!("{}:{}", domain.0, port))
}