Moved auth funcs into its own place

This commit is contained in:
WardPearce
2026-03-03 20:10:56 +13:00
parent 6c52aa1abf
commit 7d244de562
8 changed files with 115 additions and 121 deletions
+104
View File
@@ -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<boolean> {
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('/', {}));
}
@@ -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,
@@ -1,6 +1,6 @@
<script lang="ts">
import { _ } from '$lib/i18n';
import { materialiousLogout } from '$lib/misc';
import { materialiousLogout } from '$lib/auth';
import { watchHistoryEnabledStore } from '$lib/store';
let clickCount = $state(0);
+1 -101
View File
@@ -1,25 +1,11 @@
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
import he from 'he';
import { get } from 'svelte/store';
import { env } from '$env/dynamic/public';
import {
invidiousAuthStore,
backendInUseStore,
channelCacheStore,
feedCacheStore,
invidiousInstanceStore,
interfaceAndroidUseNativeShare,
playlistCacheStore,
rawMasterKeyStore,
searchCacheStore
} from './store';
import { backendInUseStore, interfaceAndroidUseNativeShare } from './store';
import { Capacitor } from '@capacitor/core';
import { Share } from '@capacitor/share';
import { Clipboard } from '@capacitor/clipboard';
import { isOwnBackend } from './shared';
import { Browser } from '@capacitor/browser';
import { clearFeedYTjs } from './api/youtubejs/subscriptions';
import { addToast } from './components/Toast.svelte';
import { _ } from './i18n';
@@ -130,89 +116,3 @@ export function isUnrestrictedPlatform(): boolean {
export function isYTBackend(): boolean {
return get(backendInUseStore) === 'yt' && isUnrestrictedPlatform();
}
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<boolean> {
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('/', {}));
}
+2 -7
View File
@@ -28,13 +28,8 @@
import ui from 'beercss';
import { onMount } from 'svelte';
import { _ } from '$lib/i18n';
import {
goToInvidiousLogin,
invidiousLogout,
isYTBackend,
materialiousLogout,
truncate
} from '$lib/misc';
import { isYTBackend, truncate } from '$lib/misc';
import { goToInvidiousLogin, invidiousLogout, materialiousLogout } from '$lib/auth';
import Author from '$lib/components/Author.svelte';
import Toast from '$lib/components/Toast.svelte';
import { isOwnBackend } from '$lib/shared';
@@ -3,7 +3,8 @@
import { resolve } from '$app/paths';
import Question from '$lib/components/Question.svelte';
import { _ } from '$lib/i18n';
import { clearCaches, isUnrestrictedPlatform, setInvidiousInstance } from '$lib/misc';
import { isUnrestrictedPlatform } from '$lib/misc';
import { setInvidiousInstance, clearCaches } from '$lib/auth';
import { isOwnBackend } from '$lib/shared';
import { backendInUseStore, invidiousInstanceStore, playerYouTubeJsFallback } from '$lib/store';
@@ -2,7 +2,7 @@ import { getFeed } from '$lib/api/index';
import type { PlaylistPageVideo, Video, VideoBase } from '$lib/api/model';
import { localDb } from '$lib/dexie';
import { excludeDuplicateFeeds } from '$lib/feed';
import { authProtected } from '$lib/misc';
import { authProtected } from '$lib/auth';
import { feedCacheStore, feedLoadingStore } from '$lib/store';
import { error } from '@sveltejs/kit';
import { get } from 'svelte/store';
@@ -1,5 +1,5 @@
import { getSubscriptions } from '$lib/api';
import { authProtected } from '$lib/misc';
import { authProtected } from '$lib/auth';
import { error } from '@sveltejs/kit';
export async function load() {