diff --git a/CHANGELOG.md b/CHANGELOG.md index 58c433f1e9d45fa8923716ad7d0e6e5fbb18dffb..276a22368de78883729b4244c68922af62c66c11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - add ability to configure new settings (UploadS3 bucket namespace, Rate limit for Activity pub routes, Email notifications settings, MRF Vocabulary, user bio and name length and others) +- add sign in via PleromaFE ### Changed - removes "Dashboard" from dropdown menu - makes all single selects clearable and allow to enter custom values in all multiple selects -- remove legacy activitypub accept_blocks setting +- remove legacy activitypub accept_blocks setting ### Fixed diff --git a/src/permission.js b/src/permission.js index 7dbf3c47db5ac544839540039d737c343c261dee..764c666e9d6b5654bbc1e97ee927d4f3d87bd277 100644 --- a/src/permission.js +++ b/src/permission.js @@ -14,7 +14,7 @@ function hasPermission(roles, permissionRoles) { return roles.some(role => permissionRoles.indexOf(role) >= 0) } -const whiteList = ['/login', '/auth-redirect']// no redirect whitelist +const whiteList = ['/login', '/auth-redirect', '/login-pleroma']// no redirect whitelist export const beforeEachRoute = (to, from, next) => { NProgress.start() // start progress bar diff --git a/src/router/index.js b/src/router/index.js index e215ca4b45b9d9f331cdc84b34959703cbdc7cb8..7ffbb61c2fa5b92ed0191c1070d1dfe2c9562414 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -18,6 +18,11 @@ export const constantRouterMap = [ } ] }, + { + path: '/login-pleroma', + component: () => import('@/views/login/pleroma'), + hidden: true + }, { path: '/login', component: () => import('@/views/login/index'), diff --git a/src/services/pleromaAuth.js b/src/services/pleromaAuth.js new file mode 100644 index 0000000000000000000000000000000000000000..9008f5c09db91d7c5dacb9f629bf8eb761202d3f --- /dev/null +++ b/src/services/pleromaAuth.js @@ -0,0 +1,15 @@ +import localforage from 'localforage' +import _ from 'lodash' + +const pleromaFEStateKey = 'vuex-lz' + +export const authenticateWithPleromaFE = async(store) => { + const pleromaFEState = await localforage.getItem(pleromaFEStateKey) + const token = _.get(pleromaFEState, 'oauth.userToken') + + if (token === undefined) { + throw new Error('PleromaFE token not found') + } + + await store.dispatch('LoginByPleromaFE', { token }) +} diff --git a/src/views/login/index.vue b/src/views/login/index.vue index fdb00fe21c5d21353986c57c4359dbac35dc806b..875bbf46ea4c30153d866af22879effec48de939 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -53,6 +53,7 @@ import SvgIcon from '@/components/SvgIcon' import localforage from 'localforage' import _ from 'lodash' import i18n from '@/lang' +import { authenticateWithPleromaFE } from '@/services/pleromaAuth' export default { name: 'Login', @@ -112,16 +113,16 @@ export default { async handlePleromaFELogin() { this.loadingPleromaFE = true try { - await this.$store.dispatch('LoginByPleromaFE', { token: this.pleromaFEState.oauth.userToken }) + await authenticateWithPleromaFE(this.$store) } catch (error) { this.loadingPleromaFE = false this.$message.error(i18n.t('login.pleromaFELoginFailed')) } this.loadingPleromaFE = false - this.$router.push({ path: this.redirect || '/users/index' }) this.$message.success(i18n.t('login.pleromaFELoginSucceed')) + this.$router.push({ path: this.redirect || '/users/index' }) }, getLoginData() { const [username, authHost] = this.loginForm.username.split('@') diff --git a/src/views/login/pleroma.vue b/src/views/login/pleroma.vue new file mode 100644 index 0000000000000000000000000000000000000000..9b6a56d0cebb9099f8fb37f2389d939b0eb017ff --- /dev/null +++ b/src/views/login/pleroma.vue @@ -0,0 +1,26 @@ +<template> + <div /> +</template> + +<script> +import { Loading } from 'element-ui' +import { authenticateWithPleromaFE } from '@/services/pleromaAuth' +import i18n from '@/lang' + +export default { + name: 'LoginPleroma', + async mounted() { + const loadingInstance = Loading.service({ fullscreen: true }) + + try { + await authenticateWithPleromaFE(this.$store) + } catch (error) { + this.$message.error(i18n.t('login.pleromaFELoginFailed')) + } + + loadingInstance.close() + this.$router.push({ path: '/users/index' }) + this.$message.success(i18n.t('login.pleromaFELoginSucceed')) + } +} +</script>