qualia_core_db/net/
fetch_10d.rs1use crate::container_10d;
4use crate::net::disclosure::NetworkDisclosureRegistry;
5
6pub struct Fetch10dService {
7 }
9
10impl Fetch10dService {
11 pub fn new() -> Self {
12 Self {}
13 }
14
15 pub fn fetch_10d_by_hash(
18 &self,
19 hash: &str,
20 endpoint: &str,
21 registry: &NetworkDisclosureRegistry,
22 ) -> Result<Vec<u8>, String> {
23 if !registry.check_egress_consent("fetch_10d", endpoint) {
25 return Err(format!("Consent denied to fetch from {}", endpoint));
26 }
27
28 let bytes = self.mock_network_fetch(endpoint, hash)?;
30
31 let mut verify_bytes = bytes.clone();
35 if let Err(e) = container_10d::verify_whole_file_crc32c(&mut verify_bytes) {
36 return Err(format!("CRC-32C verification failed: {}", e));
37 }
38
39 Ok(bytes)
40 }
41
42 fn mock_network_fetch(&self, _endpoint: &str, _hash: &str) -> Result<Vec<u8>, String> {
43 Ok(vec![0; 64]) }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn test_fetch_10d_egress() {
55 let fetcher = Fetch10dService::new();
56 let mut registry = NetworkDisclosureRegistry::new();
57
58 let endpoint = "https://assets.example.com";
59 let hash = "abc123hash";
60
61 let res1 = fetcher.fetch_10d_by_hash(hash, endpoint, ®istry);
63 assert!(res1.is_err());
64 assert!(res1.unwrap_err().contains("Consent denied"));
65
66 registry.register_egress(
68 "fetch_10d",
69 endpoint,
70 "Fetch 10d asset by hash",
71 "User requests asset",
72 );
73
74 let res2 = fetcher.fetch_10d_by_hash(hash, endpoint, ®istry);
77 assert!(res2.is_err());
78 assert!(res2.unwrap_err().contains("CRC"));
79 }
80}