//! P8 hardening: traversal / corrupt-PDF / no-purchase-strings. //! Mirrors `nigig-site::ocr` traversal tests + SITE-14 honesty. use nigig_ocr::{ ingest::accept_path, ingest::IngestError, providers::FallbackEngine, FileItem, OcrEngine, OcrError, }; #[test] fn traversal_outside_app_data_refused() { assert_eq!( accept_path( std::path::Path::new("/etc/hostname"), std::path::Path::new("/tmp") ), Err(IngestError::BadPath) ); assert_eq!( accept_path( std::path::Path::new("/nonexistent-ocr-xyz/photo.png"), std::path::Path::new("/tmp") ), Err(IngestError::BadPath) ); } #[test] fn corrupt_pdf_rejected_by_magic() { let mut l = nigig_ocr::FileList::new(); assert_eq!( l.add(b"definitely not a file".to_vec()).unwrap_err(), IngestError::Unsupported ); assert!(l.add_pdf_pages(b"%PDF-1.4", 0).is_err()); assert!( l.add_pdf_pages(b"%PDF", 1).is_err(), "bare %PDF is not a PDF" ); } #[test] fn fallback_never_invents_text_site14() { let e = FallbackEngine; let err = e.recognize(&FileItem::new(vec![1, 2, 3])).unwrap_err(); assert_eq!(err, OcrError::NoEngine); } #[test] fn no_purchase_or_trial_strings_in_crate_sources() { // P8 gate: monetization stripped — SwiftyStoreKit/trial must not exist here. let forbidden = [ "SwiftyStoreKit", "SKPayment", "30-DAY TRIAL", "Rate us on the App Store", ]; // Walk every source file (a hard-coded list silently skipped new files). fn walk(dir: &std::path::Path, out: &mut Vec) { for e in std::fs::read_dir(dir).unwrap() { let p = e.unwrap().path(); if p.is_dir() { walk(&p, out); } else if p.extension().is_some_and(|x| x == "rs") { out.push(p); } } } let root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")); let mut files = Vec::new(); walk(&root.join("src"), &mut files); assert!( files.len() >= 15, "walker found too few files: {}", files.len() ); for path in files { let rel = path.display(); let body = std::fs::read_to_string(&path).unwrap(); for needle in forbidden { assert!(!body.contains(needle), "{rel} contains {needle}"); } } }