From 99e3f05ea59abefaa4eebdf665fb71d21719ca52 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Wed, 25 Jan 2023 17:38:05 +0100 Subject: [PATCH 1/4] add method for retrieving a single field in accesspoint --- pom.xml | 4 +- .../resources/ServiceEndpointResource.java | 55 ++++++++++++++++++- .../informationsystem/icproxy/TestCall.java | 22 +++++++- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 2c73844..9054b78 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,8 @@ ${project.basedir}/src/main/webapp/WEB-INF ${project.basedir}/distro + 1.8 + 1.8 @@ -104,7 +106,7 @@ org.projectlombok lombok - 1.14.8 + 1.18.2 diff --git a/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java b/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java index fb20b48..618d587 100644 --- a/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java +++ b/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java @@ -5,6 +5,7 @@ import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.util.List; +import java.util.Objects; import javax.validation.constraints.NotNull; import javax.ws.rs.GET; @@ -15,10 +16,11 @@ import javax.ws.rs.core.MediaType; import lombok.extern.slf4j.Slf4j; -import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.*; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; +import org.gcube.resources.discovery.client.queries.impl.XQuery; @Slf4j @Path("ServiceEndpoint") @@ -51,6 +53,39 @@ public class ServiceEndpointResource { return endpoints; } + @GET + @Path("/{category}/{name}/{ap}") + @Produces(MediaType.TEXT_XML) + public String retrieve(@NotNull @PathParam("name") String resourceName, + @NotNull @PathParam("category") String resourceCategory, + @NotNull @PathParam("ap") String accessPoint) { + log.info("ServiceEndpoint called with category {}, name {} and accessPoint {} in scope {}",resourceCategory, resourceName, accessPoint, ScopeProvider.instance.get()); +// SimpleQuery query = getQuery(resourceName, resourceCategory); +// query.setResult("$resource/Profile/AccessPoint/Interface/Endpoint[@EntryName='"+accessPoint+"'"); +//// DiscoveryClient client = clientFor(ServiceEndpoint.class); +// DiscoveryClient client = client(); +//// List endpoints = client.submit(query); +// log.debug("retrieved endpoint is "+endpoints); +// if (Objects.nonNull(endpoints)) +// return endpoints.get(0).toString(); +// else +// log.warn("endpoint not found with following coordinates: {} {} and accesspoint: {}", resourceCategory, resourceName,accessPoint); +// return null; + + + XQuery query=queryFor(ServiceEndpoint.class); + query.addCondition(String.format("$resource/Profile/Name/text() eq '%s'",resourceName)); + query.addCondition(String.format("$resource/Profile/Category/text() eq '%s'",resourceCategory)); + query.setResult("$resource/Profile/AccessPoint/Interface/Endpoint[@EntryName='"+accessPoint+"']/text()"); + DiscoveryClient client = client(); + List accessList= client.submit(query); + if (Objects.nonNull(accessList)) + return accessList.get(0).toString(); + else + log.warn("endpoint not found with following coordinates: {} {} and accesspoint: {}", resourceCategory, resourceName,accessPoint); + return null; + } + @GET @Path("/{category}/{name}/Result/{result:([^$\\?]+)}") @Produces(MediaType.TEXT_XML) @@ -90,5 +125,21 @@ public class ServiceEndpointResource { query.addCondition(String.format("$resource/Profile/Category/text() eq '%s'",resourceCategory)); return query; } - + + public static XQuery getSpecificXQuery(T resource) { + XQuery query = null; + if(resource.type().toString().equalsIgnoreCase("RuntimeResource")){ + query = queryFor(ServiceEndpoint.class); + }else if(resource.type().toString().equalsIgnoreCase("GenericResource")){ + query = queryFor(GenericResource.class); + }else if(resource.type().toString().equalsIgnoreCase("RunningInstance")){ + query = queryFor(GCoreEndpoint.class); + }else if(resource.type().toString().equalsIgnoreCase("GHN")){ + query = queryFor(HostingNode.class); + }else{ + throw new RuntimeException("The following resource type is not managed: "+resource); + } + return query; + } + } diff --git a/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java b/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java index bf68e34..71f64bf 100644 --- a/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java +++ b/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java @@ -2,6 +2,8 @@ package org.gcube.informationsystem.icproxy; import javax.ws.rs.core.Application; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; import org.gcube.informationsystem.icproxy.resources.GCoreEndpointResource; import org.gcube.informationsystem.icproxy.resources.GenericResourceResource; import org.gcube.informationsystem.icproxy.resources.HostingNodeResource; @@ -16,6 +18,7 @@ public class TestCall extends JerseyTest{ @Override protected Application configure() { return new ResourceConfig(ICResource.class,GCoreEndpointResource.class, ServiceEndpointResource.class, HostingNodeResource.class, GenericResourceResource.class); + } @Test @@ -34,8 +37,8 @@ public class TestCall extends JerseyTest{ @Test public void gcoreEndpointWithResult() { - - + + final String ret = target("GCoreEndpoint").path("DataAnalysis") .queryParam("result","/Profile/AccessPoint/RunningInstanceInterfaces//Endpoint[@EntryName/string() eq \"querymanager\"]") .queryParam("scope", "/gcube/devsec").request().get(String.class); @@ -44,12 +47,24 @@ public class TestCall extends JerseyTest{ @Test public void serviceEndpoint() { + ScopeProvider.instance.set("/gcube/devsec"); + //SecurityTokenProvider.instance.set("/gcube/devsec"); final String ret = target("ServiceEndpoint").path("BiodiversityRepository").path("CatalogueOfLife").queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } + + + @Test + public void serviceEndpointAP() { + ScopeProvider.instance.set("/gcube/devsec"); + //SecurityTokenProvider.instance.set("/gcube/devsec"); + final String ret = target("ServiceEndpoint").path("Storage").path("StorageManager").path("server1").queryParam("scope", "/gcube/devsec").request().get(String.class); + System.out.println(ret); + } @Test public void hostingNode() { + ScopeProvider.instance.set("/gcube/devsec"); final String ret = target("HostingNode").queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } @@ -62,7 +77,8 @@ public class TestCall extends JerseyTest{ @Test public void getById() { - final String ret = target("/").path("92ee1020-5604-11e3-8182-e7053f61b8fe").queryParam("scope", "/gcube/devsec").request().get(String.class); + ScopeProvider.instance.set("/gcube/devsec"); + final String ret = target("/").path("aab08cf4-ed27-406c-b4a2-89888300976f").queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } -- 2.17.1 From 1b76d204ac6dcf35750e4e3daeaf93e0d226e7b2 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Fri, 27 Jan 2023 15:42:42 +0100 Subject: [PATCH 2/4] add decrypt feature for serviceEndpoints. see #24253 --- CHANGELOG.md | 4 + pom.xml | 6 +- .../resources/ServiceEndpointResource.java | 113 ++++++++++-------- .../informationsystem/icproxy/TestCall.java | 7 +- 4 files changed, 75 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc9a0b7..14ff12d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v1.3.0-SNAPSHOT] - [2023-01-27] + +- Feature #24253 add support for decrypted ServiceEndpoint + ## [v1.2.0] - [2021-06-08] - Feature #21584 added support for /ServiceEndpoint/{category} REST call diff --git a/pom.xml b/pom.xml index 9054b78..961d234 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 4.0.0 org.gcube.information-system icproxy - 1.2.0 + 1.3.0-SNAPSHOT ICProxy war @@ -75,6 +75,10 @@ org.gcube.resources common-gcore-resources + + org.gcube.core + common-encryption + diff --git a/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java b/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java index 618d587..21c2ad5 100644 --- a/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java +++ b/src/main/java/org/gcube/informationsystem/icproxy/resources/ServiceEndpointResource.java @@ -4,23 +4,23 @@ import static org.gcube.resources.discovery.icclient.ICFactory.client; import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import javax.validation.constraints.NotNull; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; +import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import lombok.extern.slf4j.Slf4j; import org.gcube.common.resources.gcore.*; +import org.gcube.common.resources.gcore.utils.Group; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.resources.discovery.client.queries.impl.XQuery; +import org.gcube.common.encryption.StringEncrypter; @Slf4j @Path("ServiceEndpoint") @@ -39,52 +39,60 @@ public class ServiceEndpointResource { return endpoints; } +// @GET +// @Path("/{category}/{name}") +// @Produces(MediaType.APPLICATION_XML) +// public List retrieve(@NotNull @PathParam("name") String resourceName, +// @NotNull @PathParam("category") String resourceCategory) { +// log.info("ServiceEndpoint called with category {} and name {} in scope {}",resourceCategory, resourceName, ScopeProvider.instance.get()); +// +// DiscoveryClient client = clientFor(ServiceEndpoint.class); +// +// List endpoints = client.submit(getQuery(resourceName, resourceCategory)); +// log.debug("retrieved resources are "+endpoints.size()); +// return endpoints; +// } + @GET @Path("/{category}/{name}") @Produces(MediaType.APPLICATION_XML) - public List retrieve(@NotNull @PathParam("name") String resourceName, - @NotNull @PathParam("category") String resourceCategory) { + public List retrieve(@NotNull @PathParam("name") String resourceName, + @NotNull @PathParam("category") String resourceCategory, @QueryParam("decrypt") boolean isDecrypt) { log.info("ServiceEndpoint called with category {} and name {} in scope {}",resourceCategory, resourceName, ScopeProvider.instance.get()); - DiscoveryClient client = clientFor(ServiceEndpoint.class); - List endpoints = client.submit(getQuery(resourceName, resourceCategory)); - log.debug("retrieved resources are "+endpoints.size()); - return endpoints; + if(Objects.nonNull(endpoints)) { + log.debug("retrieved resources are "+endpoints.size()); + if (isDecrypt) { + List ses = new ArrayList<>(endpoints.size()); + for (ServiceEndpoint resource : endpoints) { + ses.add(decryptResource(resource)); + } + return ses; + } + } + return endpoints; } - @GET - @Path("/{category}/{name}/{ap}") - @Produces(MediaType.TEXT_XML) - public String retrieve(@NotNull @PathParam("name") String resourceName, - @NotNull @PathParam("category") String resourceCategory, - @NotNull @PathParam("ap") String accessPoint) { - log.info("ServiceEndpoint called with category {}, name {} and accessPoint {} in scope {}",resourceCategory, resourceName, accessPoint, ScopeProvider.instance.get()); -// SimpleQuery query = getQuery(resourceName, resourceCategory); -// query.setResult("$resource/Profile/AccessPoint/Interface/Endpoint[@EntryName='"+accessPoint+"'"); -//// DiscoveryClient client = clientFor(ServiceEndpoint.class); +// @GET +// @Path("/{category}/{name}/{ap}") +// @Produces(MediaType.TEXT_XML) +// public String retrieve(@NotNull @PathParam("name") String resourceName, +// @NotNull @PathParam("category") String resourceCategory, +// @NotNull @PathParam("ap") String accessPoint) { +// log.info("ServiceEndpoint called with category {}, name {} and accessPoint {} in scope {}",resourceCategory, resourceName, accessPoint, ScopeProvider.instance.get()); +// XQuery query=queryFor(ServiceEndpoint.class); +// query.addCondition(String.format("$resource/Profile/Name/text() eq '%s'",resourceName)); +// query.addCondition(String.format("$resource/Profile/Category/text() eq '%s'",resourceCategory)); +// query.setResult("$resource/Profile/AccessPoint/Interface/Endpoint[@EntryName='"+accessPoint+"']/text()"); // DiscoveryClient client = client(); -//// List endpoints = client.submit(query); -// log.debug("retrieved endpoint is "+endpoints); -// if (Objects.nonNull(endpoints)) -// return endpoints.get(0).toString(); +// List accessList= client.submit(query); +// if (Objects.nonNull(accessList)) +// return accessList.get(0).toString(); // else // log.warn("endpoint not found with following coordinates: {} {} and accesspoint: {}", resourceCategory, resourceName,accessPoint); // return null; - - - XQuery query=queryFor(ServiceEndpoint.class); - query.addCondition(String.format("$resource/Profile/Name/text() eq '%s'",resourceName)); - query.addCondition(String.format("$resource/Profile/Category/text() eq '%s'",resourceCategory)); - query.setResult("$resource/Profile/AccessPoint/Interface/Endpoint[@EntryName='"+accessPoint+"']/text()"); - DiscoveryClient client = client(); - List accessList= client.submit(query); - if (Objects.nonNull(accessList)) - return accessList.get(0).toString(); - else - log.warn("endpoint not found with following coordinates: {} {} and accesspoint: {}", resourceCategory, resourceName,accessPoint); - return null; - } +// } @GET @Path("/{category}/{name}/Result/{result:([^$\\?]+)}") @@ -126,20 +134,23 @@ public class ServiceEndpointResource { return query; } - public static XQuery getSpecificXQuery(T resource) { - XQuery query = null; - if(resource.type().toString().equalsIgnoreCase("RuntimeResource")){ - query = queryFor(ServiceEndpoint.class); - }else if(resource.type().toString().equalsIgnoreCase("GenericResource")){ - query = queryFor(GenericResource.class); - }else if(resource.type().toString().equalsIgnoreCase("RunningInstance")){ - query = queryFor(GCoreEndpoint.class); - }else if(resource.type().toString().equalsIgnoreCase("GHN")){ - query = queryFor(HostingNode.class); - }else{ - throw new RuntimeException("The following resource type is not managed: "+resource); + private ServiceEndpoint decryptResource(ServiceEndpoint resource) { + Group aps=resource.profile().accessPoints(); + for (ServiceEndpoint.AccessPoint ap : aps){ + String decrypted =decryptString(ap.password()); + String user= ap.username(); + + ap.credentials(decrypted, user); + } + return resource; + } + + public static String decryptString(String toDecrypt){ + try{ + return StringEncrypter.getEncrypter().decrypt(toDecrypt); + }catch(Exception e) { + throw new RuntimeException("Unable to decrypt : "+toDecrypt,e); } - return query; } } diff --git a/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java b/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java index 71f64bf..5941760 100644 --- a/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java +++ b/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java @@ -11,6 +11,8 @@ import org.gcube.informationsystem.icproxy.resources.ICResource; import org.gcube.informationsystem.icproxy.resources.ServiceEndpointResource; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; +import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; public class TestCall extends JerseyTest{ @@ -53,12 +55,11 @@ public class TestCall extends JerseyTest{ System.out.println(ret); } - @Test - public void serviceEndpointAP() { + public void serviceEndpointFree() { ScopeProvider.instance.set("/gcube/devsec"); //SecurityTokenProvider.instance.set("/gcube/devsec"); - final String ret = target("ServiceEndpoint").path("Storage").path("StorageManager").path("server1").queryParam("scope", "/gcube/devsec").request().get(String.class); + final String ret = target("ServiceEndpoint").path("Storage").path("StorageManager").queryParam("decrypt", true).queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } -- 2.17.1 From 7aba971bf6bbbaba2375e97647684d6cd10f33b7 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Fri, 27 Jan 2023 16:31:20 +0100 Subject: [PATCH 3/4] fix hostingNode test case --- .../gcube/informationsystem/icproxy/TestCall.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java b/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java index 5941760..c67f1d6 100644 --- a/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java +++ b/src/test/java/org/gcube/informationsystem/icproxy/TestCall.java @@ -2,7 +2,7 @@ package org.gcube.informationsystem.icproxy; import javax.ws.rs.core.Application; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +//import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.informationsystem.icproxy.resources.GCoreEndpointResource; import org.gcube.informationsystem.icproxy.resources.GenericResourceResource; @@ -11,14 +11,13 @@ import org.gcube.informationsystem.icproxy.resources.ICResource; import org.gcube.informationsystem.icproxy.resources.ServiceEndpointResource; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; public class TestCall extends JerseyTest{ @Override protected Application configure() { + ScopeProvider.instance.set("/gcube/devsec"); return new ResourceConfig(ICResource.class,GCoreEndpointResource.class, ServiceEndpointResource.class, HostingNodeResource.class, GenericResourceResource.class); } @@ -39,8 +38,6 @@ public class TestCall extends JerseyTest{ @Test public void gcoreEndpointWithResult() { - - final String ret = target("GCoreEndpoint").path("DataAnalysis") .queryParam("result","/Profile/AccessPoint/RunningInstanceInterfaces//Endpoint[@EntryName/string() eq \"querymanager\"]") .queryParam("scope", "/gcube/devsec").request().get(String.class); @@ -49,23 +46,18 @@ public class TestCall extends JerseyTest{ @Test public void serviceEndpoint() { - ScopeProvider.instance.set("/gcube/devsec"); - //SecurityTokenProvider.instance.set("/gcube/devsec"); final String ret = target("ServiceEndpoint").path("BiodiversityRepository").path("CatalogueOfLife").queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } @Test public void serviceEndpointFree() { - ScopeProvider.instance.set("/gcube/devsec"); - //SecurityTokenProvider.instance.set("/gcube/devsec"); final String ret = target("ServiceEndpoint").path("Storage").path("StorageManager").queryParam("decrypt", true).queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } @Test public void hostingNode() { - ScopeProvider.instance.set("/gcube/devsec"); final String ret = target("HostingNode").queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } @@ -78,7 +70,6 @@ public class TestCall extends JerseyTest{ @Test public void getById() { - ScopeProvider.instance.set("/gcube/devsec"); final String ret = target("/").path("aab08cf4-ed27-406c-b4a2-89888300976f").queryParam("scope", "/gcube/devsec").request().get(String.class); System.out.println(ret); } -- 2.17.1 From 9f54528e1c57afcb3561f6c7ba6fb7bd4f6f78f2 Mon Sep 17 00:00:00 2001 From: Roberto Cirillo Date: Fri, 3 Feb 2023 14:59:16 +0100 Subject: [PATCH 4/4] add keycloak-client dep --- pom.xml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 961d234..e13802a 100644 --- a/pom.xml +++ b/pom.xml @@ -131,8 +131,34 @@ 4.12 test + + + javax.xml.bind + jaxb-api + 2.3.1 + + + org.glassfish.jaxb + jaxb-runtime + 2.3.1 + + + javax.activation + activation + 1.1 + + + com.sun.xml.ws + jaxws-ri + 2.3.2 + pom + + + org.gcube.common + keycloak-client + [1.0.0,2.0.0-SNAPSHOT) + - ${artifactId} -- 2.17.1