diff --git a/.gitignore b/.gitignore
index 54b685e..fb4f905 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,7 @@ target/
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
+
+/.classpath
+/.project
+/.settings/
diff --git a/pom.xml b/pom.xml
index d324003..81381a4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- io.activestack
+ org.activestack
syncengine
1.1.15-SNAPSHOT
@@ -14,6 +14,7 @@
1.6.1
1.19.0
1.19.0
+ 1.9.5
@@ -33,6 +34,12 @@
4.8.2
test
+
+ org.mockito
+ mockito-core
+ ${mockito-core.version}
+ test
+
org.codehaus.jackson
diff --git a/src/main/java/com/percero/agents/auth/helpers/AccountHelper.java b/src/main/java/com/percero/agents/auth/helpers/AccountHelper.java
index dca0075..bf1cfb7 100644
--- a/src/main/java/com/percero/agents/auth/helpers/AccountHelper.java
+++ b/src/main/java/com/percero/agents/auth/helpers/AccountHelper.java
@@ -701,7 +701,7 @@ public void setupUserRoles(String userId, List serviceUserList) thr
Boolean isInaccurateList = false;
for (ServiceUser nextServiceUser : serviceUserList) {
if (!nextServiceUser.getAreRoleNamesAccurate()) {
- log.debug("Ignoring role names from " + nextServiceUser.getAuthProvider().toString());
+ log.debug("Ignoring role names from " + nextServiceUser.getAuthProviderID().toString());
isInaccurateList = true;
break;
}
diff --git a/src/main/java/com/percero/agents/auth/services/AnonAuthProvider.java b/src/main/java/com/percero/agents/auth/services/AnonAuthProvider.java
new file mode 100644
index 0000000..629131c
--- /dev/null
+++ b/src/main/java/com/percero/agents/auth/services/AnonAuthProvider.java
@@ -0,0 +1,56 @@
+package com.percero.agents.auth.services;
+
+import com.percero.agents.auth.vo.AuthProvider;
+import com.percero.agents.auth.vo.ServiceIdentifier;
+import com.percero.agents.auth.vo.ServiceOrganization;
+import com.percero.agents.auth.vo.ServiceUser;
+import com.percero.util.RandomStringGenerator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jonnysamps on 8/14/15.
+ */
+@Component
+public class AnonAuthProvider implements IAuthProvider {
+ private static String ID = "anonymous";
+
+ @Autowired
+ @Value("$pf{anonAuth.enabled:false}")
+ Boolean anonAuthEnabled = false;
+ @Autowired @Value("$pf{anonAuth.code:ANON}")
+ String anonAuthCode = "ANON";
+ @Autowired @Value("$pf{anonAuth.roleNames:}")
+ String anonAuthRoleNames = "";
+
+ public String getID() {
+ return ID;
+ }
+
+ public ServiceUser authenticate(String credential) {
+ ServiceUser serviceUser = new ServiceUser();
+ serviceUser.setFirstName("ANON");
+ serviceUser.setLastName("ANON");
+ serviceUser.setId("ANON");
+ serviceUser.setAuthProviderID(AuthProvider.ANON.toString());
+
+ List roles = new ArrayList();
+ String[] roleNames = anonAuthRoleNames.split(",");
+ for(int i = 0; i < roleNames.length; i++) {
+ if (roleNames[i] != null && !roleNames[i].isEmpty())
+ roles.add(roleNames[i]);
+ }
+ serviceUser.setRoleNames(roles);
+ serviceUser.setAreRoleNamesAccurate(true);
+
+ String email = "anonymous@activestack.io";
+ serviceUser.getEmails().add(email);
+ serviceUser.getIdentifiers().add(new ServiceIdentifier("email", email));
+
+ return serviceUser;
+ }
+}
diff --git a/src/main/java/com/percero/agents/auth/services/AuthProviderRegistry.java b/src/main/java/com/percero/agents/auth/services/AuthProviderRegistry.java
new file mode 100644
index 0000000..b2e43a1
--- /dev/null
+++ b/src/main/java/com/percero/agents/auth/services/AuthProviderRegistry.java
@@ -0,0 +1,58 @@
+package com.percero.agents.auth.services;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Class is the registration point for IAuthProviders.
+ */
+@Component
+public class AuthProviderRegistry {
+ private static Logger logger = Logger.getLogger(AuthProviderRegistry.class);
+ private Map providerMap = new HashMap();
+
+ /**
+ * Intended to be a default registration point for all IAuthProviders in the application context
+ * @param providers
+ */
+ @Autowired(required = false)
+ public void setProviders(Collection providers){
+ for(IAuthProvider provider : providers){
+ this.addProvider(provider);
+ }
+ }
+
+ /**
+ * Add a provider to the registry
+ * @param provider
+ */
+ public void addProvider(IAuthProvider provider){
+ if(providerMap.containsKey(provider.getID()))
+ logger.warn("Non-unique auth provider ID: "+provider.getID());
+
+ providerMap.put(provider.getID(), provider);
+ }
+
+ /**
+ * Find a provider by ID
+ * @param ID
+ * @return
+ */
+ public IAuthProvider getProvider(String ID){
+ return providerMap.get(ID);
+ }
+
+ /**
+ * Returns true if registry has a provider registered for this key
+ * @param ID
+ * @return
+ */
+ public boolean hasProvider(String ID){
+ return providerMap.containsKey(ID);
+ }
+}
diff --git a/src/main/java/com/percero/agents/auth/services/AuthService.java b/src/main/java/com/percero/agents/auth/services/AuthService.java
index d7079be..bc833d0 100644
--- a/src/main/java/com/percero/agents/auth/services/AuthService.java
+++ b/src/main/java/com/percero/agents/auth/services/AuthService.java
@@ -41,8 +41,6 @@
import com.percero.agents.auth.vo.UserToken;
import com.percero.agents.sync.access.IAccessManager;
-import edu.emory.mathcs.backport.java.util.Arrays;
-
/**
* The AuthService is responsible for managing authentication of users within the Percero framework. The AuthService
* maintains its own separate database that generically references users. Implementations of IAuthHelper's provide
@@ -129,20 +127,20 @@ protected List findByExample(Object theQueryObject,
/* (non-Javadoc)
* @see com.com.percero.agents.auth.services.IAuthService#authenticateOAuthCode(com.com.percero.agents.auth.vo.AuthProvider, java.lang.String, java.lang.String, java.lang.String, java.lang.String, com.com.percero.agents.auth.vo.OAuthToken)
*/
- public OAuthResponse authenticateOAuthCode(AuthProvider authProvider, String code, String clientId, String deviceId, String redirectUrl, OAuthToken requestToken){
+ public OAuthResponse authenticateOAuthCode(String authProviderID, String code, String clientId, String deviceId, String redirectUrl, OAuthToken requestToken){
- Object accessTokenResult = getServiceProviderAccessToken(authProvider, code, redirectUrl, requestToken);
+ Object accessTokenResult = getServiceProviderAccessToken(authProviderID, code, redirectUrl, requestToken);
if (accessTokenResult == null)
return null;
if (accessTokenResult instanceof ServiceUser) {
ServiceUser serviceUser = (ServiceUser) accessTokenResult;
- serviceUser.setAuthProvider(authProvider);
- return setupServiceUser(authProvider, serviceUser, clientId, deviceId);
+ serviceUser.setAuthProviderID(authProviderID.toString());
+ return setupServiceUser(authProviderID, serviceUser, clientId, deviceId);
}
else if (accessTokenResult instanceof OAuthToken){
OAuthToken token = (OAuthToken) accessTokenResult;
- return authenticateOAuthAccessToken(authProvider, token.getToken(), token.getTokenSecret(), clientId, deviceId, false);
+ return authenticateOAuthAccessToken(authProviderID, token.getToken(), token.getTokenSecret(), clientId, deviceId, false);
}
else {
log.error("Invalid access token result in authenticateOAuthCode");
@@ -150,11 +148,11 @@ else if (accessTokenResult instanceof OAuthToken){
}
}
- protected Object getServiceProviderAccessToken(AuthProvider authProvider, String code, String redirectUrl, OAuthToken requestToken) {
+ protected Object getServiceProviderAccessToken(String authProviderID, String code, String redirectUrl, OAuthToken requestToken) {
OAuthToken token = null;
try {
- /*if (authProvider.equals(AuthProvider.LINKEDIN)) {
+ /*if (authProviderID.equals(AuthProvider.LINKEDIN)) {
// LinkedInHelper linkedInHelper = new LinkedInHelper();
// token = linkedInHelper.getAccessToken(svcOAuth.getAppKey(), svcOAuthSecret.getAppToken(), code, requestToken);
}
@@ -162,24 +160,25 @@ protected Object getServiceProviderAccessToken(AuthProvider authProvider, String
// //oauthToken = FacebookHelper.getRequestToken(svcOauth.getAppKey(), svcOauthSecret.getAppToken());
// throw new IllegalArgumentException("Facebook OAuth Not supported");
// }
- else */if (authProvider.equals(AuthProvider.GOOGLE)) {
+ else */
+ if (authProviderID.equals(AuthProvider.GOOGLE.toString())) {
ServiceUser serviceUser = googleHelper.authenticateOAuthCode(code, redirectUrl);
return serviceUser;
}
- else if (authProvider.equals(AuthProvider.LINKEDIN)) {
+ else if (authProviderID.equals(AuthProvider.LINKEDIN.toString())) {
ServiceUser serviceUser = linkedInHelper.authenticateOAuthCode(code, redirectUrl);
return serviceUser;
}
- else if (authProvider.equals(AuthProvider.FACEBOOK)) {
+ else if (authProviderID.equals(AuthProvider.FACEBOOK.toString())) {
ServiceUser serviceUser = facebookHelper.authenticateOAuthCode(code, redirectUrl);
return serviceUser;
}
- else if (authProvider.equals(AuthProvider.GITHUB)) {
+ else if (authProviderID.equals(AuthProvider.GITHUB.toString())) {
String accessToken = githubHelper.getAccessTokenResponse(code, redirectUrl);
token = new OAuthToken();
token.setToken(accessToken);
}
- else if(authProvider.equals(AuthProvider.ANON)){
+ else if(authProviderID.equals(AuthProvider.ANON.toString())){
token = new OAuthToken();
token.setToken("ANON");
token.setTokenSecret("ANON");
@@ -194,31 +193,31 @@ else if(authProvider.equals(AuthProvider.ANON)){
/* (non-Javadoc)
* @see com.com.percero.agents.auth.services.IAuthService#authenticateBasicOAuth(com.com.percero.agents.auth.vo.AuthProvider, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, com.com.percero.agents.auth.vo.OAuthToken)
*/
- public OAuthResponse authenticateBasicOAuth(AuthProvider authProvider, String userName, String password, String scopes, String appUrl, String clientId, String deviceId, OAuthToken requestToken){
+ public OAuthResponse authenticateBasicOAuth(String authProviderID, String userName, String password, String scopes, String appUrl, String clientId, String deviceId, OAuthToken requestToken){
- OAuthToken token = getServiceProviderAccessTokenViaBasicAuth(authProvider, userName, password, scopes, appUrl, requestToken);
+ OAuthToken token = getServiceProviderAccessTokenViaBasicAuth(authProviderID, userName, password, scopes, appUrl, requestToken);
if (token == null)
return null;
- return authenticateOAuthAccessToken(authProvider, token.getToken(), token.getTokenSecret(), clientId, deviceId, false);
+ return authenticateOAuthAccessToken(authProviderID, token.getToken(), token.getTokenSecret(), clientId, deviceId, false);
}
- protected OAuthToken getServiceProviderAccessTokenViaBasicAuth(AuthProvider authProvider, String userName, String password, String scopes, String appUrl, OAuthToken requestToken) {
+ protected OAuthToken getServiceProviderAccessTokenViaBasicAuth(String authProviderID, String userName, String password, String scopes, String appUrl, OAuthToken requestToken) {
OAuthToken token = null;
try {
- if (authProvider.equals(AuthProvider.GITHUB)) {
+ if (authProviderID.equals(AuthProvider.GITHUB)) {
String accessToken = githubHelper.getBasicAccessTokenResponse(userName, password, scopes, appUrl);
token = new OAuthToken();
token.setToken(accessToken);
}
- else if(authProvider.equals(AuthProvider.ANON)){
+ else if(authProviderID.equals(AuthProvider.ANON)){
token = new OAuthToken();
token.setToken("ANON");
token.setTokenSecret("ANON");
}
else {
- throw new IllegalArgumentException(authProvider.name() + " OAuth Not supported");
+ throw new IllegalArgumentException(authProviderID + " OAuth Not supported");
}
} catch (Exception e) {
@@ -231,11 +230,11 @@ else if(authProvider.equals(AuthProvider.ANON)){
/* (non-Javadoc)
* @see com.com.percero.agents.auth.services.IAuthService#authenticateOAuthAccessToken(com.com.percero.agents.auth.vo.AuthProvider, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
- public OAuthResponse authenticateOAuthAccessToken(AuthProvider authProvider, String accessToken, String refreshToken, String clientId, String deviceId) {
- return authenticateOAuthAccessToken(authProvider, accessToken, refreshToken, clientId, deviceId, true);
+ public OAuthResponse authenticateOAuthAccessToken(String authProviderID, String accessToken, String refreshToken, String clientId, String deviceId) {
+ return authenticateOAuthAccessToken(authProviderID, accessToken, refreshToken, clientId, deviceId, true);
}
- public OAuthResponse authenticateOAuthAccessToken(AuthProvider authProvider, String accessToken, String refreshToken, String clientId, String deviceId, Boolean canOverideAccessToken) {
+ public OAuthResponse authenticateOAuthAccessToken(String authProviderID, String accessToken, String refreshToken, String clientId, String deviceId, Boolean canOverideAccessToken) {
/**
* The client may not actually have the refresh token. If not then we need to find it, because without a valid
* refresh token then any "Auto-login" will fail after the token expires... which can cause client connections
@@ -259,7 +258,7 @@ public OAuthResponse authenticateOAuthAccessToken(AuthProvider authProvider, Str
if(user != null){
for(Object ob : user.getUserAccounts()){
UserAccount ua = (UserAccount)ob;
- if(ua.getAuthProvider().equals(authProvider)){
+ if(ua.getAuthProviderID().equals(authProviderID)){
refreshToken = ua.getRefreshToken();
accessToken = ua.getAccessToken();
break;
@@ -269,14 +268,14 @@ public OAuthResponse authenticateOAuthAccessToken(AuthProvider authProvider, Str
}
- ServiceUser serviceUser = getServiceProviderServiceUser(accessToken, refreshToken, "", authProvider);
+ ServiceUser serviceUser = getServiceProviderServiceUser(accessToken, refreshToken, "", authProviderID);
if (serviceUser == null)
return null;
else
- return setupServiceUser(authProvider, serviceUser, clientId, deviceId);
+ return setupServiceUser(authProviderID, serviceUser, clientId, deviceId);
}
- public OAuthResponse setupServiceUser(AuthProvider authProvider, ServiceUser serviceUser, String clientId, String deviceId) {
+ public OAuthResponse setupServiceUser(String authProviderID, ServiceUser serviceUser, String clientId, String deviceId) {
OAuthResponse result = null;
UserToken userToken = null;
@@ -301,7 +300,7 @@ public OAuthResponse setupServiceUser(AuthProvider authProvider, ServiceUser ser
if(user != null){
for(Object ob : user.getUserAccounts()){
UserAccount ua = (UserAccount)ob;
- if(ua.getAuthProvider().equals(authProvider)){
+ if(ua.getAuthProviderID().equals(authProviderID)){
serviceUser.setRefreshToken(ua.getRefreshToken());
serviceUser.setAccessToken(ua.getAccessToken());
break;
@@ -323,7 +322,7 @@ public OAuthResponse setupServiceUser(AuthProvider authProvider, ServiceUser ser
queryUserAccount.setAccountId(accountId);
queryUserAccount.setAccessToken(serviceUser.getAccessToken());
queryUserAccount.setRefreshToken(serviceUser.getRefreshToken());
- queryUserAccount.setAuthProvider(serviceUser.getAuthProvider());
+ queryUserAccount.setAuthProviderID(serviceUser.getAuthProviderID());
UserAccount theFoundUserAccount = updateUserAccountToken(queryUserAccount, true, serviceUser);
@@ -351,17 +350,17 @@ public OAuthResponse setupServiceUser(AuthProvider authProvider, ServiceUser ser
// TODO: Need to check the Service Application only, NOT ALL Service Applications for this Service Provider.
protected Boolean validateUserRoles(ServiceUser serviceUser, String userId) {
- // Get list of role names required for this Auth provider
- List authProviderRequiredSvcRoles = getSvcAppRoles(serviceUser.getAuthProvider());
+ // Get list of role names required for this Auth authProviderID
+ List authProviderRequiredSvcRoles = getSvcAppRoles(serviceUser.getAuthProviderID());
- // If the auth provider requires no valid roles, then we have "foundMatchingRole"
+ // If the auth authProviderID requires no valid roles, then we have "foundMatchingRole"
Boolean foundMatchingRole = (authProviderRequiredSvcRoles == null || authProviderRequiredSvcRoles.size() == 0);
// Only check the ServiceUser roles list if role names for the ServiceUser are valid.
if (serviceUser.getAreRoleNamesAccurate() && !foundMatchingRole) {
Iterator itrSvcRoles = authProviderRequiredSvcRoles.iterator();
- // Check to see if the ServiceUser has at least one role that is in the required auth provider roles list.
+ // Check to see if the ServiceUser has at least one role that is in the required auth authProviderID roles list.
while(!foundMatchingRole && itrSvcRoles.hasNext()) {
SvcAppRole nextSvcAppRole = itrSvcRoles.next();
for(String nextRole : serviceUser.getRoleNames()) {
@@ -373,7 +372,7 @@ protected Boolean validateUserRoles(ServiceUser serviceUser, String userId) {
}
}
- // Now check existing auth roles for the user. Not all Auth Providers provider roles.
+ // Now check existing auth roles for the user. Not all Auth Providers authProviderID roles.
if (!foundMatchingRole) {
Iterator itrAuthProviderRequiredSvcRoles = authProviderRequiredSvcRoles.iterator();
@@ -407,21 +406,21 @@ protected Boolean validateUserRoles(ServiceUser serviceUser, String userId) {
/**
- * Retrieve the list of valid role names for the specified auth provider (or NONE)
+ * Retrieve the list of valid role names for the specified auth authProviderID (or NONE)
* for which a user must have have at least one to access the system.
*
- * @param authProvider
+ * @param authProviderID
* @return
*/
@SuppressWarnings("unchecked")
- protected List getSvcAppRoles(AuthProvider authProvider) {
+ protected List getSvcAppRoles(String authProviderID) {
Session s = null;
List result = null;
try {
s = sessionFactoryAuth.openSession();
Query query = s.createQuery("FROM SvcAppRole sar WHERE sar.authProvider = :authProvider OR sar.authProvider = NULL");
- query.setString("authProvider", authProvider.toString());
+ query.setString("authProvider", authProviderID.toString());
result = (List) query.list();
result = (List) AuthHibernateUtils.cleanObject(result);
@@ -524,7 +523,7 @@ private UserAccount updateUserAccountToken(UserAccount theQueryObject, Boolean c
theFoundUserAccount = new UserAccount();
- theFoundUserAccount.setAuthProvider(serviceUser.getAuthProvider());
+ theFoundUserAccount.setAuthProviderID(serviceUser.getAuthProviderID());
theFoundUserAccount.setUser(theUser);
theFoundUserAccount.setDateCreated(currentDate);
theFoundUserAccount.setDateModified(currentDate);
@@ -872,7 +871,7 @@ public List getServiceUsers(String aUserId) {
// Get list of all ServiceApplicationOAuth's for this ServiceProvider.
for (UserAccount nextUserAccount : userAccounts) {
- ServiceUser nextServiceUser = getServiceProviderServiceUser(nextUserAccount, nextUserAccount.getAuthProvider());
+ ServiceUser nextServiceUser = getServiceProviderServiceUser(nextUserAccount, nextUserAccount.getAuthProviderID());
if(nextServiceUser != null) {
// Found a valid Service User, add to list and break.
result.add(nextServiceUser);
@@ -926,8 +925,8 @@ public Set getUserAccounts(String aUserId) {
* @param aUserAccount
* @return
*/
- public ServiceUser getServiceProviderServiceUser(UserAccount aUserAccount, AuthProvider provider) {
- return getServiceProviderServiceUser(aUserAccount.getAccessToken(), aUserAccount.getRefreshToken(), aUserAccount.getAccountId(), provider);
+ public ServiceUser getServiceProviderServiceUser(UserAccount aUserAccount, String authProviderID) {
+ return getServiceProviderServiceUser(aUserAccount.getAccessToken(), aUserAccount.getRefreshToken(), aUserAccount.getAccountId(), authProviderID);
}
/**
@@ -936,10 +935,10 @@ public ServiceUser getServiceProviderServiceUser(UserAccount aUserAccount, AuthP
* @param accessToken
* @param refreshToken
* @param accountId
- * @param provider
+ * @param authProviderID
* @return
*/
- public ServiceUser getServiceProviderServiceUser(String accessToken, String refreshToken, String accountId, AuthProvider provider) {
+ public ServiceUser getServiceProviderServiceUser(String accessToken, String refreshToken, String accountId, String authProviderID) {
ServiceUser serviceUser = null;
try {
@@ -950,7 +949,7 @@ public ServiceUser getServiceProviderServiceUser(String accessToken, String refr
serviceUser.setFirstName("ANON");
serviceUser.setLastName("ANON");
serviceUser.setId("ANON");
- serviceUser.setAuthProvider(AuthProvider.ANON);
+ serviceUser.setAuthProviderID(AuthProvider.ANON.toString());
serviceUser.setRefreshToken(anonAuthCode);
List roles = new ArrayList();
@@ -965,7 +964,7 @@ public ServiceUser getServiceProviderServiceUser(String accessToken, String refr
}
}
- /**if (AuthProvider.LINKEDIN.equals(provider)) {
+ /**if (AuthProvider.LINKEDIN.equals(authProviderID)) {
// LinkedInHelper linkedInHelper = new LinkedInHelper();
// ServiceUser liServiceUser = linkedInHelper.getServiceUser(
// svcOauth.getAppKey(), svcOauthSecret.getAppToken(),
@@ -974,44 +973,44 @@ public ServiceUser getServiceProviderServiceUser(String accessToken, String refr
// svcOauth.getServiceApplication().getAppDomain());
// serviceUser = liServiceUser;
}
- else */if (AuthProvider.FACEBOOK.equals(provider)) {
+ else */if (AuthProvider.FACEBOOK.equals(authProviderID)) {
ServiceUser fbServiceUser = facebookHelper.getServiceUser(
accessToken,
accountId);
serviceUser = fbServiceUser;
}
- else if (AuthProvider.GOOGLE.equals(provider)) {
+ else if (AuthProvider.GOOGLE.equals(authProviderID)) {
ServiceUser glServiceUser = googleHelper.authenticateAccessToken(accessToken, refreshToken, accountId);
//ServiceUser glServiceUser = googleHelper.retrieveServiceUser(accountId);
serviceUser = glServiceUser;
}
- else if (AuthProvider.GITHUB.equals(provider)) {
+ else if (AuthProvider.GITHUB.equals(authProviderID)) {
ServiceUser glServiceUser = githubHelper.getServiceUser(accessToken, refreshToken);
serviceUser = glServiceUser;
}
- else if (AuthProvider.LINKEDIN.equals(provider)) {
+ else if (AuthProvider.LINKEDIN.equals(authProviderID)) {
ServiceUser liServiceUser = linkedInHelper.getServiceUser(accessToken, refreshToken);
serviceUser = liServiceUser;
}
- else if(AuthProvider.ANON.equals(provider)){
+ else if(AuthProvider.ANON.equals(authProviderID)){
serviceUser = new ServiceUser();
serviceUser.setEmails(new ArrayList());
serviceUser.getEmails().add("blargblarg@com.percero.com");
serviceUser.setAccessToken("blargblarg");
serviceUser.setFirstName("ANONYMOUS");
serviceUser.setId("ANONYMOUS");
- serviceUser.setAuthProvider(AuthProvider.ANON);
+ serviceUser.setAuthProviderID(AuthProvider.ANON.toString());
}
else
{
- log.warn("ServiceProvider not yet supported: " + provider);
+ log.warn("ServiceProvider not yet supported: " + authProviderID);
}
} catch (Exception e) {
e.printStackTrace();
}
if (serviceUser != null)
- serviceUser.setAuthProvider(provider);
+ serviceUser.setAuthProviderID(authProviderID);
return serviceUser;
}
diff --git a/src/main/java/com/percero/agents/auth/services/AuthService2.java b/src/main/java/com/percero/agents/auth/services/AuthService2.java
new file mode 100644
index 0000000..8cf4750
--- /dev/null
+++ b/src/main/java/com/percero/agents/auth/services/AuthService2.java
@@ -0,0 +1,321 @@
+package com.percero.agents.auth.services;
+
+import com.percero.agents.auth.hibernate.AssociationExample;
+import com.percero.agents.auth.hibernate.AuthHibernateUtils;
+import com.percero.agents.auth.hibernate.BaseDataObjectPropertySelector;
+import com.percero.agents.auth.vo.*;
+import org.apache.log4j.Logger;
+import org.hibernate.*;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.exception.LockAcquisitionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * This class handles AuthenticationRequest type authentication
+ */
+@Component
+public class AuthService2 {
+
+ private static Logger logger = Logger.getLogger(AuthService2.class);
+
+ @Autowired
+ private AuthProviderRegistry authProviderRegistry;
+
+ @Autowired
+ SessionFactory sessionFactoryAuth;
+
+ public AuthenticationResponse authenticate(AuthenticationRequest request) throws IllegalArgumentException{
+ if(!authProviderRegistry.hasProvider(request.getAuthProvider()))
+ throw new IllegalArgumentException(request.getAuthProvider()+" auth provider not found");
+
+ AuthenticationResponse response = new AuthenticationResponse();
+
+ IAuthProvider provider = authProviderRegistry.getProvider(request.getAuthProvider());
+
+ ServiceUser serviceUser = provider.authenticate(request.getCredential());
+
+ // Login successful
+ if(serviceUser != null) {
+ logger.info(provider.getID()+" Authentication success");
+ serviceUser.setAuthProviderID(provider.getID()); // Set the provider ID just in case the provider didn't
+ UserAccount userAccount = getOrCreateUserAccount(serviceUser, provider, request);
+
+ UserToken userToken = loginUserAccount(userAccount, request.getClientId(), request.getDeviceId());
+ userToken = (UserToken) AuthHibernateUtils.cleanObject(userToken);
+ response.setResult(userToken);
+ }
+
+ return response;
+ }
+
+ /**
+ * Allows the user to re-login with the token stored on their device from a previous login
+ * @param request
+ * @return
+ */
+ public AuthenticationResponse reauthenticate(ReauthenticationRequest request){
+ AuthenticationResponse response = new AuthenticationResponse();
+
+ Session session = sessionFactoryAuth.getCurrentSession();
+ UserToken userToken = (UserToken) session.createCriteria(UserToken.class)
+ .add(Restrictions.eq("token", request.getToken()))
+ .uniqueResult();
+
+ // TODO: add expiration to the token
+ if(userToken != null){
+ userToken.setLastLogin(new Date());
+ userToken.setClientId(request.getClientId());
+ session.save(userToken);
+ userToken = (UserToken) AuthHibernateUtils.cleanObject(userToken);
+ response.setResult(userToken);
+ }
+
+ return response;
+ }
+
+ /**
+ * Find a UserAccount from a ServiceUser
+ * @param serviceUser
+ * @return
+ */
+ private UserAccount findUserAccount(ServiceUser serviceUser){
+ UserAccount theFoundUserAccount = null;
+ UserAccount theQueryObject = new UserAccount();
+ theQueryObject.setAccountId(serviceUser.getId());
+ theQueryObject.setAuthProviderID(serviceUser.getAuthProviderID());
+
+ List excludeProperties = new ArrayList();
+ excludeProperties.add("accessToken");
+ excludeProperties.add("refreshToken");
+ excludeProperties.add("isAdmin");
+ excludeProperties.add("isSuspended");
+ List userAccounts = findByExample(theQueryObject,
+ excludeProperties);
+
+ if ((userAccounts instanceof List)
+ && ((List) userAccounts).size() > 0) {
+ // Found a valid UserAccount.
+ List userAccountList = (List) userAccounts;
+ theFoundUserAccount = (UserAccount) userAccountList.get(0);
+ }
+
+ return theFoundUserAccount;
+ }
+
+ /**
+ * Find a User from a ServiceUser
+ * @param serviceUser
+ * @return
+ */
+ private User findUser(ServiceUser serviceUser){
+ Session s = sessionFactoryAuth.openSession();
+
+ User theUser = null;
+
+ // Attempt to find this user by finding a matching UserIdentifier.
+ if (serviceUser.getIdentifiers() != null && serviceUser.getIdentifiers().size() > 0) {
+ String strFindUserIdentifier = "SELECT ui.user FROM UserIdentifier ui WHERE";
+ int counter = 0;
+ for(ServiceIdentifier nextServiceIdentifier : serviceUser.getIdentifiers()) {
+ if (counter > 0)
+ strFindUserIdentifier += " OR ";
+ strFindUserIdentifier += " ui.type='" + nextServiceIdentifier.getParadigm() + "' AND ui.userIdentifier='" + nextServiceIdentifier.getValue() + "'";
+ counter++;
+ }
+
+ Query q = s.createQuery(strFindUserIdentifier);
+ List userList = (List) q.list();
+ if (userList.size() > 0) {
+ theUser = userList.get(0);
+ }
+ }
+
+ return theUser;
+ }
+
+ /**
+ * Does the work of synchronizing the ServiceUser (from 3rd party) with the UserAccounts
+ * that ActiveStack knows about.
+ * @param serviceUser
+ * @returns UserAccount
+ */
+ private UserAccount getOrCreateUserAccount(ServiceUser serviceUser, IAuthProvider provider, AuthenticationRequest request){
+
+ UserAccount theFoundUserAccount = null;
+ Session s = null;
+ try {
+ theFoundUserAccount = findUserAccount(serviceUser);
+
+ if(theFoundUserAccount == null) {
+ s = sessionFactoryAuth.openSession();
+
+ User theUser = findUser(serviceUser);
+
+ Transaction tx = s.beginTransaction();
+ tx.begin();
+ Date currentDate = new Date();
+
+ if (theUser == null) {
+ theUser = new User();
+ theUser.setID(UUID.randomUUID().toString());
+ theUser.setDateCreated(currentDate);
+ theUser.setDateModified(currentDate);
+ s.save(theUser);
+ }
+
+ theFoundUserAccount = new UserAccount();
+
+ theFoundUserAccount.setAuthProviderID(serviceUser.getAuthProviderID());
+ theFoundUserAccount.setUser(theUser);
+ theFoundUserAccount.setDateCreated(currentDate);
+ theFoundUserAccount.setDateModified(currentDate);
+ theFoundUserAccount.setAccountId(serviceUser.getId());
+
+ s.save(theFoundUserAccount);
+ tx.commit();
+
+ s.close();
+ s = sessionFactoryAuth.openSession();
+
+ theFoundUserAccount = (UserAccount) s.get(UserAccount.class,
+ theFoundUserAccount.getID());
+ }
+
+ theFoundUserAccount = (UserAccount) AuthHibernateUtils
+ .cleanObject(theFoundUserAccount);
+
+ // Now enter in the UserIdentifiers for this User.
+ if (serviceUser.getIdentifiers() != null && serviceUser.getIdentifiers().size() > 0) {
+ if (s == null)
+ s = sessionFactoryAuth.openSession();
+ Transaction tx = s.beginTransaction();
+ Query q;
+ for(ServiceIdentifier nextServiceIdentifier : serviceUser.getIdentifiers()) {
+ q = s.createQuery("FROM UserIdentifier ui WHERE ui.userIdentifier=:uid AND ui.type=:paradigm");
+ q.setString("uid", nextServiceIdentifier.getValue());
+ q.setString("paradigm", nextServiceIdentifier.getParadigm());
+
+ List userIdenditifierList = (List) q.list();
+
+ if (userIdenditifierList.size() == 0) {
+ try {
+ UserIdentifier userIdentifier = new UserIdentifier();
+ userIdentifier.setType(nextServiceIdentifier.getParadigm());
+ userIdentifier.setUser(theFoundUserAccount.getUser());
+ userIdentifier.setUserIdentifier(nextServiceIdentifier.getValue());
+ s.saveOrUpdate(userIdentifier);
+ } catch(Exception e) {
+ logger.warn("Unable to save UserIdentifier for " + serviceUser.getName(), e);
+ }
+ }
+ }
+ tx.commit();
+ }
+ } catch (Exception e) {
+ logger.error("Unable to run getOrCreateUserAccount", e);
+ } finally {
+ if (s != null)
+ s.close();
+ }
+ return theFoundUserAccount;
+ }
+
+ @SuppressWarnings("rawtypes")
+ private UserToken loginUserAccount(UserAccount theUserAccount, String clientId, String deviceId) {
+ Session s = null;
+ UserToken theUserToken = null;
+ try {
+ Date currentDate = new Date();
+ UserToken queryUserToken = new UserToken();
+ queryUserToken.setUser(theUserAccount.getUser());
+ queryUserToken.setClientId(clientId);
+ List userTokenResult = findByExample(queryUserToken, null);
+
+ if ( !userTokenResult.isEmpty() ) {
+ theUserToken = (UserToken) userTokenResult.get(0);
+ }
+
+ if (s == null)
+ s = sessionFactoryAuth.openSession();
+ Transaction tx = s.beginTransaction();
+ tx.begin();
+
+ if (theUserToken == null) {
+ if (StringUtils.hasText(deviceId)) {
+ // Need to delete all of UserTokens for this User/Device.
+ logger.debug("Deleting ALL UserToken's for User " + theUserAccount.getUser().getID() + ", Device " + deviceId);
+ String deleteUserTokenSql = "DELETE FROM UserToken WHERE deviceId=:deviceId AND user=:user";
+ Query deleteQuery = s.createQuery(deleteUserTokenSql);
+ deleteQuery.setString("deviceId", deviceId);
+ deleteQuery.setEntity("user", theUserAccount.getUser());
+ deleteQuery.executeUpdate();
+ }
+
+ theUserToken = new UserToken();
+ theUserToken.setUser(theUserAccount.getUser());
+ theUserToken.setClientId(clientId);
+ theUserToken.setDeviceId(deviceId);
+ theUserToken.setDateCreated(currentDate);
+ theUserToken.setDateModified(currentDate);
+ theUserToken.setToken(getRandomId());
+ theUserToken.setLastLogin(currentDate);
+ s.save(theUserToken);
+
+ } else {
+ theUserToken.setToken(getRandomId());
+ theUserToken.setLastLogin(currentDate);
+ //s.merge(theUserToken);
+ s.saveOrUpdate(theUserToken);
+ }
+
+ tx.commit();
+
+ } catch (LockAcquisitionException lae) {
+ logger.error("Unable to run authenticate UserAccount", lae);
+ } catch (Exception e) {
+ logger.error("Unable to run authenticate UserAccount", e);
+ } finally {
+ if (s != null)
+ s.close();
+ }
+
+ return theUserToken;
+ }
+
+ @SuppressWarnings("rawtypes")
+ protected List findByExample(Object theQueryObject,
+ List excludeProperties) {
+ Session s = null;
+ try {
+ s = sessionFactoryAuth.openSession();
+ Criteria criteria = s.createCriteria(theQueryObject.getClass());
+ AssociationExample example = AssociationExample
+ .create(theQueryObject);
+ BaseDataObjectPropertySelector propertySelector = new BaseDataObjectPropertySelector(
+ excludeProperties);
+ example.setPropertySelector(propertySelector);
+ criteria.add(example);
+
+ List result = criteria.list();
+ return (List) AuthHibernateUtils.cleanObject(result);
+ } catch (Exception e) {
+ logger.error("Unable to findByExample", e);
+ } finally {
+ if (s != null)
+ s.close();
+ }
+ return null;
+ }
+
+ private static String getRandomId() {
+ UUID randomId = UUID.randomUUID();
+ return randomId.toString();
+ }
+}
diff --git a/src/main/java/com/percero/agents/auth/services/DatabaseHelper.java b/src/main/java/com/percero/agents/auth/services/DatabaseHelper.java
index afcdcf9..0432696 100644
--- a/src/main/java/com/percero/agents/auth/services/DatabaseHelper.java
+++ b/src/main/java/com/percero/agents/auth/services/DatabaseHelper.java
@@ -56,7 +56,7 @@ public ServiceUser getServiceUser(String userName, String password) {
result.getEmails().add(userIdentifier.getUserIdentifier());
}
result.setAccessToken(UUID.randomUUID().toString());
- result.setAuthProvider(AuthProvider.DATABASE);
+ result.setAuthProviderID(AuthProvider.DATABASE.toString());
result.setAreRoleNamesAccurate(false);
}
diff --git a/src/main/java/com/percero/agents/auth/services/GoogleHelper.java b/src/main/java/com/percero/agents/auth/services/GoogleHelper.java
index dc58ddb..7262383 100644
--- a/src/main/java/com/percero/agents/auth/services/GoogleHelper.java
+++ b/src/main/java/com/percero/agents/auth/services/GoogleHelper.java
@@ -184,7 +184,7 @@ public ServiceUser authenticateOAuthCode(String code, String redirectUri) throws
ServiceUser serviceUser = new ServiceUser();
serviceUser.setAccessToken("DEV");
serviceUser.setAreRoleNamesAccurate(useRoleNames);
- serviceUser.setAuthProvider(null);
+ serviceUser.setAuthProviderID(null);
serviceUser.setAvatarUrl("");
ArrayList emails = new ArrayList();
@@ -268,7 +268,7 @@ private ServiceUser authenticateAccessToken(String accessToken, String refreshTo
ServiceUser serviceUser = new ServiceUser();
serviceUser.setAccessToken("DEV");
serviceUser.setAreRoleNamesAccurate(useRoleNames);
- serviceUser.setAuthProvider(null);
+ serviceUser.setAuthProviderID(null);
serviceUser.setAvatarUrl("");
ArrayList emails = new ArrayList();
diff --git a/src/main/java/com/percero/agents/auth/services/IAuthProvider.java b/src/main/java/com/percero/agents/auth/services/IAuthProvider.java
new file mode 100644
index 0000000..5b32aad
--- /dev/null
+++ b/src/main/java/com/percero/agents/auth/services/IAuthProvider.java
@@ -0,0 +1,22 @@
+package com.percero.agents.auth.services;
+
+import com.percero.agents.auth.vo.ServiceUser;
+
+/**
+ * Defines the interface for providing additional authentication behavior into the ActiveStack
+ */
+public interface IAuthProvider {
+ /**
+ * Returns the string that uniquely identifies this provider
+ * @return String
+ */
+ String getID();
+
+ /**
+ * Authenticates a token and returns a ServiceUser that cooresponds to the credentials provided
+ * @param credential - A String to be interpreted by the provider as an authentication credential
+ * @return ServiceUser
+ */
+ ServiceUser authenticate(String credential);
+
+}
diff --git a/src/main/java/com/percero/agents/auth/services/IAuthService.java b/src/main/java/com/percero/agents/auth/services/IAuthService.java
index 6687646..00e3bc0 100644
--- a/src/main/java/com/percero/agents/auth/services/IAuthService.java
+++ b/src/main/java/com/percero/agents/auth/services/IAuthService.java
@@ -21,7 +21,7 @@ public interface IAuthService {
/**
* Authenticates an OAuth Code. Typical use case is client-side code produces an OAuth Code that the server then valdates.
*
- * @param authProvider
+ * @param authProviderID
* @param code
* @param clientId
* @param deviceId
@@ -29,12 +29,12 @@ public interface IAuthService {
* @param requestToken
* @return
*/
- public OAuthResponse authenticateOAuthCode(AuthProvider authProvider, String code, String clientId, String deviceId, String redirectUrl, OAuthToken requestToken);
+ public OAuthResponse authenticateOAuthCode(String authProviderID, String code, String clientId, String deviceId, String redirectUrl, OAuthToken requestToken);
/**
* In the case the OAuth Provider allows exchanging a user name/password combination for an Access Token, this method does just that.
*
- * @param authProvider
+ * @param authProviderID
* @param userName
* @param password
* @param scopes
@@ -44,20 +44,20 @@ public interface IAuthService {
* @param requestToken
* @return
*/
- public OAuthResponse authenticateBasicOAuth(AuthProvider authProvider, String userName, String password, String scopes, String appUrl, String clientId, String deviceId, OAuthToken requestToken);
+ public OAuthResponse authenticateBasicOAuth(String authProviderID, String userName, String password, String scopes, String appUrl, String clientId, String deviceId, OAuthToken requestToken);
/**
* Authenticates an OAuth Access Token. Typically, OAuth providers issue an AccessToken (and RefreshToken) that can be used to authenticate
* a user for a pre-determined amount of time.
*
- * @param authProvider
+ * @param authProviderID
* @param accessToken
* @param refreshToken
* @param clientId
* @param deviceId
* @return
*/
- public OAuthResponse authenticateOAuthAccessToken(AuthProvider authProvider, String accessToken, String refreshToken, String clientId, String deviceId);
+ public OAuthResponse authenticateOAuthAccessToken(String authProviderID, String accessToken, String refreshToken, String clientId, String deviceId);
/**
* Checks to see if the aUserId, aToken, aClientId combination exists in the Auth Service data store.
diff --git a/src/main/java/com/percero/agents/auth/vo/AuthRequest.java b/src/main/java/com/percero/agents/auth/vo/AuthRequest.java
index 80bd0b1..ae3cd7e 100644
--- a/src/main/java/com/percero/agents/auth/vo/AuthRequest.java
+++ b/src/main/java/com/percero/agents/auth/vo/AuthRequest.java
@@ -67,11 +67,11 @@ public String getRegAppKey() {
return regAppKey;
}
- private AuthProvider authProvider;
- public AuthProvider getAuthProvider() {
+ private String authProvider;
+ public String getAuthProvider() {
return authProvider;
}
- public void setAuthProvider(AuthProvider authProvider) {
- this.authProvider = authProvider;
+ public void setAuthProvider(String authProviderID) {
+ this.authProvider = authProviderID;
}
}
diff --git a/src/main/java/com/percero/agents/auth/vo/AuthenticationRequest.java b/src/main/java/com/percero/agents/auth/vo/AuthenticationRequest.java
index 5998d12..1c26300 100644
--- a/src/main/java/com/percero/agents/auth/vo/AuthenticationRequest.java
+++ b/src/main/java/com/percero/agents/auth/vo/AuthenticationRequest.java
@@ -1,7 +1,5 @@
package com.percero.agents.auth.vo;
-import java.util.Map;
-
/**
* This class represents a request from the client where they will specify the provider name
* that they wish to authenticate against and a credential string that the provider will
@@ -9,14 +7,6 @@
*/
public class AuthenticationRequest extends AuthRequest {
- private String providerName;
- public String getProviderName() {
- return providerName;
- }
- public void setProviderName(String providerName) {
- this.providerName = providerName;
- }
-
private String credential;
public String getCredential() {
return credential;
@@ -25,11 +15,4 @@ public void setCredential(String credential) {
this.credential = credential;
}
- private Map context;
- public Map getContext() {
- return context;
- }
- public void setContext(Map context) {
- this.context = context;
- }
}
diff --git a/src/main/java/com/percero/agents/auth/vo/AuthenticationResponse.java b/src/main/java/com/percero/agents/auth/vo/AuthenticationResponse.java
new file mode 100644
index 0000000..4121cf3
--- /dev/null
+++ b/src/main/java/com/percero/agents/auth/vo/AuthenticationResponse.java
@@ -0,0 +1,16 @@
+package com.percero.agents.auth.vo;
+
+/**
+ * Created by jonnysamps on 8/17/15.
+ */
+public class AuthenticationResponse extends AuthResponse {
+
+ private UserToken result;
+ public UserToken getResult() {
+ return result;
+ }
+ public void setResult(UserToken result) {
+ this.result = result;
+ }
+
+}
diff --git a/src/main/java/com/percero/agents/auth/vo/ReauthenticationRequest.java b/src/main/java/com/percero/agents/auth/vo/ReauthenticationRequest.java
new file mode 100644
index 0000000..8cdd3e5
--- /dev/null
+++ b/src/main/java/com/percero/agents/auth/vo/ReauthenticationRequest.java
@@ -0,0 +1,9 @@
+package com.percero.agents.auth.vo;
+
+/**
+ * Intended to be used to re-establish a user session
+ * using the token rather than the OAuth accessToken
+ */
+public class ReauthenticationRequest extends AuthRequest{
+
+}
diff --git a/src/main/java/com/percero/agents/auth/vo/ServiceUser.java b/src/main/java/com/percero/agents/auth/vo/ServiceUser.java
index ae58c7e..4b0d4a0 100644
--- a/src/main/java/com/percero/agents/auth/vo/ServiceUser.java
+++ b/src/main/java/com/percero/agents/auth/vo/ServiceUser.java
@@ -11,7 +11,7 @@ public class ServiceUser implements Serializable {
*/
private static final long serialVersionUID = 5880752591299642651L;
- private AuthProvider authProvider;
+ private String authProvider;
private String id = "";
private String login = "";
public String getLogin() {
@@ -142,10 +142,10 @@ public String getAvatarUrl() {
public void setAvatarUrl(String value) {
avatarUrl = value;
}
- public AuthProvider getAuthProvider() {
+ public String getAuthProviderID() {
return authProvider;
}
- public void setAuthProvider(AuthProvider authProvider) {
- this.authProvider = authProvider;
+ public void setAuthProviderID(String authProviderID) {
+ this.authProvider = authProviderID;
}
}
diff --git a/src/main/java/com/percero/agents/auth/vo/UserAccount.java b/src/main/java/com/percero/agents/auth/vo/UserAccount.java
index 3299cbf..147765c 100644
--- a/src/main/java/com/percero/agents/auth/vo/UserAccount.java
+++ b/src/main/java/com/percero/agents/auth/vo/UserAccount.java
@@ -32,8 +32,8 @@
@Entity
@Table(uniqueConstraints = {
- @UniqueConstraint(columnNames={"authProvider", "accountId"}),
- @UniqueConstraint(columnNames={"user_ID", "authProvider"})
+ @UniqueConstraint(columnNames={"authProviderID", "accountId"}),
+ @UniqueConstraint(columnNames={"user_ID", "authProviderID"})
})
public class UserAccount extends _Super_UserAccount
{
diff --git a/src/main/java/com/percero/agents/auth/vo/_Super_UserAccount.java b/src/main/java/com/percero/agents/auth/vo/_Super_UserAccount.java
index 65d8bc1..59daa72 100644
--- a/src/main/java/com/percero/agents/auth/vo/_Super_UserAccount.java
+++ b/src/main/java/com/percero/agents/auth/vo/_Super_UserAccount.java
@@ -9,8 +9,6 @@
import java.util.Date;
import javax.persistence.Column;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@@ -41,8 +39,7 @@ public class _Super_UserAccount implements Serializable, IAuthCachedObject
private String _accountId;
private Boolean _isSupended;
private Boolean _isAdmin;
- @Enumerated(EnumType.STRING)
- private AuthProvider _authProvider;
+ private String _authProviderID;
/*
* Property getters and setters
@@ -203,12 +200,12 @@ public int hashCode()
return result;
}
- public AuthProvider getAuthProvider() {
- return _authProvider;
+ public String getAuthProviderID() {
+ return _authProviderID;
}
- public void setAuthProvider(AuthProvider _provider) {
- this._authProvider = _provider;
+ public void setAuthProviderID(String providerID) {
+ this._authProviderID = providerID;
}
}
diff --git a/src/main/java/com/percero/agents/sync/access/AccessManager.java b/src/main/java/com/percero/agents/sync/access/AccessManager.java
index 33b1fae..77440c0 100644
--- a/src/main/java/com/percero/agents/sync/access/AccessManager.java
+++ b/src/main/java/com/percero/agents/sync/access/AccessManager.java
@@ -1257,6 +1257,34 @@ public String validateAndRetrieveCurrentClientId(String clientId,
return null;
}
+ @Override
+ public void updateWatcherFields(String category, String subCategory,
+ String fieldName, Collection fieldsToWatch, String[] params) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addWatcherField(String category, String subCategory,
+ String fieldName, Collection collection, String[] params) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addWatcherField(String category, String subCategory,
+ String fieldName, Collection collection) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void updateWatcherFields(String category, String subCategory,
+ String fieldName, Collection fieldsToWatch) {
+ // TODO Auto-generated method stub
+
+ }
+
/* (non-Javadoc)
* @see com.com.percero.agents.sync.services.IAccessManager#removeDeleteJournals(java.util.List)
*
diff --git a/src/main/java/com/percero/agents/sync/access/IAccessManager.java b/src/main/java/com/percero/agents/sync/access/IAccessManager.java
index 7875993..0a20947 100644
--- a/src/main/java/com/percero/agents/sync/access/IAccessManager.java
+++ b/src/main/java/com/percero/agents/sync/access/IAccessManager.java
@@ -196,10 +196,14 @@ public Set findClientByUserIdDeviceId(String deviceId, String userId)
////////////////////////////////////////////////////////
public void addWatcherField(ClassIDPair classIdPair, String fieldName, Collection collection);
public void addWatcherField(ClassIDPair classIdPair, String fieldName, Collection collection, String[] params);
+ public void addWatcherField(String category, String subCategory, String fieldName, Collection collection);
+ public void addWatcherField(String category, String subCategory, String fieldName, Collection collection, String[] params);
public void addWatcherClient(ClassIDPair classIdPair, String fieldName, String clientId);
public void addWatcherClient(ClassIDPair classIdPair, String fieldName, String clientId, String[] params);
public void updateWatcherFields(ClassIDPair classIdPair, String fieldName, Collection fieldsToWatch);
public void updateWatcherFields(ClassIDPair classIdPair, String fieldName, Collection fieldsToWatch, String[] params);
+ public void updateWatcherFields(String category, String subCategory, String fieldName, Collection fieldsToWatch);
+ public void updateWatcherFields(String category, String subCategory, String fieldName, Collection fieldsToWatch, String[] params);
public void saveChangeWatcherResult(ClassIDPair classIdPair, String fieldName, Object result);
public void saveChangeWatcherResult(ClassIDPair classIdPair, String fieldName, Object result, String[] params);
public Boolean getChangeWatcherResultExists(ClassIDPair classIdPair, String fieldName);
diff --git a/src/main/java/com/percero/agents/sync/access/RedisAccessManager.java b/src/main/java/com/percero/agents/sync/access/RedisAccessManager.java
index cdcc43b..86bc1f0 100644
--- a/src/main/java/com/percero/agents/sync/access/RedisAccessManager.java
+++ b/src/main/java/com/percero/agents/sync/access/RedisAccessManager.java
@@ -26,7 +26,7 @@
import com.percero.agents.sync.cw.ChangeWatcherReporting;
import com.percero.agents.sync.cw.IChangeWatcherHelper;
import com.percero.agents.sync.cw.IChangeWatcherHelperFactory;
-import com.percero.agents.sync.datastore.RedisDataStore;
+import com.percero.agents.sync.datastore.ICacheDataStore;
import com.percero.agents.sync.exceptions.ClientException;
import com.percero.agents.sync.helpers.RedisPostClientHelper;
import com.percero.agents.sync.services.IPushSyncHelper;
@@ -75,9 +75,9 @@ public void setPostClientHelper(RedisPostClientHelper value) {
//MongoOperations mongoOperations;
@Autowired
- RedisDataStore redisDataStore;
- public void setRedisDataStore(RedisDataStore redisDataStore) {
- this.redisDataStore = redisDataStore;
+ ICacheDataStore cacheDataStore;
+ public void setCacheDataStore(ICacheDataStore cacheDataStore) {
+ this.cacheDataStore = cacheDataStore;
}
@Autowired
@@ -105,48 +105,48 @@ public void setPushSyncHelper(IPushSyncHelper pushSyncHelper) {
public void createClient(String clientId, String userId, String deviceType, String deviceId) throws Exception {
String clientUserKey = RedisKeyUtils.clientUser(userId);
- redisDataStore.addSetValue(clientUserKey, clientId);
+ cacheDataStore.addSetValue(clientUserKey, clientId);
if (StringUtils.hasText(deviceId)) {
String userDeviceKey = RedisKeyUtils.userDeviceHash(userId);
- redisDataStore.setHashValue(userDeviceKey, deviceId, clientId);
+ cacheDataStore.setHashValue(userDeviceKey, deviceId, clientId);
String deviceKey = RedisKeyUtils.deviceHash(deviceId);
- redisDataStore.addSetValue(deviceKey, clientId);
+ cacheDataStore.addSetValue(deviceKey, clientId);
}
// Set the client's userId.
- redisDataStore.setValue(RedisKeyUtils.client(clientId), userId);
+ cacheDataStore.setValue(RedisKeyUtils.client(clientId), userId);
// Add to ClientUser list
- redisDataStore.addSetValue(clientUserKey, clientId);
+ cacheDataStore.addSetValue(clientUserKey, clientId);
if (Client.PERSISTENT_TYPE.equalsIgnoreCase(deviceType)) {
- redisDataStore.addSetValue(RedisKeyUtils.clientsPersistent(), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientsPersistent(), clientId);
}
else {
- redisDataStore.addSetValue(RedisKeyUtils.clientsNonPersistent(), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientsNonPersistent(), clientId);
}
}
public Boolean isNonPersistentClient(String clientId) {
- return redisDataStore.getSetIsMember(RedisKeyUtils.clientsNonPersistent(), clientId);
+ return cacheDataStore.getSetIsMember(RedisKeyUtils.clientsNonPersistent(), clientId);
}
public String getClientUserId(String clientId) {
- return (String) redisDataStore.getValue(RedisKeyUtils.client(clientId));
+ return (String) cacheDataStore.getValue(RedisKeyUtils.client(clientId));
}
public Boolean findClientByClientIdUserId(String clientId, String userId) throws Exception {
- return redisDataStore.getSetIsMember(RedisKeyUtils.clientUser(userId), clientId);
+ return cacheDataStore.getSetIsMember(RedisKeyUtils.clientUser(userId), clientId);
}
@SuppressWarnings("unchecked")
public Set findClientByUserIdDeviceId(String userId, String deviceId) throws Exception {
- Set deviceClientIds = (Set) redisDataStore.getSetValue(RedisKeyUtils.deviceHash(deviceId));
+ Set deviceClientIds = (Set) cacheDataStore.getSetValue(RedisKeyUtils.deviceHash(deviceId));
if (deviceClientIds == null) {
deviceClientIds = new HashSet(1);
}
- String result = (String) redisDataStore.getHashValue(RedisKeyUtils.userDeviceHash(userId), deviceId);
+ String result = (String) cacheDataStore.getHashValue(RedisKeyUtils.userDeviceHash(userId), deviceId);
if (!StringUtils.hasText(result)) {
deviceClientIds.add(result);
}
@@ -155,9 +155,9 @@ public Set findClientByUserIdDeviceId(String userId, String deviceId) th
}
public Boolean findClientByClientId(String clientId) {
- if (redisDataStore.getSetIsMember(RedisKeyUtils.clientsPersistent(), clientId))
+ if (cacheDataStore.getSetIsMember(RedisKeyUtils.clientsPersistent(), clientId))
return true;
- else if (redisDataStore.getSetIsMember(RedisKeyUtils.clientsNonPersistent(), clientId))
+ else if (cacheDataStore.getSetIsMember(RedisKeyUtils.clientsNonPersistent(), clientId))
return true;
else
return false;
@@ -186,13 +186,13 @@ public Boolean validateClientByClientId(String clientId, Boolean setClientTimeou
@SuppressWarnings("unchecked")
public Set validateClients(Collection clientIds) throws Exception {
- Set validClients = (Set) redisDataStore.getSetsContainsMembers(CLIENT_KEYS_SEY, clientIds.toArray());
+ Set validClients = (Set) cacheDataStore.getSetsContainsMembers(CLIENT_KEYS_SEY, clientIds.toArray());
return validClients;
}
@SuppressWarnings("unchecked")
public Set validateClientsIncludeFromDeviceHistory(Map clientDevices) throws Exception {
- Set validClients = (Set) redisDataStore.getSetsContainsMembers(CLIENT_KEYS_SEY, clientDevices.keySet().toArray());
+ Set validClients = (Set) cacheDataStore.getSetsContainsMembers(CLIENT_KEYS_SEY, clientDevices.keySet().toArray());
// Now check each device to see if it has a corresponding clientId.
Iterator> itrClientDevices = clientDevices.entrySet().iterator();
@@ -201,7 +201,7 @@ public Set validateClientsIncludeFromDeviceHistory(Map c
String nextClient = nextClientDevice.getKey();
String nextDevice = nextClientDevice.getValue();
- if (redisDataStore.getSetIsMember(RedisKeyUtils.deviceHash(nextDevice), nextClient)) {
+ if (cacheDataStore.getSetIsMember(RedisKeyUtils.deviceHash(nextDevice), nextClient)) {
validClients.add(nextClient);
}
}
@@ -217,9 +217,9 @@ public String validateAndRetrieveCurrentClientId(String clientId, String deviceI
}
else {
// Client is NOT current, but could still be valid.
- if (redisDataStore.getSetIsMember(RedisKeyUtils.deviceHash(deviceId), clientId)) {
+ if (cacheDataStore.getSetIsMember(RedisKeyUtils.deviceHash(deviceId), clientId)) {
// Client IS valid, now get current Client.
- Set validDeviceClientIds = (Set) redisDataStore.getSetValue(RedisKeyUtils.deviceHash(deviceId));
+ Set validDeviceClientIds = (Set) cacheDataStore.getSetValue(RedisKeyUtils.deviceHash(deviceId));
Iterator itrValidDeviceClientIds = validDeviceClientIds.iterator();
while (itrValidDeviceClientIds.hasNext()) {
String nextClientId = itrValidDeviceClientIds.next();
@@ -250,8 +250,8 @@ public void registerClient(String clientId, String userId, String deviceId, Stri
if (!isValidClient)
createClient(clientId, userId, deviceType, deviceId);
- redisDataStore.addSetValue(RedisKeyUtils.clientsLoggedIn(), clientId);
- redisDataStore.deleteHashKey(RedisKeyUtils.clientsHibernated(), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientsLoggedIn(), clientId);
+ cacheDataStore.deleteHashKey(RedisKeyUtils.clientsHibernated(), clientId);
postClient(clientId);
}
@@ -263,8 +263,8 @@ public Boolean hibernateClient(String clientId, String userId) throws Exception
// Make sure this client/user combo is a valid one.
if (findClientByClientIdUserId(clientId, userId)) {
// Remove the client from the LoggedIn list and add it to the Hibernated list.
- redisDataStore.setHashValue(RedisKeyUtils.clientsHibernated(), clientId, System.currentTimeMillis());
- redisDataStore.removeSetValue(RedisKeyUtils.clientsLoggedIn(), clientId);
+ cacheDataStore.setHashValue(RedisKeyUtils.clientsHibernated(), clientId, System.currentTimeMillis());
+ cacheDataStore.removeSetValue(RedisKeyUtils.clientsLoggedIn(), clientId);
// NOTE: The client is still in either the "client persistent" or "client non-persistent" list and
// is therefore still considered a valid client.
@@ -294,16 +294,16 @@ public Boolean upgradeClient(String clientId, String deviceId, String deviceType
try {
// Remove from NonPersistent list.
- redisDataStore.removeSetValue(RedisKeyUtils.clientsNonPersistent(), clientId);
+ cacheDataStore.removeSetValue(RedisKeyUtils.clientsNonPersistent(), clientId);
// Add to Persistent List.
- redisDataStore.addSetValue(RedisKeyUtils.clientsPersistent(), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientsPersistent(), clientId);
// Add to LoggedIn list
- redisDataStore.addSetValue(RedisKeyUtils.clientsLoggedIn(), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientsLoggedIn(), clientId);
// Remove from Hibernated list
- redisDataStore.deleteHashKey(RedisKeyUtils.clientsHibernated(), clientId);
+ cacheDataStore.deleteHashKey(RedisKeyUtils.clientsHibernated(), clientId);
if (previousClientIds != null && !previousClientIds.isEmpty()) {
Iterator itrPreviousClientIds = previousClientIds.iterator();
@@ -311,7 +311,7 @@ public Boolean upgradeClient(String clientId, String deviceId, String deviceType
String nextPreviousClient = itrPreviousClientIds.next();
if (StringUtils.hasText(nextPreviousClient) && nextPreviousClient.equals(clientId)) {
// Remove from NonPersistent list.
- redisDataStore.removeSetValue(RedisKeyUtils.clientsNonPersistent(), nextPreviousClient);
+ cacheDataStore.removeSetValue(RedisKeyUtils.clientsNonPersistent(), nextPreviousClient);
renameClient(nextPreviousClient, clientId);
}
@@ -319,7 +319,7 @@ public Boolean upgradeClient(String clientId, String deviceId, String deviceType
}
else {
// Add to ClientUser list
- redisDataStore.addSetValue(RedisKeyUtils.clientUser(userId), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientUser(userId), clientId);
}
result = true;
@@ -344,94 +344,94 @@ else if (thePreviousClient.equals(clientId)) {
}
// Get the existing UserId.
- String userId = (String) redisDataStore.getValue(RedisKeyUtils.client(thePreviousClient));
+ String userId = (String) cacheDataStore.getValue(RedisKeyUtils.client(thePreviousClient));
log.debug("Renaming client " + thePreviousClient + " to " + clientId);
if (StringUtils.hasText(userId)) {
log.debug("Renaming user " + userId + " from client " + thePreviousClient + " to " + clientId);
// Remove Previous Client from ClientUser list
- redisDataStore.removeSetValue(RedisKeyUtils.clientUser(userId), thePreviousClient);
+ cacheDataStore.removeSetValue(RedisKeyUtils.clientUser(userId), thePreviousClient);
// Add to ClientUser list
- redisDataStore.addSetValue(RedisKeyUtils.clientUser(userId), clientId);
+ cacheDataStore.addSetValue(RedisKeyUtils.clientUser(userId), clientId);
// Update the UserDevice ClientID.
String userDeviceHashKey = RedisKeyUtils.userDeviceHash(userId);
- Collection