pdftract/crates/pdftract-core/Cargo.toml
jedarden 76114da985 feat(pdftract-core): add SSRF protection (TH-05) and URL_PRIVATE_NETWORK diagnostic
Add URL validation module to prevent SSRF attacks by blocking:
- RFC 1918 private IPv4 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
- IPv6 ULA (fc00::/7, fd00::/8)
- Loopback addresses (127.0.0.0/8, ::1)
- Link-local addresses (169.254.0.0/16, fe80::/10)
- Cloud metadata endpoints (169.254.169.254, metadata.google.internal, etc.)
- Non-https schemes (http://, ftp://, file://)

Add URL_PRIVATE_NETWORK diagnostic code to diagnostics catalog.
Add comprehensive test suite in tests/th_05_ssrf_block.rs covering:
- 20+ dangerous URL payloads across all categories
- --allow-private-networks bypass functionality
- IPv6 zone ID detection
- Metadata subdomain detection
- Boundary address validation

Closes: pdftract-zgdkf (TH-05 test: SSRF block)
2026-05-24 01:50:12 -04:00

72 lines
2.2 KiB
TOML

[package]
name = "pdftract-core"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
publish = true
[dependencies]
anyhow = { workspace = true }
hex = "0.4"
image = { version = "0.25", optional = true }
url = { version = "2.5", optional = true }
leptonica-plumbing = { version = "1.4", optional = true }
pdfium-render = { version = "0.9", optional = true }
tesseract = { version = "0.15", optional = true }
indexmap = "2.2"
flate2 = { workspace = true }
lzw = { workspace = true }
regex = "1.10"
secrecy = { workspace = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
schemars = { version = "1.2", features = ["derive"], optional = true }
sha2 = "0.10"
thiserror = { workspace = true }
memchr = { workspace = true }
unicode-normalization = { workspace = true }
ttf-parser = "0.24"
owned_ttf_parser = "0.21"
zstd = "0.13"
rayon = "1.10"
phf = "0.11"
tracing = { workspace = true }
dashmap = "6.1"
smallvec = "1.13"
encoding_rs = { version = "0.8", optional = true }
quick-xml = { version = "0.36", optional = true }
[features]
default = ["serde"]
serde = ["dep:serde", "dep:serde_json", "dep:schemars"]
schemars = ["dep:schemars", "serde"]
receipts = [] # Enable visual citation receipts (SVG clip generation)
ocr = ["dep:image", "dep:leptonica-plumbing", "dep:quick-xml"] # Enable OCR path (image compositing + preprocessing + HOCR parsing)
full-render = ["dep:pdfium-render", "ocr"] # Enable PDFium-based rendering (requires ocr)
remote = ["dep:url"] # Enable remote HTTP source (Phase 1.8)
proptest = []
fuzzing = [] # Enable cfg(fuzzing) for fuzz harnesses
shape-db = [] # Enable glyph shape database (Level 4 encoding fallback)
cjk = ["dep:encoding_rs"] # Enable CJK text extraction via predefined CMap registry (~1.2 MB binary size increase)
[dev-dependencies]
chrono = "0.4"
criterion = "0.5"
proptest = "1.4"
quick-xml = "0.36"
regex = "1.10"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tempfile = "3.10"
filetime = "0.2"
[[bench]]
name = "table_detection"
harness = false
[build-dependencies]
phf_codegen = "0.11"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"