From 4b2e17907d9af75b9ddb8a7f4bb7b3d22035cbb2 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Fri, 28 Mar 2025 11:09:43 +0100 Subject: [PATCH] Support basic auth --- ...orage-marketplace-ui-components-0.0.51.tgz | Bin 0 -> 58277 bytes codex-storage-sdk-js-0.1.1.tgz | Bin 0 -> 44381 bytes e2e/onboarding.spec.ts | 1 + e2e/settings.spec.ts | 97 ++++-- package-lock.json | 26 +- package.json | 4 +- .../CodexUrllSettings/CodexUrlSettings.tsx | 55 ---- src/components/HealthChecks/HealthChecks.tsx | 37 ++- .../HealthChecks/health-check.utils.test.ts | 290 +++++++++--------- .../HealthChecks/health-check.utils.ts | 141 +++++---- .../ManifestFetch/ManifestFetch.tsx | 1 - src/hooks/useDebug.ts | 40 +-- src/main.tsx | 2 +- src/routes/dashboard/settings.tsx | 73 +++-- src/sdk/codex.ts | 43 ++- 15 files changed, 446 insertions(+), 364 deletions(-) create mode 100644 codex-storage-marketplace-ui-components-0.0.51.tgz create mode 100644 codex-storage-sdk-js-0.1.1.tgz delete mode 100644 src/components/CodexUrllSettings/CodexUrlSettings.tsx diff --git a/codex-storage-marketplace-ui-components-0.0.51.tgz b/codex-storage-marketplace-ui-components-0.0.51.tgz new file mode 100644 index 0000000000000000000000000000000000000000..bdb8b8558ac5bc00b4c94f86fea85049d27cb83d GIT binary patch literal 58277 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 literal 0 HcmV?d00001 diff --git a/e2e/onboarding.spec.ts b/e2e/onboarding.spec.ts index 6f362f5..baee755 100644 --- a/e2e/onboarding.spec.ts +++ b/e2e/onboarding.spec.ts @@ -77,6 +77,7 @@ test("does not display undefined when delete the url value", async ({ } await expect(page.locator("#url")).toHaveValue(""); + await page.locator("#url").blur(); await expect(page.locator("#url")).toHaveAttribute("aria-invalid"); await expect(page.locator(".refresh svg")).toHaveAttribute( "color", diff --git a/e2e/settings.spec.ts b/e2e/settings.spec.ts index 94d8192..288feab 100644 --- a/e2e/settings.spec.ts +++ b/e2e/settings.spec.ts @@ -8,23 +8,80 @@ import test, { expect } from "@playwright/test"; // await expect(page.locator('span').filter({ hasText: 'success ! The log level has' }).locator('b')).toBeVisible(); // }) -test('update the URL with wrong URL applies', async ({ page }) => { - await page.goto('/dashboard'); - await page.locator('a').filter({ hasText: 'Settings' }).click(); - await page.getByLabel('Address').click(); - await page.getByLabel('Address').fill('hello'); - await expect(page.getByLabel('Address')).toHaveAttribute("aria-invalid") - await expect(page.locator(".refresh svg")).toHaveAttribute("color", "#494949") - await page.getByLabel('Address').fill('http://127.0.0.1:8079'); - await expect(page.getByLabel('Address')).not.toHaveAttribute("aria-invalid") - await expect(page.locator(".refresh svg")).not.toHaveAttribute("aria-disabled") - await expect(page.getByLabel('Address')).toHaveValue("http://127.0.0.1") - await expect(page.getByLabel('Port')).toHaveValue("8079") - await page.locator(".refresh").click() - await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).toBeVisible() - await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).not.toBeVisible() - await page.getByLabel('Address').fill('http://127.0.0.1:8080'); - await page.locator(".refresh").click() - await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).not.toBeVisible() - await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).toBeVisible() -}) \ No newline at end of file +test("update the URL with wrong URL applies", async ({ page }) => { + await page.goto("/dashboard"); + await page.locator("a").filter({ hasText: "Settings" }).click(); + await page.getByLabel("Address").click(); + await page.getByLabel("Address").fill("hello"); + await page.getByLabel("Address").blur(); + await expect(page.getByLabel("Address")).toHaveAttribute("aria-invalid"); + await expect(page.locator(".refresh svg")).toHaveAttribute( + "color", + "#494949" + ); + await page.getByLabel("Address").fill("http://127.0.0.1:8079"); + await page.getByLabel("Address").blur(); + await expect(page.getByLabel("Address")).not.toHaveAttribute("aria-invalid"); + await expect(page.locator(".refresh svg")).not.toHaveAttribute( + "aria-disabled" + ); + await expect(page.getByLabel("Address")).toHaveValue("http://127.0.0.1"); + await expect(page.getByLabel("Port")).toHaveValue("8079"); + await page.locator(".refresh").click(); + await expect( + page.locator(".health-checks ul li").nth(2).getByTestId("icon-error") + ).toBeVisible(); + await expect( + page.locator(".health-checks ul li").nth(2).getByTestId("icon-success") + ).not.toBeVisible(); + await page.getByLabel("Address").fill("http://127.0.0.1:8080"); + await page.locator(".refresh").click(); + await expect( + page.locator(".health-checks ul li").nth(2).getByTestId("icon-error") + ).not.toBeVisible(); + await expect( + page.locator(".health-checks ul li").nth(2).getByTestId("icon-success") + ).toBeVisible(); +}); + +test("update the URL with basic auth save the credentials", async ({ + page, +}) => { + await page.goto("/dashboard"); + await page.locator("a").filter({ hasText: "Settings" }).click(); + await page.getByLabel("Address").click(); + await page.getByLabel("Address").fill("http://hello:world@localhost:8080"); + await page.getByLabel("Address").blur(); + await expect(page.getByLabel("Address")).not.toHaveAttribute("aria-invalid"); + await expect(page.locator(".refresh svg")).not.toHaveAttribute( + "aria-disabled" + ); + + let failedRequestAuthorization; + page.on("requestfailed", async (request) => { + failedRequestAuthorization = await request.headerValue("Authorization"); + }); + + await page.locator(".refresh").click(); + + await page.waitForTimeout(1000); + + expect(failedRequestAuthorization).toBe("Basic " + btoa("hello:world")); + + await page.getByLabel("Address").click(); + await page.getByLabel("Address").fill("http://localhost:8080"); + await page.getByLabel("Address").blur(); + + let successRequestAuthorization: string | null = "failed"; + page.on("request", async (request) => { + if (request.url().endsWith("/api/codex/v1/spr")) { + successRequestAuthorization = await request.headerValue("Authorization"); + } + }); + + await page.locator(".refresh").click(); + + await page.waitForRequest("http://localhost:8080/api/codex/v1/spr"); + + expect(successRequestAuthorization).toBeNull(); +}); diff --git a/package-lock.json b/package-lock.json index 15a72bd..e3b9341 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.0.16", "license": "MIT", "dependencies": { - "@codex-storage/marketplace-ui-components": "^0.0.51", - "@codex-storage/sdk-js": "^0.0.23", + "@codex-storage/marketplace-ui-components": "./codex-storage-marketplace-ui-components-0.0.51.tgz", + "@codex-storage/sdk-js": "./codex-storage-sdk-js-0.1.1.tgz", "@sentry/browser": "^8.32.0", "@sentry/react": "^8.31.0", "@tanstack/react-query": "^5.51.15", @@ -420,8 +420,8 @@ }, "node_modules/@codex-storage/marketplace-ui-components": { "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.51.tgz", - "integrity": "sha512-KPPFlcpx3a83WCBSLbRONrF/yr4J/ctyTfFPxMaRSMTRD1LtfIE0uPy3QxtHs6tigOts2h4DEz6Kn2ynHdfKPg==", + "resolved": "file:codex-storage-marketplace-ui-components-0.0.51.tgz", + "integrity": "sha512-rIgI20HA4CbccaxJPVZJw+QvoxDpY6g2FWX1HDChFqYqBcw+AP1h2gtVSau5cSZn6Zn/EQIgMlYZk+1m0U3utQ==", "license": "MIT", "engines": { "node": ">=18" @@ -433,15 +433,16 @@ } }, "node_modules/@codex-storage/sdk-js": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/@codex-storage/sdk-js/-/sdk-js-0.0.23.tgz", - "integrity": "sha512-+ktJs396GERPudRh5zjTvOMjwo3mRHVYN901Qvs0q3YlRK983aewSqJ+Z7NttSQ27oxTcvxQVrilcvzZRHQTkg==", + "version": "0.1.1", + "resolved": "file:codex-storage-sdk-js-0.1.1.tgz", + "integrity": "sha512-BwCYirG0gwNJxxF0c3Zkrachi9FcYH6sLGUE9V07zIPaC0XVtiJiyUXhP0ciI28jgg2sFqk5nim/5ZmMaQmqBw==", "license": "MIT", "dependencies": { + "undici": "^7.5.0", "valibot": "^0.32.0" }, "engines": { - "node": ">=20" + "node": ">=20.18.1" } }, "node_modules/@csstools/selector-resolve-nested": { @@ -5173,6 +5174,15 @@ "node": ">=14.17" } }, + "node_modules/undici": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.6.0.tgz", + "integrity": "sha512-gaFsbThjrDGvAaD670r81RZro/s6H2PVZF640Qn0p5kZK+/rim7/mmyfp2W7VB5vOMaFM8vuFBJUaMlaZTYHlA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", diff --git a/package.json b/package.json index ef11fe8..9c5665f 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,8 @@ "React" ], "dependencies": { - "@codex-storage/marketplace-ui-components": "^0.0.51", - "@codex-storage/sdk-js": "^0.0.23", + "@codex-storage/marketplace-ui-components": "./codex-storage-marketplace-ui-components-0.0.51.tgz", + "@codex-storage/sdk-js": "./codex-storage-sdk-js-0.1.1.tgz", "@sentry/browser": "^8.32.0", "@sentry/react": "^8.31.0", "@tanstack/react-query": "^5.51.15", diff --git a/src/components/CodexUrllSettings/CodexUrlSettings.tsx b/src/components/CodexUrllSettings/CodexUrlSettings.tsx deleted file mode 100644 index 31bfe5d..0000000 --- a/src/components/CodexUrllSettings/CodexUrlSettings.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { useState } from "react"; -import { Button, Input, Toast } from "@codex-storage/marketplace-ui-components"; -import { CodexSdk } from "../../sdk/codex"; - -export function CodexUrlSettings() { - const queryClient = useQueryClient(); - const [url, setUrl] = useState(CodexSdk.url); - const [isInvalid, setIsInvalid] = useState(false); - const [toast, setToast] = useState({ time: 0, message: "" }); - const { mutateAsync } = useMutation({ - mutationFn: (url: string) => CodexSdk.updateURL(url), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["spr"] }); - - setToast({ message: "Settings saved successfully.", time: Date.now() }); - }, - }); - - const onChange = (e: React.FormEvent) => { - const element = e.currentTarget; - const value = element.value; - - setUrl(value); - setIsInvalid(!element.checkValidity()); - }; - - const onClick = () => { - if (isInvalid === false) { - mutateAsync(url); - } - }; - - return ( - <> -
- -
- - - - ); -} diff --git a/src/components/HealthChecks/HealthChecks.tsx b/src/components/HealthChecks/HealthChecks.tsx index e9a1935..49bf1b1 100644 --- a/src/components/HealthChecks/HealthChecks.tsx +++ b/src/components/HealthChecks/HealthChecks.tsx @@ -31,6 +31,7 @@ export function HealthChecks({ online, onStepValid }: Props) { HealthCheckUtils.removePort(CodexSdk.url()) ); const [port, setPort] = useState(HealthCheckUtils.getPort(CodexSdk.url())); + const [auth, setAuth] = useState(""); const queryClient = useQueryClient(); useEffect( @@ -46,23 +47,31 @@ export function HealthChecks({ online, onStepValid }: Props) { [persistence.refetch, onStepValid, portForwarding.refetch, codex.isSuccess] ); - const onAddressChange = (e: React.FormEvent) => { + const onAddressBlur = (e: React.FormEvent) => { const element = e.currentTarget; const value = e.currentTarget.value; setIsAddressInvalid(!element.checkValidity()); - setAddress(value); + const { auth, url } = HealthCheckUtils.extractBasicAuth(value); - if (HealthCheckUtils.containsPort(value)) { - const address = HealthCheckUtils.removePort(value); + setAddress(url); + + if (HealthCheckUtils.containsPort(url)) { + const address = HealthCheckUtils.removePort(url); setAddress(address); - const p = HealthCheckUtils.getPort(value); + const p = HealthCheckUtils.getPort(url); setPort(p); } else { - setAddress(value); + setAddress(url); } + + setAuth(auth || ""); + }; + + const onChange = (e: React.FormEvent) => { + setAddress(e.currentTarget.value); }; const onPortChange = (e: React.FormEvent) => { @@ -70,19 +79,25 @@ export function HealthChecks({ online, onStepValid }: Props) { const value = element.value; setIsPortInvalid(!element.checkValidity()); - setPort(parseInt(value, 10)); + setPort(value); }; const onSave = () => { - const url = address + ":" + port; + let url = address; + + if (port) { + url += ":" + port; + } if (HealthCheckUtils.isUrlInvalid(url)) { return; } - CodexSdk.updateURL(url) + CodexSdk.updateURL(url, { auth: { basic: auth } }) .then(() => queryClient.invalidateQueries()) .then(() => codex.refetch()); + + setAuth(""); }; return ( @@ -98,9 +113,11 @@ export function HealthChecks({ online, onStepValid }: Props) { type="url" label="Address" required + mode={"manual"} isInvalid={isAddressInvalid} - onChange={onAddressChange} + onBlur={onAddressBlur} value={address} + onChange={onChange} placeholder="127.0.0.1"> {isAddressInvalid ? ( diff --git a/src/components/HealthChecks/health-check.utils.test.ts b/src/components/HealthChecks/health-check.utils.test.ts index 0d6e1e7..7cb07bc 100644 --- a/src/components/HealthChecks/health-check.utils.test.ts +++ b/src/components/HealthChecks/health-check.utils.test.ts @@ -2,155 +2,167 @@ import { assert, describe, it } from "vitest"; import { HealthCheckUtils } from "./health-check.utils"; describe("health check", () => { - it("remove the port from an url", async () => { - assert.deepEqual(HealthCheckUtils.removePort("http://localhost:8080"), "http://localhost"); - }); + it("remove the port from an url", async () => { + assert.deepEqual( + HealthCheckUtils.removePort("http://localhost:8080"), + "http://localhost" + ); + }); - it("get the port from an url", async () => { - assert.deepEqual(HealthCheckUtils.getPort("http://localhost:8080"), 8080); - }); + it("get the port from an url", async () => { + assert.deepEqual(HealthCheckUtils.getPort("http://localhost:8080"), "8080"); + }); - it("get the default port when the url does not contain the port", async () => { - assert.deepEqual(HealthCheckUtils.getPort("http://localhost"), 80); - }); + it("get the default port when the url does not contain the port", async () => { + assert.deepEqual(HealthCheckUtils.getPort("http://localhost"), ""); + }); - it("returns true when the url contains a port", async () => { - assert.deepEqual(HealthCheckUtils.containsPort("http://localhost:8080"), true); - }); + it("returns true when the url contains a port", async () => { + assert.deepEqual( + HealthCheckUtils.containsPort("http://localhost:8080"), + true + ); + }); - it("returns false when the url does not contain a port", async () => { - assert.deepEqual(HealthCheckUtils.containsPort("http://localhost"), false); - }); + it("returns false when the url does not contain a port", async () => { + assert.deepEqual(HealthCheckUtils.containsPort("http://localhost"), false); + }); + it("extracts the basic authentication", async () => { + assert.deepEqual( + HealthCheckUtils.extractBasicAuth("http://hello:world@localhost:8080"), + { auth: "hello:world", url: "http://localhost:8080" } + ); + }); - it("returns true when the url is invalid", async () => { - assert.deepEqual(HealthCheckUtils.isUrlInvalid("http://"), true); - }); + it("returns true when the url is invalid", async () => { + assert.deepEqual(HealthCheckUtils.isUrlInvalid("http://"), true); + }); - it("returns false when the url is valid", async () => { - assert.deepEqual(HealthCheckUtils.isUrlInvalid("http://localhost:8080"), false); - }); + it("returns false when the url is valid", async () => { + assert.deepEqual( + HealthCheckUtils.isUrlInvalid("http://localhost:8080"), + false + ); + }); - it("returns the tcp port", async () => { - const debug = { - "id": "a", - "addrs": [ - "/ip4/127.0.0.1/tcp/8070" - ], - "repo": "", - "spr": "", - "announceAddresses": [ - "/ip4/127.0.0.1/tcp/8070" - ], - "table": { - "localNode": { - "nodeId": "", - "peerId": "", - "record": "", - "address": "0.0.0.0:8090", - "seen": false - }, - "nodes": [] - }, - "codex": { - "version": "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", - "revision": "2fb7031e" - } - } - assert.deepEqual(HealthCheckUtils.getTcpPort(debug), { error: false, data: 8070 }); + it("returns the tcp port", async () => { + const debug = { + id: "a", + addrs: ["/ip4/127.0.0.1/tcp/8070"], + repo: "", + spr: "", + announceAddresses: ["/ip4/127.0.0.1/tcp/8070"], + table: { + localNode: { + nodeId: "", + peerId: "", + record: "", + address: "0.0.0.0:8090", + seen: false, + }, + nodes: [], + }, + codex: { + version: + "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", + revision: "2fb7031e", + }, + }; + assert.deepEqual(HealthCheckUtils.getTcpPort(debug), { + error: false, + data: 8070, }); + }); - it("returns an error when the addr is empty", async () => { - const debug = { - "id": "a", - "addrs": [ - ], - "repo": "", - "spr": "", - "announceAddresses": [ - "/ip4/127.0.0.1/tcp/8070" - ], - "table": { - "localNode": { - "nodeId": "", - "peerId": "", - "record": "", - "address": "0.0.0.0:8090", - "seen": false - }, - "nodes": [] - }, - "codex": { - "version": "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", - "revision": "2fb7031e" - } - } - assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); - }); + it("returns an error when the addr is empty", async () => { + const debug = { + id: "a", + addrs: [], + repo: "", + spr: "", + announceAddresses: ["/ip4/127.0.0.1/tcp/8070"], + table: { + localNode: { + nodeId: "", + peerId: "", + record: "", + address: "0.0.0.0:8090", + seen: false, + }, + nodes: [], + }, + codex: { + version: + "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", + revision: "2fb7031e", + }, + }; + assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); + }); - it("returns an error when the addr is misformated", async () => { - const debug = { - "id": "a", - "addrs": [ - "/ip4/127.0.0.1/tcp/hello" - ], - "repo": "", - "spr": "", - "announceAddresses": [ - "/ip4/127.0.0.1/tcp/8070" - ], - "table": { - "localNode": { - "nodeId": "", - "peerId": "", - "record": "", - "address": "0.0.0.0:8090", - "seen": false - }, - "nodes": [] - }, - "codex": { - "version": "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", - "revision": "2fb7031e" - } - } - assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); - }); + it("returns an error when the addr is misformated", async () => { + const debug = { + id: "a", + addrs: ["/ip4/127.0.0.1/tcp/hello"], + repo: "", + spr: "", + announceAddresses: ["/ip4/127.0.0.1/tcp/8070"], + table: { + localNode: { + nodeId: "", + peerId: "", + record: "", + address: "0.0.0.0:8090", + seen: false, + }, + nodes: [], + }, + codex: { + version: + "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", + revision: "2fb7031e", + }, + }; + assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); + }); - it("returns an error when the port is misformated", async () => { - const debug = { - "id": "a", - "addrs": [ - "hello" - ], - "repo": "", - "spr": "", - "announceAddresses": [ - "/ip4/127.0.0.1/tcp/8070" - ], - "table": { - "localNode": { - "nodeId": "", - "peerId": "", - "record": "", - "address": "0.0.0.0:8090", - "seen": false - }, - "nodes": [] - }, - "codex": { - "version": "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", - "revision": "2fb7031e" - } - } - assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); - }); + it("returns an error when the port is misformated", async () => { + const debug = { + id: "a", + addrs: ["hello"], + repo: "", + spr: "", + announceAddresses: ["/ip4/127.0.0.1/tcp/8070"], + table: { + localNode: { + nodeId: "", + peerId: "", + record: "", + address: "0.0.0.0:8090", + seen: false, + }, + nodes: [], + }, + codex: { + version: + "v0.1.0\nv0.1.1\nv0.1.2\nv0.1.3\nv0.1.4\nv0.1.5\nv0.1.6\nv0.1.7", + revision: "2fb7031e", + }, + }; + assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); + }); - it("extracts the announced ip", async () => { - assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses([ - "/ip4/127.0.0.1/tcp/8070" - ]).data, "127.0.0.1"); - assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses([]).error, true); - assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses(["hello"]).error, true); - }); -}) \ No newline at end of file + it("extracts the announced ip", async () => { + assert.deepEqual( + HealthCheckUtils.extractAnnounceAddresses(["/ip4/127.0.0.1/tcp/8070"]) + .data, + "127.0.0.1" + ); + assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses([]).error, true); + assert.deepEqual( + HealthCheckUtils.extractAnnounceAddresses(["hello"]).error, + true + ); + }); +}); diff --git a/src/components/HealthChecks/health-check.utils.ts b/src/components/HealthChecks/health-check.utils.ts index 096eacb..7ded7ee 100644 --- a/src/components/HealthChecks/health-check.utils.ts +++ b/src/components/HealthChecks/health-check.utils.ts @@ -1,66 +1,83 @@ -import { CodexDebugInfo, SafeValue, CodexError } from "@codex-storage/sdk-js" +import { CodexDebugInfo, SafeValue, CodexError } from "@codex-storage/sdk-js"; export const HealthCheckUtils = { - removePort(url: string) { - const parts = url.split(":") - return parts[0] + ":" + parts[1] - }, + removePort(url: string) { + const parts = url.split(":"); + return parts[0] + ":" + parts[1]; + }, - /* - * Extract the port from a protocol + ip + port string - */ - getPort(url: string) { - return parseInt(url.split(":")[2] || "80", 10) - }, - - containsPort(url: string) { - return url.split(":").length > 2 - }, - - isUrlInvalid(url: string) { - try { - new URL(url) - return false - // We do not need to manage the error because we want to check - // if the URL is valid or not only. - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (_) { - return true - } - }, - - extractAnnounceAddresses(announceAddresses: string[]): SafeValue { - if (announceAddresses.length === 0) { - return { error: true, data: new CodexError("Not existing announce address") } - } - - - const ip = announceAddresses[0].split("/") - - if (ip.length !== 5) { - return { error: true, data: new CodexError("Misformatted ip") } - } - - return { error: false, data: ip[2] } - }, - - getTcpPort(info: CodexDebugInfo): SafeValue { - if (info.addrs.length === 0) { - return { error: true, data: new CodexError("Not existing address") } - } - - const parts = info.addrs[0].split("/") - - if (parts.length < 2) { - return { error: true, data: new CodexError("Address misformated") } - } - - const port = parseInt(parts[parts.length - 1], 10) - - if (isNaN(port)) { - return { error: true, data: new CodexError("Port misformated") } - } - - return { error: false, data: port } + extractBasicAuth(url: string) { + if (!url.includes("@")) { + return { auth: "", url }; } -} \ No newline at end of file + + const [prefix, rest] = url.split("@"); + const [protocol, auth] = prefix.split("//"); + + return { auth, url: protocol + "//" + rest }; + }, + + /* + * Extract the port from a protocol + ip + port string + */ + getPort(url: string) { + return url.split(":")[2] || ""; + }, + + containsPort(url: string) { + if (url.includes("@")) { + return url.split(":").length > 3; + } + + return url.split(":").length > 2; + }, + + isUrlInvalid(url: string) { + try { + new URL(url); + return false; + // We do not need to manage the error because we want to check + // if the URL is valid or not only. + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_) { + return true; + } + }, + + extractAnnounceAddresses(announceAddresses: string[]): SafeValue { + if (announceAddresses.length === 0) { + return { + error: true, + data: new CodexError("Not existing announce address"), + }; + } + + const ip = announceAddresses[0].split("/"); + + if (ip.length !== 5) { + return { error: true, data: new CodexError("Misformatted ip") }; + } + + return { error: false, data: ip[2] }; + }, + + getTcpPort(info: CodexDebugInfo): SafeValue { + if (info.addrs.length === 0) { + return { error: true, data: new CodexError("Not existing address") }; + } + + const parts = info.addrs[0].split("/"); + + if (parts.length < 2) { + return { error: true, data: new CodexError("Address misformated") }; + } + + const port = parseInt(parts[parts.length - 1], 10); + + if (isNaN(port)) { + return { error: true, data: new CodexError("Port misformated") }; + } + + return { error: false, data: port }; + }, +}; diff --git a/src/components/ManifestFetch/ManifestFetch.tsx b/src/components/ManifestFetch/ManifestFetch.tsx index c611cad..acbe97f 100644 --- a/src/components/ManifestFetch/ManifestFetch.tsx +++ b/src/components/ManifestFetch/ManifestFetch.tsx @@ -17,7 +17,6 @@ export function ManifestFetch() { if (s.error === false) { setCid(""); queryClient.invalidateQueries({ queryKey: ["cids"] }); - console.info("Done"); } return Promises.rejectOnError(s); }); diff --git a/src/hooks/useDebug.ts b/src/hooks/useDebug.ts index 909335f..ffe0369 100644 --- a/src/hooks/useDebug.ts +++ b/src/hooks/useDebug.ts @@ -3,29 +3,31 @@ import { CodexSdk } from "../sdk/codex"; import { Promises } from "../utils/promises"; export function useDebug(throwOnError: boolean) { - const { data, isError, isPending, refetch, isSuccess, isFetching } = useQuery({ - queryFn: () => - CodexSdk.debug() - .info() - .then((s) => Promises.rejectOnError(s)), + const { data, isError, isPending, refetch, isSuccess, isFetching } = useQuery( + { + queryFn: () => + CodexSdk.debug() + .info() + .then((s) => Promises.rejectOnError(s)), - queryKey: ["debug"], + queryKey: ["debug"], - // No need to retry because if the connection to the node - // is back again, all the queries will be invalidated. - retry: false, + // No need to retry because if the connection to the node + // is back again, all the queries will be invalidated. + retry: false, - // The client node should be local, so display the cache value while - // making a background request looks good. - staleTime: 0, + // The client node should be local, so display the cache value while + // making a background request looks good. + staleTime: 0, - // Refreshing when focus returns can be useful if a user comes back - // to the UI after performing an operation in the terminal. - refetchOnWindowFocus: true, + // Refreshing when focus returns can be useful if a user comes back + // to the UI after performing an operation in the terminal. + refetchOnWindowFocus: true, - // Throw the error to the error boundary - throwOnError, - }); + // Throw the error to the error boundary + throwOnError, + } + ); - return { data, isPending, isError, isSuccess, refetch, isFetching }; + return { data, isPending, isError, isSuccess, refetch, isFetching }; } diff --git a/src/main.tsx b/src/main.tsx index da29709..fd9a768 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -135,7 +135,7 @@ if (rootElement) { return; } - return CodexSdk.updateURL(url); + return CodexSdk.updateURL(url, {}); } } } diff --git a/src/routes/dashboard/settings.tsx b/src/routes/dashboard/settings.tsx index 5478c67..90f4dbd 100644 --- a/src/routes/dashboard/settings.tsx +++ b/src/routes/dashboard/settings.tsx @@ -7,41 +7,46 @@ import Logotype from "../../assets/icons/logotype.svg?react"; import Logo from "../../assets/icons/logo.svg?react"; import { Versions } from "../../components/Versions/Versions"; import { BackgroundImage } from "../../components/BackgroundImage/BackgroundImage"; +import { useNetwork } from "../../network/useNetwork"; -export const SettingsRoute = () => ( -
-
-
- - -
- -
-
-

Personalization

- ( - - )}> - - +export const SettingsRoute = () => { + const online = useNetwork(); -

Connection

+ return ( +
+
+
+ + +
+ +
+
+

Personalization

+ ( + + )}> + + - ( - - )}> - {}} /> - -
+

Connection

- -
-); + ( + + )}> + {}} /> + +
+ + +
+ ); +}; diff --git a/src/sdk/codex.ts b/src/sdk/codex.ts index d4660f7..0a6fd59 100644 --- a/src/sdk/codex.ts +++ b/src/sdk/codex.ts @@ -4,38 +4,55 @@ import { WebStorage } from "../utils/web-storage"; let client: Codex = new Codex(import.meta.env.VITE_CODEX_API_URL); let url: string = import.meta.env.VITE_CODEX_API_URL; +type CodexSdkUpdateOptions = { + auth?: { + basic?: string; + }; +}; + export const CodexSdk = { url() { return url; }, - load() { - return WebStorage.get("codex-node-url").then((u) => { - url = u || import.meta.env.VITE_CODEX_API_URL; - client = new Codex(url); - }); + async load() { + const [url = import.meta.env.VITE_CODEX_API_URL, basicAuthSecret] = + await Promise.all([ + WebStorage.get("codex-node-url"), + WebStorage.get("codex-auth-basic"), + ]); + + client = new Codex(url, { auth: { basic: basicAuthSecret } }); }, - updateURL(u: string) { - url = u; - client = new Codex(url); + updateURL(u: string, options: CodexSdkUpdateOptions) { + let basicAuthSecret: string = ""; - return WebStorage.set("codex-node-url", url); + if (options.auth?.basic) { + basicAuthSecret = btoa(options.auth?.basic); + } + + url = u; + client = new Codex(url, { auth: { basic: basicAuthSecret } }); + + return WebStorage.set("codex-auth-basic", basicAuthSecret).then(() => + WebStorage.set("codex-node-url", url) + ); }, debug() { - return client.debug + return client.debug; }, data() { - return client.data + return client.data; }, node() { - return client.node + return client.node; }, marketplace() { - return client.marketplace + return client.marketplace; }, };