From cf3c13495333ab0759976c9a323354b3409110db Mon Sep 17 00:00:00 2001 From: lucio lelii Date: Thu, 17 Mar 2022 17:17:15 +0100 Subject: [PATCH] moving smartgears to a .ini Configuration file type --- .gitignore | 1 + CHANGELOG.md | 6 + pom.xml | 10 +- .../java/org/gcube/smartgears/Constants.java | 2 +- .../configuration/ProxyAddress.java | 42 ++ .../application/ApplicationConfiguration.java | 40 +- .../BridgedApplicationConfiguration.java | 43 +- .../DefaultApplicationConfiguration.java | 56 +- .../application/ProxyAddress.java | 97 ---- .../container/BaseConfiguration.java | 101 ++++ .../container/ContainerConfiguration.java | 534 ++++++------------ .../configuration/container/Site.java | 96 +--- .../application/ApplicationContext.java | 4 +- .../DefaultApplicationContext.java | 4 +- .../context/container/ContainerContext.java | 4 +- .../container/DefaultContainerContext.java | 7 +- .../application/lifecycle/ProfileBuilder.java | 6 +- .../lifecycle/ProfilePublisherImpl.java | 76 +-- .../request/RequestAccounting.java | 10 +- .../application/request/RequestValidator.java | 32 +- .../container/lifecycle/ProfileBuilder.java | 4 +- .../managers/ApplicationManager.java | 62 -- .../smartgears/managers/ContainerManager.java | 9 +- .../smartgears/managers/ContextEvents.java | 7 +- .../persistence/DefaultPersistence.java | 96 ---- .../persistence/LocalPersistence.java | 65 +++ ...ersistence.java => PersistenceWriter.java} | 8 +- .../smartgears/provider/DefaultProvider.java | 1 - .../gcube/smartgears/provider/Provider.java | 3 +- .../security/AuthorizationProvider.java | 10 + .../smartgears/security/Credentials.java | 5 + .../DefaultAuthorizationProvider.java | 14 + .../security/SimpleCredentials.java | 67 +++ src/test/java/app/SomeApp.java | 27 +- .../test/application/ConfigurationTest.java | 6 +- .../test/container/ConfigurationTest.java | 76 +-- .../test/container/PersistenceWriterTest.java | 32 ++ src/test/java/utils/TestUtils.java | 30 - src/test/resources/test-configuration.ini | 41 ++ 39 files changed, 732 insertions(+), 1002 deletions(-) create mode 100644 src/main/java/org/gcube/smartgears/configuration/ProxyAddress.java delete mode 100644 src/main/java/org/gcube/smartgears/configuration/application/ProxyAddress.java create mode 100644 src/main/java/org/gcube/smartgears/configuration/container/BaseConfiguration.java delete mode 100644 src/main/java/org/gcube/smartgears/persistence/DefaultPersistence.java create mode 100644 src/main/java/org/gcube/smartgears/persistence/LocalPersistence.java rename src/main/java/org/gcube/smartgears/persistence/{Persistence.java => PersistenceWriter.java} (65%) create mode 100644 src/main/java/org/gcube/smartgears/security/AuthorizationProvider.java create mode 100644 src/main/java/org/gcube/smartgears/security/Credentials.java create mode 100644 src/main/java/org/gcube/smartgears/security/DefaultAuthorizationProvider.java create mode 100644 src/main/java/org/gcube/smartgears/security/SimpleCredentials.java create mode 100644 src/test/java/test/container/PersistenceWriterTest.java create mode 100644 src/test/resources/test-configuration.ini diff --git a/.gitignore b/.gitignore index 4110018..476f58e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target/ /.classpath /bin/ +/bin/ diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f3212..b35f0ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for Common Smartgears + +## [v4.0.0-SNAPSHOT] + + + + ## [v3.2.0-SNAPSHOT] - Added SecretManagerProvider thread local from authorization-utils [#22871] diff --git a/pom.xml b/pom.xml index 39ef440..fcc1b7c 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.gcube.core common-smartgears - 3.2.0-SNAPSHOT + 4.0.0-SNAPSHOT SmartGears @@ -66,7 +66,7 @@ org.gcube.common common-authorization - + org.gcube.common authorization-utils @@ -97,6 +97,12 @@ common-gcore-resources + + org.ini4j + ini4j + 0.5.4 + + org.gcube.core common-validator diff --git a/src/main/java/org/gcube/smartgears/Constants.java b/src/main/java/org/gcube/smartgears/Constants.java index fd4486b..e0ec805 100644 --- a/src/main/java/org/gcube/smartgears/Constants.java +++ b/src/main/java/org/gcube/smartgears/Constants.java @@ -28,7 +28,7 @@ public class Constants { /** * The container configuration file path, relative to the container configuration directory. */ - public static final String container_configuraton_file_path = "container.xml"; + public static final String container_configuraton_file_path = "smartgears-node.ini"; /** diff --git a/src/main/java/org/gcube/smartgears/configuration/ProxyAddress.java b/src/main/java/org/gcube/smartgears/configuration/ProxyAddress.java new file mode 100644 index 0000000..731b20c --- /dev/null +++ b/src/main/java/org/gcube/smartgears/configuration/ProxyAddress.java @@ -0,0 +1,42 @@ +package org.gcube.smartgears.configuration; + +import org.gcube.common.validator.annotations.NotEmpty; +import org.gcube.common.validator.annotations.NotNull; + +public class ProxyAddress { + + @NotNull @NotEmpty + String protocol = "http"; + + @NotNull @NotEmpty + String hostname; + + @NotNull + Integer port; + + public String getProtocol() { + return protocol; + } + + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + +} diff --git a/src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfiguration.java b/src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfiguration.java index c7e1257..cbc85d6 100644 --- a/src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfiguration.java +++ b/src/main/java/org/gcube/smartgears/configuration/application/ApplicationConfiguration.java @@ -2,8 +2,8 @@ package org.gcube.smartgears.configuration.application; import java.util.Set; -import org.gcube.smartgears.configuration.Mode; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.configuration.ProxyAddress; +import org.gcube.smartgears.persistence.PersistenceWriter; /** * The configuration of the application. @@ -13,15 +13,7 @@ import org.gcube.smartgears.persistence.Persistence; */ public interface ApplicationConfiguration { - - /** - * Returns the management mode of the application. - * @return the management mode - */ - Mode mode(); - - - + /** * Returns the context path of the application * @return the context path @@ -37,14 +29,7 @@ public interface ApplicationConfiguration { */ ApplicationConfiguration context(String context); - /** - * Sets the management mode of this application. - * @param the management mode - * @return this configuration - */ - ApplicationConfiguration mode(Mode mode); - - + /** * Returns the name of the application. * @return the name @@ -102,25 +87,12 @@ public interface ApplicationConfiguration { ApplicationConfiguration proxyAddress(ProxyAddress proxyaddress); - /** - * Returns the tokens in which the application operates when it first starts. - * @return the tokens - */ - Set startTokens(); - - /** - * Sets the tokens in which the application operates when it first starts. - * @param scopes the scopes - * @return this configuration - */ - ApplicationConfiguration startTokens(Set tokens); - /** * Returns the persistence manager of the application. * @return the manager */ - Persistence persistence(); + PersistenceWriter persistence(); /** @@ -141,7 +113,7 @@ public interface ApplicationConfiguration { * @param manager the manager * @return this configuration */ - ApplicationConfiguration persistence(Persistence manager); + ApplicationConfiguration persistence(PersistenceWriter manager); /** diff --git a/src/main/java/org/gcube/smartgears/configuration/application/BridgedApplicationConfiguration.java b/src/main/java/org/gcube/smartgears/configuration/application/BridgedApplicationConfiguration.java index caa3de1..7ab9517 100644 --- a/src/main/java/org/gcube/smartgears/configuration/application/BridgedApplicationConfiguration.java +++ b/src/main/java/org/gcube/smartgears/configuration/application/BridgedApplicationConfiguration.java @@ -1,14 +1,10 @@ package org.gcube.smartgears.configuration.application; -import static org.gcube.smartgears.configuration.Mode.offline; - -import java.io.File; import java.util.Set; -import org.gcube.smartgears.configuration.Mode; +import org.gcube.smartgears.configuration.ProxyAddress; import org.gcube.smartgears.configuration.container.ContainerConfiguration; -import org.gcube.smartgears.persistence.DefaultPersistence; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.persistence.PersistenceWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,25 +17,18 @@ public class BridgedApplicationConfiguration implements ApplicationConfiguration private static Logger log = LoggerFactory.getLogger(ApplicationConfiguration.class); - private final ContainerConfiguration container; private final ApplicationConfiguration application; public BridgedApplicationConfiguration(ContainerConfiguration container, ApplicationConfiguration config) { - this.container=container; this.application=config; if (application.persistence()==null) { - String location = container.persistence().location()+"/"+application.name(); - File dir = new File(location); - if (!dir.exists()) - dir.mkdirs(); + application.persistence(container.persistence()); - application.persistence(new DefaultPersistence(location)); - - log.trace("setting persistence location for {} @ {}",application.name(), dir.getAbsolutePath()); + log.trace("setting persistence location for {} the same as the container persistence",application.name()); } } @@ -47,10 +36,6 @@ public class BridgedApplicationConfiguration implements ApplicationConfiguration public ApplicationConfiguration inner() { return application; } - - public Mode mode() { - return container.mode()==offline?offline:application.mode(); - } @Override public String context() { @@ -98,17 +83,14 @@ public class BridgedApplicationConfiguration implements ApplicationConfiguration return application.description(description); } - public Persistence persistence() { + public PersistenceWriter persistence() { return application.persistence(); } - public ApplicationConfiguration persistence(Persistence manager) { + public ApplicationConfiguration persistence(PersistenceWriter manager) { return application.persistence(manager); } - public ApplicationConfiguration mode(Mode mode) { - return application.mode(mode); - } public void validate() { @@ -130,18 +112,7 @@ public class BridgedApplicationConfiguration implements ApplicationConfiguration public void merge(ApplicationConfiguration config) { application.merge(config); } - - - @Override - public Set startTokens() { - return application.startTokens(); - } - - @Override - public ApplicationConfiguration startTokens(Set tokens) { - return application.startTokens(tokens); - } - + @Override public boolean proxied() { diff --git a/src/main/java/org/gcube/smartgears/configuration/application/DefaultApplicationConfiguration.java b/src/main/java/org/gcube/smartgears/configuration/application/DefaultApplicationConfiguration.java index a4fe514..4c34ee8 100644 --- a/src/main/java/org/gcube/smartgears/configuration/application/DefaultApplicationConfiguration.java +++ b/src/main/java/org/gcube/smartgears/configuration/application/DefaultApplicationConfiguration.java @@ -7,20 +7,17 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; import org.gcube.common.validator.ValidationError; import org.gcube.common.validator.Validator; import org.gcube.common.validator.ValidatorFactory; import org.gcube.common.validator.annotations.IsValid; import org.gcube.common.validator.annotations.NotNull; -import org.gcube.smartgears.configuration.Mode; -import org.gcube.smartgears.persistence.DefaultPersistence; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.configuration.ProxyAddress; +import org.gcube.smartgears.persistence.PersistenceWriter; /** * The configuration of a managed app. @@ -34,11 +31,6 @@ import org.gcube.smartgears.persistence.Persistence; @XmlRootElement(name="application") public class DefaultApplicationConfiguration implements ApplicationConfiguration { - - @XmlAttribute - private Mode mode = Mode.online; - - @XmlAttribute(name="context") String context; @XmlElement(name="name" , required=true) @@ -52,14 +44,10 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration @XmlElement(name="version", required=true) @NotNull String version; - - @XmlTransient - Set tokens = new HashSet(); @XmlElement(name="description") String description=""; - @XmlElementRef @IsValid ProxyAddress proxyAddress; @@ -68,10 +56,10 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration @XmlElementRef Set includes= new LinkedHashSet(); - - @XmlElementRef(type=DefaultPersistence.class) + + @NotNull @IsValid - private Persistence persistenceManager; + private PersistenceWriter persistenceManager; @Override public Set excludes() { @@ -85,12 +73,7 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration } public DefaultApplicationConfiguration() {} - - @Override - public Mode mode() { - return mode; - } - + @Override public String name() { return name; @@ -152,16 +135,6 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration return this; } - @Override - public Set startTokens() { - return tokens; - } - - @Override - public ApplicationConfiguration startTokens(Set tokens) { - this.tokens.addAll(tokens); - return this; - } @Override public String description() { @@ -180,12 +153,12 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration } @Override - public Persistence persistence() { + public PersistenceWriter persistence() { return persistenceManager; } @Override - public ApplicationConfiguration persistence(Persistence manager) { + public ApplicationConfiguration persistence(PersistenceWriter manager) { this.persistenceManager=manager; return this; } @@ -196,12 +169,7 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration return this; } - @Override - public ApplicationConfiguration mode(Mode mode) { - this.mode=mode; - return this; - } - + @Override public void validate() { @@ -223,13 +191,9 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration @Override public void merge(ApplicationConfiguration config) { - - mode(config.mode()); - + if (config.persistence()!=null) persistence(config.persistence()); - - //scopes.addAll(config.startScopes()); } diff --git a/src/main/java/org/gcube/smartgears/configuration/application/ProxyAddress.java b/src/main/java/org/gcube/smartgears/configuration/application/ProxyAddress.java deleted file mode 100644 index ae9bb97..0000000 --- a/src/main/java/org/gcube/smartgears/configuration/application/ProxyAddress.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.gcube.smartgears.configuration.application; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -import org.gcube.common.validator.annotations.NotNull; - -@XmlRootElement(name="proxy") -public class ProxyAddress { - - - @XmlAttribute - String protocol = "http"; - - @XmlElement - @NotNull - String hostname; - - @XmlElement - Integer port; - - public String hostname() { - return hostname; - } - - public ProxyAddress hostname(String hostname) { - this.hostname = hostname; - return this; - } - - public Integer port() { - return port; - } - - public ProxyAddress port(int port) { - this.port = port; - return this; - } - - public String protocol() { - return protocol; - } - - public ProxyAddress protocol(String protocol) { - this.protocol = protocol; - return this; - } - - - @Override - public String toString() { - return "ProxyAddress [protocol=" + protocol + ", hostname=" + hostname + ", port=" + port + "]"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((hostname == null) ? 0 : hostname.hashCode()); - result = prime * result + ((port == null) ? 0 : port.hashCode()); - result = prime * result + ((protocol == null) ? 0 : protocol.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ProxyAddress other = (ProxyAddress) obj; - if (hostname == null) { - if (other.hostname != null) - return false; - } else if (!hostname.equals(other.hostname)) - return false; - if (port == null) { - if (other.port != null) - return false; - } else if (!port.equals(other.port)) - return false; - if (protocol == null) { - if (other.protocol != null) - return false; - } else if (!protocol.equals(other.protocol)) - return false; - return true; - } - - - - - -} diff --git a/src/main/java/org/gcube/smartgears/configuration/container/BaseConfiguration.java b/src/main/java/org/gcube/smartgears/configuration/container/BaseConfiguration.java new file mode 100644 index 0000000..9fdcb45 --- /dev/null +++ b/src/main/java/org/gcube/smartgears/configuration/container/BaseConfiguration.java @@ -0,0 +1,101 @@ +package org.gcube.smartgears.configuration.container; + +import static org.gcube.smartgears.Constants.default_container_publication_frequency_in_seconds; + +import org.gcube.common.validator.annotations.NotEmpty; +import org.gcube.common.validator.annotations.NotNull; +import org.gcube.smartgears.configuration.Mode; + +public class BaseConfiguration { + + + Mode mode = Mode.online; + + @NotNull @NotEmpty + String hostname; + + @NotNull + Integer port; + + @NotNull @NotEmpty + String protocol="http"; + + boolean authorizeChildrenContext = false; + + @NotNull @NotEmpty + String infrastructure; + + long publicationFrequencyInSeconds = default_container_publication_frequency_in_seconds; + + public Mode getMode() { + return mode; + } + + public String getHostname() { + return hostname; + } + + public Integer getPort() { + return port; + } + + public String getProtocol() { + return protocol; + } + + public boolean isAuthorizeChildrenContext() { + return authorizeChildrenContext; + } + + public String getInfrastructure() { + return infrastructure; + } + + + + public long getPublicationFrequencyInSeconds() { + return publicationFrequencyInSeconds; + } + + public void setPublicationFrequencyInSeconds(long publicationFrequencyInSeconds) { + this.publicationFrequencyInSeconds = publicationFrequencyInSeconds; + } + + public void setMode(Mode mode) { + this.mode = mode; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public void setPort(Integer port) { + this.port = port; + } + + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + public void setAuthorizeChildrenContext(boolean authorizeChildrenContext) { + this.authorizeChildrenContext = authorizeChildrenContext; + } + + public void setInfrastructure(String infrastructure) { + this.infrastructure = infrastructure; + } + + + + + @Override + public String toString() { + return "BaseConfiguration [mode=" + mode + ", hostname=" + hostname + ", port=" + port + ", protocol=" + + protocol + ", authorizeChildrenContext=" + authorizeChildrenContext + ", infrastructure=" + + infrastructure + ", publicationFrequency=" + publicationFrequencyInSeconds + + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/smartgears/configuration/container/ContainerConfiguration.java b/src/main/java/org/gcube/smartgears/configuration/container/ContainerConfiguration.java index f138d93..ba6dc3b 100644 --- a/src/main/java/org/gcube/smartgears/configuration/container/ContainerConfiguration.java +++ b/src/main/java/org/gcube/smartgears/configuration/container/ContainerConfiguration.java @@ -1,19 +1,17 @@ package org.gcube.smartgears.configuration.container; -import static org.gcube.smartgears.Constants.default_container_publication_frequency_in_seconds; -import static org.gcube.smartgears.utils.Utils.notNull; - +import java.io.File; +import java.io.InputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; +import java.util.stream.Collectors; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementRef; -import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import org.gcube.common.validator.ValidationError; @@ -23,10 +21,16 @@ import org.gcube.common.validator.annotations.IsValid; import org.gcube.common.validator.annotations.NotEmpty; import org.gcube.common.validator.annotations.NotNull; import org.gcube.smartgears.configuration.Mode; +import org.gcube.smartgears.configuration.ProxyAddress; import org.gcube.smartgears.configuration.application.ApplicationConfiguration; -import org.gcube.smartgears.configuration.application.DefaultApplicationConfiguration; -import org.gcube.smartgears.persistence.DefaultPersistence; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.persistence.LocalPersistence; +import org.gcube.smartgears.persistence.PersistenceWriter; +import org.gcube.smartgears.security.AuthorizationProvider; +import org.gcube.smartgears.security.Credentials; +import org.gcube.smartgears.security.DefaultAuthorizationProvider; +import org.gcube.smartgears.utils.Utils; +import org.ini4j.Ini; +import org.ini4j.Profile.Section; /** * The configuration of the container. @@ -34,78 +38,45 @@ import org.gcube.smartgears.persistence.Persistence; * @author Fabio Simeoni * @author Luca Frosini (ISTI - CNR) */ -@XmlRootElement(name="container") public class ContainerConfiguration { - - @XmlAttribute - private Mode mode = Mode.online; - - @XmlElement - @NotNull @IsValid - String hostname; - - @XmlElement - @NotNull - Integer port; - - @XmlElement(name ="authentication-endpoint") - String authenticationEnpoint = null; - - @XmlElement(name ="protocol") - @NotNull @IsValid - String protocol="http"; - - @XmlElement - boolean authorizeChildrenContext = false; - - @XmlElement - @NotNull@IsValid - String infrastructure; - @XmlElement - @NotNull @IsValid - Site site; - - @XmlElement(name="token") - @NotNull @NotEmpty - List tokens = new ArrayList(); + @NotNull @IsValid + private BaseConfiguration baseConfiguration; + + @IsValid + private Map properties = new HashMap(); + + @NotNull @IsValid + private Site site; + + @IsValid + private ProxyAddress proxy; + + @NotEmpty @NotNull + private String accountingFallbackLocation; + @XmlTransient - Set allowedContext = new HashSet(); + private Set allowedContext = new HashSet(); + + private List apps = new ArrayList(); + + + @NotNull @IsValid + private PersistenceWriter persistenceManager; + + @NotNull @IsValid + private AuthorizationProvider authorizationProvider; - @XmlElementRef(type=DefaultApplicationConfiguration.class) - List apps = new ArrayList(); - - @XmlElement(name="property") - @IsValid - List properties = new ArrayList(); - - @XmlElement(name="publication-frequency") - long publicationFrequency = default_container_publication_frequency_in_seconds; - - @XmlElementRef(type=DefaultPersistence.class) - @IsValid - private Persistence persistenceManager; - /** * Returns the management mode for the container. * @return the management mode */ public Mode mode() { - return mode; + return baseConfiguration.getMode(); } - - /** - * Sets the management mode for the container. - * @param mode the management mode - * @return this configuration - */ - public ContainerConfiguration mode(Mode mode) { - this.mode=mode; - return this; - } - + /** * Returns the application configurations included in this configuration. * @return the application configurations @@ -113,21 +84,21 @@ public class ContainerConfiguration { public List apps() { return apps; } - + /** * Returns the configuration of an application with a given context path. * @param context the context path * @return the application configuration */ public ApplicationConfiguration app(String context) { - + for (ApplicationConfiguration app : apps) if (context.equals(app.context())) return app; - + return null; } - + /** * Adds the configuration of an application to this configuration. * @param app the application configuration @@ -146,7 +117,7 @@ public class ContainerConfiguration { apps.add(app); return this; } - + /** * Returns the geographical site of the container. * @return the site @@ -155,186 +126,96 @@ public class ContainerConfiguration { return site; } - /** - * Sets the geographical site of the container. - * @param site the site - * @return this configuration - */ - public ContainerConfiguration site(Site site) { - this.site=site; - return this; - } - + /** * Returns the infrastructure in which the container is running. * @return the infrastructure */ public String infrastructure() { - return infrastructure; + return baseConfiguration.getInfrastructure(); } - /** - * Sets the infrastructure in which the container is running. - * @param infrastructure the infrastructure - * @return this configuration - */ - public ContainerConfiguration infrastructure(String infrastructure) { - this.infrastructure=infrastructure; - return this; - } - - - + /** * Returns the host name of the container. * @return the host name; */ public String hostname() { - return hostname; + return baseConfiguration.getHostname(); } - - /** - * Sets the host name of the container. - * @param name the host name - * @return this configuration - */ - public ContainerConfiguration hostname(String name) { - this.hostname=name; - return this; - } - + /** * Returns the port at which the container is listening for requests. * @return the port */ public int port() { - return port; + return baseConfiguration.getPort(); } - - + + /** * Returns the port at which the container is listening for requests. * @return the port */ public String protocol() { - return protocol; - } - - - public String authenticationEnpoint() { - return authenticationEnpoint; - } - - public ContainerConfiguration authenticationEnpoint(String endpoint) { - this.authenticationEnpoint = endpoint; - return this; + return baseConfiguration.getProtocol(); } - /** - * Sets the port at which the container is listening for requests. - * @param port the port - * @return this configuration - */ - public ContainerConfiguration port(int port) { - this.port=port; - return this; - } - - public ContainerConfiguration protocol(String protocol) { - this.protocol=protocol; - return this; - } - + public boolean authorizeChildrenContext() { - return authorizeChildrenContext; - } - - public ContainerConfiguration authorizeChildrenContext(boolean authorizeChildrenContext) { - this.authorizeChildrenContext = authorizeChildrenContext; - return this; + return baseConfiguration.isAuthorizeChildrenContext(); } /** - * Returns the VOs in which the container initially operates. - * @return the VOs + * Returns the credentials. + * @return the credentials */ - public List startTokens() { - return tokens; + public AuthorizationProvider authorizationProvider() { + return authorizationProvider; } /** - * Sets the VOs in which the container initially operates. - * @param vos the VOs - * @return this configuration + * Returns the proxy of the container. + * @return the proxy */ - public ContainerConfiguration startTokens(List tokens) { - - notNull("start Tokens",tokens); - - this.tokens = tokens; - - return this; + public ProxyAddress proxy() { + return proxy; } - + + /** * Returns the persistence manager of the container. * @return the manager */ - public Persistence persistence() { + public PersistenceWriter persistence() { return persistenceManager; } /** - * Sets the persistence manager of the container. - * @param manager the manager - * @return this configuration + * Returns the persistence manager of the container. + * @return the manager */ - public ContainerConfiguration persistence(Persistence manager) { - this.persistenceManager=manager; - return this; + public String accountingFallbackLocation() { + return accountingFallbackLocation; } - + /** * Returns the configuration properties of the container. * @return the properties */ public Map properties() { - Map map = new HashMap(); - for (Property prop : properties) - map.put(prop.name, prop.value); - return map; + return Collections.unmodifiableMap(properties); } - /** - * Adds a configuration property to the container. - * @param the name of the property - * @param the value of the property - * @return this configuration - */ - public ContainerConfiguration property(String name, String value) { - properties.add(new Property(name, value)); - return this; - } - /** * Returns the publication frequency for the container's profile. * @return the frquency; */ public long publicationFrequency() { - return publicationFrequency; + return baseConfiguration.getPublicationFrequencyInSeconds(); } - - /** - * Sets the publication frequency for the container's profile. - * @param frequency the frequency - * @return this configuration - */ - public ContainerConfiguration publicationFrequency(long frequency) { - this.publicationFrequency=frequency; - return this; - } - - + + public Set allowedContexts() { return allowedContext; } @@ -353,7 +234,7 @@ public class ContainerConfiguration { List msgs = new ArrayList(); Validator validator = ValidatorFactory.validator(); - + for (ValidationError error : validator.validate(this)) msgs.add(error.toString()); @@ -362,159 +243,116 @@ public class ContainerConfiguration { } + public static ContainerConfiguration load(InputStream stream) { + try { + Ini configurator = new Ini(stream); + ContainerConfiguration conf = new ContainerConfiguration(); + + Section nodeSection = configurator.get("node"); + if (nodeSection != null ) { + BaseConfiguration nodeConf = new BaseConfiguration(); + nodeSection.to(nodeConf); + conf.baseConfiguration = nodeConf; + } + + Section propertiesSection = configurator.get("properties"); + if (propertiesSection!=null) + conf.properties = propertiesSection.entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + + Section siteSection = configurator.get("site"); + if (siteSection != null) { + Site siteConf = new Site(); + siteSection.to(siteConf); + conf.site = siteConf; + } + + initAuthorizationPart(configurator, conf); + + initPersistencePart(configurator, conf); + + initProxyPart(configurator, conf); + + + //TODO: find a solution for this shit + String location = Utils.home()+"/state"; + File dir = new File(location); + if (!dir.exists()) + dir.mkdirs(); + conf.accountingFallbackLocation = location; + // END Shit + + return conf; + }catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void initProxyPart(Ini configurator, ContainerConfiguration conf) throws Exception{ + Section proxySection = configurator.get("proxy"); + if (proxySection != null) { + ProxyAddress proxyConf = new ProxyAddress(); + proxySection.to(proxyConf); + conf.proxy = proxyConf; + } + } + private static void initPersistencePart(Ini configurator, ContainerConfiguration conf) throws Exception{ + Section persistenceSection = configurator.get("persistence"); + if (persistenceSection != null) { + String type = persistenceSection.get("class"); + if (type ==null) + throw new Exception("ini file error: type not found in \"persistence\" section"); + PersistenceWriter persistenceWriter; + try { + Object persistenceImpl = Class.forName(type).newInstance(); + persistenceWriter = PersistenceWriter.class.cast(persistenceImpl); + }catch (Exception e) { + throw new Exception("ini file error: invalid persistence type in \"persistence\" section", e); + } + persistenceSection.to(persistenceWriter); + conf.persistenceManager = persistenceWriter; + } else { + String location = Utils.home()+"/state"; + File dir = new File(location); + if (!dir.exists()) + dir.mkdirs(); + conf.persistenceManager = new LocalPersistence(location); + } + } - static class Property { - - @XmlAttribute @NotNull - String name; - - @XmlAttribute @NotNull - String value; - - Property() {} - - Property(String key, String value) { - this.name=key; - this.value=value; + private static void initAuthorizationPart(Ini configurator, ContainerConfiguration conf) throws Exception{ + Section authorizationSection = configurator.get("authorization"); + if (authorizationSection != null) { + + String provider = authorizationSection.get("provider"); + AuthorizationProvider authProvider; + if (provider!=null) { + try { + Object authProviderImpl = Class.forName(provider).newInstance(); + authProvider = AuthorizationProvider.class.cast(authProviderImpl); + }catch (Exception e) { + throw new Exception("ini file error: invalid provider type in \"authorization\" section", e); + } + } else + authProvider = new DefaultAuthorizationProvider(); + + + String type = authorizationSection.get("credentials.class"); + if (type ==null) + throw new Exception("ini file error: credentials type not found in \"authorization\" section"); + Credentials credentials; + try { + Object credentialsImpl = Class.forName(type).newInstance(); + credentials = Credentials.class.cast(credentialsImpl); + }catch (Exception e) { + throw new Exception("ini file error: invalid credentials type in \"authorization\" section", e); + } + authorizationSection.to(credentials, "credentials."); + + authProvider.connect(credentials); + + conf.authorizationProvider = authProvider; } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Property other = (Property) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } - } - - - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((allowedContext == null) ? 0 : allowedContext.hashCode()); - result = prime * result + ((apps == null) ? 0 : apps.hashCode()); - result = prime * result + ((authenticationEnpoint == null) ? 0 : authenticationEnpoint.hashCode()); - result = prime * result + (authorizeChildrenContext ? 1231 : 1237); - result = prime * result + ((hostname == null) ? 0 : hostname.hashCode()); - result = prime * result + ((infrastructure == null) ? 0 : infrastructure.hashCode()); - result = prime * result + ((mode == null) ? 0 : mode.hashCode()); - result = prime * result + ((persistenceManager == null) ? 0 : persistenceManager.hashCode()); - result = prime * result + ((port == null) ? 0 : port.hashCode()); - result = prime * result + ((properties == null) ? 0 : properties.hashCode()); - result = prime * result + ((protocol == null) ? 0 : protocol.hashCode()); - result = prime * result + (int) (publicationFrequency ^ (publicationFrequency >>> 32)); - result = prime * result + ((site == null) ? 0 : site.hashCode()); - result = prime * result + ((tokens == null) ? 0 : tokens.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ContainerConfiguration other = (ContainerConfiguration) obj; - if (allowedContext == null) { - if (other.allowedContext != null) - return false; - } else if (!allowedContext.equals(other.allowedContext)) - return false; - if (apps == null) { - if (other.apps != null) - return false; - } else if (!apps.equals(other.apps)) - return false; - if (authenticationEnpoint == null) { - if (other.authenticationEnpoint != null) - return false; - } else if (!authenticationEnpoint.equals(other.authenticationEnpoint)) - return false; - if (authorizeChildrenContext != other.authorizeChildrenContext) - return false; - if (hostname == null) { - if (other.hostname != null) - return false; - } else if (!hostname.equals(other.hostname)) - return false; - if (infrastructure == null) { - if (other.infrastructure != null) - return false; - } else if (!infrastructure.equals(other.infrastructure)) - return false; - if (mode != other.mode) - return false; - if (persistenceManager == null) { - if (other.persistenceManager != null) - return false; - } else if (!persistenceManager.equals(other.persistenceManager)) - return false; - if (port == null) { - if (other.port != null) - return false; - } else if (!port.equals(other.port)) - return false; - if (properties == null) { - if (other.properties != null) - return false; - } else if (!properties.equals(other.properties)) - return false; - if (protocol == null) { - if (other.protocol != null) - return false; - } else if (!protocol.equals(other.protocol)) - return false; - if (publicationFrequency != other.publicationFrequency) - return false; - if (site == null) { - if (other.site != null) - return false; - } else if (!site.equals(other.site)) - return false; - if (tokens == null) { - if (other.tokens != null) - return false; - } else if (!tokens.equals(other.tokens)) - return false; - return true; - } - - @Override - public String toString() { - return "ContainerConfiguration [mode=" + mode + ", hostname=" + hostname + ", port=" + port + ", authenticationEnpoint=" + authenticationEnpoint + ", protocol=" + protocol - + ", authorizeChildrenContext=" + authorizeChildrenContext + ", infrastructure=" + infrastructure - + ", site=" + site + ", tokens=" + tokens + ", allowedContext=" + allowedContext + ", apps=" + apps - + ", properties=" + properties + ", publicationFrequency=" + publicationFrequency - + ", persistenceManager=" + persistenceManager + "]"; - } - } \ No newline at end of file diff --git a/src/main/java/org/gcube/smartgears/configuration/container/Site.java b/src/main/java/org/gcube/smartgears/configuration/container/Site.java index cc41f4f..2c22935 100644 --- a/src/main/java/org/gcube/smartgears/configuration/container/Site.java +++ b/src/main/java/org/gcube/smartgears/configuration/container/Site.java @@ -1,8 +1,5 @@ package org.gcube.smartgears.configuration.container; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - import org.gcube.common.validator.annotations.NotNull; /** @@ -11,97 +8,52 @@ import org.gcube.common.validator.annotations.NotNull; * @author Fabio Simeoni * */ -@XmlRootElement(name="site") public class Site { - @XmlElement @NotNull String country; - @XmlElement @NotNull String location; - @XmlElement @NotNull String latitude; - @XmlElement @NotNull String longitude; - /** - * Returns the country. - * @return the country - */ - public String country() { + + + public String getCountry() { return country; } - /** - * Sets the country. - * @param the country - * @return this configuration - */ - public Site country(String country) { - this.country=country; - return this; - } - - - /** - * Returns the latitude. - * @return the latitude - */ - public String latitude() { - return latitude; + public void setCountry(String country) { + this.country = country; } - /** - * Sets the latitude. - * @param the latitude - * @return this configuration - */ - public Site latitude(String latitude) { - this.latitude=latitude; - return this; - } - - - /** - * Returns the longitude. - * @return the longitude - */ - public String longitude() { - return longitude; - } - - /** - * Sets the longitude. - * @param the longitude - * @return this configuration - */ - public Site longitude(String longitude) { - this.longitude=longitude; - return this; - } - - /** - * Returns the location. - * @return the location - */ - public String location() { + public String getLocation() { return location; } - /** - * Sets the location. - * @param the location - * @return this location - */ - public Site location(String location) { - this.location=location; - return this; + public void setLocation(String location) { + this.location = location; + } + + public String getLatitude() { + return latitude; + } + + public void setLatitude(String latitude) { + this.latitude = latitude; + } + + public String getLongitude() { + return longitude; + } + + public void setLongitude(String longitude) { + this.longitude = longitude; } @Override 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 033cb34..b24640a 100644 --- a/src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java +++ b/src/main/java/org/gcube/smartgears/context/application/ApplicationContext.java @@ -7,7 +7,7 @@ import org.gcube.smartgears.configuration.application.ApplicationConfiguration; import org.gcube.smartgears.context.Properties; import org.gcube.smartgears.context.container.ContainerContext; import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.persistence.PersistenceWriter; /** * The management context of an application. @@ -56,7 +56,7 @@ public interface ApplicationContext { * * @return the manager */ - Persistence persistence(); + PersistenceWriter persistence(); /** * Returns the servlet context of the application. 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 96f2b3a..fbe0328 100644 --- a/src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java +++ b/src/main/java/org/gcube/smartgears/context/application/DefaultApplicationContext.java @@ -10,7 +10,7 @@ import org.gcube.smartgears.configuration.application.ApplicationConfiguration; import org.gcube.smartgears.context.Properties; import org.gcube.smartgears.context.container.ContainerContext; import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.persistence.PersistenceWriter; /** * Default {@link ApplicationContext} implementation. @@ -96,7 +96,7 @@ public class DefaultApplicationContext implements ApplicationContext { } @Override - public Persistence persistence() { + public PersistenceWriter persistence() { return configuration.persistence(); } diff --git a/src/main/java/org/gcube/smartgears/context/container/ContainerContext.java b/src/main/java/org/gcube/smartgears/context/container/ContainerContext.java index 3c7ae53..6afb028 100644 --- a/src/main/java/org/gcube/smartgears/context/container/ContainerContext.java +++ b/src/main/java/org/gcube/smartgears/context/container/ContainerContext.java @@ -4,7 +4,7 @@ import org.gcube.common.events.Hub; import org.gcube.smartgears.configuration.container.ContainerConfiguration; import org.gcube.smartgears.context.Properties; import org.gcube.smartgears.lifecycle.container.ContainerLifecycle; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.persistence.PersistenceWriter; /** * The management context of the container. @@ -43,7 +43,7 @@ public interface ContainerContext { * Returns the persistence manager of the container. * @return the manager */ - Persistence persistence(); + PersistenceWriter persistence(); /** * Returns the properties of the container. diff --git a/src/main/java/org/gcube/smartgears/context/container/DefaultContainerContext.java b/src/main/java/org/gcube/smartgears/context/container/DefaultContainerContext.java index 0a599f7..7d5fe14 100644 --- a/src/main/java/org/gcube/smartgears/context/container/DefaultContainerContext.java +++ b/src/main/java/org/gcube/smartgears/context/container/DefaultContainerContext.java @@ -1,12 +1,13 @@ package org.gcube.smartgears.context.container; -import static org.gcube.smartgears.Constants.*; +import static org.gcube.smartgears.Constants.container_profile_property; + import org.gcube.common.events.Hub; import org.gcube.common.resources.gcore.HostingNode; import org.gcube.smartgears.configuration.container.ContainerConfiguration; import org.gcube.smartgears.context.Properties; import org.gcube.smartgears.lifecycle.container.ContainerLifecycle; -import org.gcube.smartgears.persistence.Persistence; +import org.gcube.smartgears.persistence.PersistenceWriter; /** * Default {@link ContainerContext} implementation. @@ -62,7 +63,7 @@ public class DefaultContainerContext implements ContainerContext { } @Override - public Persistence persistence() { + public PersistenceWriter persistence() { return configuration.persistence(); } diff --git a/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfileBuilder.java b/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfileBuilder.java index da9c635..2caf451 100644 --- a/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfileBuilder.java +++ b/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfileBuilder.java @@ -48,10 +48,10 @@ public class ProfileBuilder { String baseAddress; if (configuration.proxied()){ - String protocol = configuration.proxyAddress().protocol(); - String port = configuration.proxyAddress().port()!=null?":"+configuration.proxyAddress().port():""; + String protocol = configuration.proxyAddress().getProtocol(); + String port = configuration.proxyAddress().getPort()!=null?":"+configuration.proxyAddress().getPort():""; - baseAddress=String.format("%s://%s%s%s", protocol , configuration.proxyAddress().hostname(), port,context.application().getContextPath()); + baseAddress=String.format("%s://%s%s%s", protocol , configuration.proxyAddress().getHostname(), port,context.application().getContextPath()); } else { String protocol = container.protocol(); int port = container.port(); diff --git a/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfilePublisherImpl.java b/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfilePublisherImpl.java index 54f9930..269a99e 100644 --- a/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfilePublisherImpl.java +++ b/src/main/java/org/gcube/smartgears/handlers/application/lifecycle/ProfilePublisherImpl.java @@ -8,14 +8,15 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.gcube.common.authorization.client.proxy.AuthorizationProxy; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.resources.gcore.GCoreEndpoint; +import org.gcube.common.scope.api.ScopeProvider; import org.gcube.informationsystem.publisher.ScopedPublisher; import org.gcube.smartgears.configuration.Mode; import org.gcube.smartgears.context.application.ApplicationContext; import org.gcube.smartgears.handlers.ProfilePublisher; import org.gcube.smartgears.provider.ProviderFactory; +import org.gcube.smartgears.security.AuthorizationProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +38,7 @@ public class ProfilePublisherImpl implements ProfilePublisher { private final ApplicationContext context; - private AuthorizationProxy authProxy ; + private AuthorizationProvider authProxy ; /** * Creates an instance for a given application. @@ -46,7 +47,7 @@ public class ProfilePublisherImpl implements ProfilePublisher { public ProfilePublisherImpl(ApplicationContext context) { this.context = context; this.publisher=ProviderFactory.provider().publisherFor(context); - this.authProxy = ProviderFactory.provider().authorizationProxy(); + this.authProxy = context.container().configuration().authorizationProvider(); } /** @@ -54,9 +55,9 @@ public class ProfilePublisherImpl implements ProfilePublisher { * @param scopes the scopes */ @Override - public void addTo(Collection tokens) { + public void addTo(Collection contexts) { - notEmpty("tokens",tokens); + notEmpty("tokens",contexts); GCoreEndpoint profile = context.profile(GCoreEndpoint.class); @@ -87,16 +88,19 @@ public class ProfilePublisherImpl implements ProfilePublisher { log.debug("using context {}",contextCL.getClass().getSimpleName()); String previousToken = SecurityTokenProvider.instance.get(); + String previousScope = ScopeProvider.instance.get(); try{//This classloader set is needed for the jaxb context - if (previousToken==null) - SecurityTokenProvider.instance.set((String)tokens.toArray()[0]); + if (previousToken!=null) + SecurityTokenProvider.instance.reset();; if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader()); - profile = publisher.create(profile, resolveScopesFromTokens(tokens)); + ScopeProvider.instance.set(contexts.stream().findFirst().get()); + profile = publisher.create(profile, new ArrayList(contexts)); } catch (Exception e) { rethrowUnchecked(e); } finally{ SecurityTokenProvider.instance.set(previousToken); + ScopeProvider.instance.set(previousScope); if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(contextCL); } @@ -106,7 +110,7 @@ public class ProfilePublisherImpl implements ProfilePublisher { @Override public void addToAll() { - this.addTo(context.configuration().startTokens()); + this.addTo(context.configuration().allowedContexts()); } @@ -115,33 +119,16 @@ public class ProfilePublisherImpl implements ProfilePublisher { GCoreEndpoint profile = context.profile(GCoreEndpoint.class); - - /* TODO: reintroduce it when scope will be removed - String previousToken = SecurityTokenProvider.instance.get(); - try { - - for (String token: context.configuration().startTokens()){ - SecurityTokenProvider.instance.set(token); - profile = publisher.update(profile); - SecurityTokenProvider.instance.reset(); - } - - } - catch (Exception e) { - rethrowUnchecked(e); - } finally{ - SecurityTokenProvider.instance.set(previousToken); - } - */ ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); log.debug("using context {}",contextCL.getClass().getSimpleName()); String previousToken = SecurityTokenProvider.instance.get(); + String previousScope = ScopeProvider.instance.get(); try{//This classloader set is needed for the jaxb context - if (previousToken==null) - SecurityTokenProvider.instance.set((String)context.configuration().startTokens().toArray()[0]); + if (previousToken!=null) + SecurityTokenProvider.instance.reset(); if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader()); @@ -151,6 +138,7 @@ public class ProfilePublisherImpl implements ProfilePublisher { rethrowUnchecked(e); } finally{ SecurityTokenProvider.instance.set(previousToken); + ScopeProvider.instance.set(previousScope); if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(contextCL); } @@ -164,46 +152,28 @@ public class ProfilePublisherImpl implements ProfilePublisher { * @param scopes the scopes */ @Override - public void removeFrom(Collection tokens) { + public void removeFrom(Collection contexts) { GCoreEndpoint profile = context.profile(GCoreEndpoint.class); - /* TODO: reintroduce it when scope will be removed - String previousToken = SecurityTokenProvider.instance.get(); - try { - - for (String token: tokens){ - SecurityTokenProvider.instance.set(token); - profile = publisher.remove(profile); - SecurityTokenProvider.instance.reset(); - } - - } - catch (Exception e) { - - rethrowUnchecked(e); - - } finally{ - SecurityTokenProvider.instance.set(previousToken); - } - */ - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); log.debug("using context {}",contextCL.getClass().getSimpleName()); String previousToken = SecurityTokenProvider.instance.get(); + String previousScope = ScopeProvider.instance.get(); try{//This classloader set is needed for the jaxb context - if (previousToken==null) - SecurityTokenProvider.instance.set((String)tokens.toArray()[0]); + if (previousToken!=null) + SecurityTokenProvider.instance.reset(); if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader()); - profile = publisher.remove(profile, resolveScopesFromTokens(tokens)); + profile = publisher.remove(profile, contexts); } catch (Exception e) { rethrowUnchecked(e); } finally{ SecurityTokenProvider.instance.set(previousToken); + ScopeProvider.instance.set(previousScope); if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(contextCL); } diff --git a/src/main/java/org/gcube/smartgears/handlers/application/request/RequestAccounting.java b/src/main/java/org/gcube/smartgears/handlers/application/request/RequestAccounting.java index 61f7b33..97dff80 100644 --- a/src/main/java/org/gcube/smartgears/handlers/application/request/RequestAccounting.java +++ b/src/main/java/org/gcube/smartgears/handlers/application/request/RequestAccounting.java @@ -8,8 +8,8 @@ import org.gcube.accounting.datamodel.UsageRecord.OperationResult; import org.gcube.accounting.datamodel.usagerecords.ServiceUsageRecord; import org.gcube.accounting.persistence.AccountingPersistence; import org.gcube.accounting.persistence.AccountingPersistenceFactory; -import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.smartgears.Constants; import org.gcube.smartgears.configuration.Mode; @@ -46,7 +46,7 @@ public class RequestAccounting extends RequestHandler { calledMethod= e.request().getMethod()+" "+calledMethod; } InnerMethodName.instance.set(calledMethod); - String caller = AuthorizationProvider.instance.get()!=null? AuthorizationProvider.instance.get().getClient().getId(): "UNKNOWN"; + String caller = SecretManagerProvider.instance.get().getUser().getUsername(); startCallThreadLocal.set(System.currentTimeMillis()); log.info("REQUEST START ON {}:{}({}) CALLED FROM {}@{} IN SCOPE {} ", context.configuration().name(),context.configuration().serviceClass(), InnerMethodName.instance.get(), @@ -65,8 +65,8 @@ public class RequestAccounting extends RequestHandler { resetScope = true; } - String caller = AuthorizationProvider.instance.get()!=null? AuthorizationProvider.instance.get().getClient().getId(): "UNKNOWN"; - String callerQualifier = AuthorizationProvider.instance.get()!=null? AuthorizationProvider.instance.get().getTokenQualifier(): "UNKNOWN"; + String caller = SecretManagerProvider.instance.get().getUser().getUsername(); + String callerQualifier = "UNKNOWN"; //retieves caller Ip when there is a proxy String callerIp = e.request().getHeader("x-forwarded-for"); if(callerIp==null) @@ -87,7 +87,7 @@ public class RequestAccounting extends RequestHandler { } void generateAccounting(String caller, String callerQualifier, String remoteHost, boolean success, ApplicationContext context){ - AccountingPersistenceFactory.setFallbackLocation(context.container().persistence().location()); + AccountingPersistenceFactory.setFallbackLocation(context.container().configuration().accountingFallbackLocation()); AccountingPersistence persistence = AccountingPersistenceFactory.getPersistence(); ServiceUsageRecord serviceUsageRecord = new ServiceUsageRecord(); try{ 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 648e8c6..b894db1 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 @@ -14,9 +14,9 @@ import org.gcube.common.authorization.library.PolicyUtils; import org.gcube.common.authorization.library.policies.Policy; import org.gcube.common.authorization.library.policies.User2ServicePolicy; import org.gcube.common.authorization.library.policies.UserEntity; -import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.ServiceIdentifier; +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.common.scope.impl.ScopeBean.Type; @@ -39,7 +39,7 @@ public class RequestValidator extends RequestHandler { private static Logger log = LoggerFactory.getLogger(RequestValidator.class); - private ApplicationContext context; + private ApplicationContext appContext; @Override public String getName() { @@ -51,13 +51,13 @@ public class RequestValidator extends RequestHandler { log.trace("executing request validator ON REQUEST"); - context = call.context(); + appContext = call.context(); validateAgainstLifecycle(call); rejectUnauthorizedCalls(call); - if (context.container().configuration().mode()!=Mode.offline) { + if (appContext.container().configuration().mode()!=Mode.offline) { validateScopeCall(); validatePolicy(ScopeProvider.instance.get(), call); } @@ -66,7 +66,7 @@ public class RequestValidator extends RequestHandler { private void validateAgainstLifecycle(RequestEvent call) { - switch(context.lifecycle().state()) { + switch(appContext.lifecycle().state()) { case stopped : application_unavailable_error.fire(); break; @@ -86,28 +86,28 @@ public class RequestValidator extends RequestHandler { String scope = ScopeProvider.instance.get(); if (scope == null) { - log.warn("rejecting unscoped call to {}",context.name()); + log.warn("rejecting unscoped call to {}",appContext.name()); invalid_request_error.fire("call is unscoped"); } ScopeBean bean = new ScopeBean(scope); - ContainerConfiguration conf = context.container().configuration(); + ContainerConfiguration conf = appContext.container().configuration(); if (!conf.allowedContexts().contains(scope) && !(conf.authorizeChildrenContext() && bean.is(Type.VRE) && conf.allowedContexts().contains(bean.enclosingScope().toString()) ) ) { - log.warn("rejecting call to {} in invalid context {}, allowed context are {}",context.name(),scope,context.container().configuration().allowedContexts()); - invalid_request_error.fire(context.name()+" cannot be called in scope "+scope); + log.warn("rejecting call to {} in invalid context {}, allowed context are {}",appContext.name(),scope,appContext.container().configuration().allowedContexts()); + invalid_request_error.fire(appContext.name()+" cannot be called in scope "+scope); } } private void rejectUnauthorizedCalls(RequestEvent call){ String token = SecurityTokenProvider.instance.get(); - String scope = ScopeProvider.instance.get(); + String context = SecretManagerProvider.instance.get().getContext(); - if (token == null && scope==null){ - log.warn("rejecting call to {}, authorization required",context.name(),token); - RequestError.request_not_authorized_error.fire(context.name()+": authorization required"); + if (token == null && context==null){ + log.warn("rejecting call to {}, authorization required",appContext.name(),token); + RequestError.request_not_authorized_error.fire(appContext.name()+": authorization required"); } } @@ -121,7 +121,7 @@ public class RequestValidator extends RequestHandler { ServiceIdentifier serviceIdentifier = Utils.getServiceInfo(call.context()).getServiceIdentifier(); - String callerId = AuthorizationProvider.instance.get().getClient().getId(); + String callerId = SecretManagerProvider.instance.get().getUser().getUsername(); List policies = null; try { @@ -142,8 +142,8 @@ public class RequestValidator extends RequestHandler { toReject = true; else toReject = !entity.getExcludes().contains(callerId); if (toReject) { - log.error("rejecting call to {} : {} is not allowed to contact the service ",context.name(), callerId); - RequestError.request_not_authorized_error.fire("rejecting call to "+context.name()+" for polices: "+callerId+" is not allowed to contact the service: "+serviceIdentifier.getServiceName() ); + log.error("rejecting call to {} : {} is not allowed to contact the service ",appContext.name(), callerId); + RequestError.request_not_authorized_error.fire("rejecting call to "+appContext.name()+" for polices: "+callerId+" is not allowed to contact the service: "+serviceIdentifier.getServiceName() ); } } diff --git a/src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfileBuilder.java b/src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfileBuilder.java index 3f1ac67..73b6e32 100644 --- a/src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfileBuilder.java +++ b/src/main/java/org/gcube/smartgears/handlers/container/lifecycle/ProfileBuilder.java @@ -97,7 +97,7 @@ public class ProfileBuilder { // // file system node.profile().description().localFileSystems().add().name("").type("").readOnly(false) - .root(cfg.persistence().location()); + .root("/"); return node; } @@ -192,7 +192,7 @@ public class ProfileBuilder { private long getFreeSpace() { long free = 0; try { - free = Files.getFileStore(Paths.get(context.configuration().persistence().location())).getUsableSpace()/1024; + free = context.configuration().persistence().getFreeSpace()/1024; } catch (IOException ioe) { log.warn("unable to detect the free space on the disk", ioe); } diff --git a/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java b/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java index 7f3e735..0ed56a8 100644 --- a/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java +++ b/src/main/java/org/gcube/smartgears/managers/ApplicationManager.java @@ -23,10 +23,7 @@ import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRegistration; -import org.gcube.common.authorization.client.proxy.AuthorizationProxy; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.events.Observes; -import org.gcube.smartgears.Constants; import org.gcube.smartgears.configuration.Mode; import org.gcube.smartgears.configuration.application.ApplicationExtensions; import org.gcube.smartgears.configuration.application.ApplicationHandlers; @@ -34,14 +31,12 @@ import org.gcube.smartgears.context.application.ApplicationContext; import org.gcube.smartgears.context.container.ContainerContext; import org.gcube.smartgears.extensions.ApplicationExtension; import org.gcube.smartgears.extensions.RequestExceptionBarrier; -import org.gcube.smartgears.handlers.ProfileEvents; import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent; import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler; import org.gcube.smartgears.handlers.application.ApplicationPipeline; import org.gcube.smartgears.handlers.application.RequestHandler; import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; import org.gcube.smartgears.lifecycle.container.ContainerLifecycle; -import org.gcube.smartgears.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -143,41 +138,6 @@ public class ApplicationManager { } - private List generateTokensForApplication(ContainerContext container){ - log.info("generating token for app {}",context.configuration().name()); - - SecurityTokenProvider.instance.set(container.configuration().startTokens().get(0)); - try { - AuthorizationProxy authProxy = provider().authorizationProxy(); - try { - return authProxy.generateServiceToken(Utils.getServiceInfo(context), container.configuration().startTokens()); - }catch (Exception e) { - log.error("error generating service token",e); - throw new RuntimeException(e); - } - } catch (Exception e) { - throw new RuntimeException("error contacting authorization service",e); - } finally{ - SecurityTokenProvider.instance.reset(); - } - - - } - - private String generateApplicationToken(String containerToken, AuthorizationProxy authProxy){ - SecurityTokenProvider.instance.set(containerToken); - try { - log.info("generating token for app {} with container token {} ",context.configuration().name(), containerToken); - return authProxy.generateServiceToken(Utils.getServiceInfo(context)); - } catch (Exception e) { - throw new RuntimeException("error contacting authorization service",e); - } finally{ - SecurityTokenProvider.instance.reset(); - } - - } - - private void saveApplicationState() { File file = context.configuration().persistence().file(profile_file_path); try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))){ @@ -320,28 +280,6 @@ public class ApplicationManager { log.warn("cannot stop {} after container has stopped", context.name()); } - @Observes(value = ContextEvents.ADD_TOKEN_TO_APPLICATION, kind = critical) - void onAddToken(String containerToken) { - log.trace("event add received with token {} ",containerToken); - String appToken = generateApplicationToken(containerToken, provider().authorizationProxy()); - context.configuration().startTokens().add(appToken); - log.trace("app token created : {} ", appToken); - context.events().fire(appToken, ProfileEvents.addToContext); - context.events().fire(appToken, Constants.token_registered); - saveApplicationState(); - } - - @Observes(value = ContextEvents.REMOVE_TOKEN_FROM_APPLICATION, kind = critical) - void onRemoveToken(String containerToken) { - log.trace("event remove received with token {} ",containerToken); - String appToken = generateApplicationToken(containerToken, provider().authorizationProxy()); - context.configuration().startTokens().remove(appToken); - log.trace("app token removed : {} ", appToken); - context.events().fire(appToken, ProfileEvents.removeFromContext); - context.events().fire(appToken, Constants.token_removed); - saveApplicationState(); - } - }; context.container().events().subscribe(observer); diff --git a/src/main/java/org/gcube/smartgears/managers/ContainerManager.java b/src/main/java/org/gcube/smartgears/managers/ContainerManager.java index 3d7a9d2..92ae6d8 100644 --- a/src/main/java/org/gcube/smartgears/managers/ContainerManager.java +++ b/src/main/java/org/gcube/smartgears/managers/ContainerManager.java @@ -31,6 +31,8 @@ import org.gcube.smartgears.handlers.container.ContainerLifecycleEvent; import org.gcube.smartgears.handlers.container.ContainerPipeline; import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; import org.gcube.smartgears.lifecycle.container.ContainerState; +import org.gcube.smartgears.security.AuthorizationProvider; +import org.gcube.smartgears.security.Credentials; import org.gcube.smartgears.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,7 +49,7 @@ public class ContainerManager { public static ContainerManager instance = new ContainerManager(); - private AuthorizationProxy authProvider = provider().authorizationProxy(); + private AuthorizationProvider authProvider = provider().authorizationProxy(); private ContainerContext context; @@ -101,7 +103,6 @@ public class ContainerManager { File file = context.configuration().persistence().file(container_profile_file_path); try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))){ oos.writeObject(context.id()); - oos.writeObject(context.configuration().startTokens()); }catch (Exception e) { log.error("error serializing cointainer state"); throw new RuntimeException(e); @@ -113,7 +114,9 @@ public class ContainerManager { //List tokensToRemove = new ArrayList(); context.configuration().validate(); Set foundContexts= new HashSet(); - + + Credentials credential = context.configuration().credentials(); + try { List entries = authProvider.get(context.configuration().startTokens()); diff --git a/src/main/java/org/gcube/smartgears/managers/ContextEvents.java b/src/main/java/org/gcube/smartgears/managers/ContextEvents.java index 8b771c2..224093b 100644 --- a/src/main/java/org/gcube/smartgears/managers/ContextEvents.java +++ b/src/main/java/org/gcube/smartgears/managers/ContextEvents.java @@ -2,12 +2,9 @@ package org.gcube.smartgears.managers; public class ContextEvents { - public static final String ADD_TOKEN_TO_CONTAINER ="AddTokenToContainer"; + public static final String ADD_CONTEXT_TO_CONTAINER ="AddContextToContainer"; - public static final String ADD_TOKEN_TO_APPLICATION ="AddTokenToApplication"; + public static final String REMOVE_CONTEXT_FROM_CONTAINER ="RemoveContextFromContainer"; - public static final String REMOVE_TOKEN_FROM_CONTAINER ="RemoveTokenFromContainer"; - - public static final String REMOVE_TOKEN_FROM_APPLICATION ="RemoveTokenFromApplication"; } diff --git a/src/main/java/org/gcube/smartgears/persistence/DefaultPersistence.java b/src/main/java/org/gcube/smartgears/persistence/DefaultPersistence.java deleted file mode 100644 index 21dbbc3..0000000 --- a/src/main/java/org/gcube/smartgears/persistence/DefaultPersistence.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.gcube.smartgears.persistence; - - -import static org.gcube.smartgears.utils.Utils.*; - -import java.io.File; - -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; - -import org.gcube.common.validator.annotations.NotNull; - -@XmlRootElement(name="persistence") -public class DefaultPersistence implements Persistence { - - @XmlAttribute(name="location") @NotNull - private String location; - - public DefaultPersistence() {} - - public DefaultPersistence(String location) { - - notNull("persistence location",location); - - this.location=location; - validate(); - } - - @Override - public String location() { - return location; - } - - @Override - public File writefile(String path) { - - notNull("relative path", path); - - return fileAt(new File(location, path).getAbsolutePath()).toWrite(); - } - - @Override - public File file(String path) { - - notNull("relative path", path); - - return fileAt(new File(location, path).getAbsolutePath()).toRead(); - } - - - //called after JAXB unmarshalling to purge unavailable handlers - void afterUnmarshal(Unmarshaller u, Object parent) { - - validate(); - } - - public void validate() { - - File locationDir = new File(location); - if (!(locationDir.exists() && locationDir.isDirectory() && locationDir.canRead() && locationDir.canWrite())) - throw new IllegalStateException("invalid node configuration: home "+location+" does not exist or is not a directory or cannot be accessed in read/write mode"); - - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((location == null) ? 0 : location.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - DefaultPersistence other = (DefaultPersistence) obj; - if (location == null) { - if (other.location != null) - return false; - } else if (!location.equals(other.location)) - return false; - return true; - } - - @Override - public String toString() { - return "local persistence in "+location; - } - -} diff --git a/src/main/java/org/gcube/smartgears/persistence/LocalPersistence.java b/src/main/java/org/gcube/smartgears/persistence/LocalPersistence.java new file mode 100644 index 0000000..9e9ca85 --- /dev/null +++ b/src/main/java/org/gcube/smartgears/persistence/LocalPersistence.java @@ -0,0 +1,65 @@ +package org.gcube.smartgears.persistence; + + +import static org.gcube.smartgears.utils.Utils.fileAt; +import static org.gcube.smartgears.utils.Utils.notNull; + +import java.io.File; + +import org.gcube.common.validator.annotations.NotEmpty; +import org.gcube.common.validator.annotations.NotNull; + +public class LocalPersistence implements PersistenceWriter { + + @NotNull @NotEmpty + private String location; + + protected LocalPersistence() {} + + public LocalPersistence(String location) { + + notNull("persistence location",location); + + this.location=location; + + validate(); + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + + @Override + public File writefile(String path) { + + notNull("relative path", path); + + return fileAt(new File(location, path).getAbsolutePath()).toWrite(); + } + + @Override + public File file(String path) { + + notNull("relative path", path); + + return fileAt(new File(location, path).getAbsolutePath()).toRead(); + } + + void initialize(){ + + } + + public void validate() { + + File locationDir = new File(location); + if (!(locationDir.exists() && locationDir.isDirectory() && locationDir.canRead() && locationDir.canWrite())) + throw new IllegalStateException("invalid node configuration: home "+location+" does not exist or is not a directory or cannot be accessed in read/write mode"); + + } + +} diff --git a/src/main/java/org/gcube/smartgears/persistence/Persistence.java b/src/main/java/org/gcube/smartgears/persistence/PersistenceWriter.java similarity index 65% rename from src/main/java/org/gcube/smartgears/persistence/Persistence.java rename to src/main/java/org/gcube/smartgears/persistence/PersistenceWriter.java index 058480e..528b350 100644 --- a/src/main/java/org/gcube/smartgears/persistence/Persistence.java +++ b/src/main/java/org/gcube/smartgears/persistence/PersistenceWriter.java @@ -2,12 +2,12 @@ package org.gcube.smartgears.persistence; import java.io.File; -public interface Persistence { - - String location(); - +public interface PersistenceWriter { + File file(String path); File writefile(String path); + + long getFreeSpace(); } \ No newline at end of file diff --git a/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java b/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java index 1466d25..0bf1e8e 100644 --- a/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java +++ b/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java @@ -221,7 +221,6 @@ public class DefaultProvider implements Provider { } } - // TODO we can check scopes here instead of in BridgedApplicationConfiguration constructor ApplicationConfiguration bridgedConfiguration = new BridgedApplicationConfiguration(context.configuration(), configuration); diff --git a/src/main/java/org/gcube/smartgears/provider/Provider.java b/src/main/java/org/gcube/smartgears/provider/Provider.java index 13f538d..40f1da3 100644 --- a/src/main/java/org/gcube/smartgears/provider/Provider.java +++ b/src/main/java/org/gcube/smartgears/provider/Provider.java @@ -10,6 +10,7 @@ import org.gcube.smartgears.configuration.container.ContainerHandlers; import org.gcube.smartgears.configuration.library.SmartGearsConfiguration; import org.gcube.smartgears.context.application.ApplicationContext; import org.gcube.smartgears.context.container.ContainerContext; +import org.gcube.smartgears.security.AuthorizationProvider; /** * Provides dependencies for container and application management. @@ -84,6 +85,6 @@ public interface Provider { * @param application the context of the application * @return the publisher implementation */ - AuthorizationProxy authorizationProxy(); + AuthorizationProvider authorizationProxy(); } diff --git a/src/main/java/org/gcube/smartgears/security/AuthorizationProvider.java b/src/main/java/org/gcube/smartgears/security/AuthorizationProvider.java new file mode 100644 index 0000000..13b5e86 --- /dev/null +++ b/src/main/java/org/gcube/smartgears/security/AuthorizationProvider.java @@ -0,0 +1,10 @@ +package org.gcube.smartgears.security; + +import java.util.Collection; + +public interface AuthorizationProvider { + + void connect(Credentials credentials) throws Exception; + + Collection getAllowedContexts(); +} diff --git a/src/main/java/org/gcube/smartgears/security/Credentials.java b/src/main/java/org/gcube/smartgears/security/Credentials.java new file mode 100644 index 0000000..088a338 --- /dev/null +++ b/src/main/java/org/gcube/smartgears/security/Credentials.java @@ -0,0 +1,5 @@ +package org.gcube.smartgears.security; + +public interface Credentials { + +} diff --git a/src/main/java/org/gcube/smartgears/security/DefaultAuthorizationProvider.java b/src/main/java/org/gcube/smartgears/security/DefaultAuthorizationProvider.java new file mode 100644 index 0000000..2645fff --- /dev/null +++ b/src/main/java/org/gcube/smartgears/security/DefaultAuthorizationProvider.java @@ -0,0 +1,14 @@ +package org.gcube.smartgears.security; + + + +public class DefaultAuthorizationProvider implements AuthorizationProvider { + + SimpleCredentials credentials; + + @Override + public void connect(Credentials credentials) { + this.credentials = (SimpleCredentials)credentials; + } + +} diff --git a/src/main/java/org/gcube/smartgears/security/SimpleCredentials.java b/src/main/java/org/gcube/smartgears/security/SimpleCredentials.java new file mode 100644 index 0000000..3c8a5ab --- /dev/null +++ b/src/main/java/org/gcube/smartgears/security/SimpleCredentials.java @@ -0,0 +1,67 @@ +package org.gcube.smartgears.security; + +import org.gcube.common.validator.annotations.NotEmpty; +import org.gcube.common.validator.annotations.NotNull; + +public class SimpleCredentials implements Credentials{ + + @NotNull @NotEmpty + String clientID; + + @NotNull @NotEmpty + String secret; + + public String getClientID() { + return clientID; + } + + public void setClientID(String clientID) { + this.clientID = clientID; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((clientID == null) ? 0 : clientID.hashCode()); + result = prime * result + ((secret == null) ? 0 : secret.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SimpleCredentials other = (SimpleCredentials) obj; + if (clientID == null) { + if (other.clientID != null) + return false; + } else if (!clientID.equals(other.clientID)) + return false; + if (secret == null) { + if (other.secret != null) + return false; + } else if (!secret.equals(other.secret)) + return false; + return true; + } + + @Override + public String toString() { + return "SimpleCredentials [clientID=" + clientID + ", secret=" + secret + "]"; + } + + +} diff --git a/src/test/java/app/SomeApp.java b/src/test/java/app/SomeApp.java index edc311d..aa108ad 100644 --- a/src/test/java/app/SomeApp.java +++ b/src/test/java/app/SomeApp.java @@ -10,6 +10,7 @@ import static utils.TestUtils.location; import static utils.TestUtils.servlet_name; import java.io.File; +import java.io.InputStream; import org.apache.catalina.Wrapper; import org.apache.catalina.core.StandardContext; @@ -18,13 +19,11 @@ import org.apache.commons.io.FileUtils; import org.apache.tomcat.util.scan.StandardJarScanner; import org.gcube.informationsystem.publisher.ScopedPublisher; import org.gcube.smartgears.Constants; -import org.gcube.smartgears.configuration.Mode; import org.gcube.smartgears.configuration.application.ApplicationConfiguration; import org.gcube.smartgears.configuration.application.ApplicationExtensions; import org.gcube.smartgears.configuration.application.ApplicationHandlers; import org.gcube.smartgears.configuration.application.DefaultApplicationConfiguration; import org.gcube.smartgears.configuration.container.ContainerConfiguration; -import org.gcube.smartgears.configuration.container.Site; import org.gcube.smartgears.context.application.ApplicationContext; import org.gcube.smartgears.managers.ContainerManager; import org.gcube.smartgears.provider.ProviderFactory; @@ -249,8 +248,7 @@ public class SomeApp { if (clean) cleanupInstallation(); - installContainerConfiguration(); - + if (deployConfiguration) deployConfiguration(); @@ -283,7 +281,7 @@ public class SomeApp { webapp.setServlet(new TestServlet(test)); - context.container().configuration().port(port()); + //context.container().configuration().port(port()); containerConfiguration = context.container().configuration(); } @@ -343,14 +341,7 @@ public class SomeApp { } // helpers - /** - * Installs the container configuration. - */ - private void installContainerConfiguration() { - - TestUtils.serialise(containerConfiguration(),containerConfigurationFile()); - - } + /** * Includes the configuration in the application's WAR. @@ -411,17 +402,15 @@ public class SomeApp { private ApplicationConfiguration defaultConfiguration() { - return new DefaultApplicationConfiguration().mode(Mode.offline).serviceClass("test-class").name("test-app").version("1.0"); + return new DefaultApplicationConfiguration().serviceClass("test-class").name("test-app").version("1.0"); } private ContainerConfiguration defaultContainerConfiguration() { - return new ContainerConfiguration().mode(Mode.offline).hostname("localhost").port(port()).infrastructure("gcube") - .site(new Site().country("it").location("rome").latitude("41.9000").longitude("12.5000")) - .property("test-prop1","foo") - .property("test-prop2","bar") - .publicationFrequency(5); + InputStream is = SomeApp.class.getResourceAsStream("/test-configuration.ini"); + + return ContainerConfiguration.load(is); } diff --git a/src/test/java/test/application/ConfigurationTest.java b/src/test/java/test/application/ConfigurationTest.java index c9d6d81..b9b84a3 100644 --- a/src/test/java/test/application/ConfigurationTest.java +++ b/src/test/java/test/application/ConfigurationTest.java @@ -5,14 +5,13 @@ import static junit.framework.Assert.assertNotNull; import java.io.ByteArrayInputStream; -import org.gcube.smartgears.configuration.Mode; import org.gcube.smartgears.configuration.application.ApplicationConfiguration; import org.gcube.smartgears.configuration.application.ApplicationConfigurationBinder; import org.gcube.smartgears.configuration.application.ApplicationExtensions; import org.gcube.smartgears.configuration.application.DefaultApplicationConfiguration; import org.gcube.smartgears.configuration.application.Include; import org.gcube.smartgears.extensions.ApplicationExtension; -import org.gcube.smartgears.persistence.DefaultPersistence; +import org.gcube.smartgears.persistence.LocalPersistence; import org.junit.Test; public class ConfigurationTest { @@ -99,14 +98,13 @@ public class ConfigurationTest { return new DefaultApplicationConfiguration() - .mode(Mode.offline) .context("ctx") .name("name") .serviceClass("class") .includes(new Include("/pathBis")) .version("version") .description("desc") - .persistence(new DefaultPersistence("target")); + .persistence(new LocalPersistence("target")); } diff --git a/src/test/java/test/container/ConfigurationTest.java b/src/test/java/test/container/ConfigurationTest.java index 0f29ef6..a20f772 100644 --- a/src/test/java/test/container/ConfigurationTest.java +++ b/src/test/java/test/container/ConfigurationTest.java @@ -1,19 +1,10 @@ package test.container; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; +import java.io.StringWriter; -import java.io.ByteArrayInputStream; -import java.util.Arrays; -import java.util.List; - -import org.gcube.smartgears.configuration.Mode; -import org.gcube.smartgears.configuration.application.ApplicationConfiguration; -import org.gcube.smartgears.configuration.application.DefaultApplicationConfiguration; import org.gcube.smartgears.configuration.container.ContainerConfiguration; -import org.gcube.smartgears.configuration.container.ContainerConfigurationBinder; -import org.gcube.smartgears.configuration.container.Site; -import org.gcube.smartgears.persistence.DefaultPersistence; +import org.ini4j.Ini; +import org.ini4j.Profile.Section; import org.junit.Test; public class ConfigurationTest { @@ -21,51 +12,30 @@ public class ConfigurationTest { @Test public void containerConfigurationBinds() throws Exception { - String appXml = "" + "name" + "class" - + "version" + "desc" + "" - + ""; - - String xml = "" - + "localhost" - + "8080" - + "gcube" - + "true " - +"token1" + "token2" + "" + appXml + "" - + "it" + "rome" + "41.9000" - + "12.5000" + "" + "" - + "" + "30" - + ""; - - ContainerConfigurationBinder binder = new ContainerConfigurationBinder(); - - ContainerConfiguration bound = binder.bind(new ByteArrayInputStream(xml.getBytes())); - + ContainerConfiguration bound = ContainerConfiguration + .load(ConfigurationTest.class.getResourceAsStream("/test-configuration.ini")); + bound.validate(); - - List scopes = bound.startTokens(); - - assertTrue(scopes.contains("token1")); - assertTrue(scopes.contains("token2")); - - assertEquals(sampleContainerConfiguration(), bound); - + } - private ContainerConfiguration sampleContainerConfiguration() { + @Test + public void iniStore() throws Exception { + Ini ini = new Ini(); - return new ContainerConfiguration().mode(Mode.offline).hostname("localhost").port(8080).infrastructure("gcube") - .startTokens(Arrays.asList("token1", "token2")) - .site(new Site().country("it").location("rome").latitude("41.9000").longitude("12.5000")) - .property("prop1", "val1").property("prop2", "val2").publicationFrequency(30) - .app(sampleAppConfiguration()).authorizeChildrenContext(true) - .persistence(new DefaultPersistence("target")); - - } - - private ApplicationConfiguration sampleAppConfiguration() { - - return new DefaultApplicationConfiguration().mode(Mode.offline).name("name").serviceClass("class") - .version("version").description("desc").persistence(new DefaultPersistence("target")); + // lets add a section, it will create needed intermediate sections as well + ini.add("root/child/sub"); + Section rsec = ini.get("root"); + rsec.add("test", "team"); + Section csec = rsec.getChild("child"); + csec.add("testchild", "pappo"); + Section ssec = csec.getChild("sub"); + ssec.add("testSec", "pippo"); + + StringWriter sw = new StringWriter(); + ini.store(sw); + + System.out.println(sw.toString()); } } diff --git a/src/test/java/test/container/PersistenceWriterTest.java b/src/test/java/test/container/PersistenceWriterTest.java new file mode 100644 index 0000000..f593fa5 --- /dev/null +++ b/src/test/java/test/container/PersistenceWriterTest.java @@ -0,0 +1,32 @@ +package test.container; + +import java.io.File; + +import org.gcube.common.validator.annotations.IsValid; +import org.gcube.common.validator.annotations.NotNull; +import org.gcube.smartgears.persistence.PersistenceWriter; + +public class PersistenceWriterTest implements PersistenceWriter{ + + @IsValid @NotNull + String location; + + @Override + public File file(String path) { + return null; + } + + @Override + public File writefile(String path) { + return null; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + +} diff --git a/src/test/java/utils/TestUtils.java b/src/test/java/utils/TestUtils.java index 61ebc8e..a148ca3 100644 --- a/src/test/java/utils/TestUtils.java +++ b/src/test/java/utils/TestUtils.java @@ -1,7 +1,5 @@ package utils; -import java.io.File; -import java.io.FileWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; @@ -13,7 +11,6 @@ import org.gcube.smartgears.configuration.application.ApplicationConfiguration; import org.gcube.smartgears.configuration.application.ApplicationExtensions; import org.gcube.smartgears.configuration.application.ApplicationHandlers; import org.gcube.smartgears.configuration.application.DefaultApplicationConfiguration; -import org.gcube.smartgears.configuration.container.ContainerConfiguration; import org.gcube.smartgears.extensions.ApplicationExtension; import org.gcube.smartgears.handlers.application.ApplicationHandler; @@ -41,34 +38,7 @@ public class TestUtils { } - /** - * Serialises a {@link ContainerConfiguration} to XML in a file. - * - * @param config the configuration - * @param the file - * @return the serialisation - * @throws RuntimeException if the configuration cannot be serialised - */ - public static void serialise(ContainerConfiguration config, File file) { - - //serialises configuration - - try { - JAXBContext ctx = JAXBContext.newInstance(ContainerConfiguration.class); - - FileWriter writer = new FileWriter(file); - - ctx.createMarshaller().marshal(config, writer); - - writer.flush(); - writer.close(); - - } catch (Exception e) { - - throw new RuntimeException("invalid service configuration", e); - } - } /** * Serialises a {@link ApplicationConfiguration} to XML. * diff --git a/src/test/resources/test-configuration.ini b/src/test/resources/test-configuration.ini new file mode 100644 index 0000000..d3b2c8d --- /dev/null +++ b/src/test/resources/test-configuration.ini @@ -0,0 +1,41 @@ +[node] +; mandatory +; optional fields: mode (online), publication-frequency-seconds (=60), authorizeChildrenContext (=false) +mode = offline +hostname = localhost +protocol= https +port = 8080 +infrastructure = gcube +authorizeChildrenContext = true +publicationFrequencyInSeconds = 60 + +[properties] +; not mandatory +SmartGearsDistribution = 0.0.1 +SmartGearsDistributionBundle = UnBundled + +[site] +; mandatory +country = it +location = rome +latitude = 41.9000 +longitude = 12.5000 + +[proxy] +; not mandatory +protocol = https +hostname = proxy +port = 80 + +[authorization] +; mandatory +; optional fields: provider (org.gcube.smartgears.security.DefaultAuthorizationProvider) +provider = org.gcube.smartgears.security.DefaultAuthorizationProvider +credentials.class = org.gcube.smartgears.security.SimpleCredentials +credentials.clientID = testClient +credentials.secret = testSecret + +[persistence] +; not mandatory (default is LocalPersistence writing in the ghn home) +class = test.container.PersistenceWriterTest +location = /state