USERGRID-933: token now contains org in workflows for confirmation/activation 
of admin users

allows org-specific email templates and admin approval email addresses to be 
used


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/e3d454fe
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/e3d454fe
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/e3d454fe

Branch: refs/heads/master
Commit: e3d454fed8ffc04978e167aacf29b42e450de2d1
Parents: 16bcae6
Author: Mike Dunker <[email protected]>
Authored: Fri Jan 8 09:53:15 2016 -0800
Committer: Mike Dunker <[email protected]>
Committed: Fri Jan 8 09:53:15 2016 -0800

----------------------------------------------------------------------
 .../rest/management/users/UserResource.java     |   4 +-
 .../usergrid/management/ManagementService.java  |  12 +-
 .../cassandra/ManagementServiceImpl.java        | 171 +++++++++++--------
 .../usergrid/security/tokens/TokenInfo.java     |  19 +++
 .../usergrid/security/tokens/TokenService.java  |   9 +-
 .../tokens/cassandra/TokenServiceImpl.java      |  44 ++++-
 .../apache/usergrid/management/EmailFlowIT.java |   9 +-
 7 files changed, 181 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/rest/src/main/java/org/apache/usergrid/rest/management/users/UserResource.java
----------------------------------------------------------------------
diff --git 
a/stack/rest/src/main/java/org/apache/usergrid/rest/management/users/UserResource.java
 
