From 1ac76814136b5c2a5eed726fcba799d9b2c552f1 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Wed, 10 Nov 2021 18:23:43 +0100
Subject: [PATCH] Improved error message when attempting to open forbidden node

---
 .../vospace/ui/controller/NodesController.java   | 16 +++++++++++++++-
 vospace-ui-frontend/src/api/server/index.js      |  2 +-
 vospace-ui-frontend/src/store.js                 | 10 ++++++++++
 3 files changed, 26 insertions(+), 2 deletions(-)

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 2dbb673..abcb6dd 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 4d09ab4..fb22961 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 c2d82b9..ccdf1a3 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) {
-- 
GitLab