From 8f3287a6f6bcdf0c6c2a1ba6a4c57bad28c23a52 Mon Sep 17 00:00:00 2001 From: "lucio.lelii" Date: Mon, 14 Nov 2016 16:39:00 +0000 Subject: [PATCH] git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/Common/authorization-common-client@134131 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/proxy/AuthorizationProxy.java | 6 + .../proxy/DefaultAuthorizationProxy.java | 80 ++++++++- .../authorizationservice/cl/CallTest.java | 157 +++++++++++++++++- .../authorizationservice/cl/StressTest.java | 48 ++++++ src/test/resources/Scopes.txt | 8 + 5 files changed, 286 insertions(+), 13 deletions(-) create mode 100644 src/test/java/org/gcube/common/authorizationservice/cl/StressTest.java create mode 100644 src/test/resources/Scopes.txt diff --git a/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java b/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java index 8213aa5..235e773 100644 --- a/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java +++ b/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java @@ -41,5 +41,11 @@ public interface AuthorizationProxy { Map retrieveApiKeys() throws Exception; File getSymmKey(String filePath) throws Exception; + + String resolveTokenByUserAndContext(String user, String context) + throws Exception; + + String generateExternalServiceToken(String serviceId) + throws Exception; } diff --git a/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java b/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java index a7cd368..c869a90 100644 --- a/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java +++ b/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.net.ssl.HttpsURLConnection; @@ -90,6 +91,64 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy { return Utils.addInfrastructureHashToToken(token, infrastructureHash); } + @Override + public String generateExternalServiceToken(String serviceId) throws Exception { + + String methodPath = "/token/external/"; + + int infrastructureHash = Utils.getInfrastructureHashFromToken(SecurityTokenProvider.instance.get(), endpoints.getDefaultInfrastructure()); + + StringBuilder callUrl = new StringBuilder(getInternalEnpoint(infrastructureHash)).append(methodPath).append(serviceId); + + URL url = new URL(callUrl.toString()); + HttpURLConnection connection = makeRequest(url, "PUT", true); + connection.setDoInput(true); + connection.setRequestProperty("Content-type", "application/xml"); + + log.debug("response code for "+callUrl.toString()+" is "+connection.getResponseCode()+" "+connection.getResponseMessage()); + + if (connection.getResponseCode()!=200) throw new Exception("error contacting authorization service"); + String token= ""; + try(BufferedReader reader = new BufferedReader(new InputStreamReader((InputStream)connection.getContent()))){ + StringBuilder result = new StringBuilder(); + String line; + while((line = reader.readLine()) != null) + result.append(line); + token = result.toString(); + } + + return Utils.addInfrastructureHashToToken(token, infrastructureHash); + } + + @Override + public String resolveTokenByUserAndContext(String user, String context) throws Exception { + + String methodPath = "/token/"; + + int infrastructureHash = Utils.getInfrastructureHashfromContext(context); + + StringBuilder callUrl = new StringBuilder(getInternalEnpoint(infrastructureHash)).append(methodPath).append(user).append("?context=").append(context); + + URL url = new URL(callUrl.toString()); + HttpURLConnection connection = makeRequest(url, "GET", false); + + log.debug("response code for "+callUrl.toString()+" is "+connection.getResponseCode()+" "+connection.getResponseMessage()); + + if (connection.getResponseCode()==404) throw new ObjectNotFound("token not found"); + if (connection.getResponseCode()!=200) throw new Exception("error contacting authorization service (error code is "+connection.getResponseCode()+")"); + if (connection.getContentLengthLong()==0) return null; + String token= ""; + try(BufferedReader reader = new BufferedReader(new InputStreamReader((InputStream)connection.getContent()))){ + StringBuilder result = new StringBuilder(); + String line; + while((line = reader.readLine()) != null) + result.append(line); + token = result.toString(); + } + + return Utils.addInfrastructureHashToToken(token, infrastructureHash); + } + @Override public String generateUserToken(UserInfo client, String context) throws Exception { @@ -179,10 +238,19 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy { if (connection.getResponseCode()!=200) throw new Exception("error retrieving keys (error code is "+connection.getResponseCode()+")"); if (connection.getContentLengthLong()<=0) return Collections.emptyMap(); + Map tokensQulifiersMap; try(InputStream stream = (InputStream)connection.getContent();){ QualifiersList entries = (QualifiersList)Binder.getContext().createUnmarshaller().unmarshal(stream); - return entries.getQualifiers(); + tokensQulifiersMap = entries.getQualifiers(); } + + if (tokensQulifiersMap!=null && !tokensQulifiersMap.isEmpty()){ + Map toReturnMap = new HashMap(); + for (Entry entry: tokensQulifiersMap.entrySet()) + toReturnMap.put(entry.getKey(), Utils.addInfrastructureHashToToken(entry.getValue(), infrastructureHash)); + return toReturnMap; + } else return Collections.emptyMap(); + } @@ -281,7 +349,7 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy { if (connection.getResponseCode()==404) throw new ObjectNotFound("token "+maskedToken+" not found"); if (connection.getResponseCode()!=200) throw new Exception("error contacting authorization service (error code is "+connection.getResponseCode()+")"); - if (connection.getContentLengthLong()<=0) return null; + if (connection.getContentLengthLong()==0) return null; try(InputStream stream = (InputStream)connection.getContent();){ AuthorizationEntry entry = (AuthorizationEntry)Binder.getContext().createUnmarshaller().unmarshal(stream); @@ -333,8 +401,12 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy { URL url = new URL(callUrl.toString()); HttpURLConnection connection = makeRequest(url, "GET", true); connection.setDoInput(true); - if (connection.getResponseCode()!=200) throw new Exception("error retrieving policies"); - if (connection.getContentLengthLong()<=0) return Collections.emptyList(); + if (connection.getResponseCode()!=200){ + log.info("response code is not 200"); + throw new Exception("error retrieving policies"); + } + if (connection.getContentLengthLong()==0) + return Collections.emptyList(); try(InputStreamReader stream = new InputStreamReader((InputStream)connection.getContent())){ Policies policies = (Policies)Binder.getContext().createUnmarshaller().unmarshal(stream); diff --git a/src/test/java/org/gcube/common/authorizationservice/cl/CallTest.java b/src/test/java/org/gcube/common/authorizationservice/cl/CallTest.java index 29ce00f..5fd2039 100644 --- a/src/test/java/org/gcube/common/authorizationservice/cl/CallTest.java +++ b/src/test/java/org/gcube/common/authorizationservice/cl/CallTest.java @@ -2,10 +2,18 @@ package org.gcube.common.authorizationservice.cl; import static org.gcube.common.authorization.client.Constants.authorizationService; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import org.gcube.common.authorization.client.proxy.AuthorizationProxy; import org.gcube.common.authorization.library.AuthorizationEntry; import org.gcube.common.authorization.library.policies.Action; import org.gcube.common.authorization.library.policies.Policy; @@ -15,12 +23,14 @@ import org.gcube.common.authorization.library.policies.Users; import org.gcube.common.authorization.library.provider.ContainerInfo; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.UserInfo; +import org.junit.Ignore; import org.junit.Test; public class CallTest { @Test public void resolveNodeToken() throws Exception{ - System.out.println(resolveToken("a7caa51b-6979-4b1d-abc6-449365b8350a-98187548")); //81caac0f-8a0d-4923-9312-7ff0eb3f2d5e|98187548")); + System.out.println(resolveToken("80048c62-26e0-4df3-a5ec-f893aee07243-843339462")); //81caac0f-8a0d-4923-9312-7ff0eb3f2d5e|98187548")); + } @Test @@ -38,9 +48,10 @@ public class CallTest { @Test public void getPolicies() throws Exception{ - SecurityTokenProvider.instance.set(requestTestToken("/gcube/devNext/NextNext")); - List policies = authorizationService().getPolicies("/gcube/devsec/devVRE"); - System.out.println(policies); + SecurityTokenProvider.instance.set(requestTestToken("/gcube/devNext")); + List policies = authorizationService().getPolicies("/gcube/devsec"); + for (Policy policy: policies) + System.out.println(policy); } @Test @@ -50,13 +61,13 @@ public class CallTest { @Test public void requestToken() throws Exception{ - System.out.println(authorizationService().generateUserToken(new UserInfo("andrea.dellamico", new ArrayList()), "/gcube")); + System.out.println(authorizationService().generateUserToken(new UserInfo("test.gcube", new ArrayList()), "/gcube/devsec")); } @Test(expected=RuntimeException.class) public void createKeyWithError() throws Exception { authorizationService().generateApiKey("TEST"); } - + @Test public void getSymmKey() throws Exception{ SecurityTokenProvider.instance.set(_requestNodeToken()); @@ -83,8 +94,8 @@ public class CallTest { } public String _requestNodeToken() throws Exception { - SecurityTokenProvider.instance.set(requestTestToken("/gcube")); - String token = authorizationService().requestActivation(new ContainerInfo("dlib29.isti.cnr.it",8080), "/gcube/devsec"); + SecurityTokenProvider.instance.set(requestTestToken("/d4science.research-infrastructures.eu")); + String token = authorizationService().requestActivation(new ContainerInfo("node65.d4science.org",80), "/d4science.research-infrastructures.eu"); return token; } @@ -94,11 +105,139 @@ public class CallTest { } private String requestTestToken(String context) throws Exception{ - return authorizationService().generateUserToken(new UserInfo("test.token", new ArrayList()), context); + return authorizationService().generateUserToken(new UserInfo("lucio.lelii", new ArrayList()), context); } private AuthorizationEntry resolveToken(String token) throws Exception{ AuthorizationEntry entry = authorizationService().get(token); return entry; } + + /* List scopes = Arrays.asList("/d4science.research-infrastructures.eu/gCubeApps/TabularDataLab", +"/d4science.research-infrastructures.eu/FARM/AquaMaps", +"/d4science.research-infrastructures.eu/FARM/WECAFC-FIRMS", +"/d4science.research-infrastructures.eu/gCubeApps/PGFA-UFMT", +"/d4science.research-infrastructures.eu/FARM", +"/d4science.research-infrastructures.eu/gCubeApps/EcologicalModelling", +"/d4science.research-infrastructures.eu/gCubeApps/EuBrazilOpenBio", +"/d4science.research-infrastructures.eu/gCubeApps/AlieiaVRE", + /d4science.research-infrastructures.eu/gCubeApps/ENVRIPlus", + /d4science.research-infrastructures.eu/gCubeApps/ENVRI", + /d4science.research-infrastructures.eu/gCubeApps/ICES_DASC", + /d4science.research-infrastructures.eu/gCubeApps/FAO_TunaAtlas", + /d4science.research-infrastructures.eu/SoBigData/ResourceCatalogue", + /d4science.research-infrastructures.eu/gCubeApps/StocksAndFisheriesKB", + /d4science.research-infrastructures.eu/SoBigData/TagMe", + /d4science.research-infrastructures.eu/gCubeApps/BlueCommons", + /d4science.research-infrastructures.eu/gCubeApps/ICES_TCSSM", + /d4science.research-infrastructures.eu/gCubeApps/OpenIt", + /d4science.research-infrastructures.eu/SmartArea/SmartApps", + /d4science.research-infrastructures.eu", + /d4science.research-infrastructures.eu/gCubeApps/Parthenos", + /d4science.research-infrastructures.eu/gCubeApps/AquacultureAtlasGeneration", + /d4science.research-infrastructures.eu/gCubeApps/IGDI", + /d4science.research-infrastructures.eu/gCubeApps/RStudioLab", + /d4science.research-infrastructures.eu/SoBigData", + /d4science.research-infrastructures.eu/gCubeApps/BlueBridgeProject", + /d4science.research-infrastructures.eu/gCubeApps/rScience", + /d4science.research-infrastructures.eu/FARM/VME-DB", + /d4science.research-infrastructures.eu/gCubeApps/EllinikaPsariaVRE", + /d4science.research-infrastructures.eu/gCubeApps/gCube", + /d4science.research-infrastructures.eu/FARM/TBTI_VRE", + /d4science.research-infrastructures.eu/FARM/GRSF", + /d4science.research-infrastructures.eu/gCubeApps/DocumentsWorkflow", + /d4science.research-infrastructures.eu/gCubeApps/ICOS_ETC", + /d4science.research-infrastructures.eu/SoBigData/CityOfCitizens", + /d4science.research-infrastructures.eu/gCubeApps/SoBigData.eu", + /d4science.research-infrastructures.eu/gCubeApps/BiOnym", + /d4science.research-infrastructures.eu/gCubeApps/PerformanceEvaluationInAquaculture", + /d4science.research-infrastructures.eu/gCubeApps/SmartArea", + /d4science.research-infrastructures.eu/gCubeApps/ICES_TCRE", + /d4science.research-infrastructures.eu/gCubeApps/CNR_OpenScienceTF", + /d4science.research-infrastructures.eu/gCubeApps/BlueBRIDGE-PSC", + /d4science.research-infrastructures.eu/gCubeApps/BOBLME_HilsaAWG", + /d4science.research-infrastructures.eu/gCubeApps/ScalableDataMining", + /d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab", + /d4science.research-infrastructures.eu/gCubeApps/DESCRAMBLE", + /d4science.research-infrastructures.eu/gCubeApps/ICES_FIACO", + /d4science.research-infrastructures.eu/gCubeApps/BlueBRIDGE-EAB", + /d4science.research-infrastructures.eu/gCubeApps/ARIADNE", + /d4science.research-infrastructures.eu/SmartArea/SmartBuilding", + /d4science.research-infrastructures.eu/gCubeApps/ProtectedAreaImpactMaps", + /d4science.research-infrastructures.eu/gCubeApps/ForkysVRE", + /d4science.research-infrastructures.eu/gCubeApps/EGIEngage", + /d4science.research-infrastructures.eu/gCubeApps/ICES_StockAssessmentAdvanced", + /d4science.research-infrastructures.eu/FARM/GRSF", + /d4science.research-infrastructures.eu/SmartArea", + /d4science.research-infrastructures.eu/gCubeApps/RPrototypingLab", + /d4science.research-infrastructures.eu/gCubeApps/TCom", + /d4science.research-infrastructures.eu/gCubeApps/ICCAT_BFT-E", + /d4science.research-infrastructures.eu/gCubeApps/ICES_DALSA", + /d4science.research-infrastructures.eu/gCubeApps/SoBigData.it", + /d4science.research-infrastructures.eu/gCubeApps/EGIP", + /d4science.research-infrastructures.eu/gCubeApps/BlueUptake", + /d4science.research-infrastructures.eu/FARM/iMarineBoardVRE", + /d4science.research-infrastructures.eu/gCubeApps/KnowledgeBridging", + /d4science.research-infrastructures.eu/gCubeApps/EFG", + /d4science.research-infrastructures.eu/gCubeApps/StockAssessment", + /d4science.research-infrastructures.eu/gCubeApps/iSearch", +"/d4science.research-infrastructures.eu/gCubeApps", +"/d4science.research-infrastructures.eu/gCubeApps/StrategicInvestmentAnalysis")*/ + + @Test + public void requestListOfTokenForVREs() throws Exception{ + SecurityTokenProvider.instance.set(requestTestToken("/d4science.research-infrastructures.eu")); + + String jrNode ="tabulardata.d4science.org"; + int jrPort =8080; + + AuthorizationProxy proxy = authorizationService(); + + try(BufferedReader isr = new BufferedReader(new InputStreamReader(new FileInputStream("./src/test/resources/Scopes.txt"))); + BufferedWriter bw = new BufferedWriter(new FileWriter("./src/test/resources/tokens-"+jrNode+".txt"))){ + String line = null; + + + while ( (line=isr.readLine())!=null){ + System.out.println(" retrieving token for scope "+line); + String token = proxy.requestActivation(new ContainerInfo(jrNode,jrPort), line.trim()); + bw.write(String.format("%s", token)); + bw.newLine(); + } + } + } + @Ignore @Test + public void checkDiff() throws Exception{ + + + Set scopes = new HashSet(); + + try(BufferedReader isr = new BufferedReader(new InputStreamReader(new FileInputStream("./src/test/resources/Scopes.txt")))){ + String line = null; + + while ( (line=isr.readLine())!=null){ + System.out.println(scopes.size()+" "+line); + if (scopes.contains(line.trim())) + System.out.println("already contians "+line); + else scopes.add(line.trim()); + } + } + + System.out.println("initial scope count is "+scopes.size()); + + + try(BufferedReader isr = new BufferedReader(new InputStreamReader(new FileInputStream("./src/test/resources/createdScope.txt")))){ + String line = null; + + + while ( (line=isr.readLine())!=null){ + if (!scopes.remove(line.trim())) + System.out.println("cannot remove scope "+line.trim()); + } + } + + System.out.println("final scope count is "+scopes.size()); + + } + } diff --git a/src/test/java/org/gcube/common/authorizationservice/cl/StressTest.java b/src/test/java/org/gcube/common/authorizationservice/cl/StressTest.java new file mode 100644 index 0000000..b62af97 --- /dev/null +++ b/src/test/java/org/gcube/common/authorizationservice/cl/StressTest.java @@ -0,0 +1,48 @@ +package org.gcube.common.authorizationservice.cl; + +import static org.gcube.common.authorization.client.Constants.authorizationService; + +import java.io.IOException; +import java.util.ArrayList; + +import org.gcube.common.authorization.library.provider.UserInfo; +import org.junit.Test; + +public class StressTest { + + + @Test + public void stressing(){ + int counter = 0; + for (int i =1 ; i<=10000; i++){ + if ((i-(counter*4))>4) + counter++; + final int index = counter; + Thread t = new Thread(){ + + public void run(){ + try { + requestTestToken("/gcube", "stress.test19-"+index); + } catch (Exception e) { + System.out.println("erorr in thread "+Thread.currentThread().getName()); + e.printStackTrace(); + } + } + + }; + t.start(); + System.out.println("next execution"); + } + System.out.println("waiting"); + try { + System.in.read(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private String requestTestToken(String context, String user) throws Exception{ + return authorizationService().generateUserToken(new UserInfo(user, new ArrayList()), context); + } +} diff --git a/src/test/resources/Scopes.txt b/src/test/resources/Scopes.txt new file mode 100644 index 0000000..9130113 --- /dev/null +++ b/src/test/resources/Scopes.txt @@ -0,0 +1,8 @@ +/d4science.research-infrastructures.eu/gCubeApps/FAO_TunaAtlas +/d4science.research-infrastructures.eu/gCubeApps/TabularDataLab +/d4science.research-infrastructures.eu/gCubeApps/BOBLME_HilsaAWG +/d4science.research-infrastructures.eu/gCubeApps/PGFA-UFMT +/d4science.research-infrastructures.eu/gCubeApps/IGDI +/d4science.research-infrastructures.eu/gCubeApps/ICES_TCRE +/d4science.research-infrastructures.eu/gCubeApps/StockAssessment +/d4science.research-infrastructures.eu \ No newline at end of file