Re-encodes every newly selected JPEG, PNG, and WebP through the bounded canvas path before preview, draft/outbox persistence, or upload. This removes embedded EXIF/GPS/device metadata while preserving filenames, MIME types, visible pixels, and existing byte/pixel limits. Decode or encode failure remains fail-closed.
TDD proof:
RED: bounded-image sanitizer test returned the original object with embedded metadata and zero canvas draws.
Closes #949
Re-encodes every newly selected JPEG, PNG, and WebP through the bounded canvas path before preview, draft/outbox persistence, or upload. This removes embedded EXIF/GPS/device metadata while preserving filenames, MIME types, visible pixels, and existing byte/pixel limits. Decode or encode failure remains fail-closed.
TDD proof:
- RED: bounded-image sanitizer test returned the original object with embedded metadata and zero canvas draws.
- GREEN: `pytest -q tests/test_issue_attachment_ui.py tests/test_service_worker.py` — 95 passed.
- Full suite: `pytest -q` — 1807 passed, 1 skipped.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #949
Re-encodes every newly selected JPEG, PNG, and WebP through the bounded canvas path before preview, draft/outbox persistence, or upload. This removes embedded EXIF/GPS/device metadata while preserving filenames, MIME types, visible pixels, and existing byte/pixel limits. Decode or encode failure remains fail-closed.
TDD proof:
pytest -q tests/test_issue_attachment_ui.py tests/test_service_worker.py— 95 passed.pytest -q— 1807 passed, 1 skipped.