Repository navigation
enhance(media): support private Azure Blob storage - #37
Merged
Merged
Conversation
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add an optional private Azure Blob backend to TryPost while preserving the existing S3 and local defaults. Physical object names are flat; logical paths and media ownership remain stable. No database migration, existing-media copy or reset is included.
Browser previews use authorized redirects. API/MCP and webhook payloads obtain per-file read links when delivered; unavailable attachments retain their identity with a null URL so lists and lifecycle events still work. Publishing workers obtain links at execution time, fail before contacting a provider when an attachment is missing, and retry temporary storage outages. Accepted provider checkpoints remain intact.
Workload identity requests user-delegation keys, cached encrypted for five minutes, with no account-key fallback. Persistent references stay unsigned, including webhook queues and logs. Redaction preserves safe exception diagnostics, and avatar failures yield an absent image. Native block uploads and range reads bound video/PDF memory use. Azure publication emails use the existing text/attachment fallback, and API/MCP thread previews share the normal owned-media link helper. Ranged requests have explicit request/read limits. The default streaming handler uses the request limit for connecting; the separate connect setting applies only to supporting handlers. Stalled connections, body-read failures and actual retries remain Azure qualification cases. MIME detection and prefix scanning are consolidated without changing upload replay or deletion ordering. Read links confer file access until expiry.
Real Chromium captures, synthetic local storage fixture, English; 1280×900 and 390×844. Edit, save and reload passed. These demonstrate browser integration and do not qualify Azure transport or RBAC.
Screenshots
Azure publication email fallback
Private Azure media renders as the existing attachment filename fallback.
Screenshots record visual state at capture time; they do not by themselves establish that an interaction works.
Interaction checks
Warnings
Publication emails
label: Published email
Current screenshot; source revision: 6435329
captured: 2026-10-25T19:50:32.705768+00:00
locale: en
viewport: 1200x900
screenshot note: Azure media uses the existing filename fallback without a broken image.
provenance: Captured from the actual Blade render with a synthetic unsaved Post. Mail source is identical to this committed revision; layout/assets unchanged.
label: Published email
Current screenshot; source revision: 6435329
captured: 2026-10-25T19:50:32.705768+00:00
locale: en
viewport: 390x844
screenshot note: Azure media uses the existing filename fallback without a broken image.
provenance: Captured from the actual Blade render with a synthetic unsaved Post. Mail source is identical to this committed revision; layout/assets unchanged.
label: Failed email
Current screenshot; source revision: 6435329
captured: 2026-10-25T19:50:32.705768+00:00
locale: en
viewport: 1200x900
screenshot note: Azure media uses the existing filename fallback without a broken image.
provenance: Captured from the actual Blade render with a synthetic unsaved Post. Mail source is identical to this committed revision; layout/assets unchanged.
label: Failed email
Current screenshot; source revision: 6435329
captured: 2026-10-25T19:50:32.705768+00:00
locale: en
viewport: 390x844
screenshot note: Azure media uses the existing filename fallback without a broken image.
provenance: Captured from the actual Blade render with a synthetic unsaved Post. Mail source is identical to this committed revision; layout/assets unchanged.
Screenshots document the recorded visual states.
Validation: earlier media/storage/ownership, API/MCP/social, webhook, signing-vector and block suites passed. The correction and simplification suite passes 132 tests with 643 assertions; five new preview cases reproduced the original defects. PHP formatting passes. Scoped Opengrep reports zero findings with four partial-parse limitations. Official Azure SDK 12.19.0 signing vectors remain unchanged. Desktop/compact edit, upload, save and reload evidence remains applicable; new email fallback renders were inspected at both widths. All ten hosted checks pass at 6435329: quality, PostgreSQL/MySQL shards, browser shards and backend/e2e aggregators. One unchanged label-filter browser test timed out initially; its exact job and dependent aggregator passed on one same-head rerun.
Prior independent risk and integrated reviews remain applicable to unchanged code. The committed correction range passed independent risk review and final Opus verification with no introduced blocker. This remains draft source preparation. Real Azure identity/RBAC, Shared Key denial, SAS and block transport, video seek, external fetch, and redirect/API/avatar latency require qualification before activation. Flat-prefix pruning currently scans the dedicated container; assess its cost before expanding the media library. Provisioning, release and deployment require separate approval.