use crate::named_routes;
pub fn route_url(name: &str, params: &[(&str, &str)]) -> String {
named_routes::resolve(name, params)
}
#[cfg(feature = "crypto")]
pub fn route_url_signed(
name: &str,
params: &[(&str, &str)],
ttl_seconds: u64,
secret: &str,
) -> String {
let path = named_routes::resolve(name, params);
let expires = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs()
.saturating_add(ttl_seconds);
let signer = crate::crypto::encrypt::Signer::new(secret);
let data = format!("{}:{}", path, expires);
let signature = signer.sign(&data);
format!("{}?expires={}&signature={}", path, expires, signature)
}
#[cfg(feature = "crypto")]
pub fn verify_signed_url(
path: &str,
expires: &str,
signature: &str,
secret: &str,
) -> bool {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let expires_secs: u64 = match expires.parse() {
Ok(e) => e,
Err(_) => return false,
};
if now > expires_secs {
return false;
}
let data = format!("{}:{}", path, expires);
let signer = crate::crypto::encrypt::Signer::new(secret);
signer.verify(&data, signature)
}