Skip to content

enhance(media): support private Azure Blob storage - #37

Merged
rschlaefli merged 10 commits into
release/2.0.0-uzhfrom
rs/trypost-blob-storage
Oct 26, 2026
Merged

rschlaefli merged 10 commits into
release/2.0.0-uzhfrom
rs/trypost-blob-storage

Conversation

@rschlaefli

@rschlaefli rschlaefli commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

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.

State Desktop Compact
Edit through authorized file access Synthetic image editor on desktop Synthetic image editor on compact viewport
Saved draft reopened Edited image after reload on desktop Edited image after reload on compact viewport

Screenshots

Azure publication email fallback

Private Azure media renders as the existing attachment filename fallback.

  • Source revision: 6435329
  • Captured: 2026-10-25T19:50:32.705768+00:00
  • Environment: Real Chromium rendering actual local Blade output with synthetic data; no SMTP or live Azure
  • Viewports: 1200x900, 390x844
  • Locales: en

Screenshots record visual state at capture time; they do not by themselves establish that an interaction works.

Interaction checks

  • Published and failed email rendering passes existing tests.
  • No broken images or horizontal overflow in inspected compact render.
  • The existing action link remains present.

Warnings

Email transport and individual mail clients were not exercised.
Azure identity, SAS and network qualification remain separate.

Publication emails

State Desktop Compact
Published email Published email with synthetic attachment filename on desktop viewport
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.
Published email with synthetic attachment filename on compact viewport
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.
Failed email Failed email with synthetic attachment filename on desktop viewport
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.
Failed email with synthetic attachment filename on compact viewport
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.

@rschlaefli
rschlaefli marked this pull request as ready for review October 26, 2026 06:48
Copilot AI balanced review requested due to automatic review settings October 26, 2026 06:48
@rschlaefli
rschlaefli merged commit 9ef8fea into release/2.0.0-uzh Oct 26, 2026
17 of 19 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants