atagen

malice

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

Blame: crates/malice-push/src/env.rs

aa3dce5114d0atagen2026-10-26 06:09 UTC1
use std::path::Path;
aa3dce5114d0atagen2026-10-26 06:09 UTC2
aa3dce5114d0atagen2026-10-26 06:09 UTC3
use crate::{Allowlist, Sender, Vapid};
aa3dce5114d0atagen2026-10-26 06:09 UTC4
aa3dce5114d0atagen2026-10-26 06:09 UTC5
/// `MALICE_PUBLIC_URL`, the origin browsers and the homeserver reach this server at.
aa3dce5114d0atagen2026-10-26 06:09 UTC6
pub fn public_url() -> Option<String> {
aa3dce5114d0atagen2026-10-26 06:09 UTC7
    let url = std::env::var("MALICE_PUBLIC_URL").ok()?;
aa3dce5114d0atagen2026-10-26 06:09 UTC8
    let url = url.trim().trim_end_matches('/');
aa3dce5114d0atagen2026-10-26 06:09 UTC9
    match url::Url::parse(url) {
aa3dce5114d0atagen2026-10-26 06:09 UTC10
        Ok(parsed) if matches!(parsed.scheme(), "http" | "https") && parsed.has_host() => {
aa3dce5114d0atagen2026-10-26 06:09 UTC11
            Some(url.to_owned())
aa3dce5114d0atagen2026-10-26 06:09 UTC12
        }
aa3dce5114d0atagen2026-10-26 06:09 UTC13
        _ => {
aa3dce5114d0atagen2026-10-26 06:09 UTC14
            tracing::warn!("ignoring MALICE_PUBLIC_URL, it is not an http(s) URL");
aa3dce5114d0atagen2026-10-26 06:09 UTC15
            None
aa3dce5114d0atagen2026-10-26 06:09 UTC16
        }
aa3dce5114d0atagen2026-10-26 06:09 UTC17
    }
aa3dce5114d0atagen2026-10-26 06:09 UTC18
}
aa3dce5114d0atagen2026-10-26 06:09 UTC19
aa3dce5114d0atagen2026-10-26 06:09 UTC20
/// The VAPID `sub`: `MALICE_PUSH_CONTACT`, else the public URL.
aa3dce5114d0atagen2026-10-26 06:09 UTC21
pub fn contact(public_url: Option<&str>) -> String {
aa3dce5114d0atagen2026-10-26 06:09 UTC22
    std::env::var("MALICE_PUSH_CONTACT")
aa3dce5114d0atagen2026-10-26 06:09 UTC23
        .ok()
aa3dce5114d0atagen2026-10-26 06:09 UTC24
        .map(|contact| contact.trim().to_owned())
aa3dce5114d0atagen2026-10-26 06:09 UTC25
        .filter(|contact| contact.starts_with("mailto:") || contact.starts_with("https://"))
aa3dce5114d0atagen2026-10-26 06:09 UTC26
        .or_else(|| {
aa3dce5114d0atagen2026-10-26 06:09 UTC27
            public_url
aa3dce5114d0atagen2026-10-26 06:09 UTC28
                .filter(|url| url.starts_with("https://"))
aa3dce5114d0atagen2026-10-26 06:09 UTC29
                .map(str::to_owned)
aa3dce5114d0atagen2026-10-26 06:09 UTC30
        })
aa3dce5114d0atagen2026-10-26 06:09 UTC31
        .unwrap_or_else(|| "mailto:webpush@localhost".to_owned())
aa3dce5114d0atagen2026-10-26 06:09 UTC32
}
aa3dce5114d0atagen2026-10-26 06:09 UTC33
aa3dce5114d0atagen2026-10-26 06:09 UTC34
/// A sender with the VAPID key kept in `dir`, configured from the environment.
aa3dce5114d0atagen2026-10-26 06:09 UTC35
pub fn sender(dir: &Path, public_url: Option<&str>) -> Result<Sender, String> {
aa3dce5114d0atagen2026-10-26 06:09 UTC36
    let vapid = Vapid::load_or_create(&dir.join("vapid.pk8"))?;
aa3dce5114d0atagen2026-10-26 06:09 UTC37
    Sender::new(vapid, contact(public_url), Allowlist::from_env())
aa3dce5114d0atagen2026-10-26 06:09 UTC38
}