diff --git a/pom.xml b/pom.xml index 256e3a8..99d6c32 100644 --- a/pom.xml +++ b/pom.xml @@ -37,13 +37,13 @@ https://code-repo.d4science.org/gCubeSystem/common-smartgears - jakarta.servlet jakarta.servlet-api 6.0.0 + provided org.reflections diff --git a/src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java b/src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java index b4a41ed..3ad198e 100644 --- a/src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java +++ b/src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java @@ -1,6 +1,6 @@ package org.gcube.smartgears.context.application; -import jakarta.servlet.ServletContext; +import java.nio.file.Path; import org.gcube.common.events.Hub; import org.gcube.smartgears.configuration.application.ApplicationConfiguration; @@ -10,6 +10,8 @@ import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; import org.gcube.smartgears.persistence.PersistenceWriter; import org.gcube.smartgears.security.AuthorizationProvider; +import jakarta.servlet.ServletContext; + /** * The management context of an application. * @@ -83,4 +85,11 @@ public interface ApplicationContext { **/ AuthorizationProvider authorizationProvider(); + /** + * Returns the Path to the configuration Folder for the current app + * + * @return the Path to the folder , null if the Path is not present + */ + Path appSpecificConfigurationFolder(); + } diff --git a/src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java b/src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java index 4c15c53..766d71c 100644 --- a/src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java +++ b/src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java @@ -5,10 +5,10 @@ import static org.gcube.smartgears.Constants.profile_file_path; import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.UUID; -import jakarta.servlet.ServletContext; - import org.gcube.common.events.Hub; import org.gcube.smartgears.configuration.PersistenceConfiguration; import org.gcube.smartgears.configuration.application.ApplicationConfiguration; @@ -17,9 +17,12 @@ import org.gcube.smartgears.context.container.ContainerContext; import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; import org.gcube.smartgears.persistence.PersistenceWriter; import org.gcube.smartgears.security.AuthorizationProvider; +import org.gcube.smartgears.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jakarta.servlet.ServletContext; + /** * Default {@link ApplicationContext} implementation. * @@ -38,6 +41,9 @@ public class DefaultApplicationContext implements ApplicationContext { private final Hub hub; private final PersistenceWriter persistenceWriter; private final String id; + private Path appSpecificConfigurationFolder; + + private final static String APPS_CONFIG__DIR = "config/apps"; /** * Crates an intance with mandatory parameters @@ -78,6 +84,7 @@ public class DefaultApplicationContext implements ApplicationContext { this.configuration=configuration; this.hub=hub; this.lifecycle = lifecycle; + this.appSpecificConfigurationFolder = getApplicationSpecificConfig(); this.properties=properties; } @@ -154,4 +161,34 @@ public class DefaultApplicationContext implements ApplicationContext { return container().authorizationProvider(); } + @Override + public Path appSpecificConfigurationFolder() { + return this.appSpecificConfigurationFolder; + } + + private Path getApplicationSpecificConfig(){ + String home = Utils.home(); + + + File homeDir = new File(home); + + if (!(homeDir.exists() && homeDir.isDirectory() && homeDir.canRead())) + throw new IllegalStateException("invalid node configuration: home " + home + + " does not exist or is not a directory or cannot be accessed in read mode"); + + String appName = this.configuration.name(); + + Path appSpecificConfigurationPath = Paths.get(home, APPS_CONFIG__DIR, appName); + + File appSpecificConfiguration = appSpecificConfigurationPath.toFile(); + + if (!(appSpecificConfiguration.exists() && appSpecificConfiguration.isDirectory() && appSpecificConfiguration.canRead())) { + log.warn("specific configuration folder for {} not found", appName); + return null; + } + + log.info("reading specific app configuration folder @ {} ", appSpecificConfiguration.getAbsolutePath()); + + return appSpecificConfigurationPath; + } } diff --git a/src/main/java/org/gcube/smartgears/handlers/application/request/RequestValidator.java b/src/main/java/org/gcube/smartgears/handlers/application/request/RequestValidator.java index d09af14..042ba4a 100644 --- a/src/main/java/org/gcube/smartgears/handlers/application/request/RequestValidator.java +++ b/src/main/java/org/gcube/smartgears/handlers/application/request/RequestValidator.java @@ -150,7 +150,11 @@ public class RequestValidator extends RequestHandler { RequestError.internal_server_error.fire("error contacting keycloak client", e); } } else if (token!=null && !token.isEmpty()) + try { secret = new GCubeSecret(token); + }catch(Throwable t) { + RequestError.request_not_authorized_error.fire("gcube token verification error ("+t.getMessage()+")"); + } return secret; } diff --git a/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java b/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java index 09c5afb..b1250c0 100644 --- a/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java +++ b/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java @@ -101,7 +101,8 @@ public class ApplicationManager { //adding the context name to the configuration context.configuration().context(application.getContextPath()); - + + // we're in business context.lifecycle().moveTo(active);