From a12ad32a828158ccf98d6e22405d004ed8211eed Mon Sep 17 00:00:00 2001 From: ThanKarab <tkarabatsis@hotmail.com> Date: Mon, 4 May 2020 18:35:19 +0300 Subject: [PATCH 1/6] Refactored experiment-pathologies API. --- .../eu/hbp/mip/controllers/ExperimentApi.java | 46 ++++------ .../hbp/mip/controllers/PathologiesApi.java | 46 +--------- .../java/eu/hbp/mip/model/PathologyDTO.java | 6 ++ .../java/eu/hbp/mip/utils/ClaimUtils.java | 87 ++++++++++++++++++- .../eu/hbp/mip/utils/UserActionLogging.java | 2 +- 5 files changed, 110 insertions(+), 77 deletions(-) diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index 3958d99d6..ce5c81f64 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -115,39 +115,25 @@ public class ExperimentApi { UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", "Running the algorithm..."); if(authenticationIsEnabled) { - // --- Validating proper access rights on the datasets --- - List<String> userClaims = Arrays.asList(authentication.getAuthorities().toString().toLowerCase() - .replaceAll("[\\s+\\]\\[]", "").split(",")); - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "User Claims", userClaims.toString()); - - // Don't check for dataset claims if "super" claim exists allowing everything - if (!userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) { - // Getting the dataset from the experiment parameters - String experimentDatasets = null; - for (AlgorithmExecutionParamDTO parameter : experimentExecutionDTO.getAlgorithms().get(0).getParameters()) { - if (parameter.getName().equals("dataset")) { - experimentDatasets = parameter.getValue(); - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", "Found the dataset parameter!"); - break; - } - } - - if (experimentDatasets == null || experimentDatasets.equals("")) { - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", - "A dataset should be specified when running an algorithm."); - return ResponseEntity.badRequest().body("A dataset should be specified when running an algorithm."); + // Getting the dataset from the experiment parameters + String experimentDatasets = null; + for (ExperimentExecutionDTO.AlgorithmExecutionDTO.AlgorithmExecutionParamDTO parameter : experimentExecutionDTO.getAlgorithms().get(0).getParameters()) { + if (parameter.getName().equals("dataset")) { + experimentDatasets = parameter.getValue(); + UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", "Got the dataset parameter!"); + break; } + } - for (String dataset : experimentDatasets.split(",")) { - String datasetRole = ClaimUtils.getDatasetClaim(dataset); - if (!userClaims.contains(datasetRole.toLowerCase())) { - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", - "You are not allowed to use dataset: " + dataset); - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("You are not allowed to use dataset: " + dataset); - } - } + if (experimentDatasets == null || experimentDatasets.equals("")) { UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", - "User is authorized to use the datasets: " + experimentDatasets); + "A dataset should be specified to run an algorithm."); + return ResponseEntity.badRequest().body("Please provide at least one dataset to run the algorithm."); + } + + // --- Validating proper access rights on the datasets --- + if (!ClaimUtils.userHasDatasetsAuthorization(userInfo.getUser().getUsername(), authentication.getAuthorities(), experimentDatasets)){ + return ResponseEntity.badRequest().body("You are not authorized to use these datasets."); } } diff --git a/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java b/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java index b7914e221..56a6b165a 100644 --- a/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java +++ b/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java @@ -7,7 +7,6 @@ package eu.hbp.mip.controllers; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import eu.hbp.mip.model.PathologyDTO; -import eu.hbp.mip.model.PathologyDTO.PathologyDatasetDTO; import eu.hbp.mip.model.UserInfo; import eu.hbp.mip.utils.ClaimUtils; import eu.hbp.mip.utils.CustomResourceLoader; @@ -26,8 +25,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @@ -68,47 +65,8 @@ public class PathologiesApi { return ResponseEntity.ok().body(gson.toJson(allPathologies)); } - // --- Providing only the allowed pathologies/datasets to the user --- - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), - "Load all the pathologies", "Filter out the unauthorised datasets."); - - List<String> userClaims = Arrays.asList(authentication.getAuthorities().toString().toLowerCase() - .replaceAll("[\\s+\\]\\[]", "").split(",")); - - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), - "Load all the pathologies", "User Claims: " + userClaims); - - // If the "dataset_all" claim exists then return everything - if (userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) { - return ResponseEntity.ok().body(gson.toJson(allPathologies)); - } - - List<PathologyDTO> userPathologies = new ArrayList<>(); - for (PathologyDTO curPathology : allPathologies) { - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), - "Load all the pathologies", "Pathology: " + curPathology); - - List<PathologyDatasetDTO> userPathologyDatasets = new ArrayList<PathologyDatasetDTO>(); - for (PathologyDatasetDTO dataset : curPathology.getDatasets()) { - if (userClaims.contains(ClaimUtils.getDatasetClaim(dataset.getCode()))) { - userPathologyDatasets.add(dataset); - } - } - - if (userPathologyDatasets.size() > 0) { - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Load all the pathologies", - "Added pathology '" + curPathology.getLabel() + " with datasets: '" + userPathologyDatasets + "'"); - - PathologyDTO userPathology = new PathologyDTO(); - userPathology.setCode(curPathology.getCode()); - userPathology.setLabel(curPathology.getLabel()); - userPathology.setMetadataHierarchy(curPathology.getMetadataHierarchy()); - userPathology.setDatasets(userPathologyDatasets); - userPathologies.add(userPathology); - } - } - - return ResponseEntity.ok().body(gson.toJson(userPathologies)); + return ResponseEntity.ok().body(ClaimUtils.getAuthorizedPathologies( + userInfo.getUser().getUsername(), authentication.getAuthorities(), allPathologies)); } // Pure Java diff --git a/src/main/java/eu/hbp/mip/model/PathologyDTO.java b/src/main/java/eu/hbp/mip/model/PathologyDTO.java index e447ba605..cc407e7f2 100644 --- a/src/main/java/eu/hbp/mip/model/PathologyDTO.java +++ b/src/main/java/eu/hbp/mip/model/PathologyDTO.java @@ -72,6 +72,12 @@ public class PathologyDTO { public void setLabel(String label) { this.label = label; } + + public String toString(){ return code;} + } + + public String toString(){ + return code; } } diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java index f9bd98b58..b53d1d900 100644 --- a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java +++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java @@ -1,11 +1,94 @@ package eu.hbp.mip.utils; +import com.google.gson.Gson; +import eu.hbp.mip.model.PathologyDTO; +import org.springframework.security.core.GrantedAuthority; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + + public class ClaimUtils { - public static String allDatasetsAllowedClaim(){ + + private static final Gson gson = new Gson(); + + public static String allDatasetsAllowedClaim() { return "dataset_all"; } - public static String getDatasetClaim(String datasetCode){ + public static String getDatasetClaim(String datasetCode) { return "dataset_" + datasetCode; } + + public static boolean userHasDatasetsAuthorization(String username, Collection<? extends GrantedAuthority> authorities, + String experimentDatasets) { + + List<String> userClaims = Arrays.asList(authorities.toString().toLowerCase() + .replaceAll("[\\s+\\]\\[]", "").split(",")); + UserActionLogging.LogUserAction(username, "User Claims", userClaims.toString()); + + // Don't check for dataset claims if "super" claim exists allowing everything + if (!userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) { + + for (String dataset : experimentDatasets.split(",")) { + String datasetRole = ClaimUtils.getDatasetClaim(dataset); + if (!userClaims.contains(datasetRole.toLowerCase())) { + UserActionLogging.LogUserAction(username, "Run algorithm", + "You are not allowed to use dataset: " + dataset); + return false; + } + } + UserActionLogging.LogUserAction(username, "Run algorithm", + "User is authorized to use the datasets: " + experimentDatasets); + } + return true; + } + + public static String getAuthorizedPathologies(String username, Collection<? extends GrantedAuthority> authorities, + List<PathologyDTO> allPathologies) { + // --- Providing only the allowed pathologies/datasets to the user --- + UserActionLogging.LogUserAction(username, + "Load all the pathologies", "Filter out the unauthorised datasets."); + + List<String> userClaims = Arrays.asList(authorities.toString().toLowerCase() + .replaceAll("[\\s+\\]\\[]", "").split(",")); + + UserActionLogging.LogUserAction(username, + "Load all the pathologies", "User Claims: " + userClaims); + + // If the "dataset_all" claim exists then return everything + if (userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) { + return gson.toJson(allPathologies); + } + + List<PathologyDTO> userPathologies = new ArrayList<>(); + for (PathologyDTO curPathology : allPathologies) { + UserActionLogging.LogUserAction(username, + "Load all the pathologies", "Pathology: " + curPathology.getCode()); + + List<PathologyDTO.PathologyDatasetDTO> userPathologyDatasets = new ArrayList<PathologyDTO.PathologyDatasetDTO>(); + for (PathologyDTO.PathologyDatasetDTO dataset : curPathology.getDatasets()) { + if (userClaims.contains(ClaimUtils.getDatasetClaim(dataset.getCode()))) { + userPathologyDatasets.add(dataset); + } + } + + if (userPathologyDatasets.size() > 0) { + UserActionLogging.LogUserAction(username, "Load all the pathologies", + "Added pathology '" + curPathology.getLabel() + " with datasets: '" + userPathologyDatasets + "'"); + + PathologyDTO userPathology = new PathologyDTO(); + userPathology.setCode(curPathology.getCode()); + userPathology.setLabel(curPathology.getLabel()); + userPathology.setMetadataHierarchy(curPathology.getMetadataHierarchy()); + userPathology.setDatasets(userPathologyDatasets); + userPathologies.add(userPathology); + } + } + + return gson.toJson(userPathologies); + } + } diff --git a/src/main/java/eu/hbp/mip/utils/UserActionLogging.java b/src/main/java/eu/hbp/mip/utils/UserActionLogging.java index a0ec02277..18e27317a 100644 --- a/src/main/java/eu/hbp/mip/utils/UserActionLogging.java +++ b/src/main/java/eu/hbp/mip/utils/UserActionLogging.java @@ -11,7 +11,7 @@ public class UserActionLogging { LOGGER.info(" User : " + userName + " called endpoint: " + actionName - + " info: " + actionInfo); + + ", info: " + actionInfo); } // Usually, used from Threads because threads can't get userName. -- GitLab From ed846218367c72fa809465e092e4a981ac4a6fbc Mon Sep 17 00:00:00 2001 From: ThanKarab <tkarabatsis@hotmail.com> Date: Mon, 4 May 2020 20:59:07 +0300 Subject: [PATCH 2/6] Logs added. --- src/main/java/eu/hbp/mip/utils/ClaimUtils.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java index b53d1d900..243b2c60e 100644 --- a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java +++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java @@ -50,13 +50,13 @@ public class ClaimUtils { List<PathologyDTO> allPathologies) { // --- Providing only the allowed pathologies/datasets to the user --- UserActionLogging.LogUserAction(username, - "Load all the pathologies", "Filter out the unauthorised datasets."); + "Load pathologies", "Filter out the unauthorised datasets."); List<String> userClaims = Arrays.asList(authorities.toString().toLowerCase() .replaceAll("[\\s+\\]\\[]", "").split(",")); UserActionLogging.LogUserAction(username, - "Load all the pathologies", "User Claims: " + userClaims); + "Load pathologies", "User Claims: " + userClaims); // If the "dataset_all" claim exists then return everything if (userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) { @@ -66,18 +66,26 @@ public class ClaimUtils { List<PathologyDTO> userPathologies = new ArrayList<>(); for (PathologyDTO curPathology : allPathologies) { UserActionLogging.LogUserAction(username, - "Load all the pathologies", "Pathology: " + curPathology.getCode()); + "Load pathologies", "Pathology: " + curPathology.getCode()); List<PathologyDTO.PathologyDatasetDTO> userPathologyDatasets = new ArrayList<PathologyDTO.PathologyDatasetDTO>(); for (PathologyDTO.PathologyDatasetDTO dataset : curPathology.getDatasets()) { if (userClaims.contains(ClaimUtils.getDatasetClaim(dataset.getCode()))) { + UserActionLogging.LogUserAction(username, "Load pathologies", + "Added dataset: " + dataset.getCode()); userPathologyDatasets.add(dataset); + }else{ + UserActionLogging.LogUserAction(username, "Load pathologies", + "Dataset not added: '" + dataset.getCode()); + UserActionLogging.LogUserAction(username, "Load pathologies", + "Claim did not exist: '" + ClaimUtils.getDatasetClaim(dataset.getCode())); } } if (userPathologyDatasets.size() > 0) { - UserActionLogging.LogUserAction(username, "Load all the pathologies", - "Added pathology '" + curPathology.getLabel() + " with datasets: '" + userPathologyDatasets + "'"); + UserActionLogging.LogUserAction(username, "Load pathologies", + "Added pathology '" + curPathology.getLabel() + + " with datasets: '" + userPathologyDatasets + "'"); PathologyDTO userPathology = new PathologyDTO(); userPathology.setCode(curPathology.getCode()); -- GitLab From 1b8a9785d3e593f7e799c2b9d84b4ecd9ba8d0c1 Mon Sep 17 00:00:00 2001 From: ThanKarab <tkarabatsis@hotmail.com> Date: Mon, 4 May 2020 21:46:58 +0300 Subject: [PATCH 3/6] Log fixes. --- src/main/java/eu/hbp/mip/utils/ClaimUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java index 243b2c60e..72565800e 100644 --- a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java +++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java @@ -66,7 +66,7 @@ public class ClaimUtils { List<PathologyDTO> userPathologies = new ArrayList<>(); for (PathologyDTO curPathology : allPathologies) { UserActionLogging.LogUserAction(username, - "Load pathologies", "Pathology: " + curPathology.getCode()); + "Load pathologies", "Checking pathology: " + curPathology.getCode()); List<PathologyDTO.PathologyDatasetDTO> userPathologyDatasets = new ArrayList<PathologyDTO.PathologyDatasetDTO>(); for (PathologyDTO.PathologyDatasetDTO dataset : curPathology.getDatasets()) { @@ -85,7 +85,7 @@ public class ClaimUtils { if (userPathologyDatasets.size() > 0) { UserActionLogging.LogUserAction(username, "Load pathologies", "Added pathology '" + curPathology.getLabel() - + " with datasets: '" + userPathologyDatasets + "'"); + + "' with datasets: '" + userPathologyDatasets + "'"); PathologyDTO userPathology = new PathologyDTO(); userPathology.setCode(curPathology.getCode()); -- GitLab From 0784864709782119063900708c13fe14e10e05a2 Mon Sep 17 00:00:00 2001 From: ThanKarab <tkarabatsis@hotmail.com> Date: Mon, 4 May 2020 22:30:46 +0300 Subject: [PATCH 4/6] Log fixes. --- src/main/java/eu/hbp/mip/controllers/PathologiesApi.java | 2 +- src/main/java/eu/hbp/mip/utils/ClaimUtils.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java b/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java index 56a6b165a..f4eb2a7d6 100644 --- a/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java +++ b/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java @@ -48,7 +48,7 @@ public class PathologiesApi { @RequestMapping(name = "/pathologies", method = RequestMethod.GET) public ResponseEntity<String> getPathologies(Authentication authentication) { - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Load all the pathologies", ""); + UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Load pathologies", "Running ..."); // Load pathologies from file Resource resource = resourceLoader.getResource("file:/opt/portal/api/pathologies.json"); diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java index 72565800e..a169fff57 100644 --- a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java +++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java @@ -76,9 +76,9 @@ public class ClaimUtils { userPathologyDatasets.add(dataset); }else{ UserActionLogging.LogUserAction(username, "Load pathologies", - "Dataset not added: '" + dataset.getCode()); + "Dataset not added: " + dataset.getCode()); UserActionLogging.LogUserAction(username, "Load pathologies", - "Claim did not exist: '" + ClaimUtils.getDatasetClaim(dataset.getCode())); + "Claim did not exist: " + ClaimUtils.getDatasetClaim(dataset.getCode())); } } -- GitLab From 8db5f0edf215f656fc2cb7d8f3c73c84ba15f492 Mon Sep 17 00:00:00 2001 From: ThanKarab <tkarabatsis@hotmail.com> Date: Tue, 5 May 2020 10:21:11 +0300 Subject: [PATCH 5/6] Lower Casing the dataset when getting the role. --- src/main/java/eu/hbp/mip/utils/ClaimUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java index a169fff57..0972bc0a0 100644 --- a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java +++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java @@ -19,7 +19,7 @@ public class ClaimUtils { } public static String getDatasetClaim(String datasetCode) { - return "dataset_" + datasetCode; + return "dataset_" + datasetCode.toLowerCase(); } public static boolean userHasDatasetsAuthorization(String username, Collection<? extends GrantedAuthority> authorities, -- GitLab From 6ecab71440e3f81ae7105a25cc741af5cfaf0e1b Mon Sep 17 00:00:00 2001 From: ThanKarab <tkarabatsis@hotmail.com> Date: Tue, 5 May 2020 10:22:23 +0300 Subject: [PATCH 6/6] Removed unecessary logs. --- src/main/java/eu/hbp/mip/utils/ClaimUtils.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java index 0972bc0a0..eeceb5d21 100644 --- a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java +++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java @@ -65,20 +65,12 @@ public class ClaimUtils { List<PathologyDTO> userPathologies = new ArrayList<>(); for (PathologyDTO curPathology : allPathologies) { - UserActionLogging.LogUserAction(username, - "Load pathologies", "Checking pathology: " + curPathology.getCode()); - List<PathologyDTO.PathologyDatasetDTO> userPathologyDatasets = new ArrayList<PathologyDTO.PathologyDatasetDTO>(); for (PathologyDTO.PathologyDatasetDTO dataset : curPathology.getDatasets()) { if (userClaims.contains(ClaimUtils.getDatasetClaim(dataset.getCode()))) { UserActionLogging.LogUserAction(username, "Load pathologies", "Added dataset: " + dataset.getCode()); userPathologyDatasets.add(dataset); - }else{ - UserActionLogging.LogUserAction(username, "Load pathologies", - "Dataset not added: " + dataset.getCode()); - UserActionLogging.LogUserAction(username, "Load pathologies", - "Claim did not exist: " + ClaimUtils.getDatasetClaim(dataset.getCode())); } } -- GitLab