WIP: Layered ingestion security and measured analysis costs #19

Draft
jchapman wants to merge 41 commits from issue-12-isolated-malware-scanning into main
Owner

Large Google Takeout exports need meaningful security checks without repeated full scans or a blanket small-file ceiling. This WIP adds layered validation, isolated managed antivirus, complete private per-file findings and authenticated reuse. Scope follows #12, #14 and comment 332. Overall scanning, performance and release acceptance remains unfinished.

Implemented behavior:

  • Share archive integrity, bounded classification, applicable AV and selective structure through existing streams. Strict coverage is default. Acknowledged oversized supported media has explicit partial coverage; disguised/unsupported binaries cannot obtain that exception. Outages and incomplete scans never become clean.
  • Use managed periodic signatures and offline non-root workers with admission, CPU/memory/process/storage/deadline limits. Private paged/downloadable findings provide plain summaries and optional technical evidence. Software report limits do not claim a kernel quota against a compromised worker.
  • Bind successful checks and scoped one-use execution permits to exact inputs, operation, policy, limits, immutable images, managed definitions and coverage consent. Reuse avoids duplicate AV across analysis/preview/import, retaining hashing and preview matching. Held collections and assessment-only evidence receive no execution authority; no automatic rescan fallback.
  • Complete independent file assessments after recognized holds/detections within shared budgets. Unsafe archive layouts, unknown reads, outages/timeouts and global/storage failures stop. Preserve all-part preflight, verified ZIP64 descriptors and bounded legacy QuickTime validation.
  • Policy 13 supports the 21 previously targeted camera JPEGs and existing panoramas without conversion. Original JFIF warnings remain distinct evidence. Explicit metadata/numeric/preview/Exif/ICC profiles require reconstructed-component AV. Unknown layouts/containers, recursion, other warnings, detections and failures cannot acquire compatibility.
  • Preserve one original JPEG read and bounded sequential component work. Matching notes or valid numbers cannot replace AV. No rewriting, stripping, transcoding or full pixel decode. Main 532f520, guided stages, SSO/dependency/locale fixes and operation-bound findings/consent remain integrated. Importer bridge.7 combines main's duplicate/stack fixes with Takeout reporting/private manifests and matching source/license notices.

Current staged checkpoint (2cfea71):

  • XML field parsing accounts for all 654 saved headers. New bounded Bag/boolean-style property rules remain disabled at the production parser entry point. Generated whole-file controls prove the candidate grants no receipt or compatibility authority.
  • Fifteen of twenty remaining cases have full staged XMP component plans, including both plain-text notes with no preview. Fresh unchanged managed definitions complete 365 requests / 7,584,496 bytes without detection across XML, decoded labels, wrappers/gzip/expanded text/logs, supported previews and normalized numeric representations. A real-engine XML-character-reference canary requires decoded-label AV; raw XML alone misses it.
  • Five cases expose further byte schemas: two in log record 31 and three richer encoded numeric notes. They refuse explicitly; no unknown LEN type is inferred from a plausible recursive parse. Earlier log normalization remains semantic-order stable and keeps maximum/ordinary weights distinct.
  • All 654 saved trailers / 1,872 blocks complete 2,105 wire/gzip representation AV requests / 20,126,895 bytes without detection. Unknown nested types/decoded representations remain unresolved. Zero exact matches across 17,244 eligible root fields and 652 validated header logs supplies no basis for borrowing header schemas; two unsupported logs are excluded.
  • Policy remains 13 and all 654 original photo holds remain. Negative AV at these scopes does not approve a complete photo or the original collection. New private readable/JSON METADATA-TRAILER-CHECKS-UPDATE reports beside the examination ZIP map the findings; actual names/paths/values/digests/manifests stay outside public Git.

One offline non-root worker per batch uses saved snapshots only, fresh immutable-generation managed definitions and bounded per-file/shared requests, bytes, expansion and deadlines. Metadata command/cleanup is 23.125 s, trailers 32.088 s, under one CPU / 5 GiB / 2 GiB temporary space. No source ZIP/full photo is mounted. An initial broad plan hit the 256-MiB decoded-work bound and stopped; the completed check focuses expensive work on the twenty cases while retaining that bound. These timings are not representative complete-import overhead or achievement of the 15% target.

Current validation passes: canonical full Linux AMD64 backend/vet/focused API/security/malware/runner races; malware/candidate/relation and production-refusal controls; all real-ClamAV generated fixtures; source policy (76 files / 16,638 lines / 43 reviewed findings, zero suppressions/new allowances); source govulncheck; generated-only guided XML fuzz (204,358 executions, requested 20 s / observed 21.055 s, no private seeds); nine CI tests; docs/workflow/privacy contracts; formatting; exact private-identity exclusion; staged/full-history redacted secret checks. UI/importer/dependency sources are unchanged; earlier browser/importer/complete-workflow evidence is retained without claiming a new run.

Historical runtime evidence remains separate: combined-main checkpoint 24db3ff passed four canonical image builds, actual importer compatibility (collapsed/valid stacks, real errors, disabled job control, discards, reports and retry), matching-source export and binary govulncheck, plus the race-controller required-mode Docker workflow in 56.14 s with generated camera analysis/reuse/preview/synthetic upload, held refusal, partial consent, mutation/replay/isolation/cleanup. The policy-13 targeted archive passed all 21 camera photos and three panorama controls with 480 component requests. Earlier whole-set assessment visited 67,013 members, with 66,302 clean AV, sixteen acknowledged oversized exceptions, 688 JPEG holds and seven type blocks. These historical scopes do not approve the original collection under the current feature or establish complete-analysis overhead acceptance.

