this_env/env/methods/
resolve.rs1use crate::env::structs::{EnvRequestLog, EnvStatus};
8use crate::middleware::env_request::EnvRequestInfo;
9use crate::middleware::env_request::EnvRequest;
10use crate::env::Env;
11use rusqlite::{params, Connection, Result as SqlResult};
12
13impl Env {
14 fn check_if_blocked(req: &EnvRequest) -> Option<String> {
15 let blocked_domains = vec!["malicious.com", "banned.example"];
17 let domain = match req {
18 EnvRequest::Http(http_req) => http_req.headers.get("domain"),
19 EnvRequest::Ws(ws_req) => ws_req.headers.get("domain"),
20 EnvRequest::Cli(_) => None,
21 };
22
23 if let Some(domain) = domain {
24 if blocked_domains.contains(&domain.as_str()) {
25 return Some(format!("Domain '{}' is blocked", domain));
26 }
27 }
28
29 None
30 }
31
32 pub fn resolve(req: &EnvRequest, conn: &Connection) -> EnvStatus {
33 let (domain, _env_type) = match req {
36 EnvRequest::Http(http_req) => {
37 let domain = http_req.headers.get("domain").cloned().unwrap_or_default();
40 let env_type = http_req.headers.get("env_type").cloned().unwrap_or_default();
41 (domain, env_type)
42 }
43 EnvRequest::Ws(ws_req) => {
44 let domain = ws_req.headers.get("domain").cloned().unwrap_or_default();
46 let env_type = ws_req.headers.get("env_type").cloned().unwrap_or_default();
47 (domain, env_type)
48 }
49 EnvRequest::Cli(_cli_req) => {
50 let domain = "localhost".to_string();
51 let env_type = "cli".to_string();
52 (domain, env_type)
53 }
54 };
56
57 let env_found = false;
59 if let Some(reason) = Self::check_if_blocked(req) {
60 log::debug!("this.env resolve: request is explicitly blocked");
61 let mut log_entry: EnvRequestLog = req.clone().into();
63 log_entry.decision = "Blocked".into();
64 log_entry.reason = reason.clone();
65 if let Err(e) = Self::save_log_to_sqlite(conn, &log_entry) {
67 log::error!("this.env resolve: failed to save blocked log: {:?}", e);
68 } else {
69 log::debug!("this.env resolve: blocked log saved to SQLite");
70 }
71 let env_info = EnvRequestInfo::from(req);
72 return EnvStatus::Blocked { env_request: env_info, reason };
73 }
74
75 if env_found {
76 log::debug!("this.env resolve: found existing env");
77 let env_info = EnvRequestInfo::from(req);
79 EnvStatus::Approved { env_request: env_info }
80 } else {
81 log::debug!("this.env resolve: no env found, defaulting to Pending");
82 let mut log_entry: EnvRequestLog = req.clone().into();
84 log_entry.decision = "PendingApproval".into();
85 log_entry.reason = "No existing env found".into();
86
87 if let Err(e) = Self::save_log_to_sqlite(conn, &log_entry) {
89 log::error!("this.env resolve: failed to save log: {:?}", e);
90 } else {
91 log::debug!("this.env resolve: log saved to SQLite");
92 }
93 let env_info = EnvRequestInfo::from(req);
94 EnvStatus::PendingApproval { env_request: env_info, reason: domain }
95 }
96 }
97
98 fn save_log_to_sqlite(conn: &Connection, log: &EnvRequestLog) -> SqlResult<()> {
99 conn.execute(
100 "INSERT INTO env_request_logs (ip, method, path, host, headers, decision, reason, timestamp, domain) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)",
101 params![
102 log.ip.as_deref().unwrap_or("unknown"),
103 log.method,
104 log.path,
105 log.host,
106 log.headers,
107 log.decision,
108 log.reason,
109 log.timestamp,
110 log.domain,
111 ],
112 )?;
113 Ok(())
114 }
115}