changing path

This commit is contained in:
Anaïs Saraiva
2026-08-15 00:46:02 +02:00
parent 4848e7a3e7
commit ad469460a4
4 changed files with 20 additions and 6 deletions
+2 -2
View File
@@ -42,7 +42,7 @@ auth() { # auth <key> -> POST password, stores cookie
}
fetch_auth() { # fetch_auth <key> <outfile>
curl -sS -b "$COOKIES" -o "$2" "$BASE/d/$1"
curl -sS -b "$COOKIES" -o "$2" "$BASE/$1"
}
printf 'hello world\n' > "$TMP/plain.txt"
@@ -62,7 +62,7 @@ URL="$(get "$TMP/up.json" url)"
check "protected file serves a password form" test \
"$(curl -sS -o /dev/null -w '%{content_type}' "$BASE$URL")" = "text/html; charset=utf-8"
check "invalid key returns 404" test \
"$(curl -sS -o /dev/null -w '%{http_code}' "$BASE/d/AAAAAAAAAAAA")" = "404"
"$(curl -sS -o /dev/null -w '%{http_code}' "$BASE/AAAAAAAAAAAA")" = "404"
check "storage directory not served" test \
"$(curl -sS -o /dev/null -w '%{http_code}' "$BASE/storage/")" = "404"
+3 -3
View File
@@ -19,7 +19,7 @@ export async function handleAuth(
if (!meta) return notFound();
if (!meta.passwordHash) {
return new Response(null, { status: 302, headers: { location: `/d/${rawKey}` } });
return new Response(null, { status: 302, headers: { location: `/${rawKey}` } });
}
const password = await req.formData().then(
@@ -32,7 +32,7 @@ export async function handleAuth(
if (!passwordMatches(meta.passwordHash, password)) {
log("warn", `auth failed id=${id}`);
return new Response(null, { status: 302, headers: { location: `/d/${rawKey}?e=1` } });
return new Response(null, { status: 302, headers: { location: `/${rawKey}?e=1` } });
}
const token = makeAuthToken(rawKey, secret, AUTH_TTL_MS);
@@ -41,5 +41,5 @@ export async function handleAuth(
}; Max-Age=${Math.floor(AUTH_TTL_MS / 1000)}`;
log("info", `auth ok id=${id}`);
return new Response(null, { status: 302, headers: { location: `/d/${rawKey}`, "set-cookie": cookie } });
return new Response(null, { status: 302, headers: { location: `/${rawKey}`, "set-cookie": cookie } });
}
+1 -1
View File
@@ -76,7 +76,7 @@ export async function handleUpload(
});
log("info", `upload ok id=${id} size=${size} name=${JSON.stringify(originalName)}`);
return json({ id, key, url: `/d/${key}`, originalName, size, protected: true });
return json({ id, key, url: `/${key}`, originalName, size, protected: true });
} catch (err) {
await storage.delete(id);
await storage.deletePartial(id);
+14
View File
@@ -7,6 +7,7 @@ import { handleAuth } from "./routes/auth";
import { handleDelete } from "./routes/delete";
import { handleDownload } from "./routes/download";
import { handleUpload } from "./routes/upload";
import { KEY_PATTERN } from "./security";
import { Storage } from "./storage";
const cfg = loadConfig();
@@ -113,6 +114,19 @@ async function route(req: Request, srv: Server<undefined>): Promise<Response> {
return handleDownload(req, storage, path.slice(3), secret);
}
const rootKey = path.slice(1);
if (
rootKey &&
!rootKey.includes("/") &&
KEY_PATTERN.test(rootKey) &&
(method === "GET" || method === "HEAD")
) {
if (cfg.rateLimitEnabled && !limiter.check(clientIp(req, srv))) {
return jsonError(429, "too many requests");
}
return handleDownload(req, storage, rootKey, secret);
}
if (path.startsWith("/api/files/") && method === "DELETE") {
if (cfg.rateLimitEnabled && !limiter.check(clientIp(req, srv))) {
return jsonError(429, "too many requests");