From 1430fb676fa6b7d0c094fec8c2f7445640981f38 Mon Sep 17 00:00:00 2001 From: "luca.frosini" Date: Thu, 17 May 2018 10:52:17 +0000 Subject: [PATCH] Added token generations by iterating contexts read dinamically Refs #11756: Refactor DataHArvesterPlugin to support scheduled execution from smart-executor Task-Url: https://support.d4science.org/issues/11756 git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/accounting/accounting-dashboard-harvester-se-plugin@167556 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 24 +++- .../AccountingDataHarvesterPlugin.java | 26 +++- .../dataharvest/dao/DatabaseDataExplorer.java | 1 + .../utils/ContextAuthorization.java | 123 ++++++++++++++++++ src/main/resources/config.properties.example | 3 + .../AccountingDataHarvesterPluginTest.java | 2 +- .../utils/ContextAuthorizationTest.java | 48 +++++++ .../{ => dataharvest}/utils/DataFiller.java | 2 +- .../{ => dataharvest}/utils/ScopedTest.java | 4 +- src/test/resources/config.properties | 5 + 10 files changed, 228 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/gcube/dataharvest/utils/ContextAuthorization.java create mode 100644 src/main/resources/config.properties.example create mode 100644 src/test/java/org/gcube/dataharvest/utils/ContextAuthorizationTest.java rename src/test/java/org/gcube/{ => dataharvest}/utils/DataFiller.java (99%) rename src/test/java/org/gcube/{ => dataharvest}/utils/ScopedTest.java (97%) create mode 100644 src/test/resources/config.properties diff --git a/pom.xml b/pom.xml index 605ed1c..75f90e9 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 org.gcube.accounting accounting-dashboard-harvester-se-plugin @@ -22,6 +24,13 @@ pom import + + org.gcube.distribution + gcube-smartgears-bom + LATEST + pom + import + @@ -70,7 +79,7 @@ registry-publisher provided - + org.gcube.resources common-gcore-resources @@ -93,7 +102,7 @@ accounting-analytics [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) - + org.gcube.accounting accounting-analytics-persistence-couchbase @@ -105,7 +114,14 @@ accounting-lib provided - + + + + org.gcube.portlets.admin + rmp-common-library + [2.7.1-SNAPSHOT, 3.0.0-SNAPSHOT) + + org.ancoron.postgresql org.postgresql diff --git a/src/main/java/org/gcube/dataharvest/AccountingDataHarvesterPlugin.java b/src/main/java/org/gcube/dataharvest/AccountingDataHarvesterPlugin.java index 6bc2407..a930ff2 100644 --- a/src/main/java/org/gcube/dataharvest/AccountingDataHarvesterPlugin.java +++ b/src/main/java/org/gcube/dataharvest/AccountingDataHarvesterPlugin.java @@ -1,9 +1,12 @@ package org.gcube.dataharvest; +import java.io.IOException; +import java.io.InputStream; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Properties; import org.gcube.dataharvest.dao.DatabaseManager; import org.gcube.dataharvest.datamodel.Harvest; @@ -12,6 +15,7 @@ import org.gcube.dataharvest.harvester.MethodInvocationHarvester; import org.gcube.dataharvest.harvester.ResourceCatalogueHarvester; import org.gcube.dataharvest.harvester.SocialHarvester; import org.gcube.dataharvest.harvester.VreUsersHarvester; +import org.gcube.dataharvest.utils.ContextAuthorization; import org.gcube.vremanagement.executor.plugin.Plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +24,8 @@ public class AccountingDataHarvesterPlugin extends Plugin inputs) throws Exception { logger.debug("DataHarvestPlugin: launch()"); + try { + getConfigParameters(); + }catch (Exception e) { + logger.warn("Unable to load {} file containing configuration properties. AccountingDataHarvesterPlugin will use defaults", PROPERTY_FILENAME); + } + + ContextAuthorization contextAuthorization = new ContextAuthorization(properties); + + String message = ""; DatabaseManager dbaseManager = new DatabaseManager(testMode); diff --git a/src/main/java/org/gcube/dataharvest/dao/DatabaseDataExplorer.java b/src/main/java/org/gcube/dataharvest/dao/DatabaseDataExplorer.java index 0b5e8ce..16a8b37 100644 --- a/src/main/java/org/gcube/dataharvest/dao/DatabaseDataExplorer.java +++ b/src/main/java/org/gcube/dataharvest/dao/DatabaseDataExplorer.java @@ -11,6 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DatabaseDataExplorer { + private static Logger logger = LoggerFactory.getLogger(DatabaseDataExplorer.class); private boolean testMode = false; private boolean productionMode = false; diff --git a/src/main/java/org/gcube/dataharvest/utils/ContextAuthorization.java b/src/main/java/org/gcube/dataharvest/utils/ContextAuthorization.java new file mode 100644 index 0000000..deab896 --- /dev/null +++ b/src/main/java/org/gcube/dataharvest/utils/ContextAuthorization.java @@ -0,0 +1,123 @@ +package org.gcube.dataharvest.utils; + +import static org.gcube.common.authorization.client.Constants.authorizationService; + +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Properties; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.authorization.library.provider.UserInfo; +import org.gcube.common.scope.impl.ScopeBean; +import org.gcube.resourcemanagement.support.server.managers.scope.ScopeManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ContextAuthorization { + + private static Logger logger = LoggerFactory.getLogger(ContextAuthorization.class); + + protected Properties properties; + + public static final String VO_FILE = "VO_FILE"; + public static final String DEFAULT_VO_FILENAME = "scopedata.xml"; + + public static final String USERNAME = "USERNAME"; + public static final String DEFAULT_USERNAME = "luca.frosini"; + + public static final String SERVICE_NAME = "SERVICE_NAME"; + public static final String DEFAULT_SERVICE_NAME = "accounting-harvester"; + + /** + * Contains Context full name as key and Token as Value + */ + protected Map contextToToken; + + /** + * Contains Token as key and Context full name as Value + */ + protected Map tokenToContext; + + /** + * Contains Properties used to generate tokens + */ + + public ContextAuthorization(Properties properties) throws Exception { + this.contextToToken = new HashMap<>(); + this.tokenToContext = new HashMap<>(); + if(properties!=null) { + this.properties = properties; + }else { + this.properties = new Properties(); + } + //retrieveContextsAndTokens(); + } + + public File getVOFile() { + try { + String voFileName = properties.getProperty(VO_FILE, DEFAULT_VO_FILENAME); + URL url = ContextAuthorization.class.getClassLoader().getResource(voFileName); + File voFile = new File(url.toURI()); + logger.trace("VO file is {}", voFile); + if(!voFile.exists()) { + throw new Exception("No VO file found. Unable to continue without it"); + } + return voFile; + }catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected void retrieveContextsAndTokens() throws Exception { + + String initialToken = SecurityTokenProvider.instance.get(); + + try { + + LinkedHashMap map = ScopeManager.readScopes(getVOFile().getAbsolutePath()); + for(String scope : map.keySet()) { + try { + String context = map.get(scope).toString(); + System.out.println("Going to generate Token for Context " + context); + logger.info("Going to generate Token for Context {}", context); + UserInfo userInfo = new UserInfo(properties.getProperty(USERNAME, DEFAULT_USERNAME), new ArrayList<>()); + String userToken = authorizationService().generateUserToken(userInfo, context); + SecurityTokenProvider.instance.set(userToken); + String generatedToken = authorizationService().generateExternalServiceToken(properties.getProperty(SERVICE_NAME, DEFAULT_SERVICE_NAME)); + + logger.trace("Token for Context {} is {}", context, generatedToken); + + contextToToken.put(context, generatedToken); + tokenToContext.put(generatedToken, context); + + }catch (Exception e) { + logger.error("Error while elaborating {}", scope, e); + throw e; + } finally { + SecurityTokenProvider.instance.reset(); + } + + } + } catch (Exception ex) { + throw ex; + } finally { + SecurityTokenProvider.instance.set(initialToken); + } + } + + public String getTokenForContext(String contextFullName) { + return contextToToken.get(contextFullName); + } + + public String getContextFromToken(String token) { + return tokenToContext.get(token); + } + + + + +} diff --git a/src/main/resources/config.properties.example b/src/main/resources/config.properties.example new file mode 100644 index 0000000..2236150 --- /dev/null +++ b/src/main/resources/config.properties.example @@ -0,0 +1,3 @@ +VO_FILE=scopedata.xml +USERNAME=luca.frosini +SERVICE_NAME=accounting-harvester \ No newline at end of file diff --git a/src/test/java/org/gcube/dataharvest/AccountingDataHarvesterPluginTest.java b/src/test/java/org/gcube/dataharvest/AccountingDataHarvesterPluginTest.java index 46fc188..381004f 100644 --- a/src/test/java/org/gcube/dataharvest/AccountingDataHarvesterPluginTest.java +++ b/src/test/java/org/gcube/dataharvest/AccountingDataHarvesterPluginTest.java @@ -7,7 +7,7 @@ import java.util.HashMap; import java.util.Map; import java.util.TimeZone; -import org.gcube.utils.ScopedTest; +import org.gcube.dataharvest.utils.ScopedTest; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/test/java/org/gcube/dataharvest/utils/ContextAuthorizationTest.java b/src/test/java/org/gcube/dataharvest/utils/ContextAuthorizationTest.java new file mode 100644 index 0000000..e863d25 --- /dev/null +++ b/src/test/java/org/gcube/dataharvest/utils/ContextAuthorizationTest.java @@ -0,0 +1,48 @@ +package org.gcube.dataharvest.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.gcube.dataharvest.AccountingDataHarvesterPlugin; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ContextAuthorizationTest extends ScopedTest { + + private static Logger logger = LoggerFactory.getLogger(ContextAuthorizationTest.class); + + private static final String PROPERTY_FILENAME = "config.properties"; + + private Properties properties; + + private void getConfigParameters() throws IOException { + properties = new Properties(); + InputStream input = AccountingDataHarvesterPlugin.class.getClassLoader().getResourceAsStream(PROPERTY_FILENAME); + properties.load(input); + } + + @Test + public void testGetVOFile() throws Exception { + try { + getConfigParameters(); + }catch (Exception e) { + logger.warn("Unable to load {} file containing configuration properties. AccountingDataHarvesterPlugin will use defaults", PROPERTY_FILENAME); + } + ContextAuthorization contextAuthorization = new ContextAuthorization(properties); + contextAuthorization.getVOFile(); + } + + @Test + public void testRetrieveContextsAndTokens() throws Exception { + try { + getConfigParameters(); + }catch (Exception e) { + logger.warn("Unable to load {} file containing configuration properties. AccountingDataHarvesterPlugin will use defaults", PROPERTY_FILENAME); + } + ContextAuthorization contextAuthorization = new ContextAuthorization(properties); + contextAuthorization.retrieveContextsAndTokens(); + } + +} diff --git a/src/test/java/org/gcube/utils/DataFiller.java b/src/test/java/org/gcube/dataharvest/utils/DataFiller.java similarity index 99% rename from src/test/java/org/gcube/utils/DataFiller.java rename to src/test/java/org/gcube/dataharvest/utils/DataFiller.java index 276ecea..746137d 100644 --- a/src/test/java/org/gcube/utils/DataFiller.java +++ b/src/test/java/org/gcube/dataharvest/utils/DataFiller.java @@ -1,4 +1,4 @@ -package org.gcube.utils; +package org.gcube.dataharvest.utils; public class DataFiller { private static String[] data10 = { diff --git a/src/test/java/org/gcube/utils/ScopedTest.java b/src/test/java/org/gcube/dataharvest/utils/ScopedTest.java similarity index 97% rename from src/test/java/org/gcube/utils/ScopedTest.java rename to src/test/java/org/gcube/dataharvest/utils/ScopedTest.java index 4bef19d..e262e7b 100644 --- a/src/test/java/org/gcube/utils/ScopedTest.java +++ b/src/test/java/org/gcube/dataharvest/utils/ScopedTest.java @@ -1,7 +1,7 @@ /** * */ -package org.gcube.utils; +package org.gcube.dataharvest.utils; import java.io.IOException; import java.io.InputStream; @@ -73,7 +73,7 @@ public class ScopedTest { TAGME = properties.getProperty(TAGME_VARNAME); - DEFAULT_TEST_SCOPE = GCUBE_DEVSEC; + DEFAULT_TEST_SCOPE = GCUBE; } public static String getCurrentScope(String token) throws ObjectNotFound, Exception{ diff --git a/src/test/resources/config.properties b/src/test/resources/config.properties new file mode 100644 index 0000000..bb55497 --- /dev/null +++ b/src/test/resources/config.properties @@ -0,0 +1,5 @@ +VO_FILE=scopedata.xml +USERNAME=luca.frosini +SERVICE_NAME=accounting-harvester + +LOCAL_DB=true \ No newline at end of file