You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/06/29 12:45:27 UTC
[17/38] usergrid git commit: Fixes for linked collections
Fixes for linked collections
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/7f49c806
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/7f49c806
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/7f49c806
Branch: refs/heads/usergrid-1268-akka-211
Commit: 7f49c8068ab68ab440d3c2e430cb69f68befc53e
Parents: 9efa3b4
Author: Mike Dunker <md...@apigee.com>
Authored: Wed Jun 22 13:41:12 2016 -0700
Committer: Mike Dunker <md...@apigee.com>
Committed: Wed Jun 22 13:41:12 2016 -0700
----------------------------------------------------------------------
.../corepersistence/CpRelationManager.java | 32 +++++---
.../usergrid/rest/management/AdminUsersIT.java | 80 ++++++++++++++++++++
.../cassandra/ManagementServiceImpl.java | 33 +++++---
.../services/devices/DevicesService.java | 2 +
4 files changed, 126 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/usergrid/blob/7f49c806/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
index 4082b45..39b3161 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
@@ -501,9 +501,9 @@ public class CpRelationManager implements RelationManager {
@Override
public void removeFromCollection( String collectionName, EntityRef itemRef ) throws Exception {
- // special handling for roles collection of the application
if ( headEntity.getUuid().equals( applicationId ) ) {
if ( collectionName.equals( COLLECTION_ROLES ) ) {
+ // special handling for roles collection of the application
Entity itemEntity = em.get( itemRef );
if ( itemEntity != null ) {
RoleRef roleRef = SimpleRoleRef.forRoleEntity( itemEntity );
@@ -511,12 +511,12 @@ public class CpRelationManager implements RelationManager {
return;
}
}
+ // handles normal app collection deletes
em.delete( itemRef );
return;
}
- // load the entity to be removed to the collection
-
+ // headEntity is not an application (used for management entities and entity collections like user devices)
if ( logger.isDebugEnabled() ) {
logger.debug( "Loading entity to remove from collection {}:{} from app {}\n",
@@ -531,12 +531,26 @@ public class CpRelationManager implements RelationManager {
GraphManager gm = managerCache.getGraphManager( applicationScope );
+ List<Edge> removedEdges = new ArrayList<>();
//run our delete
gm.loadEdgeVersions(
CpNamingUtils.createEdgeFromCollectionName( cpHeadEntity.getId(), collectionName, memberEntity.getId() ) )
- .flatMap(edge -> gm.markEdge(edge)).flatMap(edge -> gm.deleteEdge(edge)).toBlocking()
+ .flatMap(edge -> gm.markEdge(edge)).flatMap(edge -> gm.deleteEdge(edge))
+ .doOnNext(edge -> removedEdges.add(edge)).toBlocking()
.lastOrDefault(null);
+ CollectionInfo collection = getDefaultSchema().getCollection( headEntity.getType(), collectionName );
+ if (collection != null && collection.getLinkedCollection() != null) {
+ // delete reverse edges
+ final String pluralType = InflectionUtils.pluralize( cpHeadEntity.getId().getType() );
+ gm.loadEdgeVersions(
+ CpNamingUtils.createEdgeFromCollectionName( memberEntity.getId(), pluralType, cpHeadEntity.getId() ) )
+ .flatMap(reverseEdge -> gm.markEdge(reverseEdge))
+ .flatMap(reverseEdge -> gm.deleteEdge(reverseEdge))
+ .doOnNext(reverseEdge -> removedEdges.add(reverseEdge))
+ .toBlocking().lastOrDefault(null);
+ }
+
/**
* Remove from the index
@@ -544,12 +558,10 @@ public class CpRelationManager implements RelationManager {
*/
- //TODO: this should not happen here, needs to go to SQS
- //indexProducer.put(batch).subscribe();
- if ( !skipIndexingForType( memberEntity.getId().getType() ) ) {
-
- indexService.queueEntityDelete(applicationScope, memberEntity.getId());
- }
+ // item not deindexed, only edges
+ removedEdges.forEach(edge -> {
+ indexService.queueDeleteEdge(applicationScope, edge);
+ });
// special handling for roles collection of a group
if ( headEntity.getType().equals( Group.ENTITY_TYPE ) ) {
http://git-wip-us.apache.org/repos/asf/usergrid/blob/7f49c806/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
index 07132cb..3adc719 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
@@ -435,6 +435,7 @@ public class AdminUsersIT extends AbstractRestIT {
//Add a property to management user
Entity userProperty = new Entity( ).chainPut( "company","usergrid" );
management().users().user( newOrg.getUsername() ).put( userProperty );
+ fail("Should not have been allowed");
} catch( NotAuthorizedException e ){
@@ -445,6 +446,85 @@ public class AdminUsersIT extends AbstractRestIT {
}
+ @Test
+ public void testAdminRemovalFromOrg() throws Exception {
+ Organization newOrg = createOrgPayload( "testAdminRemovalFromOrg", null );
+ Organization orgReturned = clientSetup.getRestClient().management().orgs().post(newOrg);
+ User owner = orgReturned.getOwner();
+ assertNotNull(owner);
+ String orgName = orgReturned.getName();
+ Token ownerToken = management.token().get(owner.getUsername(), orgName);
+
+ // add a new admin user to the org
+ Entity adminUserPayload = new Entity();
+ String newAdminUserName = "newAdminUser"+UUIDUtils.newTimeUUID();
+ adminUserPayload.put( "username", newAdminUserName );
+ adminUserPayload.put( "name", newAdminUserName );
+ adminUserPayload.put( "email", newAdminUserName+"@usergrid.com" );
+ adminUserPayload.put( "password", newAdminUserName );
+
+ management.token().setToken(ownerToken);
+ management.orgs().org(orgName).users().post(User.class, adminUserPayload);
+
+ // get token of the new admin user
+ Token adminToken = management.token().get(newAdminUserName, newAdminUserName);
+ assertNotNull(adminToken);
+
+ // get org info
+ try {
+ management.token().setToken(adminToken);
+ management.orgs().org(orgName).get();
+ }
+ catch (Exception e) {
+ // should have been allowed
+ fail("Should have worked: " + e.getMessage());
+ }
+
+ // remove access
+ try {
+ management.token().setToken(ownerToken);
+ management.orgs().org(orgName).users().user(newAdminUserName).delete();
+ }
+ catch (Exception e) {
+ // should have been allowed
+ fail("Should have worked: " + e.getMessage());
+ }
+
+ // get org info (should be unsuccessful)
+ try {
+ management.token().setToken(adminToken);
+ management.orgs().org(orgName).get();
+ fail("Should not have allowed org access");
+ }
+ catch (NotAuthorizedException nae) {
+ // this is the right return
+
+ }
+ catch (Exception e) {
+ fail("Should have been unauthorized: " + e.getMessage());
+ }
+
+ // restore access
+ try {
+ management.token().setToken(ownerToken);
+ management.orgs().org(orgName).users().user(newAdminUserName).put(new Entity());
+ }
+ catch (Exception e) {
+ // should have been allowed
+ fail("Should have worked: " + e.getMessage());
+ }
+
+ // get org info
+ try {
+ management.token().setToken(adminToken);
+ management.orgs().org(orgName).get();
+ }
+ catch (Exception e) {
+ // should have been allowed
+ fail("Should have worked: " + e.getMessage());
+ }
+
+ }
/**
http://git-wip-us.apache.org/repos/asf/usergrid/blob/7f49c806/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 73a56c8..b56f211 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
@@ -1580,7 +1580,8 @@ public class ManagementServiceImpl implements ManagementService {
BiMap<UUID, String> organizations = HashBiMap.create();
EntityManager em = emf.getEntityManager( smf.getManagementAppId() );
- Results results = em.getCollection( new SimpleEntityRef( User.ENTITY_TYPE, userId ),
+ EntityRef userRef = new SimpleEntityRef(User.ENTITY_TYPE, userId);
+ Results results = em.getCollection( userRef,
Schema.COLLECTION_GROUPS, null, 1000, Level.ALL_PROPERTIES, false );
do {
@@ -1592,10 +1593,17 @@ public class ManagementServiceImpl implements ManagementService {
path = path.toLowerCase();
}
- try {
- organizations.put( entity.getUuid(), path );
- } catch (IllegalArgumentException e) {
- logger.warn("Error adding {}:{} to BiMap: {}", entity.getUuid(), path, e.getMessage() );
+ // check that user is in users collection for org
+ EntityRef groupRef = new SimpleEntityRef(Group.ENTITY_TYPE, entity.getUuid());
+ if (em.isCollectionMember(groupRef, Schema.COLLECTION_USERS, userRef)) {
+ try {
+ organizations.put(entity.getUuid(), path);
+ } catch (IllegalArgumentException e) {
+ logger.warn("Error adding {}:{} to BiMap: {}", entity.getUuid(), path, e.getMessage());
+ }
+ } else {
+ // org doesn't know about user, so read repair
+ em.removeFromCollection(userRef, Schema.COLLECTION_GROUPS, groupRef);
}
}
@@ -1698,16 +1706,18 @@ public class ManagementServiceImpl implements ManagementService {
EntityManager em = emf.getEntityManager( smf.getManagementAppId() );
+ EntityRef orgRef = new SimpleEntityRef( Group.ENTITY_TYPE, organization.getUuid() );
+ EntityRef userRef = new SimpleEntityRef( User.ENTITY_TYPE, user.getUuid() );
+
- if(em.getCollection(organization.getUuid() ,"users",Query.fromQL( "select * where uuid ="+user.getUuid() ),Level.IDS ).size() >0){
+ if(em.isCollectionMember(orgRef, Schema.COLLECTION_USERS, userRef)) {
if(logger.isDebugEnabled()) {
logger.debug( "addAdminUserToOrganization - Found value: {} already in collection", user.getName() );
}
return;
}
- em.addToCollection(new SimpleEntityRef(Group.ENTITY_TYPE, organization.getUuid()), "users",
- new SimpleEntityRef(User.ENTITY_TYPE, user.getUuid()));
+ em.addToCollection(orgRef, Schema.COLLECTION_USERS, userRef);
invalidateManagementAppAuthCache();
@@ -1733,10 +1743,11 @@ public class ManagementServiceImpl implements ManagementService {
EntityManager em = emf.getEntityManager( smf.getManagementAppId() );
try {
- int size = em.getCollection( new SimpleEntityRef( Group.ENTITY_TYPE, organizationId ),
- "users", null, 2, Level.IDS, false ).size();
+ Results collection = em.getCollection( new SimpleEntityRef( Group.ENTITY_TYPE, organizationId ),
+ "users", null, 2, Level.IDS, false );
+ int size = collection.size();
- if ( !force && size <= 1 ) {
+ if ( !force && (size == 0 || (size == 1 && collection.getId() == userId))) {
throw new Exception();
}
}
http://git-wip-us.apache.org/repos/asf/usergrid/blob/7f49c806/stack/services/src/main/java/org/apache/usergrid/services/devices/DevicesService.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/devices/DevicesService.java b/stack/services/src/main/java/org/apache/usergrid/services/devices/DevicesService.java
index f57a03a..111c96a 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/devices/DevicesService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/devices/DevicesService.java
@@ -85,6 +85,8 @@ public class DevicesService extends AbstractCollectionService {
for (EntityRef userDevice : userDevices) {
if(userDevice.getUuid().equals(deviceRef.getUuid())) { //only remove the current device from user
em.removeFromCollection(user, "devices", userDevice);
+ // TODO: may want to actually remove the device
+ // em.delete(userDevice);
}
}
em.removeFromCollection(deviceRef, "users", user);