Compare commits

...

16 Commits

Author SHA1 Message Date
AkshayJagadish-ne
c94a81114a WIFI-1669: TIP 1.0 Update SDK components in release 1.0 branch (#10) 2021-02-27 22:06:03 -05:00
Rahul Sharma
24149ad62e WIFI-1319: Adding sslEnabledProtocol to the SSL-Connector (#8) 2021-02-22 12:14:19 -05:00
Dmitry Toptygin
ce9ae55cd7 WIFI-1624 - in pom.xml files replace ${tip-wlan-cloud.release.version} with 0.0.1-SNAPSHOT to make sure that mvn release:update-versions command works 2021-02-20 10:18:09 -05:00
Dmitry Toptygin
c95521c672 WIFI-1551 - make deserializing mac address as byte array more forgiving - allow it to recover from ' ', '+', '/', '=' characters transparently 2021-02-11 15:52:48 -05:00
Dmitry Toptygin
66bea0dbdf WIFI-1551 - when serializing mac address as byte array we need to use Base64Variants.MODIFIED_FOR_URL class that instead of using plus and slash characters uses hyphen and underscore, respectively 2021-02-11 15:28:08 -05:00
Dmitry Toptygin
baa9453d12 WIFI-1437 - provide a way for 3rd-party developers to register methods to be called before REST controller methods 2021-02-01 18:40:04 -05:00
Dmitry Toptygin
ed6421865d expose ObjectMapper of the BaseJsonModel so that other framework related components get access to a fully configured object mapper that knows about all the subclasses of the BaseJsonModel 2021-01-28 11:34:23 -05:00
Dmitry Toptygin
71cf6b6156 in BaseJsonModel added methods to encode/decode strings in format used to store zipped json in postgresql bytea columns 2021-01-28 10:55:24 -05:00
Dmitry Toptygin
9cf640805d WIFI-1235 - added HasLocationId marker interface 2021-01-08 15:03:10 -05:00
ralphlee3
19e7361e7d WIFI 1251 custom claims processing (#7)
* [WIFI-1251] Adding claimsUrl for custom claims processing, refactoring authority enums

* [WIFI-1251] User to default to CustomerIT authority

* [WIFI-1251] Consolidating all instances of authority to the new class

* [WIFI-1251] Adding authorities in PortalUserRole, fixing environment variables

* [WIFI-1251] Fixing comments on clientId

* [WIFI-1226] callbackUrl removed, updated pom

* [WIFI-1251] Renaming claimsNamespace, removing colon to normalize namespace use

* [WIFI-1251] Defaulting namespace to wlan.telecominfraproject.com
2021-01-06 18:01:37 -05:00
Dmitry Toptygin
e5d2e42751 alow rdbms-related unit tests from different maven modules to be combined to set up composite schemas 2020-12-29 18:48:43 -05:00
Dmitry Toptygin
db60e2f763 added missing clone() methods to RadioBestApSettings, SourceSelectionSteering, and SourceSelectionValue 2020-12-22 13:16:36 -05:00
Dmitry Toptygin
661aecf98d WIFI-1212 allow extension of the portal user roles by the 3rd party vendors 2020-12-17 14:54:54 -05:00
Dmitry Toptygin
269b9f703c added prefix tip.wlan to maxHttpThreads property 2020-12-09 15:51:32 -05:00
Dmitry Toptygin
313092a1d3 HttpClientConfigResolver: allow to override values for maxConnectionsTotal and maxConnectionsPerRoute using environment variables 2020-12-09 15:37:49 -05:00
Mike Hansen
2519f9794b WIFI-1153: Add SAE SecurityType in wlan-cloud-base 2020-12-04 15:14:16 -05:00
52 changed files with 773 additions and 280 deletions

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-cassandra-tests</artifactId>
@@ -15,7 +14,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-cassandra</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>cloud-metrics</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>

View File

@@ -1,11 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-client</artifactId>
@@ -16,25 +14,25 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-container</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>cloud-metrics</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>

View File

@@ -50,6 +50,22 @@ public class HttpClientConfigResolver {
ret = HttpClientConfig.fromString(StreamUtils.copyToString((InputStream) configContent, StandardCharsets.UTF_8),
HttpClientConfig.class);
}
if(environment!=null){
//override values for maxConnectionsTotal and maxConnectionsPerRoute using environment variables, if provided
if(environment.getProperty("tip.wlan.httpClientConfig.maxConnectionsTotal") != null) {
int maxConnectionsTotal = Integer.parseInt(environment.getProperty("tip.wlan.httpClientConfig.maxConnectionsTotal"));
ret.setMaxConnectionsTotal(maxConnectionsTotal);
LOG.info("Overriding http client configuration maxConnectionsTotal {}", maxConnectionsTotal);
}
if(environment.getProperty("tip.wlan.httpClientConfig.maxConnectionsPerRoute") != null) {
int maxConnectionsPerRoute = Integer.parseInt(environment.getProperty("tip.wlan.httpClientConfig.maxConnectionsPerRoute"));
ret.setMaxConnectionsPerRoute(maxConnectionsPerRoute);
LOG.info("Overriding http client configuration maxConnectionsPerRoute {}", maxConnectionsPerRoute);
}
}
LOG.info("Got http client configuration from {}", configLocation);
return ret;
} catch (Exception e) {

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-container</artifactId>
@@ -18,7 +18,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
@@ -32,7 +32,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>cloud-metrics</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Auth0 dependencies -->

View File

@@ -35,7 +35,7 @@ public class NoSSLContainerCustomizer extends ServletContainerCustomizer {
@Override
public void customize(Connector connector) {
connector.setAttribute(ConnectorType.CONNECTOR_ATTRIBUTE_NAME, ConnectorType.externalConnector);
connector.setAttribute("maxThreads", Integer.parseInt(appContext.getEnvironment().getProperty("maxHttpThreads", "100")));
connector.setAttribute("maxThreads", Integer.parseInt(appContext.getEnvironment().getProperty("tip.wlan.maxHttpThreads", "100")));
enableCompression(connector);

View File

@@ -178,8 +178,14 @@ public abstract class ServletContainerCustomizer implements WebServerFactoryCust
LOG.debug("setting SSL useServerCipherSuitesOrder to {}", bValue);
connector.setAttribute("useServerCipherSuitesOrder", bValue);
}
connector.setAttribute("maxThreads", Integer.parseInt(appContext.getEnvironment().getProperty("maxHttpThreads", "100")));
strValue = getSslProperty(environment, "sslEnabledProtocols", sslPropPrefix);
if (null != strValue) {
LOG.debug("setting SSL EnabledProtocols to {}", strValue);
connector.setProperty("enabledProtocols", strValue);
}
connector.setAttribute("maxThreads", Integer.parseInt(appContext.getEnvironment().getProperty("tip.wlan.maxHttpThreads", "100")));
LOG.info("Configured https connector for port {} with {} threads", connector.getPort(), connector.getAttribute("maxThreads"));
}

View File

@@ -66,6 +66,7 @@ import org.springframework.security.web.header.HeaderWriter;
import org.springframework.security.web.util.matcher.AnyRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import com.telecominfraproject.wlan.core.model.role.PortalUserRole;
import com.telecominfraproject.wlan.core.server.container.ConnectorProperties;
import com.telecominfraproject.wlan.core.server.security.auth0.Auth0AuthenticationEntryPoint;
import com.telecominfraproject.wlan.core.server.security.auth0.Auth0AuthenticationFilter;
@@ -87,14 +88,9 @@ public abstract class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private static final Logger LOG = LoggerFactory.getLogger(WebSecurityConfig.class);
public static final String AUTH_CACHE_NAME = "auth_details_cache";
public static final SimpleGrantedAuthority USER_AUTHORITY = new SimpleGrantedAuthority("ROLE_USER");
public static final SimpleGrantedAuthority MSP_AUTHORITY = new SimpleGrantedAuthority("ROLE_MSP");
public static final SimpleGrantedAuthority SERVICE_PROVIDER_AUTHORITY = new SimpleGrantedAuthority("ROLE_SERVICE_PROVIDER");
public static final SimpleGrantedAuthority TECH_SUPPORT_AUTHORITY = new SimpleGrantedAuthority("ROLE_TECH_SUPPORT");
public static final SimpleGrantedAuthority CUSTOMER_EQUIPMENT_AUTHORITY = new SimpleGrantedAuthority("ROLE_CUSTOMER_EQUIPMENT");
public static final SimpleGrantedAuthority API_AUTHORITY = new SimpleGrantedAuthority("ROLE_API");
/**
* Maximum number of auth0 provider
@@ -109,11 +105,13 @@ public abstract class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public UserDetailsService userDetailsService() {
List<SimpleGrantedAuthority> authorities = PortalUserRole.getAllAuthorities();
authorities.add(CUSTOMER_EQUIPMENT_AUTHORITY);
authorities.add(API_AUTHORITY);
UserDetailsService uds = new InMemoryUserDetailsManager(
Arrays.asList(new UserDetails[] { new User(environment.getProperty("tip.wlan.serviceUser", "user"),
environment.getProperty("tip.wlan.servicePassword", "password"), true, true, true, true,
Arrays.asList(new SimpleGrantedAuthority[] { USER_AUTHORITY, MSP_AUTHORITY,
SERVICE_PROVIDER_AUTHORITY, TECH_SUPPORT_AUTHORITY, API_AUTHORITY })), }));
authorities)}));
return uds;
}
@@ -865,41 +863,42 @@ public abstract class WebSecurityConfig extends WebSecurityConfigurerAdapter {
*
* @param providerIndex
* @param defaultProperties
* @return null if clientId is not set.
* @return null if clientSecret is not set.
* @throws Exception
*/
protected Auth0AuthenticationProvider createAuth0AuthenticationProvider(int providerIndex) throws Exception {
String clientId;
String clientSecret;
String issuer;
String accessTypeValue;
String jwksLocation;
String claimsNamespace;
if (0 == providerIndex) {
clientId = environment.getProperty("tip.wlan.auth0.clientId", DEFAULT_AUTH0_PROPERTY);
clientSecret = environment.getProperty("tip.wlan.auth0.clientSecret", DEFAULT_AUTH0_PROPERTY);
issuer = environment.getProperty("tip.wlan.auth0.issuerUri", DEFAULT_AUTH0_PROPERTY);
accessTypeValue = environment.getProperty("tip.wlan.auth0.accessType",
getDefaultAccessType(providerIndex));
jwksLocation = environment.getProperty("tip.wlan.auth0.jwksLocation", DEFAULT_AUTH0_PROPERTY);
claimsNamespace = environment.getProperty("tip.wlan.auth0.claimsNamespace", "https://wlan.telecominfraproject.com/"); // See Auth0UserDetails
} else {
clientId = environment.getProperty("tip.wlan.auth0.clientId" + providerIndex);
clientSecret = environment.getProperty("tip.wlan.auth0.clientSecret" + providerIndex);
issuer = environment.getProperty("tip.wlan.auth0.issuer" + providerIndex);
issuer = environment.getProperty("tip.wlan.auth0.issuerUri" + providerIndex);
accessTypeValue = environment.getProperty("tip.wlan.auth0.accessType" + providerIndex,
getDefaultAccessType(providerIndex));
jwksLocation = environment.getProperty("tip.wlan.auth0.jwksLocation" + providerIndex);
claimsNamespace = environment.getProperty("tip.wlan.auth0.claimsNamespace" + providerIndex, "https://wlan.telecominfraproject.com/");
}
if (null == clientId) {
// Be default, use HS256 decoding which requires clientSecret
if (null == clientSecret) {
return null;
}
try {
AccessType accessType = AccessType.valueOf(accessTypeValue);
Auth0AuthenticationProvider auth0Provider = new Auth0AuthenticationProvider(accessType);
auth0Provider.setClientId(clientId);
auth0Provider.setClientSecret(clientSecret);
auth0Provider.setIssuer(issuer);
auth0Provider.setJwksLocation(jwksLocation);
auth0Provider.setClaimsNamespace(claimsNamespace);
auth0Provider.afterPropertiesSet();
LOG.info("Loaded configuration for auth0 provider {}", providerIndex);
return auth0Provider;

View File

@@ -34,7 +34,7 @@ import com.telecominfraproject.wlan.core.server.security.AccessType;
import com.telecominfraproject.wlan.server.exceptions.ConfigurationException;
/**
* Class that verifies the JWT token and in case of beeing valid, it will set
* Class that verifies the JWT token and in case of being valid, it will set
* the userdetails in the authentication object
*
* @author Daniel Teixeira
@@ -47,9 +47,9 @@ public class Auth0AuthenticationProvider implements AuthenticationProvider, Init
private ObjectMapper mapper = new ObjectMapper();
private String clientSecret = null;
private String clientId = null;
private String issuer = null;
private String jwksLocation = null;
private String claimsNamespace = null;
private final AccessType accessType;
private static final AuthenticationException AUTH_ERROR = new Auth0TokenException("Authentication error occured");
@@ -90,7 +90,7 @@ public class Auth0AuthenticationProvider implements AuthenticationProvider, Init
jwt = verifier.verify(token);
LOG.trace("Decoded JWT token {}", jwt);
tokenAuth.setAuthenticated(true);
tokenAuth.setPrincipal(new Auth0UserDetails(jwt, this.accessType));
tokenAuth.setPrincipal(new Auth0UserDetails(jwt, this.accessType, claimsNamespace));
tokenAuth.setDetails(jwt);
return authentication;
@@ -114,8 +114,8 @@ public class Auth0AuthenticationProvider implements AuthenticationProvider, Init
}
public void afterPropertiesSet() throws Exception {
if ((clientSecret == null) || (clientId == null) || (issuer == null)) {
throw new ConfigurationException("Client secret, client id, or issuer URI is not set for Auth0AuthenticationProvider");
if ((clientSecret == null) || (issuer == null)) {
throw new ConfigurationException("Client secret or issuer URI is not set for Auth0AuthenticationProvider");
}
}
@@ -202,14 +202,6 @@ public class Auth0AuthenticationProvider implements AuthenticationProvider, Init
this.clientSecret = clientSecret;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getIssuer() {
return issuer;
}
@@ -226,7 +218,15 @@ public class Auth0AuthenticationProvider implements AuthenticationProvider, Init
this.jwksLocation = jwksLocation;
}
/**
public String getClaimsNamespace() {
return claimsNamespace;
}
public void setClaimsNamespace(String claimsNamespace) {
this.claimsNamespace = claimsNamespace;
}
/**
* Use to encode raw secret to Base 64 URL safe string
*
* @param args

View File

@@ -2,6 +2,7 @@ package com.telecominfraproject.wlan.core.server.security.auth0;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -10,6 +11,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.telecominfraproject.wlan.core.model.role.PortalUserRole;
import com.telecominfraproject.wlan.core.server.security.AccessType;
import com.telecominfraproject.wlan.core.server.security.AuthProviderInfo;
@@ -17,6 +19,8 @@ import com.telecominfraproject.wlan.core.server.security.AuthProviderInfo;
* Implementation of UserDetails in compliance with the decoded object returned
* by the Auth0 JWT
*
* claimsNamespace is used to allow for OIDC compliance of custom claims in JWT.
*
* @author Daniel Teixeira
*
*/
@@ -35,13 +39,32 @@ public class Auth0UserDetails implements UserDetails, AuthProviderInfo {
private static final String ROLES_CLAIM = "roles";
private static final Log LOGGER = LogFactory.getLog(Auth0UserDetails.class);
public Auth0UserDetails(DecodedJWT jwt, AccessType accessType) {
this(jwt, accessType, null);
}
public Auth0UserDetails(DecodedJWT jwt, AccessType accessType, String claimsNamespace) {
this.accessType = accessType;
if (!jwt.getClaim(EMAIL_CLAIM).isNull()) {
this.username = jwt.getClaim(EMAIL_CLAIM).asString();
} else if (!jwt.getClaim(NICKNAME_CLAIM).isNull()) {
this.username = jwt.getClaim(NICKNAME_CLAIM).asString();
String emailClaim;
String emailVerifiedClaim;
String nicknameClaim;
String rolesClaim;
if (claimsNamespace != null) {
emailClaim = claimsNamespace + EMAIL_CLAIM;
emailVerifiedClaim = claimsNamespace + EMAIL_VERIFIED_CLAIM;
nicknameClaim = claimsNamespace + NICKNAME_CLAIM;
rolesClaim = claimsNamespace + ROLES_CLAIM;
} else {
emailClaim = EMAIL_CLAIM;
emailVerifiedClaim = EMAIL_VERIFIED_CLAIM;
nicknameClaim = NICKNAME_CLAIM;
rolesClaim = ROLES_CLAIM;
}
if (!jwt.getClaim(emailClaim).isNull()) {
this.username = jwt.getClaim(emailClaim).asString();
} else if (!jwt.getClaim(nicknameClaim).isNull()) {
this.username = jwt.getClaim(nicknameClaim).asString();
} else if (jwt.getId() != null) {
this.username = jwt.getId();
} else if (jwt.getSubject() != null) {
@@ -50,16 +73,16 @@ public class Auth0UserDetails implements UserDetails, AuthProviderInfo {
this.username = "UNKNOWN_USER";
}
if (!jwt.getClaim(EMAIL_CLAIM).isNull()) {
this.emailVerified = Boolean.valueOf(jwt.getClaim(EMAIL_VERIFIED_CLAIM).toString());
if (!jwt.getClaim(emailClaim).isNull()) {
this.emailVerified = Boolean.valueOf(jwt.getClaim(emailVerifiedClaim).toString());
}
// set authorities
authorities = new ArrayList<>();
if (!jwt.getClaim(ROLES_CLAIM).isNull()) {
ArrayList<String> roles = null;
if (!jwt.getClaim(rolesClaim).isNull()) {
List<String> roles = null;
try {
roles = (ArrayList<String>) jwt.getClaim(ROLES_CLAIM).asList(String.class);
roles = jwt.getClaim(rolesClaim).asList(String.class);
for (String role : roles) {
authorities.add(new SimpleGrantedAuthority(role));
}
@@ -68,9 +91,9 @@ public class Auth0UserDetails implements UserDetails, AuthProviderInfo {
}
}
// By default if nothing is added
// By default, set to CustomerIT authority if nothing is added
if (authorities.isEmpty()) {
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
authorities.add(PortalUserRole.CustomerIT.getAuthority());
}
this.details = jwt;

View File

@@ -0,0 +1,33 @@
package com.telecominfraproject.wlan.core.server.webconfig;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
@Configuration
public class ByteArrayHttpMessageConverterConfig {
/**
* Create byte array http message converter
* @return
*/
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());
return arrayHttpMessageConverter;
}
private List<MediaType> getSupportedMediaTypes() {
List<MediaType> list = new ArrayList<>();
list.add(MediaType.APPLICATION_OCTET_STREAM);
list.add(MediaType.IMAGE_JPEG);
list.add(MediaType.IMAGE_PNG);
return list;
}
}

View File

@@ -0,0 +1,57 @@
package com.telecominfraproject.wlan.core.server.webconfig;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Profile;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerMethod;
/**
* This is an example of ServletPreInvocableHandler.
* To enable it - activate spring profile "useExampleServletPreInvocableHandler".
*
* @author dtop
*
*/
@Component
@Profile("useExampleServletPreInvocableHandler")
public class ExampleServletPreInvocableHandler implements ServletPreInvocableHandler {
final static Logger LOG = LoggerFactory.getLogger(ExampleServletPreInvocableHandler.class);
@Override
public void preInvoke(HandlerMethod handlerMethod, Object[] args) {
RequestMapping reqMapping = handlerMethod.getMethodAnnotation(RequestMapping.class);
MethodParameter[] methodParamDefs = handlerMethod.getMethodParameters();
Map<String, Object> methodParams = new HashMap<>();
String pName;
for(int i=0; i< args.length; i++) {
if(i< methodParamDefs.length) {
pName = methodParamDefs[i].getParameterName();
if(pName==null) {
pName = "unknown" + i;
}
} else {
pName = "unknown" + i;
}
methodParams.put(pName, args[i]);
}
LOG.info("Calling doInvoke on {}.{} : {} {} with parameters {} ", handlerMethod.getBean().getClass().getName(), handlerMethod.getMethod().getName(),
reqMapping.path(), reqMapping.method(), methodParams);
//TODO: invoke some application logic in here, like fine-grained role-based access control
if(reqMapping.path()[0].equals("/equipment/forCustomerWithFilter")) {
throw new RuntimeException("Cannot do that!");
}
}
}

View File

@@ -0,0 +1,17 @@
package com.telecominfraproject.wlan.core.server.webconfig;
import org.springframework.web.method.HandlerMethod;
/**
* This interface defines a method that is called after all the parameters are deserialized and converted to java objects but before the Controller method gets called.
* Can be used for fine-grained role-based access control.
* Many classes can implement this interface.
* When marked as @Bean, all such classes will be registered and called before every Controller method.
*
* @see ExampleServletPreInvocableHandler
* @author dtop
*
*/
public interface ServletPreInvocableHandler {
void preInvoke(HandlerMethod handlerMethod, Object[] args);
}

View File

@@ -6,18 +6,16 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.MediaType;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
@@ -28,9 +26,14 @@ import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
@Configuration
//@EnableWebMvc - DTOP: do not use this, it will break mapping for index.html file
// see http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-auto-configuration
public class WebConfig extends WebMvcConfigurerAdapter {
public class WebConfig implements WebMvcConfigurer {
@Autowired
private Environment environment;
@Autowired
private ByteArrayHttpMessageConverter byteArrayHttpMessageConverter;
@Autowired private Environment environment;
private static final Logger LOG = LoggerFactory.getLogger(WebConfig.class);
private static final String WEB_RESOURCE_PROP = "tip.wlan.webResources";
@@ -54,8 +57,6 @@ public class WebConfig extends WebMvcConfigurerAdapter {
resourceHandlerRegistration.setCachePeriod(Integer.getInteger("tip.wlan.webResources.cachePeriodSec", 0));
}
super.addResourceHandlers(registry);
}
@Override
@@ -91,26 +92,7 @@ public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(byteArrayHttpMessageConverter());
}
/**
* Create byte array http message converter
* @return
*/
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());
return arrayHttpMessageConverter;
}
private List<MediaType> getSupportedMediaTypes() {
List<MediaType> list = new ArrayList<>();
list.add(MediaType.APPLICATION_OCTET_STREAM);
list.add(MediaType.IMAGE_JPEG);
list.add(MediaType.IMAGE_PNG);
return list;
converters.add(byteArrayHttpMessageConverter);
}
}

View File

@@ -4,9 +4,11 @@
package com.telecominfraproject.wlan.core.server.webconfig;
import java.lang.reflect.Method;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -14,19 +16,30 @@ import org.springframework.context.annotation.Profile;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod;
/**
* @author yongli
* @author dtop
*
*/
@Configuration
public class WebMvcRegistrationsConfiguration {
final static Logger LOG = LoggerFactory.getLogger(WebMvcRegistrationsConfiguration.class);
@Autowired(required = false)
private List<ServletPreInvocableHandler> servletPreInvocableHandlers;
/**
* Use adaptor to filter out RequestMapping methods based on condition
* Use adaptor to filter out RequestMapping methods based on condition.<br>
* Provide a way to register pre-invoke servlet handlers - to have common logic applied
* after the parameters have been parsed and converted to java objects but before the Controller method itself is called.
* @see ExampleServletPreInvocableHandler
* @see ServletPreInvocableHandler
*
* @param environment
* @return
@@ -34,6 +47,11 @@ public class WebMvcRegistrationsConfiguration {
@Bean
public WebMvcRegistrations mvcRegistrations(Environment environment) {
LOG.info("Customizing WebMvcRegistrations");
if(servletPreInvocableHandlers!=null) {
servletPreInvocableHandlers.forEach(h -> LOG.info("registering pre-invoke servlet handler {}", h) );
}
return new WebMvcRegistrations() {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
@@ -63,6 +81,28 @@ public class WebMvcRegistrationsConfiguration {
}
};
}
@Override
public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
return new RequestMappingHandlerAdapter() {
@Override
protected ServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) {
return new ServletInvocableHandlerMethod(handlerMethod) {
@Override
protected Object doInvoke(Object... args) throws Exception {
//apply all registered pre-invoke servlet handlers
if(servletPreInvocableHandlers!=null) {
servletPreInvocableHandlers.forEach(h -> h.preInvoke(handlerMethod, args) );
}
return super.doInvoke(args);
}
};
}
};
}
};
}
}

View File

@@ -1,11 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-datastore-inmemory</artifactId>
@@ -15,7 +13,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-elasticsearch</artifactId>
@@ -15,12 +14,12 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- ElasticSearch dependencies -->
<dependency>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-exceptions</artifactId>

View File

@@ -1,11 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-hazelcast-client</artifactId>
@@ -23,12 +21,12 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>common-hazelcast</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-hierarchical-datastore</artifactId>
@@ -13,17 +13,17 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-hazelcast-client</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>cloud-metrics</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-jdbc-tests</artifactId>
@@ -17,7 +16,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>

View File

@@ -1,18 +1,11 @@
package com.telecominfraproject.wlan.core.server.jdbc.test;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import java.io.IOException;
import java.lang.reflect.Field;
import javax.sql.DataSource;
import org.junit.runner.RunWith;
import org.reflections.Reflections;
import org.reflections.scanners.ResourcesScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,18 +15,19 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.transaction.AfterTransaction;
import org.springframework.test.context.transaction.BeforeTransaction;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.server.jdbc.BaseJDbcDataSource;
import com.telecominfraproject.wlan.core.server.jdbc.BaseKeyColumnConverter;
import com.telecominfraproject.wlan.core.server.jdbc.KeyColumnUpperCaseConverter;
@@ -100,51 +94,68 @@ public abstract class BaseJdbcTest {
// creates a HSQL in-memory db populated from scripts
// classpath:schema-hsqldb-test.sql and classpath:test-data.sql
// this will auto-wire DataSource object
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder()
.addScript("classpath:schema-hsqldb-test.sql");
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
// If the EmbeddedDatabaseBuilder class had a following method, we would have used it directly:
// public EmbeddedDatabaseBuilder addScript(Resource scriptResource) {
// this.databasePopulator.addScript(scriptResource);
// return this;
// }
// But it does not have this method, and we will have to use reflection to achieve similar effect.
//
// We need to expose ResourceDatabasePopulator databasePopulator field of the
// EmbeddedDatabaseBuilder to be able to pass to it resources with the same name
// in the classpath, i.e. schema-hsqldb-test.sql files that are defined in
// different modules
ResourceDatabasePopulator dbPopulator;
try {
Field dbPopulatorField = EmbeddedDatabaseBuilder.class.getDeclaredField("databasePopulator");
//the field is private, so we have to use a hammer
dbPopulatorField.setAccessible(true);
dbPopulator = (ResourceDatabasePopulator) dbPopulatorField.get(builder);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
throw new RuntimeException("Cannot get access to dbPopulator of the EmbeddedDatabaseBuilder : " + e.getMessage(), e);
}
//
// Add the schema-hsqldb-test.sql scripts to the DB builder
//
try {
PathMatchingResourcePatternResolver pRes = new PathMatchingResourcePatternResolver();
Resource[] resources = pRes.getResources("classpath*:schema-hsqldb-test.sql");
if(resources!=null) {
for(Resource r: resources) {
dbPopulator.addScript(r);
LOG.debug("Adding SQL script {} - {}", r.getFilename(), r.getURI());
}
}
} catch (IOException e) {
throw new RuntimeException("Cannot load SQL scripts: " + e.getMessage(), e);
}
builder.generateUniqueName(true);
//
// We only want to add the test-data.sql if the file actually
// exists.
// Now add the test-data.sql scripts to the DB builder
//
Set<String> testDataFiles = getReflections().getResources(Pattern.compile("test-data.sql"));
if (!CollectionUtils.isEmpty(testDataFiles)) {
builder.addScript("classpath:test-data.sql");
try {
PathMatchingResourcePatternResolver pRes = new PathMatchingResourcePatternResolver();
Resource[] resources = pRes.getResources("classpath*:test-data.sql");
if(resources!=null) {
for(Resource r: resources) {
dbPopulator.addScript(r);
LOG.debug("Adding SQL script {} - {}", r.getFilename(), r.getURI());
}
}
} catch (IOException e) {
throw new RuntimeException("Cannot load SQL scripts: ", e);
}
EmbeddedDatabase db = builder.build();
return new BaseJdbcTestDatabase(db, new KeyColumnUpperCaseConverter());
}
public static Reflections getReflections() {
//scan urls that contain 'com.telecominfraproject.wlan' and vendor-specific top level packages, use the ResourcesScanner
List<URL> urls = new ArrayList<>();
urls.addAll(ClasspathHelper.forPackage("com.telecominfraproject.wlan"));
//add vendor packages
String vendorTopLevelPackages = BaseJsonModel.getVendorTopLevelPackages();
if(vendorTopLevelPackages!=null) {
String[] vendorPkgs = vendorTopLevelPackages.split(",");
for(int i=0; i< vendorPkgs.length; i++) {
if(vendorPkgs[i].trim().isEmpty()) {
continue;
}
urls.addAll(ClasspathHelper.forPackage(vendorPkgs[i]));
}
}
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setUrls(urls)
.setScanners(new ResourcesScanner() ));
return reflections;
return new BaseJdbcTestDatabase(db, new KeyColumnUpperCaseConverter());
}
@Bean

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-jdbc</artifactId>
@@ -41,7 +41,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>cloud-metrics</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -16,7 +15,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,11 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-models</artifactId>
@@ -16,20 +14,20 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>json-patch-tip</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- this is used to register all subclasses of BaseJsonModel for deserialization -->
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>reflections-tip</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
@@ -45,6 +43,11 @@
<artifactId>base62</artifactId>
<version>${seruco.base62.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
</dependencies>

View File

@@ -4,9 +4,11 @@ import java.util.Arrays;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.serializers.Base64UrlByteArrayDeserializer;
import com.telecominfraproject.wlan.core.model.serializers.Base64UrlByteArraySerializer;
@JsonSerialize()
@JsonIgnoreProperties(ignoreUnknown = true)
@@ -40,10 +42,12 @@ public class MacAddress extends BaseJsonModel implements Comparable<MacAddress>
(byte) ((valueAsLong >> 8) & 0xff), (byte) (valueAsLong & 0xff) });
}
@JsonDeserialize(using = Base64UrlByteArrayDeserializer.class)
public void setAddress(byte[] address) {
this.address = address;
}
@JsonSerialize(using = Base64UrlByteArraySerializer.class)
public byte[] getAddress() {
return this.address;
}

View File

@@ -104,4 +104,8 @@ public class RadioBestApSettings extends BaseJsonModel
return false;
}
@Override
public RadioBestApSettings clone() {
return (RadioBestApSettings) super.clone();
}
}

View File

@@ -9,6 +9,7 @@ public enum SecurityType
OPEN,
RADIUS,
PSK,
SAE,
UNSUPPORTED;

View File

@@ -38,4 +38,15 @@ public class SourceSelectionSteering extends AbstractSource<RadioBestApSettings>
return false;
}
@Override
public SourceSelectionSteering clone() {
SourceSelectionSteering ret = (SourceSelectionSteering) super.clone();
if(this.value!=null) {
ret.value = this.value.clone();
}
return ret;
}
}

View File

@@ -47,4 +47,10 @@ public class SourceSelectionValue extends AbstractSource<Integer>{
return false;
}
@Override
public SourceSelectionValue clone() {
SourceSelectionValue ret = (SourceSelectionValue) super.clone();
return ret;
}
}

View File

@@ -89,6 +89,11 @@ public abstract class BaseJsonModel implements Cloneable, Serializable {
PRETTY_WRITTER = MAPPER.writer().withDefaultPrettyPrinter();
}
public static ObjectMapper getMapper() {
return MAPPER;
}
/**
* For NoSQL databases we do not use synthetic keys, but they are still part of the object model.
* This method allows us to calculate a value of synthetic key from two long elements, for example equipmentId and timestamp.
@@ -404,7 +409,48 @@ public abstract class BaseJsonModel implements Cloneable, Serializable {
return listFromString(jsonPayload, clazz);
}
public static void main(String[] args) {
public static void main_1(String[] args) {
String plainStr = "{\"model_type\":\"CustomerDetails\",\"autoProvisioning\":{\"model_type\":\"EquipmentAutoProvisioningSettings\",\"enabled\":true,\"locationId\":8,\"equipmentProfileIdPerModel\":{\"TIP_AP\":5,\"ECW5410\":6,\"ECW5211\":6,\"AP2220\":6,\"EA8300-CA\":5,\"EA8300\":5,\"default\":5}},\"bannedChannels\":[]}";
String encZipStr = "504b03041400080808006b513c5200000000000000000000000001000000615d4f3d0bc23010fd2f375768ab15c9166a870e4240c141445273d5409ad4f62288f4bf9b561d74ba77efde07f784c62934277ab4080c72df936bb05b23496d7a88407a72a27377dd6b67b5bd007bfe5a8a9bd76d8396f89f728b44618c216865655001a3ce6304c69d250551199855b87e1382bbd6064b25b0db8c1d63d9ae14272e80651114f93e5b2431b0e51ba74932612ed234fdd07c358fe359cedf86699ba0c25a7a43010f430495b416557e1d4778931d8ec30b504b0708be151e61b70000000a010000504b010214001400080808006b513c52be151e61b70000000a01000001000000000000000000000000000000000061504b050600000000010001002f000000e60000000000";
decodePostgresGzipBytea(encZipStr);
encodePostgresGzipBytea(plainStr);
}
public static void encodePostgresGzipBytea(String plainStr) {
byte[] bytes = BaseJsonModel.toZippedBytesFromString(plainStr);
StringBuilder encZipStr = new StringBuilder(bytes.length * 2);
String oneByteStr;
int unsignedByte;
for(int i = 0; i<bytes.length; i++) {
unsignedByte = 0x00ff & bytes[i];
oneByteStr = Integer.toHexString(unsignedByte);
if(oneByteStr.length()<2) {
oneByteStr = "0" + oneByteStr;
}
encZipStr.append( oneByteStr );
}
System.out.println(encZipStr.toString());
}
public static void decodePostgresGzipBytea(String encZipStr) {
byte[] bytes = new byte[encZipStr.length()/2];
for(int i = 0; i+2<encZipStr.length(); i+=2) {
bytes[i/2] = (byte) Integer.parseUnsignedInt(encZipStr, i, i+2, 16);
}
System.out.println(BaseJsonModel.fromZippedBytesAsString(bytes));
}
public static void main_syntheticKey(String[] args) {
long one = 1;
long maxEncodable = 0x3FFFFFL;

View File

@@ -0,0 +1,14 @@
package com.telecominfraproject.wlan.core.model.json.interfaces;
/**
* Marker interface that tells if current object can provide locationId for which it belongs to
* @author dtop
*
*/
public interface HasLocationId {
/**
* @return locationId for which this object belongs to
*/
long getLocationId();
}

View File

@@ -3,105 +3,152 @@
*/
package com.telecominfraproject.wlan.core.model.role;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.telecominfraproject.wlan.core.model.json.JsonDeserializationUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.telecominfraproject.wlan.core.model.extensibleenum.EnumWithId;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
/**
* All available roles for the portal users that can be handled by the CloudSDK.
* <br>This enumeration-like class can be extended by vendors - new elements can be defined by extending this class like so:
* <br>
* <pre>
* public class VendorExtendedPortalUserRole extends PortalUserRole {
*
* public static final PortalUserRole
* VENDOR_USER_ROLE_A = new VendorExtendedPortalUserRole(100, "VENDOR_USER_ROLE_A", 5) ,
* VENDOR_USER_ROLE_B = new VendorExtendedPortalUserRole(101, "VENDOR_USER_ROLE_B", 5)
* ;
*
* private VendorExtendedPortalUserRole(int id, String name, int permissionLevel) {
* super(id, name, permissionLevel);
* }
*
* }
* </pre>
* @see com.telecominfraproject.wlan.core.model.extensibleenum.EnumWithId
* @see com.telecominfraproject.wlan.core.model.role.vendorextensions.VendorExtendedPortalUserRole
* <br>
* @author dtop
* @author ekeddy
*
* Defines the various user roles and permissions. Highest permission
* level has greatest permission.
*/
public enum PortalUserRole {
public class PortalUserRole implements EnumWithId {
private static final Logger LOG = LoggerFactory.getLogger(PortalUserRole.class);
private static Object lock = new Object();
private static final Map<Integer, PortalUserRole> ELEMENTS = new ConcurrentHashMap<>();
private static final Map<String, PortalUserRole> ELEMENTS_BY_NAME = new ConcurrentHashMap<>();
public static final PortalUserRole
/**
* Public user - Read Only
*/
Public(0, 0),
Public = new PortalUserRole(0, "Public", 0),
/**
* Customer - Read Write
*/
CustomerIT(1, 10),
CustomerIT = new PortalUserRole(1, "CustomerIT", 10),
/**
* MSP - Read Write
*/
ManagedServiceProvider(2, 20),
ManagedServiceProvider = new PortalUserRole(2, "ManagedServiceProvider", 20),
/**
* Service Distributor - Read Write
*/
Distributor(3, 30),
Distributor = new PortalUserRole(3, "Distributor", 30),
/**
* Technical Support - Read Write
*/
TechSupport(4, 40),
TechSupport = new PortalUserRole(4, "TechSupport", 40),
/**
* Super User - Read Write
*/
SuperUser(Integer.MAX_VALUE, Integer.MAX_VALUE),
SuperUser = new PortalUserRole(Integer.MAX_VALUE, "SuperUser", Integer.MAX_VALUE),
/**
* Customer - Read Only
*/
CustomerIT_RO(5, 5),
CustomerIT_RO = new PortalUserRole(5, "CustomerIT_RO", 5),
/**
* MSP - Read Only
*/
ManagedServiceProvider_RO(6, 15),
ManagedServiceProvider_RO = new PortalUserRole(6, "ManagedServiceProvider_RO", 15),
/**
* Service Distributor - Read Only
*/
Distributor_RO(7, 25),
Distributor_RO = new PortalUserRole(7, "Distributor_RO", 25),
/**
* Technical Support - Read Only
*/
TechSupport_RO(8, 35),
TechSupport_RO = new PortalUserRole(8, "TechSupport_RO", 35),
/**
* Super User - Read Only
*/
SuperUser_RO(Integer.MAX_VALUE - 1, Integer.MAX_VALUE - 5),
SuperUser_RO = new PortalUserRole(Integer.MAX_VALUE - 1, "SuperUser_RO", Integer.MAX_VALUE - 5),
/**
* Unknown
*/
Unknown(-1, -1);
Unknown = new PortalUserRole(-1, "Unknown", -1);
private final static Map<Integer, PortalUserRole> ID_MAP;
static {
ID_MAP = new HashMap<>();
for (PortalUserRole r : PortalUserRole.values()) {
if (PortalUserRole.isUnsupported(r)) {
continue;
//try to load all the subclasses explicitly - to avoid timing issues when items coming from subclasses may be registered some time later, after the parent class is loaded
Set<Class<? extends PortalUserRole>> subclasses = BaseJsonModel.getReflections().getSubTypesOf(PortalUserRole.class);
for(Class<?> cls: subclasses) {
try {
Class.forName(cls.getName());
} catch (ClassNotFoundException e) {
LOG.warn("Cannot load class {} : {}", cls.getName(), e);
}
ID_MAP.put(r.getId(), r);
}
}
}
public static final String SYSTEM_IDENTIFIER = "System";
public static PortalUserRole getById(int id) {
PortalUserRole result = ID_MAP.get(id);
if (result == null) {
return PortalUserRole.Unknown;
}
return result;
}
@JsonCreator
public static PortalUserRole getByName(String value) {
return JsonDeserializationUtils.deserializEnum(value, PortalUserRole.class, Unknown);
}
public static boolean isUnsupported(PortalUserRole userRole) {
return Unknown.equals(userRole);
}
private final int permissionLevel;
private final SimpleGrantedAuthority authority;
private final int id;
private final String name;
private PortalUserRole(int id, int permissionLevel) {
this.id = id;
this.permissionLevel = permissionLevel;
protected PortalUserRole(int id, String name, int permissionLevel) {
synchronized(lock) {
LOG.debug("Registering PortalUserRole by {} : {}", this.getClass().getSimpleName(), name);
this.id = id;
this.name = name;
this.permissionLevel = permissionLevel;
this.authority = new SimpleGrantedAuthority(name);
ELEMENTS_BY_NAME.values().forEach(s -> {
if(s.getName().equals(name)) {
throw new IllegalStateException("PortalUserRole item for "+ name + " is already defined, cannot have more than one of them");
}
});
if(ELEMENTS.containsKey(id)) {
throw new IllegalStateException("PortalUserRole item "+ name + "("+id+") is already defined, cannot have more than one of them");
}
ELEMENTS.put(id, this);
ELEMENTS_BY_NAME.put(name, this);
}
}
public int getId() {
@@ -111,4 +158,76 @@ public enum PortalUserRole {
public int getPermissionLevel() {
return this.permissionLevel;
}
public String getName() {
return name;
}
public SimpleGrantedAuthority getAuthority() {
return authority;
}
@Override
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof PortalUserRole)) {
return false;
}
PortalUserRole other = (PortalUserRole) obj;
return id == other.id;
}
public String toString() {
return name;
}
@JsonIgnore
public static PortalUserRole[] values() {
return new ArrayList<>(ELEMENTS.values()).toArray(new PortalUserRole[0]);
}
public static PortalUserRole getById(int enumId){
PortalUserRole result = ELEMENTS.get(enumId);
if (result == null) {
return Unknown;
}
return result;
}
@JsonCreator
public static PortalUserRole getByName(String value) {
PortalUserRole ret = ELEMENTS_BY_NAME.get(value);
if (ret == null) {
ret = Unknown;
}
return ret;
}
public static List<PortalUserRole> getValues() {
return new ArrayList<>(ELEMENTS.values());
}
public static List<SimpleGrantedAuthority> getAllAuthorities() {
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
ELEMENTS.values().forEach(y -> authorities.add(y.getAuthority()));
return authorities;
}
public static boolean isUnsupported(PortalUserRole value) {
return (Unknown.equals(value));
}
}

View File

@@ -0,0 +1,40 @@
package com.telecominfraproject.wlan.core.model.serializers;
import java.io.IOException;
import com.fasterxml.jackson.core.Base64Variants;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
/**
* Characters plus and slash, that would need quoting in URLs, are replaced with hyphen and underscore, respectively.
* @see com.fasterxml.jackson.core.Base64Variants.MODIFIED_FOR_URL
*/
public class Base64UrlByteArrayDeserializer extends JsonDeserializer<byte[]> {
@Override
public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken token = p.currentToken();
// we only support base64 encoded String
if (token == JsonToken.VALUE_STRING) {
try {
String text = p.getText();
return Base64Variants.MODIFIED_FOR_URL.decode(text.replace(' ', '-').replace('+', '-').replace('/', '_').replace("=", ""));
} catch (JsonParseException e) {
String msg = e.getOriginalMessage();
if (msg.contains("base64")) {
return (byte[]) ctxt.handleWeirdStringValue(byte[].class,
p.getText().replace(' ', '+'), msg);
}
}
}
throw new JsonParseException(p, "Cannot convert to byte[]");
}
}

View File

@@ -0,0 +1,21 @@
package com.telecominfraproject.wlan.core.model.serializers;
import java.io.IOException;
import com.fasterxml.jackson.core.Base64Variants;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
* Characters plus and slash, that would need quoting in URLs, are replaced with hyphen and underscore, respectively.
* @see com.fasterxml.jackson.core.Base64Variants.MODIFIED_FOR_URL
*/
public class Base64UrlByteArraySerializer extends JsonSerializer<byte[]> {
@Override
public void serialize(byte[] value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(Base64Variants.MODIFIED_FOR_URL.encode(value));
}
}

View File

@@ -32,24 +32,4 @@ public class VendorExtendedEquipmentTypeModel extends BaseJsonModel{
this.dataType = dataType;
}
public static void main(String[] args) {
VendorExtendedEquipmentTypeModel t1 = new VendorExtendedEquipmentTypeModel("t1", EquipmentType.AP);
VendorExtendedEquipmentTypeModel t2 = new VendorExtendedEquipmentTypeModel("t2", VendorExtendedEquipmentType.AP);
VendorExtendedEquipmentTypeModel t3 = new VendorExtendedEquipmentTypeModel("t3", VendorExtendedEquipmentType.VENDOR_EQ_B);
System.out.println("t1 = "+ t1);
System.out.println("t2 = "+ t2);
System.out.println("t3 = "+ t3);
VendorExtendedEquipmentTypeModel t1d = BaseJsonModel.fromString(t1.toString(), VendorExtendedEquipmentTypeModel.class);
VendorExtendedEquipmentTypeModel t2d = BaseJsonModel.fromString(t2.toString(), VendorExtendedEquipmentTypeModel.class);
VendorExtendedEquipmentTypeModel t3d = BaseJsonModel.fromString(t3.toString(), VendorExtendedEquipmentTypeModel.class);
System.out.println("=======================");
System.out.println("t1d = "+ t1d);
System.out.println("t2d = "+ t2d);
System.out.println("t3d = "+ t3d);
}
}

View File

@@ -0,0 +1,28 @@
package com.telecominfraproject.wlan.core.model.role.vendorextensions;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Test;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.role.PortalUserRole;
public class TestVendorExtentions {
@Test
public void testExtendedEnum() {
VendorExtendedPortalUserRoleModel t1 = new VendorExtendedPortalUserRoleModel("t1", PortalUserRole.CustomerIT);
VendorExtendedPortalUserRoleModel t2 = new VendorExtendedPortalUserRoleModel("t2", VendorExtendedPortalUserRole.CustomerIT);
VendorExtendedPortalUserRoleModel t3 = new VendorExtendedPortalUserRoleModel("t3", VendorExtendedPortalUserRole.VENDOR_USER_ROLE_B);
VendorExtendedPortalUserRoleModel t1d = BaseJsonModel.fromString(t1.toString(), VendorExtendedPortalUserRoleModel.class);
VendorExtendedPortalUserRoleModel t2d = BaseJsonModel.fromString(t2.toString(), VendorExtendedPortalUserRoleModel.class);
VendorExtendedPortalUserRoleModel t3d = BaseJsonModel.fromString(t3.toString(), VendorExtendedPortalUserRoleModel.class);
assertEquals(t1.toString(), t1d.toString());
assertEquals(t2.toString(), t2d.toString());
assertEquals(t3.toString(), t3d.toString());
}
}

View File

@@ -0,0 +1,16 @@
package com.telecominfraproject.wlan.core.model.role.vendorextensions;
import com.telecominfraproject.wlan.core.model.role.PortalUserRole;
public class VendorExtendedPortalUserRole extends PortalUserRole {
public static final PortalUserRole
VENDOR_USER_ROLE_A = new VendorExtendedPortalUserRole(100, "VENDOR_USER_ROLE_A", 5) ,
VENDOR_USER_ROLE_B = new VendorExtendedPortalUserRole(101, "VENDOR_USER_ROLE_B", 5)
;
private VendorExtendedPortalUserRole(int id, String name, int permissionLevel) {
super(id, name, permissionLevel);
}
}

View File

@@ -0,0 +1,36 @@
package com.telecominfraproject.wlan.core.model.role.vendorextensions;
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.role.PortalUserRole;
public class VendorExtendedPortalUserRoleModel extends BaseJsonModel{
private static final long serialVersionUID = -7571240065645860754L;
private String name;
private PortalUserRole role;
protected VendorExtendedPortalUserRoleModel() {
//for deserializer
}
public VendorExtendedPortalUserRoleModel(String name, PortalUserRole role) {
this.name = name;
this.role = role;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PortalUserRole getRole() {
return role;
}
public void setRole(PortalUserRole role) {
this.role = role;
}
}

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-partitioner</artifactId>
@@ -13,7 +13,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-hazelcast-client</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-remote-tests</artifactId>
@@ -15,7 +14,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-tx-tests</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-scheduler</artifactId>
@@ -15,7 +14,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-stream-consumer</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<artifactId>base-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-stream-interface</artifactId>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>base-tx-tests</artifactId>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>cloud-metrics</artifactId>
@@ -14,18 +13,18 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-elasticsearch</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>

View File

@@ -1,10 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>common-hazelcast</artifactId>
@@ -20,7 +19,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1,13 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>reflections-tip</artifactId>

View File

@@ -1,11 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>webtoken-auth-service</artifactId>
@@ -16,13 +14,13 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-container</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-client</artifactId>
<version>${tip-wlan-cloud.release.version}</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -8,10 +8,10 @@ import org.slf4j.LoggerFactory;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import com.telecominfraproject.wlan.core.model.role.PortalUserRole;
import com.telecominfraproject.wlan.core.model.webtoken.IntrospectWebTokenResult;
import com.telecominfraproject.wlan.core.server.security.AccessType;
import com.telecominfraproject.wlan.core.server.security.AuthProviderInfo;
import com.telecominfraproject.wlan.core.server.security.WebSecurityConfig;
/**
* Implementation of UserDetails in compliance with the decoded object returned
@@ -42,7 +42,7 @@ public class WebtokenUserDetails implements UserDetails, AuthProviderInfo {
// set authorities
authorities = new ArrayList<>();
authorities.add(WebSecurityConfig.TECH_SUPPORT_AUTHORITY);
authorities.add(PortalUserRole.TechSupport.getAuthority());
}