From cbe7f742b99ac6385d74a44de46d32616dfd4ce5 Mon Sep 17 00:00:00 2001 From: kieran Date: Mon, 17 Feb 2025 12:19:50 +0000 Subject: [PATCH] feat: pubkey whitelist --- .env | 3 ++- src/const.ts | 21 ++++++++++++++++++++- src/hooks/live-streams.ts | 12 ++++++------ src/hooks/useLiveStreams.ts | 4 ++-- src/pages/layout/header.tsx | 3 ++- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/.env b/.env index a17cd5b..69babd5 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -VITE_SINGLE_PUBLISHER= \ No newline at end of file +# Array whitelist of pubkeys +# VITE_SINGLE_PUBLISHER="npub18vy7ydt98zrlf47km0v82336cvzj7duv0u4nwulhy8eeps8u69sqdq3d5w,npub1kepjwqtmkr5rctx5rtpwqhyagwpxxg4ydfk84sqtnxh0t89slaesjqnlsn,npub1wxgpvehj0uhe22dwq4vhpgx3ew7w6v7etze36x89x6arpcmdzsqslwsvzl,npub1s3lr24j7pysn45yzmkky8pvrh7257vy6mxfrtskmyzycd3m0rxwstgdgdu,npub1ctrsduxssdgthmmx7lz7erhqt2hjgj99tzkt22g2uyvayhxd9asq3xsd73,npub17yemy3hswcelmcdgjsfn4sns4wr4q5ptvj5h08qt4s7fy2qe3hdqsczs99,npub1764k59pjf7yfmzag6e4jgh36t0p4fklmaaxhxcdgwfdvl8weuedq3jn7q3,npub1a8622rn2ptxazukjrkkrxdnpu29z8lztxvu9hnjewhaw29qntwas35c7gy,npub1agr3n5wn38dg8uvprl452w43pegsyphfh7hesg9tgf9d9enzxudspzgnej,npub1gfh3zdy07r37mgk4hyr0njmajapswk4ct6anc9w407uqkn39aslqqkalqc,npub18gp8p84hjmjh9zejdlyqqcg22sj6x3qra0q2ng4v6cxxg95sav8q0mcg5e,npub13ql75nq8rldygpkjke47y893akh5tglqtqzs6cspancaxktthsusvfqcg7,npub186ptarjwp53k6tz5fyzj2t0wcu9wtahrdh8lqca0j7065cuxfvksparxqq,npub1gr65v2hqq83n3vqfh6m65eej65hxlqwyjp0echc9ghvw5p6pvqpse3mmjc,npub1v5ufyh4lkeslgxxcclg8f0hzazhaw7rsrhvfquxzm2fk64c72hps45n0v5,npub1066yklzctwr34r0ph0hyteqjccg9q97ty7l0htm88jnq0kx425hs82perc,npub1theparkprcs70dcs437ke9zzwsr6u60f8flu7rg28m30438aep9sd94dha,npub17j3f7cuhcvjqnf7d80x6rt9hmkkhdguwg4l2th0h4qnhqketr63s6xakwv,npub1papldckxytp2m8met6hyeh37m0cn6e32j03srl6thy4gq3tqrz3srq8t4n,npub184cwc849sejs5pr566zcg4pqn53zzk85q70gmwqx7qt77h3suansvet30s,npub18ams6ewn5aj2n3wt2qawzglx9mr4nzksxhvrdc4gzrecw7n5tvjqctp424,npub1getal6ykt05fsz5nqu4uld09nfj3y3qxmv8crys4aeut53unfvlqr80nfm,npub14wxtsrj7g2jugh70pfkzjln43vgn4p7655pgky9j9w9d75u465pqvagcye,npub1key55ax33gkl50uqemvl4khrtqrhzm7wzpc7fhseutt5ddkcwcrqgxlt3h,npub13qrrw2h4z52m7jh0spefrwtysl4psfkfv6j4j672se5hkhvtyw7qu0almy,npub19r9qrxmckj2vyk5a5ttyt966s5qu06vmzyczuh97wj8wtyluktxqymeukr,npub1yfg0d955c2jrj2080ew7pa4xrtj7x7s7umt28wh0zurwmxgpyj9shwv6vg,npub1eequz6v23szzyx9utphsh8kg6kll50wte6sfh4vah8gdjtplcz6qg7at9s,npub1t6njrhtc9q3f5wdrwfrhpypq3kes5mpdx4u4rw9w2pxjanuxcpkqveagv3,npub1d9a94klcx90k073pmlc606q9gyhtmg4p4h0jrzs0j0s34whjlzxq2sw3fp,npub14kw5ygpl6fyqagh9cnrytyaqyacg46lzkq42vz7hk8txdk49kzxs04j7y0,npub14mcddvsjsflnhgw7vxykz0ndfqj0rq04v7cjq5nnc95ftld0pv3shcfrlx,npub1fnn2h0tgm2mwnl0kar5ez25wztum2w0q0rrrf326n0ljn999znwsqf4xnx,npub1jwev660jrdrfeaw2u9sssv3v4jgsxqs32qmd5yhpgzlesg5j0gase4qha6,npub1w6gapkq7rajutrrgp89fyfcfxyt8rw7r4nuhfqnfa6306m7zh79s7f09sz,npub15t3qpnzd9h6lgh5zfeywl5353nefpjv6fls4lg6yqy2rypzslyas5cc8rq,npub1hrctsg2qwu5gsp65gvj29968z460g0th755jq92c8uaz620lewmq6qk525,npub1dsfcdwmj4h0hrhllu40ma3gfssjh0tr4elqfk7fac7j6hzqnwwwsy5ywd5,npub1geauq4eq8547h5ea75lpvg40q2k3syyun6hhwsejglex35s7cc8sd00xm0,npub1jz42cy8qxw6dres86sn0cr42hww24pnjqssa4k9wxqvzm5l0mvqsq2f5ku,npub1563z6kxmvuy7s8zhzan8m0hzmkavyfzg2aw6h7f0fvcvdms398csaxc9n6" \ No newline at end of file diff --git a/src/const.ts b/src/const.ts index 57c1818..bb78e11 100644 --- a/src/const.ts +++ b/src/const.ts @@ -1,4 +1,5 @@ -import { EventKind } from "@snort/system"; +import { isHex } from "@snort/shared"; +import { EventKind, parseNostrLink } from "@snort/system"; export const LIVE_STREAM = 30_311 as EventKind; export const LIVE_STREAM_CHAT = 1_311 as EventKind; @@ -36,3 +37,21 @@ export const defaultRelays = { export const DefaultProviderUrl = "https://api.zap.stream/api/nostr"; //export const DefaultProviderUrl = "http://localhost:5295/api/nostr"; + +function loadWhitelist() { + if (import.meta.env.VITE_SINGLE_PUBLISHER !== undefined) { + const list = import.meta.env.VITE_SINGLE_PUBLISHER as string | undefined; + if (list) { + return list.split(",").map(a => { + if (isHex(a)) { + return a; + } else { + return parseNostrLink(a).id; + } + }); + } + } + return undefined; +} + +export const WHITELIST: Array | undefined = loadWhitelist(); \ No newline at end of file diff --git a/src/hooks/live-streams.ts b/src/hooks/live-streams.ts index 985550f..2bc90d7 100644 --- a/src/hooks/live-streams.ts +++ b/src/hooks/live-streams.ts @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { RequestBuilder } from "@snort/system"; import { useRequestBuilder } from "@snort/system-react"; -import { LIVE_STREAM } from "@/const"; +import { LIVE_STREAM, WHITELIST } from "@/const"; export function useStreamsFeed(tag?: string) { const liveStreamKinds = [LIVE_STREAM]; @@ -10,23 +10,23 @@ export function useStreamsFeed(tag?: string) { rb.withOptions({ leaveOpen: true, }); - if (import.meta.env.VITE_SINGLE_PUBLISHER) { + if (WHITELIST) { if (tag) { rb.withFilter() .kinds(liveStreamKinds) .tag("t", [tag]) - .authors([import.meta.env.VITE_SINGLE_PUBLISHER]); + .authors(WHITELIST); rb.withFilter() .kinds(liveStreamKinds) .tag("t", [tag]) - .tag("p", [import.meta.env.VITE_SINGLE_PUBLISHER]); + .tag("p", WHITELIST); } else { rb.withFilter() .kinds(liveStreamKinds) - .authors([import.meta.env.VITE_SINGLE_PUBLISHER]); + .authors(WHITELIST); rb.withFilter() .kinds(liveStreamKinds) - .tag("p", [import.meta.env.VITE_SINGLE_PUBLISHER]); + .tag("p", WHITELIST); } } else { if (tag) { diff --git a/src/hooks/useLiveStreams.ts b/src/hooks/useLiveStreams.ts index b37558a..c2ef961 100644 --- a/src/hooks/useLiveStreams.ts +++ b/src/hooks/useLiveStreams.ts @@ -1,4 +1,4 @@ -import { DAY, LIVE_STREAM, StreamState } from "@/const"; +import { DAY, LIVE_STREAM, StreamState, WHITELIST } from "@/const"; import { findTag, getHost } from "@/utils"; import { unixNow } from "@snort/shared"; import { NostrEvent, TaggedNostrEvent } from "@snort/system"; @@ -19,7 +19,7 @@ export function useSortedStreams(feed: Array, oldest?: number) if (feed) { return feed .filter(a => a.created_at > (oldest ?? unixNow() - 7 * DAY)) - .filter(a => !import.meta.env.VITE_SINGLE_PUBLISHER || import.meta.env.VITE_SINGLE_PUBLISHER === getHost(a)); + .filter(a => !WHITELIST || WHITELIST.includes(getHost(a))); } return []; }, [feed]); diff --git a/src/pages/layout/header.tsx b/src/pages/layout/header.tsx index 3f5e8b7..6c033bc 100644 --- a/src/pages/layout/header.tsx +++ b/src/pages/layout/header.tsx @@ -16,6 +16,7 @@ import { Profile } from "@/element/profile"; import { SearchBar } from "./search"; import { NavLinkIcon } from "./nav-icon"; import { useLayout } from "./context"; +import { WHITELIST } from "@/const"; export function HeaderNav() { const navigate = useNavigate(); @@ -55,7 +56,7 @@ export function HeaderNav() { return (
- {(!import.meta.env.VITE_SINGLE_PUBLISHER || import.meta.env.VITE_SINGLE_PUBLISHER === login.pubkey) && ( + {(!WHITELIST || WHITELIST.includes(login.pubkey)) && (