From 574fd4314496af84b9f876168bed6074380d2e14 Mon Sep 17 00:00:00 2001 From: Juliet Date: Sat, 28 Feb 2026 08:04:10 +0100 Subject: [PATCH] remove delete token --- public/index.html | 25 +------------------------ src/db.ts | 22 ++++------------------ src/index.ts | 2 -- src/routes/delete.ts | 18 ------------------ src/routes/file.ts | 5 ++--- 5 files changed, 7 insertions(+), 65 deletions(-) delete mode 100644 src/routes/delete.ts diff --git a/public/index.html b/public/index.html index deebe52..dcb2dcc 100644 --- a/public/index.html +++ b/public/index.html @@ -119,19 +119,6 @@ Copy -
- - -
@@ -157,8 +144,6 @@ const linkInput = document.getElementById("link-input"); const linkEl = document.getElementById("link"); const copyBtn = document.getElementById("copy"); - const deleteUrlEl = document.getElementById("delete-url"); - const copyDeleteBtn = document.getElementById("copy-delete"); const errorEl = document.getElementById("error"); let selectedFile = null; @@ -269,13 +254,10 @@ xhr.send(formData); }); - const { id, deleteToken } = res; + const { id } = res; const url = `${location.origin}/p/${id}#${encoded}`; - const deleteUrl = `${location.origin}/delete/${id}?token=${deleteToken}`; linkEl.href = url; linkInput.value = url; - deleteUrlEl.href = deleteUrl; - deleteUrlEl.textContent = "Delete link"; result.classList.remove("hidden"); progressBar.classList.add("hidden"); } catch (e) { @@ -294,11 +276,6 @@ setTimeout(() => (copyBtn.textContent = "Copy"), 1500); }); - copyDeleteBtn.addEventListener("click", () => { - navigator.clipboard.writeText(deleteUrlEl.href); - copyDeleteBtn.textContent = "Copied!"; - setTimeout(() => (copyDeleteBtn.textContent = "Copy"), 1500); - }); diff --git a/src/db.ts b/src/db.ts index c1d9ff9..4064043 100644 --- a/src/db.ts +++ b/src/db.ts @@ -13,20 +13,18 @@ db.run(` CREATE TABLE IF NOT EXISTS files ( id TEXT PRIMARY KEY, expires_at INTEGER NOT NULL, - burn_after_read INTEGER NOT NULL DEFAULT 0, - delete_token TEXT NOT NULL + burn_after_read INTEGER NOT NULL DEFAULT 0 ); `); -const insertStmt = db.prepare( - "INSERT INTO files (id, expires_at, burn_after_read, delete_token) VALUES (?, ?, ?, ?)", +const insertStmt = db.prepare( + "INSERT INTO files (id, expires_at, burn_after_read) VALUES (?, ?, ?)", ); type FileRow = { id: string; expires_at: number; burn_after_read: number; - delete_token: string; }; const selectStmt = db.prepare( @@ -39,10 +37,6 @@ const burnStmt = db.prepare( "DELETE FROM files WHERE id = ? AND burn_after_read = 1 RETURNING *", ); -const deleteWithTokenStmt = db.prepare( - "DELETE FROM files WHERE id = ? AND delete_token = ?", -); - const cleanStmt = db.prepare<{ id: string }, [number]>( "DELETE FROM files WHERE expires_at <= ? RETURNING id", ); @@ -51,9 +45,8 @@ export function createFile( id: string, expiresAt: number, burnAfterRead: boolean, - deleteToken: string, ): void { - insertStmt.run(id, expiresAt, burnAfterRead ? 1 : 0, deleteToken); + insertStmt.run(id, expiresAt, burnAfterRead ? 1 : 0); } // Read-only lookup — does not trigger burn-after-read or delete expired rows @@ -87,13 +80,6 @@ export function unlinkFile(id: string): void { } catch {} } -export function deleteFile(id: string, token: string): boolean { - const result = deleteWithTokenStmt.run(id, token); - if (!result.changes) return false; - unlinkFile(id); - return true; -} - export function cleanExpired(): void { const now = Math.floor(Date.now() / 1000); for (const { id } of cleanStmt.all(now)) { diff --git a/src/index.ts b/src/index.ts index b68d8fe..44c5a72 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,14 +1,12 @@ import { Hono } from "hono"; import { serveStatic } from "hono/bun"; import file from "./routes/file.ts"; -import del from "./routes/delete.ts"; import { cleanExpired } from "./db.ts"; import { config } from "./config.ts"; const app = new Hono(); app.route("/api/file", file); -app.route("/delete", del); app.get("/p/:id", () => { return new Response(Bun.file("public/view.html"), { diff --git a/src/routes/delete.ts b/src/routes/delete.ts deleted file mode 100644 index a2592c2..0000000 --- a/src/routes/delete.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Hono } from "hono"; -import { deleteFile } from "../db.ts"; - -const del = new Hono(); - -del.get("/:id", (c) => { - const id = c.req.param("id"); - const token = c.req.query("token"); - if (!token) { - return c.json({ error: "Missing token" }, 401); - } - if (!deleteFile(id, token)) { - return c.json({ error: "Invalid token or file not found" }, 403); - } - return c.json({ ok: true }); -}); - -export default del; diff --git a/src/routes/file.ts b/src/routes/file.ts index 7a04b76..20ec5f0 100644 --- a/src/routes/file.ts +++ b/src/routes/file.ts @@ -49,7 +49,6 @@ file.post("/", async (c) => { } const id = crypto.randomUUID(); - const deleteToken = crypto.randomUUID(); const expiresAt = Math.floor(Date.now() / 1000) + expiresInSec; const filePath = `${FILES_DIR}/${id}`; @@ -57,13 +56,13 @@ file.post("/", async (c) => { await Bun.write(filePath, buffer); try { - createFile(id, expiresAt, burnAfterRead, deleteToken); + createFile(id, expiresAt, burnAfterRead); } catch (err) { unlinkFile(id); throw err; } - return c.json({ id, deleteToken }); + return c.json({ id }); }); file.get("/:id/info", (c) => { -- 2.51.2