diff --git a/src/lib/actor-status.ts b/src/lib/actor-status.ts index 02d5eabed6..89a3a163de 100644 --- a/src/lib/actor-status.ts +++ b/src/lib/actor-status.ts @@ -3,6 +3,7 @@ import { type $Typed, type AppBskyActorDefs, AppBskyEmbedExternal, + AtUri, } from '@atproto/api' import {isAfter, parseISO} from 'date-fns' @@ -73,10 +74,15 @@ export function isStatusValidForViewers( config: LiveNowConfig, ) { if (status.status !== 'app.bsky.actor.status#live') return false + if (!status.uri) return false // should not happen, just backwards compat try { + const {host: liveDid} = new AtUri(status.uri) if (AppBskyEmbedExternal.isView(status.embed)) { const url = new URL(status.embed.external.uri) - return config.allSupportedDomains.has(url.hostname) + const exception = config.allowedHostsExceptionsByDid.get(liveDid) + const isValidException = exception ? exception.has(url.hostname) : false + const isValidForAnyone = config.defaultAllowedHosts.has(url.hostname) + return isValidException || isValidForAnyone } else { return false } diff --git a/src/state/service-config.tsx b/src/state/service-config.tsx index 7612f5825c..8cbfb37d25 100644 --- a/src/state/service-config.tsx +++ b/src/state/service-config.tsx @@ -90,27 +90,34 @@ const DEFAULT_LIVE_ALLOWED_DOMAINS = [ ] export type LiveNowConfig = { allowedDomains: Set - allSupportedDomains: Set + defaultAllowedHosts: Set + allowedHostsExceptionsByDid: Map> } export function useLiveNowConfig(): LiveNowConfig { const ctx = useContext(LiveNowContext) const canGoLive = useCanGoLive() const {currentAccount} = useSession() - const allVipDomains = new Set(ctx.flatMap(live => live.domains)) - const allSupportedDomains = new Set( - DEFAULT_LIVE_ALLOWED_DOMAINS.concat(Array.from(allVipDomains)), - ) + const defaultAllowedHosts = new Set(DEFAULT_LIVE_ALLOWED_DOMAINS) + const allowedHostsExceptionsByDid = new Map>() + for (const live of ctx) { + allowedHostsExceptionsByDid.set( + live.did, + new Set(DEFAULT_LIVE_ALLOWED_DOMAINS.concat(live.domains)), + ) + } if (!currentAccount?.did || !canGoLive) return { allowedDomains: new Set(), - allSupportedDomains, + defaultAllowedHosts, + allowedHostsExceptionsByDid, } const vip = ctx.find(live => live.did === currentAccount.did) return { allowedDomains: new Set( DEFAULT_LIVE_ALLOWED_DOMAINS.concat(vip ? vip.domains : []), ), - allSupportedDomains, + defaultAllowedHosts, + allowedHostsExceptionsByDid, } }