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