feat: Add S3 quick upload with presigned manifest support

- Add `js/s3-quick.js` with `uploadWithManifest` and `uploadWithKeys`.
- Update `components/upload-modal.html` to add "Use presigned manifest" toggle and warning.
- Update `js/ui/components/UploadModal.js` to wire up the manifest upload flow.
- Add local persistence for quick S3 settings (though mainly handled by existing storage settings).
- Ensure keys are only used for client-side uploads or replaced by manifest flow.
This commit is contained in:
google-labs-jules[bot] committed 2026-01-25 01:38:41 +00:00
1 parent 874c29e41e
commit adad6a07a4
4 files changed
+368 -98

No files matched your search

+60 -36
View File
@@ -265,44 +265,68 @@
<p class="text-xs text-muted">
Configure a generic S3-compatible bucket for direct uploads.
</p>
<div class="space-y-1">
<label for="input-s3-endpoint" class="text-xs font-medium text-text">Endpoint</label>
<input id="input-s3-endpoint" type="text" class="input text-xs" placeholder="https://host[:port]" />
</div>
<div class="grid gap-3 md:grid-cols-2">
<div class="space-y-1">
<label for="input-s3-region" class="text-xs font-medium text-text">Region (optional)</label>
<input id="input-s3-region" type="text" class="input text-xs" placeholder="auto" />
</div>
<div class="space-y-1">
<label for="input-s3-bucket" class="text-xs font-medium text-text">Bucket (explicit override if needed)</label>
<input id="input-s3-bucket" type="text" class="input text-xs" placeholder="my-bucket" />
</div>
</div>
<div class="grid gap-3 md:grid-cols-2">
<div class="space-y-1">
<label for="input-s3-key" class="text-xs font-medium text-text">Access Key ID</label>
<input id="input-s3-key" type="text" class="input text-xs" placeholder="AKIA..." />
</div>
<div class="space-y-1">
<label for="input-s3-secret" class="text-xs font-medium text-text">Secret Access Key</label>
<input id="input-s3-secret" type="password" class="input text-xs" />
</div>
</div>
<div class="space-y-1">
<label for="input-s3-public-base" class="text-xs font-medium text-text">Public Base URL Override</label>
<input id="input-s3-public-base" type="text" class="input text-xs" placeholder="https://cdn.example.com/bucket" />
</div>
<div class="flex flex-wrap gap-4 text-xs text-muted">
<label class="flex items-center gap-2 cursor-pointer select-none">
<input type="checkbox" id="check-s3-path-style" class="checkbox" />
<span>Force path-style URLs</span>
</label>
<label class="flex items-center gap-2 cursor-pointer select-none">
<input type="checkbox" id="check-s3-create-bucket" class="checkbox" />
<span>Create bucket if missing</span>
<p class="text-xs text-status-warning bg-status-warning/10 p-2 rounded">
Warning: Browser-held keys are only safe for trusted operators.
</p>
<div class="flex items-center gap-2">
<input type="checkbox" id="quickS3ManifestToggle" class="checkbox" />
<label for="quickS3ManifestToggle" class="text-xs font-medium text-text select-none">
Use presigned manifest
</label>
</div>
<div id="quickS3CredentialsContainer" class="space-y-4">
<div class="space-y-1">
<label for="input-s3-endpoint" class="text-xs font-medium text-text">Endpoint</label>
<input id="input-s3-endpoint" type="text" class="input text-xs" placeholder="https://host[:port]" />
</div>
<div class="grid gap-3 md:grid-cols-2">
<div class="space-y-1">
<label for="input-s3-region" class="text-xs font-medium text-text">Region (optional)</label>
<input id="input-s3-region" type="text" class="input text-xs" placeholder="auto" />
</div>
<div class="space-y-1">
<label for="input-s3-bucket" class="text-xs font-medium text-text">Bucket (explicit override if needed)</label>
<input id="input-s3-bucket" type="text" class="input text-xs" placeholder="my-bucket" />
</div>
</div>
<div class="grid gap-3 md:grid-cols-2">
<div class="space-y-1">
<label for="input-s3-key" class="text-xs font-medium text-text">Access Key ID</label>
<input id="input-s3-key" type="text" class="input text-xs" placeholder="AKIA..." />
</div>
<div class="space-y-1">
<label for="input-s3-secret" class="text-xs font-medium text-text">Secret Access Key</label>
<input id="input-s3-secret" type="password" class="input text-xs" />
</div>
</div>
<div class="space-y-1">
<label for="input-s3-public-base" class="text-xs font-medium text-text">Public Base URL Override</label>
<input id="input-s3-public-base" type="text" class="input text-xs" placeholder="https://cdn.example.com/bucket" />
</div>
<div class="flex flex-wrap gap-4 text-xs text-muted">
<label class="flex items-center gap-2 cursor-pointer select-none">
<input type="checkbox" id="check-s3-path-style" class="checkbox" />
<span>Force path-style URLs</span>
</label>
<label class="flex items-center gap-2 cursor-pointer select-none">
<input type="checkbox" id="check-s3-create-bucket" class="checkbox" />
<span>Create bucket if missing</span>
</label>
</div>
</div>
<div id="quickS3ManifestContainer" class="hidden space-y-2">
<label for="quickS3ManifestJson" class="text-xs font-medium text-text">Manifest JSON</label>
<textarea
id="quickS3ManifestJson"
rows="6"
class="textarea text-xs font-mono"
placeholder='{"uploadId": "...", "partUrls": ["..."]}'
></textarea>
</div>
<div class="flex justify-end gap-2 pt-2">
<button type="button" id="btn-save-s3-settings" class="btn btn-sm">Verify & Save</button>
</div>