From 4654721836c67b2e9342b42a82c558271a534f49 Mon Sep 17 00:00:00 2001 From: Juliet Date: Tue, 10 Mar 2026 23:28:49 +0100 Subject: [PATCH] lifetime max ttl check --- web/src/pages/Upload.tsx | 35 +++++++++++++++++++++++++++++------ web/src/pages/View.tsx | 2 +- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/web/src/pages/Upload.tsx b/web/src/pages/Upload.tsx index ed5bf8d..1e77a06 100644 --- a/web/src/pages/Upload.tsx +++ b/web/src/pages/Upload.tsx @@ -14,9 +14,10 @@ export default function Upload() { const [burn, setBurn] = createSignal(false); const [copied, setCopied] = createSignal(false); const [maxFileSize, setMaxFileSize] = createSignal(0); + const [maxTtl, setMaxTtl] = createSignal(""); + const [expiryValue, setExpiryValue] = createSignal(""); let fileInput!: HTMLInputElement; - let expiryInput!: HTMLInputElement; let activeXhr: XMLHttpRequest | null = null; const RADIUS = 130; @@ -64,6 +65,24 @@ export default function Upload() { return !!f && !!max && f.size > max; }); + const parseDuration = (s: string): number | undefined => { + const units: Record = { s: 1, m: 60, h: 3600, d: 86400 }; + const n = parseInt(s); + const mult = units[s.trim().slice(-1)]; + if (isNaN(n) || mult === undefined) return undefined; + return n * mult; + }; + + const expiryTooLong = createMemo(() => { + const val = expiryValue(); + const max = maxTtl(); + if (!val || !max) return false; + const valSec = parseDuration(val); + const maxSec = parseDuration(max); + if (valSec === undefined || maxSec === undefined) return false; + return valSec > maxSec; + }); + const statusText = () => { if (encrypting()) return "encrypting\u2026"; if (uploading()) return "uploading\u2026"; @@ -100,6 +119,10 @@ export default function Upload() { if (res.ok) { const info = await res.json(); setMaxFileSize(info.maxFileSize); + if (info.maxTtl) { + setMaxTtl(info.maxTtl); + setExpiryValue(info.maxTtl); + } } } catch {} }); @@ -144,7 +167,7 @@ export default function Upload() { const formData = new FormData(); formData.append("file", new Blob([ciphertext])); - formData.append("expiresIn", expiryInput.value.trim()); + formData.append("expiresIn", expiryValue().trim()); formData.append("burnAfterRead", burn() ? "true" : "false"); setEncrypting(false); @@ -200,7 +223,7 @@ export default function Upload() { return ( <>
!resultUrl() && fileInput.click()} > lifetime
-

{fileName()}

+

{fileName()}