internaluploader: server + docs

One-way upload server: authentik SSO pairing (QR + app-initiated deep
link), hashed device tokens, streamed sha256-verified uploads into the
metube directory as <sha256>.<ext>.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-28 23:17:25 +01:00
committed by Michal
commit d8a606ce46
47 changed files with 4196 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
import assert from "node:assert/strict";
import { mkdtempSync } from "node:fs";
import { readFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { test } from "node:test";
import { TokenStore } from "../src/tokens.ts";
test("pairing code round-trip mints a working device token", async () => {
const dir = mkdtempSync(join(tmpdir(), "tokens-"));
const store = new TokenStore(dir, 60_000);
const pairing = store.issuePairingCode("michal");
assert.match(pairing.code, /^[0-9a-f]{64}$/);
const redeemed = store.redeemPairingCode(pairing.code);
assert.ok(redeemed);
assert.equal(redeemed.username, "michal");
// Single use.
assert.equal(store.redeemPairingCode(pairing.code), undefined);
// The token authenticates, wrong tokens do not.
assert.equal(store.authenticate(redeemed.token), "michal");
assert.equal(store.authenticate("not-a-token"), undefined);
// Nothing on disk contains the plaintext token.
const persisted = await readFile(join(dir, "devices.json"), "utf8");
assert.ok(!persisted.includes(redeemed.token));
// A fresh store reads the same devices back.
const reloaded = new TokenStore(dir, 60_000);
assert.equal(reloaded.authenticate(redeemed.token), "michal");
});
test("expired pairing codes are refused", () => {
const dir = mkdtempSync(join(tmpdir(), "tokens-"));
const store = new TokenStore(dir, -1); // already expired at issue time
const pairing = store.issuePairingCode("michal");
assert.equal(store.redeemPairingCode(pairing.code), undefined);
});