From 58988c2b3cd32cec1e42d6c35f0de8e4d6a444df Mon Sep 17 00:00:00 2001
From: Mar0xy <marie@kaifa.ch>
Date: Sun, 24 Sep 2023 20:44:33 +0200
Subject: [PATCH] upd: change auth page

---
 packages/frontend/src/pages/auth.vue | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/packages/frontend/src/pages/auth.vue b/packages/frontend/src/pages/auth.vue
index 124323a483..1454af63d2 100644
--- a/packages/frontend/src/pages/auth.vue
+++ b/packages/frontend/src/pages/auth.vue
@@ -55,12 +55,33 @@ const props = defineProps<{
 	token: string;
 }>();
 
+const getUrlParams = () =>
+	window.location.search
+		.substring(1)
+		.split("&")
+		.reduce((result, query) => {
+			const [k, v] = query.split("=");
+			result[k] = decodeURI(v);
+			return result;
+		}, {});
+
 let state = $ref<'waiting' | 'accepted' | 'fetch-session-error' | 'denied' | null>(null);
 let session = $ref<Misskey.entities.AuthSession | null>(null);
 
 function accepted() {
 	state = 'accepted';
-	if (session && session.app.callbackUrl) {
+	const isMastodon = !!getUrlParams().mastodon;
+	if (session && session.app.callbackUrl && isMastodon) {
+		const redirectUri = decodeURIComponent(getUrlParams().redirect_uri);
+		if (!session.app.callbackUrl.split("\n").includes(redirectUri)) {
+			state = "fetch-session-error";
+			throw new Error("Callback URI doesn't match registered app");
+		}
+		const callbackUrl = new URL(redirectUri);
+		callbackUrl.searchParams.append("code", session.token);
+		if (getUrlParams().state) callbackUrl.searchParams.append("state", getUrlParams().state);
+		location.href = callbackUrl.toString();
+	} else if (session && session.app.callbackUrl) {
 		const url = new URL(session.app.callbackUrl);
 		if (['javascript:', 'file:', 'data:', 'mailto:', 'tel:'].includes(url.protocol)) throw new Error('invalid url');
 		location.href = `${session.app.callbackUrl}?token=${session.token}`;