fix type errors in auth.vue

This commit is contained in:
Hazelnoot 2025-04-01 15:21:42 -04:00
parent 126d2119a3
commit 3b9de1c4bb

View file

@ -63,24 +63,30 @@ const getUrlParams = () =>
const [k, v] = query.split('='); const [k, v] = query.split('=');
result[k] = decodeURI(v); result[k] = decodeURI(v);
return result; return result;
}, {}); }, {} as Record<string, string>);
const state = ref<'waiting' | 'accepted' | 'fetch-session-error' | 'denied' | null>(null); const state = ref<'waiting' | 'accepted' | 'fetch-session-error' | 'denied' | null>(null);
const session = ref<Misskey.entities.AuthSessionShowResponse | null>(null); const session = ref<Misskey.entities.AuthSessionShowResponse | null>(null);
function accepted() { function accepted() {
state.value = 'accepted'; state.value = 'accepted';
const isMastodon = !!getUrlParams().mastodon; const params = getUrlParams();
const isMastodon = !!params.mastodon;
if (session.value && session.value.app.callbackUrl && isMastodon) { if (session.value && session.value.app.callbackUrl && isMastodon) {
const redirectUri = decodeURIComponent(getUrlParams().redirect_uri); if (!params.redirect_uri) {
throw new Error('Missing redirect_uri');
}
const redirectUri = decodeURIComponent(params.redirect_uri);
if (!session.value.app.callbackUrl.includes('elk.zone') && !session.value.app.callbackUrl.split('\n').includes(redirectUri)) { if (!session.value.app.callbackUrl.includes('elk.zone') && !session.value.app.callbackUrl.split('\n').includes(redirectUri)) {
state.value = 'fetch-session-error'; state.value = 'fetch-session-error';
throw new Error('Callback URI doesn\'t match registered app'); throw new Error('Callback URI doesn\'t match registered app');
} }
const callbackUrl = session.value.app.callbackUrl.includes('elk.zone') ? new URL(session.value.app.callbackUrl) : new URL(redirectUri); const callbackUrl = session.value.app.callbackUrl.includes('elk.zone') ? new URL(session.value.app.callbackUrl) : new URL(redirectUri);
callbackUrl.searchParams.append('code', session.value.token); callbackUrl.searchParams.append('code', session.value.token);
if (getUrlParams().state) callbackUrl.searchParams.append('state', getUrlParams().state); if (params.state) {
location.href = callbackUrl.toString(); callbackUrl.searchParams.append('state', params.state);
}
window.location.href = callbackUrl.toString();
} else if (session.value && session.value.app.callbackUrl) { } else if (session.value && session.value.app.callbackUrl) {
const url = new URL(session.value.app.callbackUrl); const url = new URL(session.value.app.callbackUrl);
if (['javascript:', 'file:', 'data:', 'mailto:', 'tel:', 'vbscript:'].includes(url.protocol)) throw new Error('invalid url'); if (['javascript:', 'file:', 'data:', 'mailto:', 'tel:', 'vbscript:'].includes(url.protocol)) throw new Error('invalid url');
@ -96,14 +102,15 @@ onMounted(async () => {
if (!$i) return; if (!$i) return;
try { try {
session.value = await misskeyApi('auth/session/show', { const sess = await misskeyApi('auth/session/show', {
token: props.token, token: props.token,
}); });
session.value = sess;
// //
if (session.value.app.isAuthorized) { if (sess.app.isAuthorized) {
await misskeyApi('auth/accept', { await misskeyApi('auth/accept', {
token: session.value.token, token: sess.token,
}); });
accepted(); accepted();
} else { } else {