Next: explicit added log/numeric-note byte-field types, then complete exposure/focus/white-balance trailer schemas. Prove complete original/reconstructed AV, hidden-content/error controls, one-read capture, shared budgets and authenticated saved evidence before new versioned eligibility; measure representative complete analysis afterwards. Native/release/provider/final-image-advisory/performance/readiness gates remain open. Bitmap mismatches and game packages retain review decisions. Recovery/selective import and later administrator enablement/posture/reporting/tunables plus security-enabled duration/leave-return/completion-email guidance remain deferred until scanning readiness. No real import, deployment/restart, owner-task interruption, merge, closure or gate waiver.

Current findings and limits | Sanitized measurements | Main integration | Validation record.

Large Google Takeout exports need meaningful security checks without repeated full scans or a blanket small-file ceiling. This WIP adds layered validation, isolated managed antivirus, complete private per-file findings and authenticated reuse. Scope follows #12, #14 and comment 332. Overall scanning, performance and release acceptance remains unfinished. Implemented behavior: - Share archive integrity, bounded classification, applicable AV and selective structure through existing streams. Strict coverage is default. Acknowledged oversized supported media has explicit partial coverage; disguised/unsupported binaries cannot obtain that exception. Outages and incomplete scans never become clean. - Use managed periodic signatures and offline non-root workers with admission, CPU/memory/process/storage/deadline limits. Private paged/downloadable findings provide plain summaries and optional technical evidence. Software report limits do not claim a kernel quota against a compromised worker. - Bind successful checks and scoped one-use execution permits to exact inputs, operation, policy, limits, immutable images, managed definitions and coverage consent. Reuse avoids duplicate AV across analysis/preview/import, retaining hashing and preview matching. Held collections and assessment-only evidence receive no execution authority; no automatic rescan fallback. - Complete independent file assessments after recognized holds/detections within shared budgets. Unsafe archive layouts, unknown reads, outages/timeouts and global/storage failures stop. Preserve all-part preflight, verified ZIP64 descriptors and bounded legacy QuickTime validation. - Policy 13 supports the 21 previously targeted camera JPEGs and existing panoramas without conversion. Original JFIF warnings remain distinct evidence. Explicit metadata/numeric/preview/Exif/ICC profiles require reconstructed-component AV. Unknown layouts/containers, recursion, other warnings, detections and failures cannot acquire compatibility. - Preserve one original JPEG read and bounded sequential component work. Matching notes or valid numbers cannot replace AV. No rewriting, stripping, transcoding or full pixel decode. Main **532f520**, guided stages, SSO/dependency/locale fixes and operation-bound findings/consent remain integrated. Importer **bridge.7** combines main's duplicate/stack fixes with Takeout reporting/private manifests and matching source/license notices. Current staged checkpoint (**2cfea71**): - XML field parsing accounts for **all 654 saved headers**. New bounded Bag/boolean-style property rules remain disabled at the production parser entry point. Generated whole-file controls prove the candidate grants no receipt or compatibility authority. - **Fifteen of twenty remaining cases** have full staged XMP component plans, including both plain-text notes with no preview. Fresh unchanged managed definitions complete **365 requests / 7,584,496 bytes** without detection across XML, decoded labels, wrappers/gzip/expanded text/logs, supported previews and normalized numeric representations. A real-engine XML-character-reference canary requires decoded-label AV; raw XML alone misses it. - Five cases expose further byte schemas: two in log record 31 and three richer encoded numeric notes. They refuse explicitly; no unknown LEN type is inferred from a plausible recursive parse. Earlier log normalization remains semantic-order stable and keeps maximum/ordinary weights distinct. - All **654 saved trailers / 1,872 blocks** complete **2,105 wire/gzip representation AV requests / 20,126,895 bytes** without detection. Unknown nested types/decoded representations remain unresolved. Zero exact matches across 17,244 eligible root fields and 652 validated header logs supplies no basis for borrowing header schemas; two unsupported logs are excluded. - **Policy remains 13 and all 654 original photo holds remain.** Negative AV at these scopes does not approve a complete photo or the original collection. New private readable/JSON METADATA-TRAILER-CHECKS-UPDATE reports beside the examination ZIP map the findings; actual names/paths/values/digests/manifests stay outside public Git. One offline non-root worker per batch uses saved snapshots only, fresh immutable-generation managed definitions and bounded per-file/shared requests, bytes, expansion and deadlines. Metadata command/cleanup is **23.125 s**, trailers **32.088 s**, under one CPU / 5 GiB / 2 GiB temporary space. No source ZIP/full photo is mounted. An initial broad plan hit the 256-MiB decoded-work bound and stopped; the completed check focuses expensive work on the twenty cases while retaining that bound. These timings are not representative complete-import overhead or achievement of the 15% target. Current validation passes: canonical full Linux AMD64 backend/vet/focused API/security/malware/runner races; malware/candidate/relation and production-refusal controls; all real-ClamAV generated fixtures; source policy (**76 files / 16,638 lines / 43 reviewed findings**, zero suppressions/new allowances); source govulncheck; generated-only guided XML fuzz (**204,358 executions**, requested 20 s / observed 21.055 s, no private seeds); nine CI tests; docs/workflow/privacy contracts; formatting; exact private-identity exclusion; staged/full-history redacted secret checks. UI/importer/dependency sources are unchanged; earlier browser/importer/complete-workflow evidence is retained without claiming a new run. Historical runtime evidence remains separate: combined-main checkpoint 24db3ff passed four canonical image builds, actual importer compatibility (collapsed/valid stacks, real errors, disabled job control, discards, reports and retry), matching-source export and binary govulncheck, plus the race-controller required-mode Docker workflow in 56.14 s with generated camera analysis/reuse/preview/synthetic upload, held refusal, partial consent, mutation/replay/isolation/cleanup. The policy-13 targeted archive passed all 21 camera photos and three panorama controls with 480 component requests. Earlier whole-set assessment visited 67,013 members, with 66,302 clean AV, sixteen acknowledged oversized exceptions, 688 JPEG holds and seven type blocks. These historical scopes do not approve the original collection under the current feature or establish complete-analysis overhead acceptance. Next: explicit added log/numeric-note byte-field types, then complete exposure/focus/white-balance trailer schemas. Prove complete original/reconstructed AV, hidden-content/error controls, one-read capture, shared budgets and authenticated saved evidence before new versioned eligibility; measure representative complete analysis afterwards. Native/release/provider/final-image-advisory/performance/readiness gates remain open. Bitmap mismatches and game packages retain review decisions. Recovery/selective import and later administrator enablement/posture/reporting/tunables plus security-enabled duration/leave-return/completion-email guidance remain deferred until scanning readiness. No real import, deployment/restart, owner-task interruption, merge, closure or gate waiver. [Current findings and limits](https://git.sharedroot.net/jchapman/Immich-Bridge/src/commit/2cfea71066fd6de07c112d347141ba700aba0743/docs/camera-metadata-trailer-candidate.md) | [Sanitized measurements](https://git.sharedroot.net/jchapman/Immich-Bridge/src/commit/2cfea71066fd6de07c112d347141ba700aba0743/docs/benchmarks/camera-metadata-trailers-20261101.json) | [Main integration](https://git.sharedroot.net/jchapman/Immich-Bridge/src/commit/2cfea71066fd6de07c112d347141ba700aba0743/docs/rebased-security-workflow.md#latest-main-integration-verification) | [Validation record](https://git.sharedroot.net/jchapman/Immich-Bridge/src/commit/2cfea71066fd6de07c112d347141ba700aba0743/docs/malware-security-review.md).
Gate archive processing on isolated antivirus coverage
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
2905edfe48
Support acknowledged partial antivirus coverage for large media
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
dc60037430
Author
Owner

