#![cfg(feature = "live-postgres")]
use dsfb_database::live::AllowedQuery;
use sha2::{Digest, Sha256};
const PINNED_SHA256: &str =
"94c3268154a09be6f71ea5adb72dc85ff68eebb7ad7a2773336e02d02cc749db";
fn sha256_hex(bytes: &[u8]) -> String {
let mut h = Sha256::new();
h.update(bytes);
let d = h.finalize();
d.iter().map(|b| format!("{:02x}", b)).collect()
}
#[test]
fn allow_list_is_pinned() {
let concat = AllowedQuery::sql_concat_for_lock();
let got = sha256_hex(concat.as_bytes());
if PINNED_SHA256 == "__DYNAMIC__" {
eprintln!(
"ALLOW-LIST LOCK SENTINEL: pin to PINNED_SHA256 = \"{}\" once text stabilises",
got
);
return;
}
assert_eq!(
got, PINNED_SHA256,
"allow-list SHA-256 drifted.\n expected {}\n got {}\nDid you edit src/live/queries.rs without updating the paper?",
PINNED_SHA256, got
);
}
#[test]
fn every_allowed_query_is_a_select() {
for q in AllowedQuery::ALL.iter() {
let sql = q.sql();
assert!(
sql.trim_start().starts_with("SELECT"),
"allowed query {:?} is not a SELECT: {}",
q,
sql
);
for kw in &[
"INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "CREATE", "TRUNCATE", "GRANT", "REVOKE",
"COPY", "LOCK",
] {
assert!(
!sql.to_uppercase().contains(kw),
"allowed query {:?} contains forbidden keyword {}: {}",
q,
kw,
sql
);
}
}
}