sys/sysmod/http/
priv_index.rs

1use std::collections::BTreeMap;
2
3use super::{HttpConfig, priv_camera};
4use actix_web::{HttpRequest, HttpResponse, Responder, http::header::ContentType, web};
5use utils::netutil;
6
7pub(super) fn server_config() -> impl Fn(&mut web::ServiceConfig, &HttpConfig) + Clone {
8    move |cfg: &mut web::ServiceConfig, http_config: &HttpConfig| {
9        if !http_config.priv_enabled {
10            return;
11        }
12        cfg.service(index_get);
13        cfg.service(priv_camera::take_post);
14        cfg.service(priv_camera::history_get);
15        cfg.service(priv_camera::archive_get);
16        cfg.service(priv_camera::history_post);
17        cfg.service(priv_camera::archive_post);
18        cfg.service(priv_camera::pic_history_get);
19        cfg.service(priv_camera::pic_archive_get);
20        cfg.service(priv_camera::index_get);
21    }
22}
23
24#[actix_web::get("/")]
25async fn index_get(req: HttpRequest) -> impl Responder {
26    let mut sorted = BTreeMap::new();
27    for (k, v) in req.headers() {
28        sorted.insert(k.as_str(), v.to_str().unwrap_or_default());
29    }
30
31    let mut header_str = String::new();
32    for (k, v) in sorted {
33        let k = netutil::html_escape(k);
34        let v = netutil::html_escape(v);
35        header_str.push_str(&format!("      <li>{k}: {v}</li>\n"));
36    }
37
38    let body = format!(
39        r#"<!DOCTYPE html>
40<html lang="en">
41  <head>
42    <title>(Privileged) House Management System Web Interface</title>
43  </head>
44  <body>
45    <h1>(Privileged) House Management System Web Interface</h1>
46
47    <h2>Caution</h2>
48    <p>This backend program does not provide any security schemes.</p>
49    <p>Check again the front server settings for client authentication.</p>
50
51    <h2>HTTP Headers</h2>
52    <ul>
53      {}
54    </ul>
55
56    <h2>Camera</h2>
57    <p><a href="./camera/">Camera Main Page</a></p>
58  </body>
59</html>
60"#,
61        header_str.trim()
62    );
63
64    HttpResponse::Ok()
65        .content_type(ContentType::html())
66        .body(body)
67}