From 839a4e8403a48e4e3fe85f0f5ecd9addb0d04c57 Mon Sep 17 00:00:00 2001 From: "lucio.lelii" Date: Fri, 27 Nov 2015 17:06:23 +0000 Subject: [PATCH] git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/Common/authorization-common-library@120459 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 5 ++ .../library/AuthorizationEntry.java | 17 +++- .../enpoints/AuthorizationEndpoint.java | 89 +++++++++++++++++++ .../AuthorizationEndpointScanner.java | 59 ++++++++++++ src/main/resources/authorization-endpoint.xml | 1 + .../library/binder/EndpointBinder.java | 64 +++++++++++++ 6 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpoint.java create mode 100644 src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpointScanner.java create mode 100644 src/main/resources/authorization-endpoint.xml create mode 100644 src/test/java/org/gcube/common/authorization/library/binder/EndpointBinder.java diff --git a/pom.xml b/pom.xml index f1f7731..201f94e 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,11 @@ common-scope [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + org.gcube.core + common-configuration-scanner + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + junit junit diff --git a/src/main/java/org/gcube/common/authorization/library/AuthorizationEntry.java b/src/main/java/org/gcube/common/authorization/library/AuthorizationEntry.java index 6171f07..0224c0e 100644 --- a/src/main/java/org/gcube/common/authorization/library/AuthorizationEntry.java +++ b/src/main/java/org/gcube/common/authorization/library/AuthorizationEntry.java @@ -7,6 +7,8 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import org.gcube.common.scope.api.ServiceMap; + @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class AuthorizationEntry { @@ -14,6 +16,7 @@ public class AuthorizationEntry { private String clientId; private List roles; private String context; + private ServiceMap map; private List bannedServices = new ArrayList(); protected AuthorizationEntry(){} @@ -25,8 +28,8 @@ public class AuthorizationEntry { this.context = context; } - public AuthorizationEntry(String userName, List roles, String scope, List bannedServices) { - this(userName, roles, scope); + public AuthorizationEntry(String userName, List roles, String context , List bannedServices) { + this(userName, roles, context); this.bannedServices = bannedServices; } @@ -41,7 +44,17 @@ public class AuthorizationEntry { public String getContext() { return context; } + + public ServiceMap getMap() { + return map; + } + + + public void setMap(ServiceMap map) { + this.map = map; + } + public List getBannedServices() { return bannedServices; } diff --git a/src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpoint.java b/src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpoint.java new file mode 100644 index 0000000..0a0509e --- /dev/null +++ b/src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpoint.java @@ -0,0 +1,89 @@ +package org.gcube.common.authorization.library.enpoints; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name="auhtorization-endpoint") +@XmlAccessorType(XmlAccessType.FIELD) +public final class AuthorizationEndpoint implements Comparable{ + + @XmlAttribute + private int priority = 0; + + @XmlElement + private String host; + + @XmlElement + private int port; + + protected AuthorizationEndpoint() {} + + public AuthorizationEndpoint(int priority, String host, int port) { + super(); + this.host = host; + this.priority = priority; + this.port = port; + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public void setHost(String host) { + this.host = host; + } + + public void setPort(int port) { + this.port = port; + } + + @Override + public int compareTo(AuthorizationEndpoint o) { + return this.priority-o.priority; + } + + @Override + public String toString() { + return "AuthorizationEndpoint [priority=" + priority + ", host=" + host + + ", port=" + port + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((host == null) ? 0 : host.hashCode()); + result = prime * result + port; + result = prime * result + priority; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AuthorizationEndpoint other = (AuthorizationEndpoint) obj; + if (host == null) { + if (other.host != null) + return false; + } else if (!host.equals(other.host)) + return false; + if (port != other.port) + return false; + if (priority != other.priority) + return false; + return true; + } + +} diff --git a/src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpointScanner.java b/src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpointScanner.java new file mode 100644 index 0000000..da14876 --- /dev/null +++ b/src/main/java/org/gcube/common/authorization/library/enpoints/AuthorizationEndpointScanner.java @@ -0,0 +1,59 @@ +package org.gcube.common.authorization.library.enpoints; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; + +import org.gcube.common.scan.ClasspathScanner; +import org.gcube.common.scan.ClasspathScannerFactory; +import org.gcube.common.scan.matchers.NameMatcher; +import org.gcube.common.scan.resources.ClasspathResource; +import org.gcube.common.scope.api.ServiceMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AuthorizationEndpointScanner { + + private static Logger log = LoggerFactory.getLogger(AuthorizationEndpointScanner.class); + + private static List endpoints; + + /** + * The path used to find service map configuration files. + */ + static final String configurationPattern = "authorization-endpoint.xml"; + + /** + * Scans the classpath for {@link ServiceMap}s. + */ + public static synchronized List endpoints() { + + if (endpoints==null || endpoints.size()==0){ + endpoints = new ArrayList(); + + try { + + JAXBContext context = JAXBContext.newInstance(AuthorizationEndpoint.class); + Unmarshaller um = context.createUnmarshaller(); + + ClasspathScanner scanner = ClasspathScannerFactory.scanner(); + for (ClasspathResource r : scanner.scan(new NameMatcher(configurationPattern))){ + AuthorizationEndpoint endpoint = (AuthorizationEndpoint)um.unmarshal(r.stream()); + endpoints.add(endpoint); + log.info("loaded endpoint {} ",endpoint.toString()); + } + if (endpoints.size()==0) + throw new Exception("no endpoints retreived"); + + } catch (Exception e) { + throw new RuntimeException("could not load authorization endpoints", e); + } + Collections.sort(endpoints); + } + return endpoints; + } + +} diff --git a/src/main/resources/authorization-endpoint.xml b/src/main/resources/authorization-endpoint.xml new file mode 100644 index 0000000..1421f9d --- /dev/null +++ b/src/main/resources/authorization-endpoint.xml @@ -0,0 +1 @@ +146.48.85.1798080 \ No newline at end of file diff --git a/src/test/java/org/gcube/common/authorization/library/binder/EndpointBinder.java b/src/test/java/org/gcube/common/authorization/library/binder/EndpointBinder.java new file mode 100644 index 0000000..82d9901 --- /dev/null +++ b/src/test/java/org/gcube/common/authorization/library/binder/EndpointBinder.java @@ -0,0 +1,64 @@ +package org.gcube.common.authorization.library.binder; + +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +import org.gcube.common.authorization.library.enpoints.AuthorizationEndpoint; +import org.gcube.common.authorization.library.enpoints.AuthorizationEndpointScanner; +import org.junit.Assert; +import org.junit.Test; + +public class EndpointBinder { + + + + public static JAXBContext getContext() throws JAXBException{ + return JAXBContext.newInstance(AuthorizationEndpoint.class); + } + + @Test + public void bind() throws Exception{ + JAXBContext context = getContext(); + StringWriter sw = new StringWriter(); + AuthorizationEndpoint ae1 = new AuthorizationEndpoint(2, "146.48.85.179", 8080); + context.createMarshaller().marshal(ae1, sw); + AuthorizationEndpoint ae2 = (AuthorizationEndpoint)context.createUnmarshaller().unmarshal(new StringReader(sw.toString())); + Assert.assertEquals(ae1, ae2); + } + + @Test + public void compare(){ + AuthorizationEndpoint ae1 = new AuthorizationEndpoint(2, "146.48.85.179", 8080); + AuthorizationEndpoint ae2 = new AuthorizationEndpoint(1, "146.48.85.179", 8080); + + Assert.assertTrue(ae1.compareTo(ae2)>0); + } + + @Test + public void order(){ + AuthorizationEndpoint ae1 = new AuthorizationEndpoint(2, "146.48.85.179", 8080); + AuthorizationEndpoint ae2 = new AuthorizationEndpoint(1, "146.48.85.179", 8080); + AuthorizationEndpoint ae3 = new AuthorizationEndpoint(3, "146.48.85.179", 8080); + + AuthorizationEndpoint[] arr1 = new AuthorizationEndpoint[]{ae1, ae2, ae3}; + + Arrays.sort(arr1); + + AuthorizationEndpoint[] arr2 = new AuthorizationEndpoint[]{ae2, ae1, ae3}; + + Assert.assertArrayEquals(arr1, arr2); + + } + + @Test + public void scan(){ + List endpoints = AuthorizationEndpointScanner.endpoints(); + System.out.println(endpoints); + } + +}