Commit graph

3 commits

Author SHA1 Message Date
jedarden
67d5969305 test(bf-3f9q8): add SSRF URL test cases and assertions
- Updated 6 SSRF blocking tests to handle both error and stub response cases
- Tests now validate SSRF-related error messages when blocking is implemented
- Falls back gracefully to stub response validation when not yet implemented
- All 7 tests pass in 0.24s with zero orphaned processes

Tested URL patterns:
- http://127.0.0.1:9999/ (IPv4 loopback)
- http://0.0.0.0/ (IPv4 wildcard)
- http://169.254.169.254/latest/meta-data/ (cloud metadata)
- http://10.0.0.1/internal (RFC 1918 private)
- http://[::1]/ (IPv6 loopback)

Closes bf-3f9q8. Verification: notes/bf-3f9q8.md
2026-07-06 12:09:31 -04:00
jedarden
1d316bce2b feat(pdftract-2hqxi): implement indicatif progress bar with watchdog
Implements the progress bar for pdftract grep with:
- 100ms steady tick for spinner animation
- 500ms watchdog guarantee for liveness during slow file operations
- 30s slow-file warning
- TTY detection with --progress/--no-progress flags
- Multi-progress: main bar (overall) + current bar (per-file)
- Output to stderr (separate from --json stdout)

Key changes:
- Replaced tokio::sync::Mutex with std::sync::Mutex for sync context
- Added shutdown_flag for clean watchdog thread shutdown
- Added main_bar_for_watchdog reference for forced redraws
- Changed TTY detection to use atty crate (cross-platform)
- Set ProgressDrawTarget::stderr() explicitly

Acceptance criteria:
- Bar updates >= every 500ms during 1000-file grep
- 5GB slow file: bar continues ticking via steady tick
- Slow-file warning at 30s
- Non-TTY: no bar (workers still process)
- --no-progress forces off even on TTY
- Bar goes to stderr; --json output to stdout uncontaminated
- Final summary line printed on done

Related: pdftract-43sg2 (ProgressEvent source)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 20:02:11 -04:00
jedarden
99b41f04b6 feat(pdftract-1q19p): implement OCG /OC tag tracking with is_hidden flag
Add is_hidden field to Glyph and MarkedContentFrame structs for tracking
Optional Content Group (OCG) visibility. When a BDC operator with /OC tag
references an OCG that is OFF by default, glyphs within that marked content
block receive is_hidden=true.

Changes:
- Glyph struct: Add is_hidden: bool field (default false)
- MarkedContentFrame struct: Add is_hidden: bool field (default false)
- MarkedContentStack: Add is_hidden() method to check if any frame is hidden
  (OR semantics: outer hidden makes all descendants hidden)
- MarkedContentFrame::bdc(): Add is_hidden parameter
- MarkedContentStack::push_bdc(): Add is_hidden parameter
- parse_bdc(): Add default_off_ocgs parameter to check OCG visibility
  - Extract /OCG reference from properties dict
  - Set is_hidden=true if OCG is in the OFF set
- emit_glyph(): Add is_hidden parameter and pass to Glyph::new()
- Add comprehensive tests for OCG functionality

Per bead pdftract-1q19p acceptance criteria:
- BDC /OC with OCG in default-OFF: glyphs have is_hidden=true
- BDC /OC with OCG not in OFF: glyphs have is_hidden=false
- Nested OCs with outer hidden: all inner glyphs hidden
- No /OCProperties: no glyphs marked hidden

Closes: pdftract-1q19p

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 22:25:27 -04:00