From de4b0f3022e222c9260f786a64e6e41d759220b4 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Thu, 19 Apr 2018 22:15:13 +0200 Subject: [PATCH] Fix #124 and #155: properly reset everything on logout --- changes/changelog.d/124.bugfix | 1 + changes/changelog.d/155.bugfix | 1 + front/src/components/Sidebar.vue | 2 +- front/src/store/auth.js | 27 +++++++++++++++++------ front/src/store/favorites.js | 4 ++++ front/src/store/player.js | 4 ++++ front/src/store/playlists.js | 5 +++++ front/src/store/queue.js | 6 +++++ front/src/store/radios.js | 4 ++++ front/test/unit/specs/store/auth.spec.js | 12 +++++----- front/test/unit/specs/store/queue.spec.js | 2 +- 11 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 changes/changelog.d/124.bugfix create mode 100644 changes/changelog.d/155.bugfix diff --git a/changes/changelog.d/124.bugfix b/changes/changelog.d/124.bugfix new file mode 100644 index 000000000..b1e104a43 --- /dev/null +++ b/changes/changelog.d/124.bugfix @@ -0,0 +1 @@ +Reset all sensitive front-end data on logout (#124) diff --git a/changes/changelog.d/155.bugfix b/changes/changelog.d/155.bugfix new file mode 100644 index 000000000..2252d56d7 --- /dev/null +++ b/changes/changelog.d/155.bugfix @@ -0,0 +1 @@ +Fixed broken playlist modal after login (#155) diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue index 96047ab98..56c63adbd 100644 --- a/front/src/components/Sidebar.vue +++ b/front/src/components/Sidebar.vue @@ -35,7 +35,7 @@ Logout Login Browse library - Favorites + Favorites { state.profile = value }, @@ -53,8 +61,6 @@ export default { return axios.post('token/', credentials).then(response => { logger.default.info('Successfully logged in as', credentials.username) commit('token', response.data.token) - commit('username', credentials.username) - commit('authenticated', true) dispatch('fetchProfile') // Redirect to a specified route router.push(next) @@ -64,19 +70,25 @@ export default { }) }, logout ({commit}) { - commit('authenticated', false) + let modules = [ + 'auth', + 'favorites', + 'player', + 'playlists', + 'queue', + 'radios' + ] + modules.forEach(m => { + commit(`${m}/reset`, null, {root: true}) + }) logger.default.info('Log out, goodbye!') router.push({name: 'index'}) }, check ({commit, dispatch, state}) { logger.default.info('Checking authentication...') var jwt = state.token - var username = state.username if (jwt) { - commit('authenticated', true) - commit('username', username) commit('token', jwt) - logger.default.info('Logged back in as ' + username) dispatch('fetchProfile') dispatch('refreshToken') } else { @@ -88,6 +100,7 @@ export default { return axios.get('users/users/me/').then((response) => { logger.default.info('Successfully fetched user profile') let data = response.data + commit('authenticated', true) commit('profile', data) commit('username', data.username) dispatch('favorites/fetch', null, {root: true}) diff --git a/front/src/store/favorites.js b/front/src/store/favorites.js index a4f85b235..b7e789511 100644 --- a/front/src/store/favorites.js +++ b/front/src/store/favorites.js @@ -20,6 +20,10 @@ export default { } } state.count = state.tracks.length + }, + reset (state) { + state.tracks = [] + state.count = 0 } }, getters: { diff --git a/front/src/store/player.js b/front/src/store/player.js index d849b7b56..ed437c3f0 100644 --- a/front/src/store/player.js +++ b/front/src/store/player.js @@ -15,6 +15,10 @@ export default { looping: 0 // 0 -> no, 1 -> on track, 2 -> on queue }, mutations: { + reset (state) { + state.errorCount = 0 + state.playing = false + }, volume (state, value) { value = parseFloat(value) value = Math.min(value, 1) diff --git a/front/src/store/playlists.js b/front/src/store/playlists.js index b3ed3ab23..d0e144d80 100644 --- a/front/src/store/playlists.js +++ b/front/src/store/playlists.js @@ -17,6 +17,11 @@ export default { }, showModal (state, value) { state.showModal = value + }, + reset (state) { + state.playlists = [] + state.modalTrack = null + state.showModal = false } }, actions: { diff --git a/front/src/store/queue.js b/front/src/store/queue.js index 6a26fa1e9..2890dd1e8 100644 --- a/front/src/store/queue.js +++ b/front/src/store/queue.js @@ -10,6 +10,12 @@ export default { previousQueue: null }, mutations: { + reset (state) { + state.tracks = [] + state.currentIndex = -1 + state.ended = true + state.previousQueue = null + }, currentIndex (state, value) { state.currentIndex = value }, diff --git a/front/src/store/radios.js b/front/src/store/radios.js index e95db5126..49bbd4f94 100644 --- a/front/src/store/radios.js +++ b/front/src/store/radios.js @@ -26,6 +26,10 @@ export default { } }, mutations: { + reset (state) { + state.running = false + state.current = false + }, current: (state, value) => { state.current = value }, diff --git a/front/test/unit/specs/store/auth.spec.js b/front/test/unit/specs/store/auth.spec.js index 518dc10d4..6b187f5c6 100644 --- a/front/test/unit/specs/store/auth.spec.js +++ b/front/test/unit/specs/store/auth.spec.js @@ -89,7 +89,12 @@ describe('store/auth', () => { action: store.actions.logout, params: {state: {}}, expectedMutations: [ - { type: 'authenticated', payload: false } + { type: 'auth/reset', payload: null, options: {root: true} }, + { type: 'favorites/reset', payload: null, options: {root: true} }, + { type: 'player/reset', payload: null, options: {root: true} }, + { type: 'playlists/reset', payload: null, options: {root: true} }, + { type: 'queue/reset', payload: null, options: {root: true} }, + { type: 'radios/reset', payload: null, options: {root: true} } ] }, done) }) @@ -107,8 +112,6 @@ describe('store/auth', () => { action: store.actions.check, params: {state: {token: 'test', username: 'user'}}, expectedMutations: [ - { type: 'authenticated', payload: true }, - { type: 'username', payload: 'user' }, { type: 'token', payload: 'test' } ], expectedActions: [ @@ -132,8 +135,6 @@ describe('store/auth', () => { payload: {credentials: credentials}, expectedMutations: [ { type: 'token', payload: 'test' }, - { type: 'username', payload: 'bob' }, - { type: 'authenticated', payload: true } ], expectedActions: [ { type: 'fetchProfile' } @@ -175,6 +176,7 @@ describe('store/auth', () => { testAction({ action: store.actions.fetchProfile, expectedMutations: [ + { type: 'authenticated', payload: true }, { type: 'profile', payload: profile }, { type: 'username', payload: profile.username }, { type: 'permission', payload: {key: 'admin', status: true} } diff --git a/front/test/unit/specs/store/queue.spec.js b/front/test/unit/specs/store/queue.spec.js index 2bc5cde4e..5304d1d75 100644 --- a/front/test/unit/specs/store/queue.spec.js +++ b/front/test/unit/specs/store/queue.spec.js @@ -326,7 +326,7 @@ describe('store/queue', () => { action: store.actions.shuffle, params: {state: {currentIndex: 1, tracks: tracks}}, expectedMutations: [ - { type: 'player/currentTime', payload: 0 , options: {root: true}}, + { type: 'player/currentTime', payload: 0, options: {root: true}}, { type: 'tracks', payload: [] } ], expectedActions: [