Immich-Bridge: Lightweight, Risk-Based Malware Scanning Architecture

  1. Mandatory Prerequisite: Rebase on Current Main

Before making any code changes, fetch the latest "main" and rebase the existing issue branch onto it.

  • Verify the working tree is clean and preserve any uncommitted work.
  • Fetch the latest remote state.
  • Rebase the issue branch onto the current "origin/main".
  • Resolve conflicts while preserving functionality already merged from other completed issues.
  • Do not discard, overwrite, or revert changes introduced by recently merged work.
  • Run the existing test suite and establish a passing baseline before proceeding.
  • If conflicts cannot be safely resolved, stop and report them rather than making assumptions.

Do not begin implementing the scanning changes until the rebase and baseline validation are complete.

  1. Objective

Redesign malware scanning to provide meaningful security protection without preventing legitimate Google Photos and Apple Photos exports from being imported.

The current problem is ClamAV's file-size and scanning limits. Large legitimate media files, particularly videos, can exceed those limits. Mandatory successful ClamAV scanning of every file would make normal photo-library imports impractical.

The solution must:

  • Remain entirely open source.
  • Preserve the existing isolated validation-worker architecture.
  • Reuse existing archive-entry inspection and validation logic.
  • Avoid introducing unnecessary services or dependencies.
  • Minimize additional CPU, memory, disk I/O, and processing time.
  • Provide explicit security outcomes without silently bypassing failed checks.
  • Continue supporting very large, resumable archives and asynchronous processing.
  • Ensure each archive is only scanned once per run,either during validation OR during a preview run, not both

Core principle: Every file must pass mandatory lightweight security validation. Additional scanning should be performed only when applicable or justified by risk.

  1. Proposed Security Architecture

Tier 1: Mandatory Lightweight Validation

Apply to every archive entry using the existing inspection pipeline.

Validate:

  • Archive integrity and entry readability.
  • Safe paths and prevention of directory traversal.
  • Entry types, including rejection of unsafe symlinks and special files.
  • File size and applicable resource limits.
  • Supported media extensions.
  • Actual file type using "libmagic" or an equivalent lightweight signature-identification library.
  • Consistency between extension, detected type, and allowed media formats.
  • Existing archive safety protections, including decompression limits.

Reject unsupported, executable, or suspiciously disguised files according to the established security policy.

Do not rely on filenames or extensions alone.

Avoid full-file decoding, redundant reads, and additional extraction passes.

Tier 2: Conditional ClamAV Scanning

Retain ClamAV as the primary known-malware detection engine.

