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);