From 7d244de5621f6b497fecda6da78de520f3a4c506 Mon Sep 17 00:00:00 2001 From: WardPearce Date: Tue, 3 Mar 2026 20:10:56 +1300 Subject: [PATCH] Moved auth funcs into its own place --- materialious/src/lib/auth.ts | 104 ++++++++++++++++++ .../lib/components/settings/Interface.svelte | 12 +- .../settings/InternalAccount.svelte | 2 +- materialious/src/lib/misc.ts | 102 +---------------- materialious/src/routes/(app)/+layout.svelte | 9 +- .../src/routes/(app)/setup/+page.svelte | 3 +- .../src/routes/(app)/subscriptions/+page.ts | 2 +- .../(app)/subscriptions/manage/+page.ts | 2 +- 8 files changed, 115 insertions(+), 121 deletions(-) create mode 100644 materialious/src/lib/auth.ts diff --git a/materialious/src/lib/auth.ts b/materialious/src/lib/auth.ts new file mode 100644 index 00000000..0c5748de --- /dev/null +++ b/materialious/src/lib/auth.ts @@ -0,0 +1,104 @@ +import { goto } from '$app/navigation'; +import { resolve } from '$app/paths'; +import { get } from 'svelte/store'; +import { + invidiousAuthStore, + channelCacheStore, + feedCacheStore, + invidiousInstanceStore, + playlistCacheStore, + rawMasterKeyStore, + searchCacheStore +} from './store'; +import { Capacitor } from '@capacitor/core'; +import { isOwnBackend } from './shared'; +import { Browser } from '@capacitor/browser'; +import { clearFeedYTjs } from './api/youtubejs/subscriptions'; +import { _ } from './i18n'; +import { ensureNoTrailingSlash, isYTBackend } from './misc'; + +export function clearCaches() { + feedCacheStore.set({}); + searchCacheStore.set({}); + playlistCacheStore.set({}); + channelCacheStore.set({}); +} + +export function authProtected() { + if (!get(invidiousAuthStore) && !isYTBackend()) { + goto(resolve('/', {}), { replaceState: true }); + } +} + +export async function setInvidiousInstance( + instanceUrl: string | undefined | null +): Promise { + if (typeof instanceUrl !== 'string') { + return false; + } + + let invalidInstance = false; + + const instance = ensureNoTrailingSlash(instanceUrl); + + try { + new URL(instance); + } catch { + invalidInstance = true; + } + + if (invalidInstance) return false; + + let resp; + try { + resp = await fetch(`${instance}/api/v1/channels/UCH-_hzb2ILSCo9ftVSnrCIQ`); + } catch { + invalidInstance = true; + } + + if (invalidInstance) return false; + + if (resp && !resp.ok) { + return false; + } + + invidiousInstanceStore.set(instance); + invidiousAuthStore.set(null); + + return true; +} + +export async function goToInvidiousLogin() { + if (!get(invidiousInstanceStore)) return; + const path = new URL(`${get(invidiousInstanceStore)}/authorize_token`); + const searchParams = new URLSearchParams({ + scopes: ':feed,:subscriptions*,:playlists*,:history*,:notifications*' + }); + if (Capacitor.getPlatform() === 'android') { + searchParams.set('callback_url', 'materialious-auth://'); + path.search = searchParams.toString(); + await Browser.open({ url: path.toString() }); + } else { + searchParams.set('callback_url', `${location.origin}${resolve('/invidious/auth', {})}`); + path.search = searchParams.toString(); + document.location.href = path.toString(); + } +} + +export async function invidiousLogout() { + invidiousAuthStore.set(null); + goto(resolve('/', {})); +} + +export async function materialiousLogout() { + if (isYTBackend()) { + await clearFeedYTjs(); + } + + if (isOwnBackend()?.internalAuth) { + fetch('/api/user/logout', { method: 'DELETE' }); + rawMasterKeyStore.set(undefined); + } + + goto(resolve('/', {})); +} diff --git a/materialious/src/lib/components/settings/Interface.svelte b/materialious/src/lib/components/settings/Interface.svelte index 78a67e04..7d1b28e4 100644 --- a/materialious/src/lib/components/settings/Interface.svelte +++ b/materialious/src/lib/components/settings/Interface.svelte @@ -9,15 +9,9 @@ import type { RgbaColor, HsvaColor, Colord } from 'colord'; import { _ } from '$lib/i18n'; import { get } from 'svelte/store'; - import { - isUnrestrictedPlatform, - setInvidiousInstance, - goToInvidiousLogin, - invidiousLogout, - timeout, - shareURL - } from '../../misc'; - import { getPages, type Pages } from '../../navPages'; + import { isUnrestrictedPlatform, timeout, shareURL } from '$lib/misc'; + import { getPages, type Pages } from '$lib/navPages'; + import { setInvidiousInstance, goToInvidiousLogin, invidiousLogout } from '$lib/auth'; import ColorPicker from 'svelte-awesome-color-picker'; import { invidiousAuthStore, diff --git a/materialious/src/lib/components/settings/InternalAccount.svelte b/materialious/src/lib/components/settings/InternalAccount.svelte index d6180e78..d53d7d3c 100644 --- a/materialious/src/lib/components/settings/InternalAccount.svelte +++ b/materialious/src/lib/components/settings/InternalAccount.svelte @@ -1,6 +1,6 @@