From 9e244f147831824e43d71dcbe488a2833132d640 Mon Sep 17 00:00:00 2001 From: Nicola Fulvio Calabria <nicola.calabria@inaf.it> Date: Fri, 8 Oct 2021 21:50:49 +0200 Subject: [PATCH] Allowed external http and https targets for LinkNodes --- .../inaf/oats/vospace/BaseNodeController.java | 27 +++++++++++++------ .../oats/vospace/CreateNodeController.java | 2 +- .../inaf/oats/vospace/SetNodeController.java | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/it/inaf/oats/vospace/BaseNodeController.java b/src/main/java/it/inaf/oats/vospace/BaseNodeController.java index 81e2a8b..f180591 100644 --- a/src/main/java/it/inaf/oats/vospace/BaseNodeController.java +++ b/src/main/java/it/inaf/oats/vospace/BaseNodeController.java @@ -19,11 +19,11 @@ public abstract class BaseNodeController { @Autowired private HttpServletRequest servletRequest; - + @Value("${vospace-authority}") protected String authority; - - protected String getPath() { + + protected String getPath() { String requestURL = servletRequest.getRequestURL().toString(); try { return NodeUtils.getPathFromRequestURLString(requestURL); @@ -35,7 +35,7 @@ public abstract class BaseNodeController { protected String getParentPath(String path) { return NodeUtils.getParentPath(path); } - + protected void validateAndCheckPayloadURIConsistence(Node node) { // Get Node path (and validates it too) String decodedURIPathFromNode = URIUtils.returnVosPathFromNodeURI(node.getUri(), this.authority); @@ -45,16 +45,27 @@ public abstract class BaseNodeController { if (!decodedURIPathFromNode.equals(this.getPath())) { throw new InvalidURIException(decodedURIPathFromNode, requestPath); } - + } - - protected void validateInternalLinkNode(LinkNode linkNode) { + + protected void validateLinkNode(LinkNode linkNode) { String target = linkNode.getTarget(); // I validate it here to add context easily if (target == null) { throw new InvalidArgumentException("LinkNode in payload has no target element specified"); } - URIUtils.returnVosPathFromNodeURI(linkNode.getTarget(), authority); + if (URIUtils.isURIInternal(target)) { + URIUtils.returnVosPathFromNodeURI(linkNode.getTarget(), authority); + } else { + // Let's discuss if we need to combine this validation with + // protocol endpoints management (URIService, ProtocolType) + // Let's start with http and https only for now + if (!(target.toLowerCase().startsWith("http://") + || target.toLowerCase().startsWith("https://"))) { + throw new InvalidArgumentException("LinkNode target malformed or unsupported protocol: " + target); + } + + } } } diff --git a/src/main/java/it/inaf/oats/vospace/CreateNodeController.java b/src/main/java/it/inaf/oats/vospace/CreateNodeController.java index 7a6e047..4fa613f 100644 --- a/src/main/java/it/inaf/oats/vospace/CreateNodeController.java +++ b/src/main/java/it/inaf/oats/vospace/CreateNodeController.java @@ -44,7 +44,7 @@ public class CreateNodeController extends BaseNodeController { private void validateInputNode(Node node) { if (node instanceof LinkNode) { - this.validateInternalLinkNode((LinkNode) node); + this.validateLinkNode((LinkNode) node); } } diff --git a/src/main/java/it/inaf/oats/vospace/SetNodeController.java b/src/main/java/it/inaf/oats/vospace/SetNodeController.java index 7659ab9..aa712ec 100644 --- a/src/main/java/it/inaf/oats/vospace/SetNodeController.java +++ b/src/main/java/it/inaf/oats/vospace/SetNodeController.java @@ -73,7 +73,7 @@ public class SetNodeController extends BaseNodeController { if (node instanceof DataNode) { checkViews((DataNode) node, (DataNode) toBeModifiedNode); } else if(node instanceof LinkNode) { - this.validateInternalLinkNode((LinkNode) node); + this.validateLinkNode((LinkNode) node); } //The service SHOULD throw a HTTP 500 status code including an InternalFault fault -- GitLab