b/stack/rest/src/main/java/org/apache/usergrid/rest/management/users/UserResource.java
index 320c18e..e9b5ad9 100644
--- 
a/stack/rest/src/main/java/org/apache/usergrid/rest/management/users/UserResource.java
+++ 
b/stack/rest/src/main/java/org/apache/usergrid/rest/management/users/UserResource.java
@@ -337,7 +337,7 @@ public class UserResource extends AbstractContextResource {
         }
 
         try {
-            management.handleActivationTokenForAdminUser( null, 
user.getUuid(), token );
+            management.handleActivationTokenForAdminUser( user.getUuid(), 
token );
             return handleViewable( "activate", this );
         }
         catch ( TokenException e ) {
@@ -366,7 +366,7 @@ public class UserResource extends AbstractContextResource {
         }
 
         try {
-            ActivationState state = 
management.handleConfirmationTokenForAdminUser( null, user.getUuid(), token );
+            ActivationState state = 
management.handleConfirmationTokenForAdminUser( user.getUuid(), token );
             if ( state == ActivationState.CONFIRMED_AWAITING_ACTIVATION ) {
                 return handleViewable( "confirm", this );
             }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/services/src/main/java/org/apache/usergrid/management/ManagementService.java
----------------------------------------------------------------------
diff --git 
a/stack/services/src/main/java/org/apache/usergrid/management/ManagementService.java
 
b/stack/services/src/main/java/org/apache/usergrid/management/ManagementService.java
index 950f7e0..4eb147a 100644
--- 
a/stack/services/src/main/java/org/apache/usergrid/management/ManagementService.java
+++ 
b/stack/services/src/main/java/org/apache/usergrid/management/ManagementService.java
@@ -50,9 +50,9 @@ public interface ManagementService {
 
     public AccessInfo authorizeClient( String clientId, String clientSecret, 
long ttl ) throws Exception;
 
-    public ActivationState handleConfirmationTokenForAdminUser( UUID 
organizationId, UUID userId, String token ) throws Exception;
+    public ActivationState handleConfirmationTokenForAdminUser( UUID userId, 
String token ) throws Exception;
 
-    public ActivationState handleActivationTokenForAdminUser( UUID 
organizationId, UUID userId, String token ) throws Exception;
+    public ActivationState handleActivationTokenForAdminUser( UUID userId, 
String token ) throws Exception;
 
     public ActivationState handleActivationTokenForOrganization( UUID 
organizationId, String token ) throws Exception;
 
@@ -120,9 +120,9 @@ public interface ManagementService {
 
     public void revokeAccessTokenForAdminUser( UUID userId, String token ) 
throws Exception;
 
-    public String getActivationTokenForAdminUser( UUID userId, long ttl ) 
throws Exception;
+    public String getActivationTokenForAdminUser( UUID userId, long ttl, UUID 
organizationId ) throws Exception;
 
-    public String getConfirmationTokenForAdminUser( UUID userId, long ttl ) 
throws Exception;
+    public String getConfirmationTokenForAdminUser( UUID userId, long ttl, 
UUID organizationId ) throws Exception;
 
     public String getActivationTokenForOrganization( UUID organizationId, long 
ttl ) throws Exception;
 
@@ -190,6 +190,8 @@ public interface ManagementService {
 
     public Map<String, Object> getOrganizationData( OrganizationInfo 
organization ) throws Exception;
 
+    public UUID getOrganizationIdForApplication( UUID applicationId ) throws 
Exception;
+
     public OrganizationInfo getOrganizationForApplication( UUID applicationId 
) throws Exception;
 
     public OrganizationInfo getOrganizationInfoFromAccessToken( String token ) 
throws Exception;
@@ -198,7 +200,7 @@ public interface ManagementService {
 
     public BiMap<UUID, String> getOrganizationsForAdminUser( UUID userId ) 
throws Exception;
 
-    public String getPasswordResetTokenForAdminUser( UUID userId, long ttl ) 
throws Exception;
+    public String getPasswordResetTokenForAdminUser( UUID userId, long ttl, 
UUID organizationId ) throws Exception;
 
     public UserInfo getAdminUserByUuid( UUID id ) throws Exception;
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
 
b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
index 61beeb7..99ea05f 100644
--- 
a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
+++ 
b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
@@ -64,6 +64,7 @@ import org.apache.usergrid.security.shiro.utils.SubjectUtils;
 import org.apache.usergrid.security.tokens.TokenCategory;
 import org.apache.usergrid.security.tokens.TokenInfo;
 import org.apache.usergrid.security.tokens.TokenService;
+import org.apache.usergrid.security.tokens.cassandra.TokenServiceImpl;
 import org.apache.usergrid.security.tokens.exceptions.TokenException;
 import org.apache.usergrid.services.*;
 import org.apache.usergrid.utils.*;
@@ -1347,18 +1348,24 @@ public class ManagementServiceImpl implements 
ManagementService {
     }
 
 
-    // TokenType tokenType, String type, AuthPrincipalInfo principal,
-    // Map<String, Object> state
     public String getTokenForPrincipal( TokenCategory token_category, String 
token_type, UUID applicationId,
                                         AuthPrincipalType principal_type, UUID 
id, long duration ) throws Exception {
 
+        return getTokenForPrincipal(token_category, token_type, applicationId, 
principal_type, id, duration, null);
+    }
+
+    // include workflowOrgId
+    public String getTokenForPrincipal( TokenCategory token_category, String 
token_type, UUID applicationId,
+                                        AuthPrincipalType principal_type, UUID 
id, long duration,
+                                        UUID workflowOrgId) throws Exception {
+
         if ( anyNull(token_category, applicationId, principal_type, id) ) {
             return null;
         }
 
         return tokens
                 .createToken( token_category, token_type, new 
AuthPrincipalInfo( principal_type, id, applicationId ),
-                        null, duration );
+                        null, duration, workflowOrgId );
     }
 
 
@@ -1375,29 +1382,40 @@ public class ManagementServiceImpl implements 
ManagementService {
     }
 
 
-    public AuthPrincipalInfo getPrincipalFromAccessToken( String token, String 
expected_token_type,
-                                                          AuthPrincipalType 
expected_principal_type ) throws Exception {
+    public boolean validateTokenAndPrincipalTypes(TokenInfo tokenInfo, String 
expected_token_type,
+                                                  AuthPrincipalType 
expected_principal_type) throws Exception {
+        boolean success = true;
+        if (tokenInfo == null || (expected_token_type != null && 
!expected_token_type.equals(tokenInfo.getType()))) {
+            success = false;
+        } else {
+            AuthPrincipalInfo principal = tokenInfo.getPrincipal();
+            if (principal == null ||
+                    (expected_principal_type != null && 
!expected_principal_type.equals(principal.getType()))) {
+                success = false;
+            }
+        }
+
+        return success;
+    }
+
+
+    public TokenInfo getTokenInfoFromAccessToken(String token, String 
expected_token_type,
+                                                 AuthPrincipalType 
expected_principal_type) throws Exception {
 
         TokenInfo tokenInfo = tokens.getTokenInfo( token );
 
-        if ( tokenInfo == null ) {
-            return null;
-        }
+        return validateTokenAndPrincipalTypes(tokenInfo, expected_token_type, 
expected_principal_type) ?
+                tokenInfo : null;
+    }
 
-        if ( ( expected_token_type != null ) && !expected_token_type.equals( 
tokenInfo.getType() ) ) {
-            return null;
-        }
 
-        AuthPrincipalInfo principal = tokenInfo.getPrincipal();
-        if ( principal == null ) {
-            return null;
-        }
+    public AuthPrincipalInfo getPrincipalFromAccessToken(String token, String 
expected_token_type,
+                                                         AuthPrincipalType 
expected_principal_type) throws Exception {
 
-        if ( ( expected_principal_type != null ) && 
!expected_principal_type.equals( principal.getType() ) ) {
-            return null;
-        }
+        // validates expected types
+        TokenInfo tokenInfo = getTokenInfoFromAccessToken(token, 
expected_token_type, expected_principal_type);
 
-        return principal;
+        return tokenInfo != null ? tokenInfo.getPrincipal() : null;
     }
 
 
@@ -1420,10 +1438,7 @@ public class ManagementServiceImpl implements 
ManagementService {
             principal.getApplicationId() != null
                 ? principal.getApplicationId() : smf.getManagementAppId() );
 
-        Entity entity = em.get(new SimpleEntityRef(
-            principal.getType().getEntityType(), principal.getUuid()));
-
-        return entity;
+        return em.get(new SimpleEntityRef( 
principal.getType().getEntityType(), principal.getUuid()));
     }
 
 
@@ -1472,8 +1487,7 @@ public class ManagementServiceImpl implements 
ManagementService {
     @Override
     public Entity getAdminUserEntityFromAccessToken( String token ) throws 
Exception {
 
-        Entity user = getEntityFromAccessToken(token, null, ADMIN_USER);
-        return user;
+        return getEntityFromAccessToken(token, null, ADMIN_USER);
     }
 
 
@@ -1794,10 +1808,7 @@ public class ManagementServiceImpl implements 
ManagementService {
     }
 
 
-
-    @Override
-    public OrganizationInfo getOrganizationForApplication( UUID 
applicationInfoId ) throws Exception {
-
+    protected Entity getOrganizationEntityForApplication( UUID 
applicationInfoId ) throws Exception {
         if ( applicationInfoId == null ) {
             return null;
         }
@@ -1805,15 +1816,28 @@ public class ManagementServiceImpl implements 
ManagementService {
         final EntityManager em = 
emf.getEntityManager(smf.getManagementAppId());
 
         Results r = em.getSourceEntities(
-            new SimpleEntityRef(CpNamingUtils.APPLICATION_INFO, 
applicationInfoId),
-            ORG_APP_RELATIONSHIP, Group.ENTITY_TYPE, Level.ALL_PROPERTIES);
+                new SimpleEntityRef(CpNamingUtils.APPLICATION_INFO, 
applicationInfoId),
+                ORG_APP_RELATIONSHIP, Group.ENTITY_TYPE, Level.ALL_PROPERTIES);
 
-        Entity entity = r.getEntity();
-        if ( entity != null ) {
-            return new OrganizationInfo( entity.getUuid(), ( String ) 
entity.getProperty( "path" ) );
-        }
+        return r.getEntity();
+    }
 
-        return null;
+    @Override
+    public UUID getOrganizationIdForApplication( UUID applicationInfoId ) 
throws Exception {
+
+        Entity entity = getOrganizationEntityForApplication(applicationInfoId);
+
+        return entity != null ? entity.getUuid() : null;
+    }
+
+    @Override
+    public OrganizationInfo getOrganizationForApplication( UUID 
applicationInfoId ) throws Exception {
+
+        Entity entity = getOrganizationEntityForApplication(applicationInfoId);
+
+        return entity != null ?
+                new OrganizationInfo( entity.getUuid(), ( String ) 
entity.getProperty( "path" ) ) :
+                null;
     }
 
 
@@ -2133,9 +2157,9 @@ public class ManagementServiceImpl implements 
ManagementService {
 
 
     @Override
-    public String getPasswordResetTokenForAdminUser( UUID userId, long ttl ) 
throws Exception {
+    public String getPasswordResetTokenForAdminUser( UUID userId, long ttl, 
UUID organizationId ) throws Exception {
         return getTokenForPrincipal( EMAIL, TOKEN_TYPE_PASSWORD_RESET, 
smf.getManagementAppId(), ADMIN_USER, userId,
-                ttl );
+                ttl, organizationId );
     }
 
 
@@ -2153,14 +2177,16 @@ public class ManagementServiceImpl implements 
ManagementService {
 
 
     @Override
-    public String getActivationTokenForAdminUser( UUID userId, long ttl ) 
throws Exception {
-        return getTokenForPrincipal( EMAIL, TOKEN_TYPE_ACTIVATION, 
smf.getManagementAppId(), ADMIN_USER, userId, ttl );
+    public String getActivationTokenForAdminUser( UUID userId, long ttl, UUID 
organizationId ) throws Exception {
+        return getTokenForPrincipal( EMAIL, TOKEN_TYPE_ACTIVATION, 
smf.getManagementAppId(), ADMIN_USER, userId,
+                ttl, organizationId );
     }
 
 
     @Override
-    public String getConfirmationTokenForAdminUser( UUID userId, long ttl ) 
throws Exception {
-        return getTokenForPrincipal( EMAIL, TOKEN_TYPE_CONFIRM, 
smf.getManagementAppId(), ADMIN_USER, userId, ttl );
+    public String getConfirmationTokenForAdminUser( UUID userId, long ttl, 
UUID organizationId ) throws Exception {
+        return getTokenForPrincipal( EMAIL, TOKEN_TYPE_CONFIRM, 
smf.getManagementAppId(), ADMIN_USER, userId,
+                ttl, organizationId );
     }
 
 
@@ -2257,7 +2283,7 @@ public class ManagementServiceImpl implements 
ManagementService {
 
     @Override
     public void startAdminUserPasswordResetFlow( UUID organizationId, UserInfo 
user ) throws Exception {
-        String token = getPasswordResetTokenForAdminUser( user.getUuid(), 0 );
+        String token = getPasswordResetTokenForAdminUser( user.getUuid(), 0, 
organizationId );
 
         String resetPropertyUrl = organizationId != null ?
                 getOrganizationConfigPropertyByUuid(organizationId, 
PROPERTIES_ADMIN_RESETPW_URL) :
@@ -2410,21 +2436,25 @@ public class ManagementServiceImpl implements 
ManagementService {
 
 
     @Override
-    public ActivationState handleConfirmationTokenForAdminUser( UUID 
organizationId, UUID userId, String token ) throws Exception {
-        AuthPrincipalInfo principal = getPrincipalFromAccessToken( token, 
TOKEN_TYPE_CONFIRM, ADMIN_USER );
-        if ( ( principal != null ) && userId.equals( principal.getUuid() ) ) {
-            UserInfo user = getAdminUserByUuid( principal.getUuid() );
-            confirmAdminUser( user.getUuid() );
-            if ( newAdminUsersNeedSysAdminApproval() ) {
-                sendAdminUserConfirmedAwaitingActivationEmail( user );
-                sendSysAdminRequestAdminActivationEmail(organizationId, user);
-                return ActivationState.CONFIRMED_AWAITING_ACTIVATION;
-            }
-            else {
-                activateAdminUser( principal.getUuid() );
-                sendAdminUserActivatedEmail( user );
-                sendSysAdminNewAdminActivatedNotificationEmail( 
organizationId, user );
-                return ActivationState.ACTIVATED;
+    // token may contain the workflow organization id
+    public ActivationState handleConfirmationTokenForAdminUser( UUID userId, 
String token ) throws Exception {
+        TokenInfo tokenInfo = getTokenInfoFromAccessToken(token, 
TOKEN_TYPE_CONFIRM, ADMIN_USER);
+        if (tokenInfo != null) {
+            AuthPrincipalInfo principal = tokenInfo.getPrincipal();
+            if ((principal != null) && userId.equals(principal.getUuid())) {
+                UUID workflowOrgId = tokenInfo.getWorkflowOrgId();
+                UserInfo user = getAdminUserByUuid(principal.getUuid());
+                confirmAdminUser(user.getUuid());
+                if (newAdminUsersNeedSysAdminApproval()) {
+                    sendAdminUserConfirmedAwaitingActivationEmail(user);
+                    sendSysAdminRequestAdminActivationEmail(workflowOrgId, 
user);
+                    return ActivationState.CONFIRMED_AWAITING_ACTIVATION;
+                } else {
+                    activateAdminUser(principal.getUuid());
+                    sendAdminUserActivatedEmail(user);
+                    
sendSysAdminNewAdminActivatedNotificationEmail(workflowOrgId, user);
+                    return ActivationState.ACTIVATED;
+                }
             }
         }
         return ActivationState.UNKNOWN;
@@ -2432,21 +2462,26 @@ public class ManagementServiceImpl implements 
ManagementService {
 
 
     @Override
-    public ActivationState handleActivationTokenForAdminUser( UUID 
organizationId, UUID userId, String token ) throws Exception {
-        AuthPrincipalInfo principal = getPrincipalFromAccessToken( token, 
TOKEN_TYPE_ACTIVATION, ADMIN_USER );
-        if ( ( principal != null ) && userId.equals( principal.getUuid() ) ) {
-            activateAdminUser( principal.getUuid() );
-            UserInfo user = getAdminUserByUuid( principal.getUuid() );
-            sendAdminUserActivatedEmail( user );
-            sendSysAdminNewAdminActivatedNotificationEmail(organizationId, 
user);
-            return ActivationState.ACTIVATED;
+    // token may contain the workflow organization id
+    public ActivationState handleActivationTokenForAdminUser( UUID userId, 
String token ) throws Exception {
+        TokenInfo tokenInfo = getTokenInfoFromAccessToken(token, 
TOKEN_TYPE_ACTIVATION, ADMIN_USER);
+        if (tokenInfo == null) {
+            AuthPrincipalInfo principal = tokenInfo.getPrincipal();
+            if ((principal != null) && userId.equals(principal.getUuid())) {
+                UUID workflowOrgId = tokenInfo.getWorkflowOrgId();
+                activateAdminUser(principal.getUuid());
+                UserInfo user = getAdminUserByUuid(principal.getUuid());
+                sendAdminUserActivatedEmail(user);
+                sendSysAdminNewAdminActivatedNotificationEmail(workflowOrgId, 
user);
+                return ActivationState.ACTIVATED;
+            }
         }
         return ActivationState.UNKNOWN;
     }
 
 
     public void sendAdminUserConfirmationEmail( UUID organizationId, UserInfo 
user ) throws Exception {
-        String token = getConfirmationTokenForAdminUser(user.getUuid(), 0);
+        String token = getConfirmationTokenForAdminUser(user.getUuid(), 0, 
organizationId);
         String adminActivationUrlTemplate = organizationId != null ?
                 getOrganizationConfigPropertyByUuid(organizationId, 
PROPERTIES_ADMIN_CONFIRMATION_URL) :
                 getOrganizationConfigPropertyForUserInfo(user, 
PROPERTIES_ADMIN_CONFIRMATION_URL);
@@ -2460,7 +2495,7 @@ public class ManagementServiceImpl implements 
ManagementService {
 
 
     public void sendSysAdminRequestAdminActivationEmail( UUID organizationId, 
UserInfo user ) throws Exception {
-        String token = getActivationTokenForAdminUser(user.getUuid(), 0);
+        String token = getActivationTokenForAdminUser(user.getUuid(), 0, 
organizationId);
         //TODO: admin specific email
         String activationUrlTemplate = organizationId != null ?
                 getOrganizationConfigPropertyByUuid(organizationId, 
PROPERTIES_ADMIN_ACTIVATION_URL) :

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenInfo.java
----------------------------------------------------------------------
diff --git 
a/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenInfo.java
 
b/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenInfo.java
index e3b3ff1..d4f42aa 100644
--- 
a/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenInfo.java
+++ 
b/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenInfo.java
@@ -17,6 +17,7 @@
 package org.apache.usergrid.security.tokens;
 
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
@@ -34,10 +35,17 @@ public class TokenInfo {
     long duration;
     AuthPrincipalInfo principal;
     Map<String, Object> state;
+    UUID workflowOrgId;
 
 
     public TokenInfo( UUID uuid, String type, long created, long accessed, 
long inactive, long duration,
                       AuthPrincipalInfo principal, Map<String, Object> state ) 
{
+        this(uuid, type, created, accessed, inactive, duration, principal, 
state, null);
+    }
+
+
+    public TokenInfo( UUID uuid, String type, long created, long accessed, 
long inactive, long duration,
+                      AuthPrincipalInfo principal, Map<String, Object> state, 
UUID workflowOrgId ) {
         this.uuid = uuid;
         this.type = type;
         this.created = created;
@@ -46,6 +54,7 @@ public class TokenInfo {
         this.principal = principal;
         this.duration = duration;
         this.state = state;
+        this.workflowOrgId = workflowOrgId;
     }
 
 
@@ -138,4 +147,14 @@ public class TokenInfo {
     public void setState( Map<String, Object> state ) {
         this.state = state;
     }
+
+
+    public UUID getWorkflowOrgId() {
+        return workflowOrgId;
+    }
+
+
+    public void setWorkflowOrgId( UUID workflowOrgId ) {
+        this.workflowOrgId = workflowOrgId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenService.java
----------------------------------------------------------------------
diff --git 
a/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenService.java
 
b/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenService.java
index 36decce..d8526af 100644
--- 
a/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenService.java
+++ 
b/stack/services/src/main/java/org/apache/usergrid/security/tokens/TokenService.java
@@ -18,6 +18,7 @@ package org.apache.usergrid.security.tokens;
 
 
 import java.util.Map;
+import java.util.UUID;
 
 import org.apache.usergrid.security.AuthPrincipalInfo;
 
@@ -31,8 +32,14 @@ public interface TokenService {
     public String createToken( TokenCategory tokenCategory, String type, 
AuthPrincipalInfo principal,
                                Map<String, Object> state, long duration ) 
throws Exception;
 
+    public String createToken( TokenCategory tokenCategory, String type, 
AuthPrincipalInfo principal,
+                               Map<String, Object> state, long duration, UUID 
workflowOrgId ) throws Exception;
+
     public void importToken( String token, TokenCategory tokenCategory, String 
type, AuthPrincipalInfo principal,
-                               Map<String, Object> state, long duration ) 
throws Exception;
+                             Map<String, Object> state, long duration ) throws 
Exception;
+
+    public void importToken( String token, TokenCategory tokenCategory, String 
type, AuthPrincipalInfo principal,
+                               Map<String, Object> state, long duration, UUID 
workflowOrgId ) throws Exception;
 
     /** Get the token info for the string version of this token */
     public TokenInfo getTokenInfo( String token ) throws Exception;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/services/src/main/java/org/apache/usergrid/security/tokens/cassandra/TokenServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/stack/services/src/main/java/org/apache/usergrid/security/tokens/cassandra/TokenServiceImpl.java
 
b/stack/services/src/main/java/org/apache/usergrid/security/tokens/cassandra/TokenServiceImpl.java
index ab0307a..6eb226f 100644
--- 
a/stack/services/src/main/java/org/apache/usergrid/security/tokens/cassandra/TokenServiceImpl.java
+++ 
b/stack/services/src/main/java/org/apache/usergrid/security/tokens/cassandra/TokenServiceImpl.java
@@ -20,6 +20,7 @@ package org.apache.usergrid.security.tokens.cassandra;
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.apache.usergrid.utils.ConversionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -88,6 +89,8 @@ public class TokenServiceImpl implements TokenService {
     private static final String TOKEN_ENTITY = "entity";
     private static final String TOKEN_APPLICATION = "application";
     private static final String TOKEN_STATE = "state";
+    private static final String TOKEN_WORKFLOW_ORG_ID = "workflowOrgId";
+
 
     private static final String TOKEN_TYPE_ACCESS = "access";
 
@@ -107,6 +110,7 @@ public class TokenServiceImpl implements TokenService {
         set.add( TOKEN_APPLICATION );
         set.add( TOKEN_STATE );
         set.add( TOKEN_DURATION );
+        set.add( TOKEN_WORKFLOW_ORG_ID );
         TOKEN_PROPERTIES = Collections.unmodifiableSet(set);
     }
 
@@ -204,13 +208,21 @@ public class TokenServiceImpl implements TokenService {
     @Override
     public String createToken( TokenCategory tokenCategory, String type, 
AuthPrincipalInfo principal,
                                Map<String, Object> state, long duration ) 
throws Exception {
-        return createToken( tokenCategory, type, principal, state, duration, 
System.currentTimeMillis() );
+        return createToken( tokenCategory, type, principal, state, duration, 
null, System.currentTimeMillis() );
+    }
+
+
+    @Override
+    public String createToken( TokenCategory tokenCategory, String type, 
AuthPrincipalInfo principal,
+                               Map<String, Object> state, long duration, UUID 
workflowOrgId ) throws Exception {
+        return createToken( tokenCategory, type, principal, state, duration, 
workflowOrgId, System.currentTimeMillis() );
     }
 
 
     /** Exposed for testing purposes. The interface does not allow creation 
timestamp checking */
     public String createToken( TokenCategory tokenCategory, String type, 
AuthPrincipalInfo principal,
-                               Map<String, Object> state, long duration, long 
creationTimestamp ) throws Exception {
+                               Map<String, Object> state, long duration, UUID 
workflowOrgId,
+                               long creationTimestamp ) throws Exception {
 
         long maxTokenTtl = getMaxTtl( tokenCategory, principal );
 
@@ -237,7 +249,8 @@ public class TokenServiceImpl implements TokenService {
         if ( type == null ) {
             type = TOKEN_TYPE_ACCESS;
         }
-        TokenInfo tokenInfo = new TokenInfo( uuid, type, timestamp, timestamp, 
0, duration, principal, state );
+        TokenInfo tokenInfo = new TokenInfo( uuid, type, timestamp, timestamp, 
0, duration, principal,
+                state, workflowOrgId );
         putTokenInfo( tokenInfo );
 
         // generate token from the UUID that we created
@@ -249,6 +262,14 @@ public class TokenServiceImpl implements TokenService {
     public void importToken(String token, TokenCategory tokenCategory, String 
type, AuthPrincipalInfo principal,
                             Map<String, Object> state, long duration) throws 
Exception {
 
+        importToken(token, tokenCategory, type, principal, state, duration, 
null);
+    }
+
+
+    @Override
+    public void importToken(String token, TokenCategory tokenCategory, String 
type, AuthPrincipalInfo principal,
+                            Map<String, Object> state, long duration, UUID 
workflowOrgId) throws Exception {
+
         // same logic as create token
 
         long maxTokenTtl = getMaxTtl( tokenCategory, principal );
@@ -267,6 +288,7 @@ public class TokenServiceImpl implements TokenService {
             Assert.notNull( principal.getType() );
             Assert.notNull( principal.getApplicationId() );
             Assert.notNull( principal.getUuid() );
+            // workflowOrgId would be taken from state
         }
 
         // except that we generate the UUID based on the token
@@ -278,7 +300,8 @@ public class TokenServiceImpl implements TokenService {
             type = TOKEN_TYPE_ACCESS;
         }
 
-        TokenInfo tokenInfo = new TokenInfo( uuid, type, timestamp, timestamp, 
0, duration, principal, state );
+        TokenInfo tokenInfo = new TokenInfo( uuid, type, timestamp, timestamp, 
0, duration, principal,
+                state, workflowOrgId );
         putTokenInfo( tokenInfo );
     }
 
@@ -449,7 +472,13 @@ public class TokenServiceImpl implements TokenService {
         }
         @SuppressWarnings("unchecked") Map<String, Object> state =
                 ( Map<String, Object> ) JsonUtils.fromByteBuffer( columns.get( 
TOKEN_STATE ) );
-        return new TokenInfo( uuid, type, created, accessed, inactive, 
duration, principal, state );
+
+        UUID workflowOrgId = null;
+        if (columns.containsKey(TOKEN_WORKFLOW_ORG_ID)) {
+            workflowOrgId = 
ConversionUtils.uuid(columns.get(TOKEN_WORKFLOW_ORG_ID));
+        }
+
+        return new TokenInfo( uuid, type, created, accessed, inactive, 
duration, principal, state, workflowOrgId );
     }
 
 
@@ -505,6 +534,11 @@ public class TokenServiceImpl implements TokenService {
                             be ) );
         }
 
+        if ( tokenInfo.getWorkflowOrgId() != null ) {
+            m.addInsertion( tokenUUID, TOKENS_CF,
+                    createColumn( TOKEN_WORKFLOW_ORG_ID, bytebuffer( 
tokenInfo.getWorkflowOrgId() ), ttl, se, be ) );
+        }
+
         m.execute();
     }
 

http://git-wip-us.apache.org/repos/asf/usergrid/blob/e3d454fe/stack/services/src/test/java/org/apache/usergrid/management/EmailFlowIT.java
----------------------------------------------------------------------
diff --git 
a/stack/services/src/test/java/org/apache/usergrid/management/EmailFlowIT.java 
b/stack/services/src/test/java/org/apache/usergrid/management/EmailFlowIT.java
index 2ba7b19..3d14c2f 100644
--- 
a/stack/services/src/test/java/org/apache/usergrid/management/EmailFlowIT.java
+++ 
b/stack/services/src/test/java/org/apache/usergrid/management/EmailFlowIT.java
@@ -104,8 +104,7 @@ public class EmailFlowIT {
         LOG.info( token );
 
         assertEquals( ActivationState.ACTIVATED,
-                setup.getMgmtSvc().handleConfirmationTokenForAdminUser( 
org_owner.getOrganization().getUuid(),
-                        org_owner.owner.getUuid(), token ) );
+                setup.getMgmtSvc().handleConfirmationTokenForAdminUser( 
org_owner.owner.getUuid(), token ) );
 
         Message activation = inbox.get( 1 );
         assertEquals( "User Account Activated", activation.getSubject() );
@@ -145,8 +144,7 @@ public class EmailFlowIT {
         LOG.info( token );
 
         ActivationState state =
-                setup.getMgmtSvc().handleConfirmationTokenForAdminUser( 
org_owner.getOrganization().getUuid(),
-                        org_owner.owner.getUuid(), token );
+                setup.getMgmtSvc().handleConfirmationTokenForAdminUser( 
org_owner.owner.getUuid(), token );
         assertEquals( ActivationState.CONFIRMED_AWAITING_ACTIVATION, state );
 
         confirmation = user_inbox.get( 1 );
@@ -166,8 +164,7 @@ public class EmailFlowIT {
         token = getTokenFromMessage( activation );
         LOG.info( token );
 
-        state = setup.getMgmtSvc().handleActivationTokenForAdminUser( 
org_owner.getOrganization().getUuid(),
-                org_owner.owner.getUuid(), token );
+        state = setup.getMgmtSvc().handleActivationTokenForAdminUser( 
org_owner.owner.getUuid(), token );
         assertEquals( ActivationState.ACTIVATED, state );
 
         Message activated = user_inbox.get( 2 );

Reply via email to