From 5b3bc10a063cd5bc393cce1f0fe9eb214fc349ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C5=ABdolfs=20O=C5=A1i=C5=86=C5=A1?= Date: Wed, 30 Sep 2026 14:46:09 +0200 Subject: [PATCH] Check bare RIDs against already seeded repos The seed form accepts a RID without the rad: prefix but compared it as typed against lists that have the prefix, so duplicates got through. --- src/components/AddRepoButton.svelte | 42 ++++++++++++----------------- src/lib/seedRepo.ts | 23 ++++++++++++++++ tests/unit/seedRepo.test.ts | 31 +++++++++++++++++++++ 3 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 src/lib/seedRepo.ts create mode 100644 tests/unit/seedRepo.test.ts diff --git a/src/components/AddRepoButton.svelte b/src/components/AddRepoButton.svelte index ca88e30da..04ae13185 100644 --- a/src/components/AddRepoButton.svelte +++ b/src/components/AddRepoButton.svelte @@ -9,8 +9,9 @@ import { nodeRunning } from "@app/lib/events"; import { invoke } from "@app/lib/invoke"; + import { seedTarget } from "@app/lib/seedRepo"; import useLocalStorage from "@app/lib/useLocalStorage.svelte"; - import { parseRepositoryId, twemoji } from "@app/lib/utils"; + import { twemoji } from "@app/lib/utils"; import { announce } from "@app/components/AnnounceSwitch.svelte"; import Button from "@app/components/Button.svelte"; @@ -56,20 +57,25 @@ ); async function submit() { - const trimmedRid = rid.trim(); - - if (trimmedRid === "") { + if (rid.trim() === "") { return; } - validationMessage = validate(trimmedRid); - - if (validationMessage === undefined) { - await seed(trimmedRid); - await reload(); - rid = ""; - closeFocused(); + const target = seedTarget( + rid, + seededNotReplicated, + repos.map(r => r.rid), + ); + if ("error" in target) { + validationMessage = target.error; + return; } + + validationMessage = undefined; + await seed(target.rid); + await reload(); + rid = ""; + closeFocused(); } async function seed(rid: string) { @@ -82,20 +88,6 @@ console.error("Seeding failed", error); } } - - function validate(rid: string): string | undefined { - const parsedRid = parseRepositoryId(rid); - if (parsedRid === undefined) { - return "RID is not valid"; - } - - if (seededNotReplicated.includes(rid)) { - return "This repo is already queued for fetching"; - } - if (repos.map(r => r.rid).includes(rid)) { - return "This repo is already seeded"; - } - }