diff --git a/CHANGELOG.md b/CHANGELOG.md index bdbed869..e3bbcad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * Fix memory leak, notification badge not showing * Improve space join flow * Fix opening images in fullscreen dialog +* Add support for blocked relays # 1.6.2 diff --git a/src/app/core/commands.ts b/src/app/core/commands.ts index 13df184f..7994031a 100644 --- a/src/app/core/commands.ts +++ b/src/app/core/commands.ts @@ -52,10 +52,8 @@ import { removeFromListByPredicate, getTag, getListTags, - getRelayTags, getRelayTagValues, toNostrURI, - getRelaysFromList, RelayMode, getAddress, getTagValue, @@ -80,8 +78,6 @@ import { publishThunk, tagEvent, tagEventForReaction, - userRelayList, - userMessagingRelayList, nip44EncryptToSelf, dropSession, tagEventForComment, @@ -208,42 +204,6 @@ export const removeRoomMembership = async (url: string, h: string) => { return publishThunk({event, relays}) } -export const setRelayPolicy = (url: string, read: boolean, write: boolean) => { - const list = get(userRelayList) || makeList({kind: RELAYS}) - const tags = getRelayTags(getListTags(list)).filter(t => normalizeRelayUrl(t[1]) !== url) - - if (read && write) { - tags.push(["r", url]) - } else if (read) { - tags.push(["r", url, "read"]) - } else if (write) { - tags.push(["r", url, "write"]) - } - - return publishThunk({ - event: makeEvent(list.kind, {tags}), - relays: [url, ...INDEXER_RELAYS, ...Router.get().FromUser().getUrls(), ...get(userSpaceUrls)], - }) -} - -export const setMessagingRelayPolicy = (url: string, enabled: boolean) => { - const list = get(userMessagingRelayList) || makeList({kind: MESSAGING_RELAYS}) - - // Only update messaging policies if they already exist or we're adding them - if (enabled || getRelaysFromList(list).includes(url)) { - const tags = getRelayTags(getListTags(list)).filter(t => normalizeRelayUrl(t[1]) !== url) - - if (enabled) { - tags.push(["relay", url]) - } - - return publishThunk({ - event: makeEvent(list.kind, {tags}), - relays: [...INDEXER_RELAYS, ...Router.get().FromUser().getUrls(), ...get(userSpaceUrls)], - }) - } -} - // Relay access export const canEnforceNip70 = async (url: string) => { diff --git a/src/app/core/sync.ts b/src/app/core/sync.ts index 9c7d70b7..e0beeef3 100644 --- a/src/app/core/sync.ts +++ b/src/app/core/sync.ts @@ -41,6 +41,7 @@ import { loadRelayList, loadMessagingRelayList, loadBlossomServerList, + loadBlockedRelayList, loadFollowList, loadMuteList, loadProfile, @@ -215,6 +216,7 @@ const syncUserData = () => { loadAlerts($userRelayList.event.pubkey) loadAlertStatuses($userRelayList.event.pubkey) loadBlossomServerList($userRelayList.event.pubkey) + loadBlockedRelayList($userRelayList.event.pubkey) loadFollowList($userRelayList.event.pubkey) loadGroupList($userRelayList.event.pubkey) loadMuteList($userRelayList.event.pubkey) @@ -229,13 +231,13 @@ const syncUserData = () => { await sleep(1000) await Promise.all( - pubkeys.map(async pk => { - await loadRelayList(pk) - await loadGroupList(pk) - await loadProfile(pk) - await loadFollowList(pk) - await loadMuteList(pk) - }), + pubkeys.flatMap(pk => [ + loadRelayList(pk), + loadGroupList(pk), + loadProfile(pk), + loadFollowList(pk), + loadMuteList(pk), + ]), ) } }) diff --git a/src/app/util/policies.ts b/src/app/util/policies.ts index a989ac08..a1bc1b91 100644 --- a/src/app/util/policies.ts +++ b/src/app/util/policies.ts @@ -1,4 +1,5 @@ import {on, always, call, dissoc, assoc, uniq} from "@welshman/lib" +import {RelayMode} from "@welshman/util" import type {Socket, RelayMessage, ClientMessage} from "@welshman/net" import { makeSocketPolicyAuth, @@ -13,7 +14,7 @@ import { isClientNegOpen, isClientNegClose, } from "@welshman/net" -import {sign} from "@welshman/app" +import {sign, pubkey, getPubkeyRelays} from "@welshman/app" import { userSettingsValues, getSetting, @@ -23,6 +24,22 @@ import { export const authPolicy = makeSocketPolicyAuth({sign, shouldAuth: always(true)}) +export const blockPolicy = (socket: Socket) => { + const previousOpen = socket.open + + socket.open = () => { + const $pubkey = pubkey.get() + + if (!$pubkey || !getPubkeyRelays($pubkey, RelayMode.Blocked).includes(socket.url)) { + return previousOpen() + } + } + + return () => { + socket.open = previousOpen + } +} + export const trustPolicy = (socket: Socket) => { const buffer: RelayMessage[] = [] diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2d1700de..06590a88 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -26,7 +26,7 @@ import {setupHistory} from "@app/util/history" import {setupTracking} from "@app/util/tracking" import {setupAnalytics} from "@app/util/analytics" - import {authPolicy, trustPolicy, mostlyRestrictedPolicy} from "@app/util/policies" + import {authPolicy, blockPolicy, trustPolicy, mostlyRestrictedPolicy} from "@app/util/policies" import {kv, db} from "@app/core/storage" import {userSettingsValues} from "@app/core/state" import {syncApplicationData} from "@app/core/sync" @@ -43,7 +43,7 @@ const {children} = $props() - const policies = [authPolicy, trustPolicy, mostlyRestrictedPolicy] + const policies = [authPolicy, blockPolicy, trustPolicy, mostlyRestrictedPolicy] // Add stuff to window for convenience Object.assign(window, { diff --git a/src/routes/settings/relays/+page.svelte b/src/routes/settings/relays/+page.svelte index a3c0bf23..e6a62016 100644 --- a/src/routes/settings/relays/+page.svelte +++ b/src/routes/settings/relays/+page.svelte @@ -1,6 +1,16 @@ @@ -77,7 +86,7 @@ {:else}

No relays found

{/each} - @@ -109,7 +118,7 @@ {:else}

No relays found

{/each} - @@ -142,7 +151,38 @@ {:else}

No relays found

{/each} - + + + + {#snippet title()} +

+ + Blocked Relays +

+ {/snippet} + {#snippet description()} +

+ These relays will never be connected to by clients supporting this policy. +

+ {/snippet} +
+ {#each $blockedRelayUrls.sort() as url (url)} + + + + {:else} +

No relays found

+ {/each} +