From d5847e2d2b68a1eb41d43be170cd4ddff9003cff Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:06:17 +0100 Subject: [feature] Application creation + management via API + settings panel (#3906) * [feature] Application creation + management via API + settings panel * fix docs links * add errnorows test * use known application as shorter * add comment about side effects --- web/source/settings/redux/login.ts | 69 +++++++++++++++++++++++++++++ web/source/settings/redux/oauth.ts | 89 -------------------------------------- web/source/settings/redux/store.ts | 10 ++--- 3 files changed, 74 insertions(+), 94 deletions(-) create mode 100644 web/source/settings/redux/login.ts delete mode 100644 web/source/settings/redux/oauth.ts (limited to 'web/source/settings/redux') diff --git a/web/source/settings/redux/login.ts b/web/source/settings/redux/login.ts new file mode 100644 index 000000000..2ba06dfff --- /dev/null +++ b/web/source/settings/redux/login.ts @@ -0,0 +1,69 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import { PayloadAction, createSlice } from "@reduxjs/toolkit"; +import { OAuthApp, OAuthAccessToken } from "../lib/types/oauth"; + +export interface LoginState { + instanceUrl?: string; + current: "none" | "awaitingcallback" | "loggedin" | "loggedout"; + expectingRedirect: boolean; + /** + * Token stored in easy-to-use format. + * Will look something like: + * "Authorization: Bearer BLAHBLAHBLAH" + */ + token?: string; + app?: OAuthApp; +} + +const initialState: LoginState = { + current: 'none', + expectingRedirect: false, +}; + +export const loginSlice = createSlice({ + name: "login", + initialState: initialState, + reducers: { + authorize: (_state, action: PayloadAction) => { + // Overrides state with payload. + return action.payload; + }, + setToken: (state, action: PayloadAction) => { + // Mark us as logged + // in by storing token. + state.token = `${action.payload.token_type} ${action.payload.access_token}`; + state.current = "loggedin"; + }, + remove: (state) => { + // Mark us as logged + // out by clearing auth. + delete state.token; + delete state.app; + state.current = "loggedout"; + } + } +}); + +export const { + authorize, + setToken, + remove, +} = loginSlice.actions; diff --git a/web/source/settings/redux/oauth.ts b/web/source/settings/redux/oauth.ts deleted file mode 100644 index 1d6bf9bb1..000000000 --- a/web/source/settings/redux/oauth.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - GoToSocial - Copyright (C) GoToSocial Authors admin@gotosocial.org - SPDX-License-Identifier: AGPL-3.0-or-later - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -import { PayloadAction, createSlice } from "@reduxjs/toolkit"; - -/** - * OAuthToken represents a response - * to an OAuth token request. - */ -export interface OAuthToken { - /** - * Most likely to be 'Bearer' - * but may be something else. - */ - token_type: string; - /** - * The actual token. Can be passed in to - * authenticate further requests using the - * Authorization header and the token type. - */ - access_token: string; -} - -export interface OAuthApp { - client_id: string; - client_secret: string; -} - -export interface OAuthState { - instanceUrl?: string; - loginState: "none" | "callback" | "login" | "logout"; - expectingRedirect: boolean; - /** - * Token stored in easy-to-use format. - * Will look something like: - * "Authorization: Bearer BLAHBLAHBLAH" - */ - token?: string; - app?: OAuthApp; -} - -const initialState: OAuthState = { - loginState: 'none', - expectingRedirect: false, -}; - -export const oauthSlice = createSlice({ - name: "oauth", - initialState: initialState, - reducers: { - authorize: (_state, action: PayloadAction) => { - // Overrides state with payload. - return action.payload; - }, - setToken: (state, action: PayloadAction) => { - // Mark us as logged in by storing token. - state.token = `${action.payload.token_type} ${action.payload.access_token}`; - state.loginState = "login"; - }, - remove: (state) => { - // Mark us as logged out by clearing auth. - delete state.token; - delete state.app; - state.loginState = "logout"; - } - } -}); - -export const { - authorize, - setToken, - remove, -} = oauthSlice.actions; diff --git a/web/source/settings/redux/store.ts b/web/source/settings/redux/store.ts index 0c1285187..076f5f88d 100644 --- a/web/source/settings/redux/store.ts +++ b/web/source/settings/redux/store.ts @@ -30,19 +30,19 @@ import { REGISTER, } from "redux-persist"; -import { oauthSlice } from "./oauth"; +import { loginSlice } from "./login"; import { gtsApi } from "../lib/query/gts-api"; const combinedReducers = combineReducers({ [gtsApi.reducerPath]: gtsApi.reducer, - oauth: oauthSlice.reducer, + login: loginSlice.reducer, }); const persistedReducer = persistReducer({ key: "gotosocial-settings", storage: require("redux-persist/lib/storage").default, stateReconciler: require("redux-persist/lib/stateReconciler/autoMergeLevel1").default, - whitelist: ["oauth"], + whitelist: ["login"], migrate: async (state) => { if (state == undefined) { return state; @@ -51,8 +51,8 @@ const persistedReducer = persistReducer({ // This is a cheeky workaround for // redux-persist being a stickler. let anyState = state as any; - if (anyState?.oauth != undefined) { - anyState.oauth.expectingRedirect = false; + if (anyState?.login != undefined) { + anyState.login.expectingRedirect = false; } return anyState; -- cgit v1.2.3