serve files from DNS server
This commit is contained in:
@@ -105,6 +105,7 @@ enum HandlerType {
|
|||||||
RequestCertificate,
|
RequestCertificate,
|
||||||
GetCertificate,
|
GetCertificate,
|
||||||
GetCaCertificate,
|
GetCaCertificate,
|
||||||
|
StaticFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GurtHandler for AppHandler {
|
impl GurtHandler for AppHandler {
|
||||||
@@ -179,6 +180,7 @@ impl GurtHandler for AppHandler {
|
|||||||
HandlerType::RequestCertificate => routes::request_certificate(&ctx, app_state).await,
|
HandlerType::RequestCertificate => routes::request_certificate(&ctx, app_state).await,
|
||||||
HandlerType::GetCertificate => routes::get_certificate(&ctx, app_state).await,
|
HandlerType::GetCertificate => routes::get_certificate(&ctx, app_state).await,
|
||||||
HandlerType::GetCaCertificate => routes::get_ca_certificate(&ctx, app_state).await,
|
HandlerType::GetCaCertificate => routes::get_ca_certificate(&ctx, app_state).await,
|
||||||
|
HandlerType::StaticFile => serve_static_file(&ctx).await,
|
||||||
};
|
};
|
||||||
|
|
||||||
let duration = start_time.elapsed();
|
let duration = start_time.elapsed();
|
||||||
@@ -248,7 +250,8 @@ pub async fn start(cli: crate::Cli) -> std::io::Result<()> {
|
|||||||
.route(Route::get("/verify-ownership/*"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::VerifyDomainOwnership })
|
.route(Route::get("/verify-ownership/*"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::VerifyDomainOwnership })
|
||||||
.route(Route::post("/ca/request-certificate"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::RequestCertificate })
|
.route(Route::post("/ca/request-certificate"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::RequestCertificate })
|
||||||
.route(Route::get("/ca/certificate/*"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::GetCertificate })
|
.route(Route::get("/ca/certificate/*"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::GetCertificate })
|
||||||
.route(Route::get("/ca/root"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::GetCaCertificate });
|
.route(Route::get("/ca/root"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::GetCaCertificate })
|
||||||
|
.route(Route::get("/*"), AppHandler { app_state: app_state.clone(), rate_limit_state: None, handler_type: HandlerType::StaticFile });
|
||||||
|
|
||||||
let http_port = 8876;
|
let http_port = 8876;
|
||||||
let ca_bootstrap_server = start_ca_bootstrap_server(app_state.clone(), http_port, config.server.address.clone());
|
let ca_bootstrap_server = start_ca_bootstrap_server(app_state.clone(), http_port, config.server.address.clone());
|
||||||
@@ -320,4 +323,48 @@ async fn get_ca_certificate_content(app_state: &AppState) -> std::result::Result
|
|||||||
Err(format!("No active CA certificate found in database: {}", e).into())
|
Err(format!("No active CA certificate found in database: {}", e).into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn serve_static_file(ctx: &ServerContext) -> Result<GurtResponse> {
|
||||||
|
let path = ctx.path();
|
||||||
|
|
||||||
|
let file_path = if path == "/" || path == "" {
|
||||||
|
"index.html"
|
||||||
|
} else {
|
||||||
|
if path.starts_with('/') {
|
||||||
|
&path[1..]
|
||||||
|
} else {
|
||||||
|
path
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if file_path.contains("..") || file_path.contains('/') || file_path.contains('\\') {
|
||||||
|
return Ok(GurtResponse::new(GurtStatusCode::Forbidden)
|
||||||
|
.with_string_body("Invalid file path"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let frontend_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("frontend");
|
||||||
|
let full_path = frontend_dir.join(file_path);
|
||||||
|
|
||||||
|
match tokio::fs::read_to_string(&full_path).await {
|
||||||
|
Ok(content) => {
|
||||||
|
let content_type = match full_path.extension().and_then(|ext| ext.to_str()) {
|
||||||
|
Some("html") => "text/html",
|
||||||
|
Some("lua") => "text/plain",
|
||||||
|
Some("txt") => "text/plain",
|
||||||
|
Some("js") => "application/javascript",
|
||||||
|
Some("css") => "text/css",
|
||||||
|
Some("json") => "application/json",
|
||||||
|
_ => "text/plain",
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(GurtResponse::ok()
|
||||||
|
.with_header("Content-Type", content_type)
|
||||||
|
.with_string_body(&content))
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
Ok(GurtResponse::new(GurtStatusCode::NotFound)
|
||||||
|
.with_string_body("File not found"))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user