// import axios from 'axios'; // // if (!window.axios) { // window.axios = axios.create({ // baseURL: 'http://localhost:8080', // }); // } export default ({ store, $axios, redirect, $toast, route, app }) => { // Add a request interceptor $axios.interceptors.request.use(function(config) { config.headers['xc-gui'] = 'true' if (store.state.users.token) { config.headers['xc-auth'] = store.state.users.token } if (!config.url.endsWith('/user/me') && !config.url.endsWith('/admin/roles') && store.state.users.previewAs) { config.headers['xc-preview'] = store.state.users.previewAs } if (!config.url.endsWith('/user/me') && !config.url.endsWith('/admin/roles')) { if (app.context && app.context.route && app.context.route.params && app.context.route.params.shared_base_id) { config.headers['xc-shared-base-id'] = app.context.route.params.shared_base_id } } return config }) // $axios.setBaseURL('http://localhost:8080') $axios.interceptors.response.use((response) => { // Return a successful response back to the calling service return response }, (error) => { if (error.response && error.response.data && error.response.data.msg === 'Database config not found') { redirect('/project/0') return } // Return any error which is not due to authentication back to the calling service if (!error.response || error.response.status !== 401) { return new Promise((resolve, reject) => { reject(error) }) } // Logout user if token refresh didn't work or user is disabled if (error.config.url === '/auth/refresh-token') { store.dispatch('users/ActSignOut') return new Promise((resolve, reject) => { reject(error) }) } // Try request again with new token return $axios.post('/auth/refresh-token', null, { withCredentials: true }) .then((token) => { // New request with new token const config = error.config config.headers['xc-auth'] = token.data.token store.commit('users/MutSetToken', token.data.token) return new Promise((resolve, reject) => { $axios.request(config).then((response) => { resolve(response) }).catch((error) => { reject(error) }) }) }) .catch(async(error) => { await store.dispatch('users/ActSignOut') if (store.state.project.appInfo.firstUser) { redirect('/') } else { $toast.clear() $toast.info('Token Expired. Please login again.', { position: 'bottom-center' }).goAway(5000) redirect('/user/authentication/signin') } Promise.reject(error) }) }) } /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd * * @author Naveen MR <oof1lab@gmail.com> * @author Pranav C Balan <pranavxc@gmail.com> * * @license GNU AGPL version 3 or any later version * * 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 <http://www.gnu.org/licenses/>. * */ /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd * * @author Naveen MR <oof1lab@gmail.com> * @author Pranav C Balan <pranavxc@gmail.com> * * @license GNU AGPL version 3 or any later version * * 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 <http://www.gnu.org/licenses/>. * */