Some checks failed
cad / cad-truth-gates (push) Has been cancelled
cad / cad-core-checks (push) Has been cancelled
cad / cad-consumers (push) Has been cancelled
doc-engine / engine (push) Has been cancelled
doc-engine / coverage (push) Has been cancelled
doc-engine / consumer (push) Has been cancelled
email / gates (push) Has been cancelled
email / email-domain (push) Has been cancelled
email / nigig-email (push) Has been cancelled
email / supply-chain (push) Has been cancelled
nigig-build (CAD) / supply-chain (push) Has been cancelled
nigig-build (CAD) / cad-module (push) Has been cancelled
nigig-build (CAD) / full-crate-check (push) Has been cancelled
nigig-build (CAD) / cad-engine-coverage (push) Has been cancelled
nigig-build (CAD) / doc-workspace-coverage (push) Has been cancelled
nigig-build (CAD) / cad-widget-coverage (push) Has been cancelled
nigig-map / test (push) Has been cancelled
nigig-site / Owned paths and honest test contracts (push) Has been cancelled
nigig-site / Cargo check-all-targets (push) Has been cancelled
nigig-site / Cargo clippy-site-owned (push) Has been cancelled
nigig-site / Cargo contained-media-export-fixtures (push) Has been cancelled
nigig-site / Cargo containment-storage-crypto (push) Has been cancelled
nigig-site / Cargo core-clippy (push) Has been cancelled
nigig-site / Cargo core-contracts (push) Has been cancelled
nigig-site / Cargo integration-non-live (push) Has been cancelled
nigig-site / Cargo production-dependency-containment (push) Has been cancelled
nigig-site / Cargo site02-crypto (push) Has been cancelled
nigig-site / Cargo site02-repository (push) Has been cancelled
nigig-site / Cargo site02-store (push) Has been cancelled
nigig-site / Cargo unit (push) Has been cancelled
nigig-site / SITE-02 native provider/filesystem (macos-latest) (push) Has been cancelled
nigig-site / SITE-02 native provider/filesystem (ubuntu-latest) (push) Has been cancelled
nigig-site / SITE-02 native provider/filesystem (windows-latest) (push) Has been cancelled
nigig-site / SITE-02 desktop runtime and normal shutdown (push) Has been cancelled
nigig-site / SITE-02 migration, recovery, and fault corpus (push) Has been cancelled
nigig-site / Media limits (explicitly skipped until enabled) (push) Has been cancelled
nigig-site / Real server interoperability (explicitly skipped until enabled) (push) Has been cancelled
nigig-site / Security and supply-chain baseline (push) Has been cancelled
repo hygiene / hygiene (push) Has been cancelled
sms / gates (push) Has been cancelled
sms / robius-sms (push) Has been cancelled
sms / android (push) Has been cancelled
sms / nigig-sms (push) Has been cancelled
sms / supply-chain (push) Has been cancelled
spreadsheet / engine-coverage (push) Has been cancelled
spreadsheet / ui-controller-coverage (push) Has been cancelled
traffic / gates (push) Has been cancelled
traffic / nigig-traffic (push) Has been cancelled
traffic / supply-chain (push) Has been cancelled
nigig-site / Release capability gate (push) Has been cancelled
- providers/tesseract: system tesseract (TSV → text + normalized word boxes), installed-language detection; default_engine() picks Vision/Tesseract/none - image_prep: decode, validate, apply rotation before recognition - jobs: background OcrJob with progress, cancel, per-item results - ui_state: no fake success toasts; clipboard/export/share report real outcomes - ingest: real decode validation, size caps, shared PDF pages (no duplication) - export: atomic writes, paginated multi-page PDF, refuse non-WinAnsi text - capture: fixed drag anchor; settings: atomic save + applied to new files - drop unused deps; tests: 78 pass incl. 5 real-OCR on a fixture - EXECUTION_PLAN: correct overstated status
83 lines
2.4 KiB
Rust
83 lines
2.4 KiB
Rust
//! 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<std::path::PathBuf>) {
|
|
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}");
|
|
}
|
|
}
|
|
}
|