atagen

malice

public
Star0
Watch0
1e2ab81040711b2541d55ad742666815c1a846f6
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: crates/malice-server/src/main.rs

dffd63b58af4atagen2026-09-28 09:10 UTC1
use std::path::PathBuf;
973f8fbdaf80atagen2026-09-28 09:10 UTC2
973f8fbdaf80atagen2026-09-28 09:10 UTC3
use malice::{
dffd63b58af4atagen2026-09-28 09:10 UTC4
    routes::router,
973f8fbdaf80atagen2026-09-28 09:10 UTC5
    state::{AppState, ensure_dirs, load_or_create_master_key},
973f8fbdaf80atagen2026-09-28 09:10 UTC6
};
dffd63b58af4atagen2026-09-28 09:10 UTC7
use malice_static::{bind_listener, serve};
973f8fbdaf80atagen2026-09-28 09:10 UTC8
973f8fbdaf80atagen2026-09-28 09:10 UTC9
fn env_flag(name: &str, default: bool) -> bool {
973f8fbdaf80atagen2026-09-28 09:10 UTC10
    match std::env::var(name) {
973f8fbdaf80atagen2026-09-28 09:10 UTC11
        Ok(value) => {
973f8fbdaf80atagen2026-09-28 09:10 UTC12
            let value = value.trim().to_ascii_lowercase();
973f8fbdaf80atagen2026-09-28 09:10 UTC13
            match value.as_str() {
973f8fbdaf80atagen2026-09-28 09:10 UTC14
                "1" | "true" | "yes" | "on" => true,
973f8fbdaf80atagen2026-09-28 09:10 UTC15
                "0" | "false" | "no" | "off" => false,
973f8fbdaf80atagen2026-09-28 09:10 UTC16
                _ => default,
973f8fbdaf80atagen2026-09-28 09:10 UTC17
            }
973f8fbdaf80atagen2026-09-28 09:10 UTC18
        }
973f8fbdaf80atagen2026-09-28 09:10 UTC19
        Err(_) => default,
973f8fbdaf80atagen2026-09-28 09:10 UTC20
    }
973f8fbdaf80atagen2026-09-28 09:10 UTC21
}
973f8fbdaf80atagen2026-09-28 09:10 UTC22
973f8fbdaf80atagen2026-09-28 09:10 UTC23
fn data_dir() -> PathBuf {
973f8fbdaf80atagen2026-09-28 09:10 UTC24
    std::env::var("MALICE_DATA_DIR")
973f8fbdaf80atagen2026-09-28 09:10 UTC25
        .map(PathBuf::from)
973f8fbdaf80atagen2026-09-28 09:10 UTC26
        .unwrap_or_else(|_| PathBuf::from("local-data"))
973f8fbdaf80atagen2026-09-28 09:10 UTC27
}
973f8fbdaf80atagen2026-09-28 09:10 UTC28
973f8fbdaf80atagen2026-09-28 09:10 UTC29
fn web_dir() -> Option<String> {
973f8fbdaf80atagen2026-09-28 09:10 UTC30
    if let Ok(dir) = std::env::var("MALICE_WEB_DIR") {
973f8fbdaf80atagen2026-09-28 09:10 UTC31
        assert!(
973f8fbdaf80atagen2026-09-28 09:10 UTC32
            std::path::Path::new(&dir).join("index.html").is_file(),
973f8fbdaf80atagen2026-09-28 09:10 UTC33
            "MALICE_WEB_DIR must point to built frontend assets containing index.html"
973f8fbdaf80atagen2026-09-28 09:10 UTC34
        );
973f8fbdaf80atagen2026-09-28 09:10 UTC35
        return Some(dir);
973f8fbdaf80atagen2026-09-28 09:10 UTC36
    }
973f8fbdaf80atagen2026-09-28 09:10 UTC37
973f8fbdaf80atagen2026-09-28 09:10 UTC38
    let local = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("web/dist");
973f8fbdaf80atagen2026-09-28 09:10 UTC39
    local
973f8fbdaf80atagen2026-09-28 09:10 UTC40
        .join("index.html")
973f8fbdaf80atagen2026-09-28 09:10 UTC41
        .is_file()
973f8fbdaf80atagen2026-09-28 09:10 UTC42
        .then(|| local.to_string_lossy().into_owned())
973f8fbdaf80atagen2026-09-28 09:10 UTC43
}
973f8fbdaf80atagen2026-09-28 09:10 UTC44
dffd63b58af4atagen2026-09-28 09:10 UTC45
#[tokio::main]
dffd63b58af4atagen2026-09-28 09:10 UTC46
async fn main() {
dffd63b58af4atagen2026-09-28 09:10 UTC47
    tracing_subscriber::fmt()
dffd63b58af4atagen2026-09-28 09:10 UTC48
        .with_env_filter(
dffd63b58af4atagen2026-09-28 09:10 UTC49
            tracing_subscriber::EnvFilter::try_from_default_env()
dffd63b58af4atagen2026-09-28 09:10 UTC50
                .unwrap_or_else(|_| "malice=info,tower_http=info".into()),
dffd63b58af4atagen2026-09-28 09:10 UTC51
        )
dffd63b58af4atagen2026-09-28 09:10 UTC52
        .with_target(false)
dffd63b58af4atagen2026-09-28 09:10 UTC53
        .compact()
dffd63b58af4atagen2026-09-28 09:10 UTC54
        .init();
973f8fbdaf80atagen2026-09-28 09:10 UTC55
973f8fbdaf80atagen2026-09-28 09:10 UTC56
    let data_dir = data_dir();
973f8fbdaf80atagen2026-09-28 09:10 UTC57
    ensure_dirs(&data_dir);
973f8fbdaf80atagen2026-09-28 09:10 UTC58
    let master_key =
973f8fbdaf80atagen2026-09-28 09:10 UTC59
        load_or_create_master_key(&data_dir).expect("loading the master key must succeed");
973f8fbdaf80atagen2026-09-28 09:10 UTC60
    let cookie_secure = env_flag("MALICE_SESSION_COOKIE_SECURE", true);
973f8fbdaf80atagen2026-09-28 09:10 UTC61
    let allow_http_homeserver = env_flag("MALICE_ALLOW_HTTP_HOMESERVER", false);
973f8fbdaf80atagen2026-09-28 09:10 UTC62
    let state = AppState::new(data_dir, master_key, cookie_secure, allow_http_homeserver);
973f8fbdaf80atagen2026-09-28 09:10 UTC63
    let app = router(state.clone(), web_dir());
973f8fbdaf80atagen2026-09-28 09:10 UTC64
    let listener = bind_listener().await;
973f8fbdaf80atagen2026-09-28 09:10 UTC65
    serve(
973f8fbdaf80atagen2026-09-28 09:10 UTC66
        listener,
973f8fbdaf80atagen2026-09-28 09:10 UTC67
        app,
973f8fbdaf80atagen2026-09-28 09:10 UTC68
        async move { state.shutdown_gracefully().await },
973f8fbdaf80atagen2026-09-28 09:10 UTC69
    )
973f8fbdaf80atagen2026-09-28 09:10 UTC70
    .await;
973f8fbdaf80atagen2026-09-28 09:10 UTC71
}