diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java index 2dbb673776c635926937e51ca2115555c6d93c0c..abcb6ddbd3a7b1e7d71ee1995392f576f9d90582 100644 --- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java +++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java @@ -10,7 +10,9 @@ import it.inaf.ia2.vospace.ui.client.VOSpaceClient; import it.inaf.ia2.vospace.ui.data.Job; import it.inaf.ia2.vospace.ui.data.ListNodeData; import it.inaf.ia2.vospace.ui.data.MoveOrCopyRequest; +import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException; import it.inaf.ia2.vospace.ui.exception.VOSpaceException; +import it.inaf.ia2.vospace.ui.exception.VOSpaceStatusException; import it.inaf.ia2.vospace.ui.service.MainNodesHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MoveOrCopyNodeModalHtmlGenerator; import it.inaf.oats.vospace.datamodel.NodeUtils; @@ -72,7 +74,19 @@ public class NodesController extends BaseController { ListNodeData listNodeData = new ListNodeData(); - Node node = client.getNode(path); + Node node; + try { + node = client.getNode(path); + } catch (VOSpaceStatusException ex) { + if (ex.getHttpStatus() == 403) { + String message = "You cannot access this node"; + if (principal.getAccessToken() != null && principal.isTokenExpired()) { + message += ". Token is expired, please repeat the login."; + } + throw new PermissionDeniedException(message); + } + throw ex; + } listNodeData.setWritable(NodeUtils.checkIfWritable(node, principal.getName(), principal.getGroups())); diff --git a/vospace-ui-frontend/src/api/server/index.js b/vospace-ui-frontend/src/api/server/index.js index 4d09ab4fb4181ed5f5f72916537c6bcb82e5ba0f..fb229612b5e0ad96bbe5a2b3299552bd7e270010 100644 --- a/vospace-ui-frontend/src/api/server/index.js +++ b/vospace-ui-frontend/src/api/server/index.js @@ -66,7 +66,7 @@ export default { headers: { 'Cache-Control': 'no-cache' } - }, (typeof loading !== 'undefined') ? loading : true, true); + }, (typeof loading !== 'undefined') ? loading : true, true, true); }, loadJobs() { let url = BASE_API_URL + 'jobs'; diff --git a/vospace-ui-frontend/src/store.js b/vospace-ui-frontend/src/store.js index c2d82b97cc1308a741169d0e629e7f21784c8a7a..ccdf1a331268bab4636c2514410d6ed018fb74e9 100644 --- a/vospace-ui-frontend/src/store.js +++ b/vospace-ui-frontend/src/store.js @@ -145,12 +145,22 @@ export default new Vuex.Store({ }, actions: { setPath({ state, commit, dispatch }, path) { + let previousPath = state.path; commit('setPath', path); commit('setNodesLoading', true); client.getNode(state.path) .then(res => { dispatch('setNodes', res); }) + .catch(error => { + if (error.response && error.response.data) { + main.showError(error.response.data.message); + } else { + main.showError('Error while accessing node'); + } + commit('setPath', previousPath); + commit('setLoading', false); + }) .finally(() => commit('setNodesLoading', false)); }, setNodes({ commit, dispatch }, res) {