authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2025-10-18 10:40:01-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2025-10-18 10:40:54-07:00
log3054df53b55f49b1421c222591bbd4d7f7e935c0
tree35d653cf56fc51913b7d574e4cba9c73d5f575d3
parent123f64dc0198ef576cae7e75bc02f2742c527d93
signature Commit is signed but in an unrecognized format.

feat(site): little secret message route


3 files changed, 29 insertions(+), 0 deletions(-)

framework/lib/path.ts+4
......@@ -193,6 +193,10 @@ export class Path {
193193 await fs.writeFile(this.raw, JSON.stringify(json));
194194 }
195195
196 async writeMkdir(text: string) {
197 await fs.writeMkdir(this.raw, text);
198 }
199
196200 static sep = path.sep;
197201
198202 [Symbol.for("nodejs.util.inspect.custom")](
src/backend-extra.ts created+24
......@@ -0,0 +1,24 @@
1export const app = new Hono();
2
3app.get("/extra/secret-message", async (c) => {
4 const { key } = c.req.query();
5 if (!key || !key.match(/^[a-z0-9]+$/)) {
6 return c.text("400 bad request", { status: 400 });
7 }
8 const text = await Path.resolve(".clover/secret-message", key)
9 .readIfExists("utf-8");
10 if (text) return c.text(text);
11 return c.text("401 not authorized", { status: 401 });
12});
13app.post("/admin/extra/secret-message", async (c) => {
14 const key = c.req.query("key");
15 if (!key || !key.match(/^[a-z0-9]$/)) {
16 return c.text("400 bad request", { status: 400 });
17 }
18 await Path.resolve(".clover/secret-message", key)
19 .writeMkdir(await c.req.text());
20 return c.text("ok", { status: 200 });
21});
22
23import { Path } from "#sitegen/path";
24import { Hono } from "hono";
src/backend.ts+1
......@@ -12,6 +12,7 @@ app.use(admin.middleware);
1212app.route("", require("./q+a/backend.ts").app);
1313app.route("", require("./file-viewer/backend.tsx").app);
1414app.route("", require("./friend-auth.ts").app);
15app.route("", require("./backend-extra.ts").app);
1516
1617// Asset middleware has least precedence
1718app.use(assets.middleware);