For eligible files:

  • Scan individual archive entries rather than entire archives.
  • Use the existing isolated scanning infrastructure.
  • Respect ClamAV's configured file, stream, and scan limits.
  • Prefer bounded streaming over additional disk copies where practical.
  • Avoid passing files to ClamAV when their known size exceeds its supported limits.
  • Record whether each scan completed successfully.

For oversized files:

  • Do not automatically reject legitimate media solely because it exceeds ClamAV limits.
  • Apply an explicit oversized-media exception only when the file has passed mandatory classification and structural checks.
  • Record that antivirus coverage was incomplete.
  • Do not report unscanned files as malware-free.
  • Do not apply this exception to arbitrary binaries, executables, or unsupported formats.

Scanner failures are not size exceptions.

ClamAV crashes, unavailable services, timeouts, and unexpected scan errors must be handled separately from documented size limitations. Such failures must not silently authorize import.

Tier 3: Selective Media Validation

Use deeper media inspection only when justified by file characteristics or suspicious findings.

For videos, consider "ffprobe" to validate:

  • Recognized container format.
  • Plausible stream metadata.
  • Expected media characteristics.
  • Structural inconsistencies requiring further investigation.

Avoid full video decoding and transcoding.

Do not run expensive media validation against every file by default.

Image decoding with "libvips" is deferred unless testing demonstrates a meaningful security benefit beyond existing validation.

Media validation must execute within the existing restricted worker environment with bounded CPU, memory, execution time, and concurrency.

A successful media probe does not establish that a file is malware-free.

  1. Security Decision Engine

Security classification must be separate from the final import decision.

Condition| Required behavior
Valid supported media; ClamAV clean| Allow
Known malware detected| Block
Archive traversal or unsafe entry| Block
Executable disguised as media| Block
Oversized, structurally valid supported media| Allow under explicit risk-based exception
ClamAV unavailable or unexpected failure| Hold and retry; do not silently bypass
Suspicious or inconsistent media structure| Escalate or quarantine
Unsupported or unreadable content| Reject or quarantine according to policy

Implement explicit per-file results, including:

  • "CLEAN"
  • "INFECTED"
  • "OVERSIZED_AV_EXEMPT"
  • "UNSUPPORTED"
  • "SUSPICIOUS"
  • "SCAN_ERROR"
  • "QUARANTINED"

These are proposed logical outcomes; adapt them to existing application conventions rather than creating redundant status systems.

Preserve the distinction between detection, incomplete scanning, and policy authorization.

Do not automatically treat a single infected file as proof that all other files in the archive are infected. Preserve per-file findings and support a safe quarantine decision. Review existing import behavior before choosing whether the overall job is blocked or eligible files can continue.

  1. Performance and Scalability Requirements

The solution must remain practical for archives containing tens of thousands of files and hundreds of gigabytes of media.

Requirements:

  1. Reuse existing archive-entry inspection wherever possible.
  2. Avoid repeated decompression or unnecessary full-file reads.
  3. Do not create additional full-size temporary copies unless required by an existing interface.
  4. Do not create a new container for each file.
  5. Reuse existing isolated workers with bounded concurrency.
  6. Apply service-level resource limits across concurrent imports, not only per job.
  7. Avoid full image/video decoding during normal validation.
  8. Avoid YARA-X, additional antivirus engines, or additional security services in this implementation.
  9. Preserve asynchronous processing and restart/resume behavior.
  10. Ensure scanning failures and retries cannot cause unbounded queues, resource consumption, or repeated work.

Use the existing approximately 23,000-file, 150 GB import benchmark as a representative workload.

Performance target: Aim for no more than 15% additional end-to-end analysis time compared with the existing baseline, while retaining mandatory security checks. Treat this as a measurement target, not permission to weaken security.

If the target cannot be met, report the measured bottlenecks and tradeoffs rather than silently reducing coverage.

  1. Security Isolation

Preserve the existing validation-worker security boundaries.

Verify that:

  • Untrusted files cannot execute arbitrary commands.
  • Workers have no unnecessary outbound network access.
  • Processing occurs without root privileges where practical.
  • Filesystem access is limited to required paths.
  • Temporary data is isolated and cleaned up.
  • CPU, memory, process counts, and execution time are bounded.
  • Scanner and media-parser crashes cannot compromise the main application.
  • Only policy-approved content is made available to the downstream import process.

Do not introduce additional container infrastructure unless a demonstrated security requirement cannot be satisfied by the existing architecture.

Remember that downstream Immich components will process original media. Validation reduces risk but does not eliminate vulnerabilities in downstream parsers.

  1. Logging and Reporting

Integrate with the existing reporting and persistent logging architecture.

For each file, record:

  • File identity and detected type.
  • Applicable validation outcomes.
  • ClamAV scan status.
  • Whether an oversized-media exception was applied.
  • Any suspicious findings.
  • Final security decision.
  • Relevant error or quarantine reason.

At the job level, provide:

  • Total files evaluated.
  • Successfully scanned files.
  • Oversized files exempted from antivirus scanning.
  • Blocked or quarantined files.
  • Scan errors and retries.
  • Total security-processing time.
  • Processing time by major validation stage.

User-facing reporting: Keep messages understandable to nontechnical users. Explain that some large media files could not be antivirus-scanned but passed other required checks.

Technical reporting: Preserve detailed diagnostics for troubleshooting and security auditing.

