~james/core

core/web/src/lib/server/avatar.test.ts -rw-r--r-- 1.5 KiB
452f17b7 — james chore(import): snapshot james.dad.town/core at f70c71c7696a 15 hours ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { createHmac } from "node:crypto";
import { describe, expect, it } from "vitest";
import { signAvatarSrcs, signedAvatarUrl } from "#lib/server/avatar.ts";

const SERVICE = "https://avatar.test";
const sig = (did: string) => createHmac("sha256", "s3cret").update(did).digest("hex");

describe("signedAvatarUrl", () => {
	it("signs the did and keeps only size, format and v", () => {
		const search = new URLSearchParams("size=42&v=3&evil=1");
		expect(signedAvatarUrl(SERVICE, "s3cret", "did:plc:alice", search)).toBe(
			`${SERVICE}/${sig("did:plc:alice")}/did:plc:alice?size=42&v=3`
		);
	});
});

describe("signAvatarSrcs", () => {
	it("points server rendered avatars at the service", () => {
		const html = '<img src="/avatar/did%3Aplc%3Aalice?size=42&amp;v=3" alt="">';
		expect(signAvatarSrcs(html, SERVICE, "s3cret")).toBe(
			`<img src="${SERVICE}/${sig("did:plc:alice")}/did:plc:alice?size=42&amp;v=3" alt="">`
		);
	});

	it("handles a src without a query", () => {
		expect(signAvatarSrcs('<img src="/avatar/did%3Aplc%3Abob">', SERVICE, "s3cret")).toBe(
			`<img src="${SERVICE}/${sig("did:plc:bob")}/did:plc:bob">`
		);
	});

	it.each([
		'<img src="/avatar/%zz">',
		'<img src="/avatar/not-a-did?size=42">',
		'<a href="/avatar/did%3Aplc%3Aalice">',
		'{"avatar":"/avatar/did%3Aplc%3Aalice"}',
		'<meta content="https://next.tangled.org/avatar/did%3Aplc%3Aalice?size=256">'
	])("leaves %s alone", (html) => {
		expect(signAvatarSrcs(html, SERVICE, "s3cret")).toBe(html);
	});
});