Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/pwa/src/moshpit.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ export async function listNamesForUser(userId) {
*/
export async function registerName({ tld: tldInput, label: labelInput, userId, target = null }) {
const tld = normalizeTld(tldInput);
const label = normalizeTld(labelInput);
const label = normalizeLabel(labelInput);
if (!tld || !label) return { ok: false, error: "not a valid name — letters, digits and dashes only" };

const owner = await getTld(tld);
Expand Down Expand Up @@ -255,7 +255,7 @@ export async function releaseName({ tld: tldInput, label: labelInput, userId })

async function ownedName(tldInput, labelInput, userId) {
const tld = normalizeTld(tldInput);
const label = normalizeTld(labelInput);
const label = normalizeLabel(labelInput);
if (!tld || !label) return { ok: false, error: "not a valid name" };
const existing = await getName(tld, label);
if (!existing) return { ok: false, error: `${label}.${tld} is not registered` };
Expand Down
18 changes: 9 additions & 9 deletions apps/pwa/src/routes/moshpit.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { page, footer, appBar, esc } from "../lib/html.mjs";
import { requireAuth, csrfInput } from "../lib/session.mjs";
import { balance } from "../lib/credits.mjs";
import {
getTld, listTlds, listTldsForUser, registerTld,
getTld, listTlds, listTldsForUser, registerTld, normalizeLabel,
setAlias, clearAlias, listExempt, setExempt, clearExempt,
listNames, registerName, setNameTarget, releaseName,
resolveMoshpitName, normalizeTld, tldRejection,
Expand Down Expand Up @@ -102,14 +102,14 @@ moshpitRouter.post("/api/moshpit/tlds/:tld/exempt", async (req, res) => {
if (!req.user) return unauthorized(res);
const result = await setExempt({ tld: req.params.tld, label: req.body?.label, userId: req.user.id });
if (!result.ok) return bad(res, result.error || "could not exempt that name");
res.status(201).json({ tld: normalizeTld(req.params.tld), label: normalizeTld(req.body?.label), exempt: true });
res.status(201).json({ tld: normalizeTld(req.params.tld), label: normalizeLabel(req.body?.label), exempt: true });
});

moshpitRouter.delete("/api/moshpit/tlds/:tld/exempt", async (req, res) => {
if (!req.user) return unauthorized(res);
const result = await clearExempt({ tld: req.params.tld, label: req.body?.label, userId: req.user.id });
if (!result.ok) return bad(res, result.error || "could not clear that exemption");
res.json({ tld: normalizeTld(req.params.tld), label: normalizeTld(req.body?.label), exempt: false });
res.json({ tld: normalizeTld(req.params.tld), label: normalizeLabel(req.body?.label), exempt: false });
});

/* ---- names under a TLD ---- */
Expand All @@ -135,14 +135,14 @@ moshpitRouter.put("/api/moshpit/tlds/:tld/names", async (req, res) => {
tld: req.params.tld, label: req.body?.label, userId: req.user.id, target: req.body?.target,
});
if (!result.ok) return bad(res, result.error || "could not retarget that name");
res.json({ tld: normalizeTld(req.params.tld), label: normalizeTld(req.body?.label), target: req.body?.target ?? null });
res.json({ tld: normalizeTld(req.params.tld), label: normalizeLabel(req.body?.label), target: req.body?.target ?? null });
});

moshpitRouter.delete("/api/moshpit/tlds/:tld/names", async (req, res) => {
if (!req.user) return unauthorized(res);
const result = await releaseName({ tld: req.params.tld, label: req.body?.label, userId: req.user.id });
if (!result.ok) return bad(res, result.error || "could not release that name");
res.json({ tld: normalizeTld(req.params.tld), label: normalizeTld(req.body?.label), released: true });
res.json({ tld: normalizeTld(req.params.tld), label: normalizeLabel(req.body?.label), released: true });
});

/**
Expand Down Expand Up @@ -325,13 +325,13 @@ moshpitRouter.post("/pit/:tld/names", requireAuth, async (req, res) => {
let result, done;
if (req.body?.release) {
result = await releaseName(args);
done = `${normalizeTld(label)}.${normalizeTld(tld)} released.`;
done = `${normalizeLabel(label)}.${normalizeTld(tld)} released.`;
} else if (req.body?.retarget) {
result = await setNameTarget({ ...args, target: req.body?.target });
done = `${normalizeTld(label)}.${normalizeTld(tld)} updated.`;
done = `${normalizeLabel(label)}.${normalizeTld(tld)} updated.`;
} else {
result = await registerName({ ...args, target: req.body?.target });
done = `${normalizeTld(label)}.${normalizeTld(tld)} is yours.`;
done = `${normalizeLabel(label)}.${normalizeTld(tld)} is yours.`;
}

if (!result.ok) return back(res, { err: result.error || "could not update that name" });
Expand All @@ -341,5 +341,5 @@ moshpitRouter.post("/pit/:tld/names", requireAuth, async (req, res) => {
moshpitRouter.post("/pit/:tld/exempt", requireAuth, async (req, res) => {
const result = await setExempt({ tld: req.params.tld, label: req.body?.label, userId: req.user.id });
if (!result.ok) return back(res, { err: result.error || "could not exempt that name" });
back(res, { ok: `${normalizeTld(req.body?.label)}.${req.params.tld} stays put.` });
back(res, { ok: `${normalizeLabel(req.body?.label)}.${req.params.tld} stays put.` });
});
19 changes: 19 additions & 0 deletions apps/pwa/test/moshpit-registry.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,25 @@ test("moshpit registry", { skip: installed ? false : "pwa dependencies not insta
assert.equal(await m.getName("eggs", "blue"), null);
});

await t.test("a numeric name can be registered, retargeted and released", async () => {
// A TLD may not be all-numeric (ambiguous against an IPv4 literal), but a
// label under one carries no such ambiguity -- 123.eggs is a fine name.
assert.equal((await m.registerName({ tld: "eggs", label: "123", userId: ALICE, target: "https://n.example" })).ok, true);
assert.equal((await m.getName("eggs", "123")).target, "https://n.example");

assert.equal((await m.setNameTarget({ tld: "eggs", label: "123", userId: ALICE, target: "https://n2.example" })).ok, true);
assert.equal((await m.getName("eggs", "123")).target, "https://n2.example");

assert.equal((await m.resolveMoshpitName("123.eggs")).name_registered, true);

assert.equal((await m.releaseName({ tld: "eggs", label: "123", userId: ALICE })).ok, true);
assert.equal(await m.getName("eggs", "123"), null);
});

await t.test("the TLD itself still may not be numeric", async () => {
assert.equal((await m.registerTld({ tld: "123", userId: ALICE })).ok, false);
});

await t.test("minting is logged", async () => {
const log = await m.tldLog();
assert.ok(log.some((e) => e.action === "name:blue"));
Expand Down
Loading