Skip to content
Snippets Groups Projects
Verified Commit 73f4fa14 authored by Ciarán Ainsworth's avatar Ciarán Ainsworth Committed by Georg Krause
Browse files

Add beforeRouteEnter guards for moderation pages

parent d44fc7e6
No related branches found
No related tags found
No related merge requests found
module.exports = {
env: {
browser: true,
es6: true
},
extends: [
'plugin:vue/recommended',
'standard'
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
parser: 'babel-eslint'
},
plugins: [
'vue'
],
rules: {
}
}
This diff is collapsed.
import Vue from 'vue' import Vue from 'vue'
import axios from 'axios' import axios from 'axios'
import logger from '@/logging' import logger from '@/logging'
import router from '@/router'
import lodash from '@/lodash' import lodash from '@/lodash'
function getDefaultScopedTokens () { function getDefaultScopedTokens () {
return { return {
listen: null, listen: null
} }
} }
function asForm (obj) { function asForm (obj) {
let data = new FormData() const data = new FormData()
Object.entries(obj).forEach((e) => { Object.entries(obj).forEach((e) => {
data.set(e[0], e[1]) data.set(e[0], e[1])
}) })
return data return data
} }
let baseUrl = `${window.location.protocol}//${window.location.hostname}` let baseUrl = `${window.location.protocol}//${window.location.hostname}`
if (window.location.port) { if (window.location.port) {
baseUrl = `${baseUrl}:${window.location.port}` baseUrl = `${baseUrl}:${window.location.port}`
...@@ -28,14 +26,14 @@ function getDefaultOauth () { ...@@ -28,14 +26,14 @@ function getDefaultOauth () {
clientId: null, clientId: null,
clientSecret: null, clientSecret: null,
accessToken: null, accessToken: null,
refreshToken: null, refreshToken: null
} }
} }
const NEEDED_SCOPES = [ const NEEDED_SCOPES = [
"read", 'read',
"write", 'write'
].join(' ') ].join(' ')
async function createOauthApp(domain) { async function createOauthApp (domain) {
const payload = { const payload = {
name: `Funkwhale web client at ${window.location.hostname}`, name: `Funkwhale web client at ${window.location.hostname}`,
website: baseUrl, website: baseUrl,
...@@ -112,9 +110,9 @@ export default { ...@@ -112,9 +110,9 @@ export default {
state.token = value state.token = value
}, },
scopedTokens: (state, value) => { scopedTokens: (state, value) => {
state.scopedTokens = {...value} state.scopedTokens = { ...value }
}, },
permission: (state, {key, status}) => { permission: (state, { key, status }) => {
state.availablePermissions[key] = status state.availablePermissions[key] = status
}, },
profilePartialUpdate: (state, payload) => { profilePartialUpdate: (state, payload) => {
...@@ -133,8 +131,9 @@ export default { ...@@ -133,8 +131,9 @@ export default {
}, },
actions: { actions: {
// Send a request to the login URL and save the returned JWT // Send a request to the login URL and save the returned JWT
login ({commit, dispatch}, {next, credentials, onError}) { login ({ commit, dispatch }, { next, credentials, onError }) {
var form = new FormData(); const router = require('@/router').default
var form = new FormData()
Object.keys(credentials).forEach((k) => { Object.keys(credentials).forEach((k) => {
form.set(k, credentials[k]) form.set(k, credentials[k])
}) })
...@@ -150,13 +149,13 @@ export default { ...@@ -150,13 +149,13 @@ export default {
onError(response) onError(response)
}) })
}, },
async logout ({state, commit}) { async logout ({ state, commit }) {
try { try {
await axios.post('users/logout') await axios.post('users/logout')
} catch { } catch {
console.log('Error while logging out, probably logged in via oauth') console.log('Error while logging out, probably logged in via oauth')
} }
let modules = [ const modules = [
'auth', 'auth',
'favorites', 'favorites',
'player', 'player',
...@@ -165,22 +164,21 @@ export default { ...@@ -165,22 +164,21 @@ export default {
'radios' 'radios'
] ]
modules.forEach(m => { modules.forEach(m => {
commit(`${m}/reset`, null, {root: true}) commit(`${m}/reset`, null, { root: true })
}) })
logger.default.info('Log out, goodbye!') logger.default.info('Log out, goodbye!')
}, },
async check ({commit, dispatch, state}) { async check ({ commit, dispatch, state }) {
logger.default.info('Checking authentication…') logger.default.info('Checking authentication…')
commit('authenticated', false) commit('authenticated', false)
let profile = await dispatch('fetchProfile') const profile = await dispatch('fetchProfile')
if (profile) { if (profile) {
commit('authenticated', true) commit('authenticated', true)
} else { } else {
logger.default.info('Anonymous user') logger.default.info('Anonymous user')
} }
}, },
fetchProfile ({commit, dispatch, state}) { fetchProfile ({ commit, dispatch, state }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios.get('users/me/').then((response) => { axios.get('users/me/').then((response) => {
logger.default.info('Successfully fetched user profile') logger.default.info('Successfully fetched user profile')
...@@ -204,22 +202,22 @@ export default { ...@@ -204,22 +202,22 @@ export default {
dispatch('playlists/fetchOwn', null, { root: true }) dispatch('playlists/fetchOwn', null, { root: true })
}, (response) => { }, (response) => {
logger.default.info('Error while fetching user profile') logger.default.info('Error while fetching user profile')
reject() reject(new Error('Error while fetching user profile'))
}) })
}) })
}, },
updateProfile({ commit }, data) { updateProfile ({ commit }, data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
commit("authenticated", true) commit('authenticated', true)
commit("profile", data) commit('profile', data)
commit("username", data.username) commit('username', data.username)
commit("fullUsername", data.full_username) commit('fullUsername', data.full_username)
if (data.tokens) { if (data.tokens) {
commit("scopedTokens", data.tokens) commit('scopedTokens', data.tokens)
} }
Object.keys(data.permissions).forEach(function(key) { Object.keys(data.permissions).forEach(function (key) {
// this makes it easier to check for permissions in templates // this makes it easier to check for permissions in templates
commit("permission", { commit('permission', {
key, key,
status: data.permissions[String(key)] status: data.permissions[String(key)]
}) })
...@@ -227,45 +225,45 @@ export default { ...@@ -227,45 +225,45 @@ export default {
resolve() resolve()
}) })
}, },
async oauthLogin({ state, rootState, commit, getters }, next) { async oauthLogin ({ state, rootState, commit, getters }, next) {
let app = await createOauthApp(getters["appDomain"]) const app = await createOauthApp(getters.appDomain)
commit("oauthApp", app) commit('oauthApp', app)
const redirectUri = encodeURIComponent(`${baseUrl}/auth/callback`) const redirectUri = encodeURIComponent(`${baseUrl}/auth/callback`)
let params = `response_type=code&scope=${encodeURIComponent(NEEDED_SCOPES)}&redirect_uri=${redirectUri}&state=${next}&client_id=${state.oauth.clientId}` const params = `response_type=code&scope=${encodeURIComponent(NEEDED_SCOPES)}&redirect_uri=${redirectUri}&state=${next}&client_id=${state.oauth.clientId}`
const authorizeUrl = `${rootState.instance.instanceUrl}authorize?${params}` const authorizeUrl = `${rootState.instance.instanceUrl}authorize?${params}`
console.log('Redirecting user...', authorizeUrl) console.log('Redirecting user...', authorizeUrl)
window.location = authorizeUrl window.location = authorizeUrl
}, },
async handleOauthCallback({ state, commit, dispatch }, authorizationCode) { async handleOauthCallback ({ state, commit, dispatch }, authorizationCode) {
console.log('Fetching token...') console.log('Fetching token...')
const payload = { const payload = {
client_id: state.oauth.clientId, client_id: state.oauth.clientId,
client_secret: state.oauth.clientSecret, client_secret: state.oauth.clientSecret,
grant_type: "authorization_code", grant_type: 'authorization_code',
code: authorizationCode, code: authorizationCode,
redirect_uri: `${baseUrl}/auth/callback` redirect_uri: `${baseUrl}/auth/callback`
} }
const response = await axios.post( const response = await axios.post(
'oauth/token/', 'oauth/token/',
asForm(payload), asForm(payload),
{headers: {'Content-Type': 'multipart/form-data'}} { headers: { 'Content-Type': 'multipart/form-data' } }
) )
commit("oauthToken", response.data) commit('oauthToken', response.data)
await dispatch('fetchProfile') await dispatch('fetchProfile')
}, },
async refreshOauthToken({ state, commit }, authorizationCode) { async refreshOauthToken ({ state, commit }, authorizationCode) {
const payload = { const payload = {
client_id: state.oauth.clientId, client_id: state.oauth.clientId,
client_secret: state.oauth.clientSecret, client_secret: state.oauth.clientSecret,
grant_type: "refresh_token", grant_type: 'refresh_token',
refresh_token: state.oauth.refreshToken, refresh_token: state.oauth.refreshToken
} }
let response = await axios.post( const response = await axios.post(
`oauth/token/`, 'oauth/token/',
asForm(payload), asForm(payload),
{headers: {'Content-Type': 'multipart/form-data'}} { headers: { 'Content-Type': 'multipart/form-data' } }
) )
commit('oauthToken', response.data) commit('oauthToken', response.data)
}, }
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment