File size: 1,777 Bytes
224e773 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | //! ERE Five-gate protocol
use crate::Result;
use hyperkitty_core::Error;
pub struct EreGates {
pub p1_no_secrets: bool,
pub p2_no_eval: bool,
pub p3_loop_safety: bool,
pub p4_no_telemetry: bool,
}
impl EreGates {
pub fn new() -> Self {
EreGates {
p1_no_secrets: true,
p2_no_eval: true,
p3_loop_safety: true,
p4_no_telemetry: true,
}
}
pub fn check_p1_no_secrets(content: &str) -> bool {
// Check for credentials/keys
!content.contains("password")
&& !content.contains("token")
&& !content.contains("secret")
}
pub fn check_p2_no_eval(content: &str) -> bool {
// Check for eval/exec
!content.contains("eval") && !content.contains("exec")
}
pub fn check_p3_loop_safety(_content: &str) -> bool {
// Stub: always safe
true
}
pub fn check_p4_no_telemetry(content: &str) -> bool {
// Check for telemetry/beacons
!content.contains("beacon") && !content.contains("telemetry")
}
pub fn all_pass(&self) -> bool {
self.p1_no_secrets && self.p2_no_eval && self.p3_loop_safety && self.p4_no_telemetry
}
}
impl Default for EreGates {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn p1_detects_secrets() {
assert!(!EreGates::check_p1_no_secrets("password=admin"));
assert!(EreGates::check_p1_no_secrets("normal content"));
}
#[test]
fn p2_detects_eval() {
assert!(!EreGates::check_p2_no_eval("eval(code)"));
assert!(EreGates::check_p2_no_eval("normal content"));
}
}
|