Avoid presenting an incomplete scan as a successful clean scan.

  1. Testing Requirements

Extend the existing automated test suite rather than introducing a separate testing framework.

Functional tests

  • Normal JPEG, PNG, HEIC, and supported video files.
  • Large legitimate video exceeding ClamAV limits.
  • Valid media with misleading extensions.
  • Executable renamed to a media extension.
  • Unsupported files.
  • Corrupt archive entries.
  • Encrypted or otherwise unreadable entries.
  • Malicious archive paths and decompression bombs.
  • Known malware detection using safe antivirus test fixtures.
  • Scanner unavailable, timeout, crash, and restart.
  • Media probe failures.
  • Mixed archives containing clean, oversized, suspicious, and infected entries.

Security tests

  • Verify oversized-media exemptions cannot be obtained by renaming arbitrary files.
  • Verify detected malware cannot bypass blocking through fallback logic.
  • Verify unexpected scanner failures do not authorize imports.
  • Verify resource limits prevent unbounded processing.
  • Verify worker isolation remains effective.
  • Verify rejected or quarantined content cannot reach Immich-Go.
  • Verify per-user isolation and prevent cross-user access to quarantined files.

Regression and performance tests

  • Preserve existing upload, resume, restart, analysis, preview, and import workflows.
  • Test concurrent imports.
  • Measure CPU, memory, disk I/O, and processing time.
  • Compare against the established baseline.
  • Confirm security results persist correctly across worker restarts.
  1. Explicitly Out of Scope

Do not implement the following without a demonstrated need and separate approval:

  • YARA-X integration.
  • A second antivirus engine.
  • Full media transcoding or sanitization.
  • Full decoding of every video.
  • New container-per-file execution.
  • A general-purpose malware-analysis platform.
  • Additional user-facing security configuration screens.
  • Automatic rejection of all files exceeding ClamAV limits.
  • Broad architectural refactoring unrelated to this issue.
  1. Implementation Sequence

After completing the mandatory rebase:

  1. Inspect existing implementation. Identify current archive inspection, ClamAV integration, worker isolation, logging, status handling, and tests. Reuse existing functionality.
  2. Document the proposed changes. Identify exact modules, dependencies, and any existing behavior requiring modification.
  3. Implement lightweight file classification. Add "libmagic" or equivalent only if current detection is insufficient.
  4. Implement size-aware ClamAV eligibility. Preserve scanning for eligible files and explicitly classify oversized media.
  5. Implement security decisions. Distinguish clean, infected, exempt, suspicious, and failed outcomes.
  6. Add selective media probing. Introduce "ffprobe" only where existing checks cannot provide the required confidence.
  7. Integrate reporting. Extend existing user-facing and technical reporting.
  8. Add regression and security tests. Include bypass, failure, isolation, and resource-exhaustion cases.
  9. Benchmark. Measure security overhead and identify expensive operations.
  10. Validate and finalize. Run the full suite, review the changes for regressions, and document any residual risks.

Work incrementally. Do not perform an unnecessary rewrite of the existing validation architecture.

  1. Acceptance Criteria

This issue is complete when:

  • Branch successfully rebased onto current "main".
  • Existing tests pass after rebase.
  • All archive entries receive mandatory lightweight validation.
  • Eligible files are scanned with ClamAV.
  • Legitimate oversized media can proceed under the explicit risk-based policy.
  • Unsupported and disguised executable content cannot use oversized-media exemptions.
  • Known malware is blocked.
  • Scanner failures do not silently bypass security.
  • File-level security results are accurately persisted and reported.
  • Existing worker isolation remains intact.
  • Large archive processing remains practical.
  • Performance overhead is measured and documented.
  • Existing upload, resume, restart, preview, and import workflows pass regression testing.
  • No unnecessary new services or dependencies are introduced.
  • All changes are committed and ready for review.

Guiding Principle

Build a secure media-ingestion pipeline, not a general-purpose antivirus platform.

Use inexpensive validation universally, ClamAV where technically applicable, and deeper analysis only when justified.

Maintain explicit security decisions, preserve isolation, and never silently convert an incomplete or failed scan into a clean result.

Security must be meaningful, measurable, and proportionate to the actual risks of importing legitimate photo and video libraries.

