use crate::core::webserver; use crate::tls::acme::{account, order}; use crate::utils::lazylock::CHALLENGES; use axum::body::Body; use axum::extract::State; use axum::http::{Response, StatusCode}; use axum::response::IntoResponse; #[allow(clippy::needless_return)] pub async fn acme_create(State(state): State) -> impl IntoResponse { match account::load_or_create(state.cert_creds.as_str()).await { Ok(txt) => { return Response::builder() .status(StatusCode::OK) .header("Content-Type", "text/plain") .body(Body::from(txt)) .unwrap_or_else(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Internal Server Error\n").into_response()); } Err(e) => { return (StatusCode::INTERNAL_SERVER_ERROR, format!("Failed to create account {}\n", e)).into_response(); } }; } #[allow(clippy::needless_return)] pub async fn acme_order(State(state): State, axum::extract::Path(domain): axum::extract::Path) -> impl IntoResponse { let domain_clean = domain.trim_matches('/'); match order::order(domain_clean, state.cert_creds.as_str(), state.certs_dir, state.acme_dns_provider).await { Ok(txt) => { return Response::builder() .status(StatusCode::OK) .header("Content-Type", "text/plain") .body(Body::from(txt)) .unwrap_or_else(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Internal Server Error\n").into_response()); } Err(e) => { return (StatusCode::INTERNAL_SERVER_ERROR, format!("Internal Server Error: {}\n", e)).into_response(); } }; } pub async fn http01_challenge(axum::extract::Path(token): axum::extract::Path) -> impl IntoResponse { if let Ok(challenges) = CHALLENGES.read() { if let Some(key_authorization) = challenges.get(&token) { return Response::builder() .status(StatusCode::OK) .header("Content-Type", "text/plain") .body(Body::from(key_authorization.clone())) .unwrap_or_else(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Internal Server Error\n").into_response()); } } (StatusCode::NOT_FOUND, "Not found\n").into_response() }