Immich-Bridge: Lightweight, Risk-Based Malware Scanning Architecture 1. Mandatory Prerequisite: Rebase on Current Main Before making any code changes, fetch the latest "main" and rebase the existing issue branch onto it. - Verify the working tree is clean and preserve any uncommitted work. - Fetch the latest remote state. - Rebase the issue branch onto the current "origin/main". - Resolve conflicts while preserving functionality already merged from other completed issues. - Do not discard, overwrite, or revert changes introduced by recently merged work. - Run the existing test suite and establish a passing baseline before proceeding. - If conflicts cannot be safely resolved, stop and report them rather than making assumptions. Do not begin implementing the scanning changes until the rebase and baseline validation are complete. 2. Objective Redesign malware scanning to provide meaningful security protection without preventing legitimate Google Photos and Apple Photos exports from being imported. The current problem is ClamAV's file-size and scanning limits. Large legitimate media files, particularly videos, can exceed those limits. Mandatory successful ClamAV scanning of every file would make normal photo-library imports impractical. The solution must: - Remain entirely open source. - Preserve the existing isolated validation-worker architecture. - Reuse existing archive-entry inspection and validation logic. - Avoid introducing unnecessary services or dependencies. - Minimize additional CPU, memory, disk I/O, and processing time. - Provide explicit security outcomes without silently bypassing failed checks. - Continue supporting very large, resumable archives and asynchronous processing. - Ensure each archive is only scanned once per run,either during validation OR during a preview run, not both Core principle: Every file must pass mandatory lightweight security validation. Additional scanning should be performed only when applicable or justified by risk. 3. Proposed Security Architecture Tier 1: Mandatory Lightweight Validation Apply to every archive entry using the existing inspection pipeline. Validate: - Archive integrity and entry readability. - Safe paths and prevention of directory traversal. - Entry types, including rejection of unsafe symlinks and special files. - File size and applicable resource limits. - Supported media extensions. - Actual file type using "libmagic" or an equivalent lightweight signature-identification library. - Consistency between extension, detected type, and allowed media formats. - Existing archive safety protections, including decompression limits. Reject unsupported, executable, or suspiciously disguised files according to the established security policy. Do not rely on filenames or extensions alone. Avoid full-file decoding, redundant reads, and additional extraction passes. Tier 2: Conditional ClamAV Scanning Retain ClamAV as the primary known-malware detection engine. For eligible files: - Scan individual archive entries rather than entire archives. - Use the existing isolated scanning infrastructure. - Respect ClamAV's configured file, stream, and scan limits. - Prefer bounded streaming over additional disk copies where practical. - Avoid passing files to ClamAV when their known size exceeds its supported limits. - Record whether each scan completed successfully. For oversized files: - Do not automatically reject legitimate media solely because it exceeds ClamAV limits. - Apply an explicit oversized-media exception only when the file has passed mandatory classification and structural checks. - Record that antivirus coverage was incomplete. - Do not report unscanned files as malware-free. - Do not apply this exception to arbitrary binaries, executables, or unsupported formats. Scanner failures are not size exceptions. ClamAV crashes, unavailable services, timeouts, and unexpected scan errors must be handled separately from documented size limitations. Such failures must not silently authorize import. Tier 3: Selective Media Validation Use deeper media inspection only when justified by file characteristics or suspicious findings. For videos, consider "ffprobe" to validate: - Recognized container format. - Plausible stream metadata. - Expected media characteristics. - Structural inconsistencies requiring further investigation. Avoid full video decoding and transcoding. Do not run expensive media validation against every file by default. Image decoding with "libvips" is deferred unless testing demonstrates a meaningful security benefit beyond existing validation. Media validation must execute within the existing restricted worker environment with bounded CPU, memory, execution time, and concurrency. A successful media probe does not establish that a file is malware-free. 4. Security Decision Engine Security classification must be separate from the final import decision. Condition| Required behavior Valid supported media; ClamAV clean| Allow Known malware detected| Block Archive traversal or unsafe entry| Block Executable disguised as media| Block Oversized, structurally valid supported media| Allow under explicit risk-based exception ClamAV unavailable or unexpected failure| Hold and retry; do not silently bypass Suspicious or inconsistent media structure| Escalate or quarantine Unsupported or unreadable content| Reject or quarantine according to policy Implement explicit per-file results, including: - "CLEAN" - "INFECTED" - "OVERSIZED_AV_EXEMPT" - "UNSUPPORTED" - "SUSPICIOUS" - "SCAN_ERROR" - "QUARANTINED" These are proposed logical outcomes; adapt them to existing application conventions rather than creating redundant status systems. Preserve the distinction between detection, incomplete scanning, and policy authorization. Do not automatically treat a single infected file as proof that all other files in the archive are infected. Preserve per-file findings and support a safe quarantine decision. Review existing import behavior before choosing whether the overall job is blocked or eligible files can continue. 5. Performance and Scalability Requirements The solution must remain practical for archives containing tens of thousands of files and hundreds of gigabytes of media. Requirements: 1. Reuse existing archive-entry inspection wherever possible. 2. Avoid repeated decompression or unnecessary full-file reads. 3. Do not create additional full-size temporary copies unless required by an existing interface. 4. Do not create a new container for each file. 5. Reuse existing isolated workers with bounded concurrency. 6. Apply service-level resource limits across concurrent imports, not only per job. 7. Avoid full image/video decoding during normal validation. 8. Avoid YARA-X, additional antivirus engines, or additional security services in this implementation. 9. Preserve asynchronous processing and restart/resume behavior. 10. Ensure scanning failures and retries cannot cause unbounded queues, resource consumption, or repeated work. Use the existing approximately 23,000-file, 150 GB import benchmark as a representative workload. Performance target: Aim for no more than 15% additional end-to-end analysis time compared with the existing baseline, while retaining mandatory security checks. Treat this as a measurement target, not permission to weaken security. If the target cannot be met, report the measured bottlenecks and tradeoffs rather than silently reducing coverage. 6. Security Isolation Preserve the existing validation-worker security boundaries. Verify that: - Untrusted files cannot execute arbitrary commands. - Workers have no unnecessary outbound network access. - Processing occurs without root privileges where practical. - Filesystem access is limited to required paths. - Temporary data is isolated and cleaned up. - CPU, memory, process counts, and execution time are bounded. - Scanner and media-parser crashes cannot compromise the main application. - Only policy-approved content is made available to the downstream import process. Do not introduce additional container infrastructure unless a demonstrated security requirement cannot be satisfied by the existing architecture. Remember that downstream Immich components will process original media. Validation reduces risk but does not eliminate vulnerabilities in downstream parsers. 7. Logging and Reporting Integrate with the existing reporting and persistent logging architecture. For each file, record: - File identity and detected type. - Applicable validation outcomes. - ClamAV scan status. - Whether an oversized-media exception was applied. - Any suspicious findings. - Final security decision. - Relevant error or quarantine reason. At the job level, provide: - Total files evaluated. - Successfully scanned files. - Oversized files exempted from antivirus scanning. - Blocked or quarantined files. - Scan errors and retries. - Total security-processing time. - Processing time by major validation stage. User-facing reporting: Keep messages understandable to nontechnical users. Explain that some large media files could not be antivirus-scanned but passed other required checks. Technical reporting: Preserve detailed diagnostics for troubleshooting and security auditing. Avoid presenting an incomplete scan as a successful clean scan. 8. Testing Requirements Extend the existing automated test suite rather than introducing a separate testing framework. Functional tests - Normal JPEG, PNG, HEIC, and supported video files. - Large legitimate video exceeding ClamAV limits. - Valid media with misleading extensions. - Executable renamed to a media extension. - Unsupported files. - Corrupt archive entries. - Encrypted or otherwise unreadable entries. - Malicious archive paths and decompression bombs. - Known malware detection using safe antivirus test fixtures. - Scanner unavailable, timeout, crash, and restart. - Media probe failures. - Mixed archives containing clean, oversized, suspicious, and infected entries. Security tests - Verify oversized-media exemptions cannot be obtained by renaming arbitrary files. - Verify detected malware cannot bypass blocking through fallback logic. - Verify unexpected scanner failures do not authorize imports. - Verify resource limits prevent unbounded processing. - Verify worker isolation remains effective. - Verify rejected or quarantined content cannot reach Immich-Go. - Verify per-user isolation and prevent cross-user access to quarantined files. Regression and performance tests - Preserve existing upload, resume, restart, analysis, preview, and import workflows. - Test concurrent imports. - Measure CPU, memory, disk I/O, and processing time. - Compare against the established baseline. - Confirm security results persist correctly across worker restarts. 9. Explicitly Out of Scope Do not implement the following without a demonstrated need and separate approval: - YARA-X integration. - A second antivirus engine. - Full media transcoding or sanitization. - Full decoding of every video. - New container-per-file execution. - A general-purpose malware-analysis platform. - Additional user-facing security configuration screens. - Automatic rejection of all files exceeding ClamAV limits. - Broad architectural refactoring unrelated to this issue. 10. Implementation Sequence After completing the mandatory rebase: 1. Inspect existing implementation. Identify current archive inspection, ClamAV integration, worker isolation, logging, status handling, and tests. Reuse existing functionality. 2. Document the proposed changes. Identify exact modules, dependencies, and any existing behavior requiring modification. 3. Implement lightweight file classification. Add "libmagic" or equivalent only if current detection is insufficient. 4. Implement size-aware ClamAV eligibility. Preserve scanning for eligible files and explicitly classify oversized media. 5. Implement security decisions. Distinguish clean, infected, exempt, suspicious, and failed outcomes. 6. Add selective media probing. Introduce "ffprobe" only where existing checks cannot provide the required confidence. 7. Integrate reporting. Extend existing user-facing and technical reporting. 8. Add regression and security tests. Include bypass, failure, isolation, and resource-exhaustion cases. 9. Benchmark. Measure security overhead and identify expensive operations. 10. Validate and finalize. Run the full suite, review the changes for regressions, and document any residual risks. Work incrementally. Do not perform an unnecessary rewrite of the existing validation architecture. 11. Acceptance Criteria This issue is complete when: - [ ] Branch successfully rebased onto current "main". - [ ] Existing tests pass after rebase. - [ ] All archive entries receive mandatory lightweight validation. - [ ] Eligible files are scanned with ClamAV. - [ ] Legitimate oversized media can proceed under the explicit risk-based policy. - [ ] Unsupported and disguised executable content cannot use oversized-media exemptions. - [ ] Known malware is blocked. - [ ] Scanner failures do not silently bypass security. - [ ] File-level security results are accurately persisted and reported. - [ ] Existing worker isolation remains intact. - [ ] Large archive processing remains practical. - [ ] Performance overhead is measured and documented. - [ ] Existing upload, resume, restart, preview, and import workflows pass regression testing. - [ ] No unnecessary new services or dependencies are introduced. - [ ] All changes are committed and ready for review. Guiding Principle Build a secure media-ingestion pipeline, not a general-purpose antivirus platform. Use inexpensive validation universally, ClamAV where technically applicable, and deeper analysis only when justified. Maintain explicit security decisions, preserve isolation, and never silently convert an incomplete or failed scan into a clean result. Security must be meaningful, measurable, and proportionate to the actual risks of importing legitimate photo and video libraries.
jchapman force-pushed issue-12-isolated-malware-scanning from dc60037430
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
to 23cfc67c57
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
2026-10-27 13:14:13 +00:00
Compare
jchapman changed title from WIP: Gate archive processing on isolated antivirus coverage to WIP: Layered ingestion security — design and shared-stream foundation 2026-10-27 13:15:40 +00:00
jchapman changed target branch from codex/issues-10-11-diagnostics to main 2026-10-27 13:15:40 +00:00
Classify archive content and validate bounded oversized media exceptions
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
2d589e2522
jchapman changed title from WIP: Layered ingestion security — design and shared-stream foundation to WIP: Layered ingestion security with bounded media validation 2026-10-27 17:39:34 +00:00
Persist bounded private per-file security findings and owner reports
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
0b318ee9f5
jchapman changed title from WIP: Layered ingestion security with bounded media validation to WIP: Layered ingestion security and private file findings 2026-10-27 18:54:15 +00:00
Authenticate scan reuse and bind one-use execution permits
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
dcc2e5e2c3
jchapman changed title from WIP: Layered ingestion security and private file findings to WIP: Layered ingestion security with authenticated scan reuse 2026-10-28 01:21:57 +00:00
Report saved security outcomes and measure reduced ingestion costs
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
edee4a3b47
jchapman changed title from WIP: Layered ingestion security with authenticated scan reuse to WIP: Layered ingestion security and measured analysis costs 2026-10-28 02:26:29 +00:00
Add private read-only real archive analysis harness
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
f0ecca9010
Explain incomplete scanner holds and record private archive trial
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
c6ea848063
Retain bounded per-file holds while assessing later archive entries
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
5098dd6472
Verify AVI-named MP4 content and bound rejected-file assessment
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
723d9f3073
Verify selected same-family media aliases without weakening holds
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
be5dd3e367
Record Takeout documentation and bounded metadata context
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
ed5563333c
Validate explicit Takeout content and report unsupported import files
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
b9444fce7f
Support bounded motion-photo timing and Android metadata layouts
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
d588fc4d06
Validate native export formats and report unsupported importer outcomes
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
4163df9ccf
Verify required security preview and upload with wider archive coverage
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
c08e677acb
Complete independent file assessment and seal reusable file evidence
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
5469cc659f
Preflight archive layouts and handle small ZIP64 descriptors
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
078103836d
Preflight entry metadata and measure held media safely
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
aade4509dc
Record complete Takeout assessment and bounded format diagnosis
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
545e29a01e
Add private examination bundle tooling and readable reports
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
c2752ff00b
Diagnose complete review-set metadata and package false classification
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
0db7a1ce85
Keep mismatched image formats in review and clarify MOV remediation
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
8bf59b791b
Validate legacy QuickTime movies and preserve JPEG coverage holds
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
bf4073d237
Measure bounded JPEG metadata and decoded component coverage
Some checks failed
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
f40f4d0a50
jchapman force-pushed issue-12-isolated-malware-scanning from f40f4d0a50
Some checks failed
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
to 36b230a3ad
Some checks failed
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
2026-10-31 19:46:51 +00:00
Compare
jchapman force-pushed issue-12-isolated-malware-scanning from 36b230a3ad
Some checks failed
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
to cb0437832d
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
2026-10-31 21:04:55 +00:00
Compare
Verify encoded JPEG detection in ordinary and format-held originals
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
e143297b44
Validate held camera metadata without granting unsupported coverage
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
941c440573
Corroborate camera merge fields with bounded typed diagnostics
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
1e6a5d6c3f
Validate camera JPEGs with bounded metadata and component scans
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
bd677ba900
test: map held JPEG debug trailer envelopes
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
4189520ecb
test: resolve compressed camera debug envelopes and inspect headers
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
30fdec7e3d
test: audit camera log variants and distinguish weight tables
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
5bb88ce6a6
test: validate bounded camera log schemas and AV representations
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
4e0afef187
jchapman force-pushed issue-12-isolated-malware-scanning from 4e0afef187
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
to 24db3ffdf4
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
2026-11-01 03:40:48 +00:00
Compare
test: assess camera metadata variants and trailer representations
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
2cfea71066
Some checks failed
Bridge validation / source (amd64) (push) Has been cancelled
Bridge validation / source (arm64) (push) Has been cancelled
Bridge validation / backend (amd64) (push) Has been cancelled
Bridge validation / backend (arm64) (push) Has been cancelled
Bridge validation / isolation (amd64) (push) Has been cancelled
Bridge validation / isolation (arm64) (push) Has been cancelled
Bridge validation / browser (amd64) (push) Has been cancelled
Bridge validation / browser (arm64) (push) Has been cancelled
Bridge validation / production (amd64) (push) Has been cancelled
Bridge validation / production (arm64) (push) Has been cancelled
Bridge validation / supply_chain (amd64) (push) Has been cancelled
Bridge validation / supply_chain (arm64) (push) Has been cancelled
Bridge validation / release-gate (push) Has been cancelled
This pull request is marked as a work in progress.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin issue-12-isolated-malware-scanning:issue-12-isolated-malware-scanning
git switch issue-12-isolated-malware-scanning

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff issue-12-isolated-malware-scanning
git switch issue-12-isolated-malware-scanning
git rebase main
git switch main
git merge --ff-only issue-12-isolated-malware-scanning
git switch issue-12-isolated-malware-scanning
git rebase main
git switch main
git merge --no-ff issue-12-isolated-malware-scanning
git switch main
git merge --squash issue-12-isolated-malware-scanning
git switch main
git merge --ff-only issue-12-isolated-malware-scanning
git switch main
git merge issue-12-isolated-malware-scanning
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jchapman/Immich-Bridge!19
No description provided.