- Excluded some of the old com.arsdigita classes from FindBugs and PMD to keep the reports clear so that we can focus on the 
      new org.libreccm classes and the important com.arsdigita classes
    - PermisssionRepository and tests. PermissionRepository will provided some maybe offer more queries.


git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3537 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2015-07-30 12:16:31 +00:00
parent e02af14df1
commit f3a443a6ab
9 changed files with 841 additions and 73 deletions

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<FindBugsFilter>
<Match>
<Class name="com.arsdigita.util.parameter.CSVParameterReader" />
</Match>
<Match>
<Class name="com.arsdigita.util.parameter.ResourceParameter" />
</Match>
<Match>
<Class name="com.arsdigita.xml.Document" />
</Match>
<Match>
<Class name="com.arsdigita.xml.Element" />
</Match>
<Match>
<Class name="com.arsdigita.xml.formatters.DateFormatter" />
</Match>
<Match>
<Class name="com.arsdigita.xml.formatters.FullDateFormatter" />
</Match>
</FindBugsFilter>

View File

@ -341,6 +341,9 @@
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId> <artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.1</version> <version>3.0.1</version>
<configuration>
<excludeFilterFile>findbugs-exclude.xml</excludeFilterFile>
</configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -370,6 +373,54 @@
<ruleset>/rulesets/java/unnecessary.xml</ruleset> <ruleset>/rulesets/java/unnecessary.xml</ruleset>
<ruleset>/rulesets/java/unusedcode.xml</ruleset> <ruleset>/rulesets/java/unusedcode.xml</ruleset>
</rulesets> </rulesets>
<excludeRoots>
<excludeRoot>src/main/java/com/arsdigita</excludeRoot>
</excludeRoots>
<excludes>
<exclude>**/AbstractConfig.java</exclude>
<exclude>**/AbstractParameter.java</exclude>
<exclude>**/AbstractParameterContext</exclude>
<exclude>**/Assert.java</exclude>
<exclude>**/Classes.java</exclude>
<exclude>**/CCMApplicationContextListener.java</exclude>
<exclude>**/CCMResourceManager.java</exclude>
<exclude>**/ClassParameterReader.java</exclude>
<exclude>**/CompoundParameterReader.java</exclude>
<exclude>**/ConfigError.java</exclude>
<exclude>**/ConfigRegistry.java</exclude>
<exclude>**/Converters.java</exclude>
<exclude>**/CSVParameterReader.java</exclude>
<exclude>**/DateFormatter.java</exclude>
<exclude>**/DataFormatterConfig.java</exclude>
<exclude>**/DateTimeFormatter</exclude>
<exclude>**/Document.java</exclude>
<exclude>**/Element.java</exclude>
<exclude>**/EmailParameter.java</exclude>
<exclude>**/EnumerationParameter.java</exclude>
<exclude>**/ErrorList.java</exclude>
<exclude>**/ExceptionUnwrapper.java</exclude>
<exclude>**/Exceptions.java</exclude>
<exclude>**/FileParameter.java</exclude>
<exclude>**/FullDateFormatter.java</exclude>
<exclude>**/IntegerParameter.java</exclude>
<exclude>**/JavaPropertyReader.java</exclude>
<exclude>**/JavaPropertyWriter.java</exclude>
<exclude>**/KernelConfig.java</exclude>
<exclude>**/LockableImpl.java</exclude>
<exclude>**/MapParameter.java</exclude>
<exclude>**/Parameter.java</exclude>
<exclude>**/ParameterError.java</exclude>
<exclude>**/ParameterException.java</exclude>
<exclude>**/RegistryConfig.java</exclude>
<exclude>**/ResourceParameter.java</exclude>
<exclude>**/SecurityConfig.java</exclude>
<exclude>**/SecurityHelper.java</exclude>
<exclude>**/SingletonParameter.java</exclude>
<exclude>**/StringParameter.java</exclude>
<exclude>**/TimeFormatter.java</exclude>
<exclude>**/UncheckedWrapperException</exclude>
<exclude>**/XML.java</exclude>
</excludes>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>

View File

@ -56,7 +56,21 @@ import javax.xml.bind.annotation.XmlRootElement;
+ " FROM Group g JOIN g.members m" + " FROM Group g JOIN g.members m"
+ " WHERE m.user = :user)"), + " WHERE m.user = :user)"),
@NamedQuery(name = "findPermissionsForCcmObject", @NamedQuery(name = "findPermissionsForCcmObject",
query = "SELECT p FROM Permission p WHERE p.object = :object") query = "SELECT p FROM Permission p WHERE p.object = :object"),
@NamedQuery(name = "findPermissionsByUserObjectAndPrivilege",
query = "SELECT p FROM Permission p "
+ "WHERE (p.grantee = :user"
+ " OR p.grantee IN (SELECT g "
+ " FROM Group g JOIN g.members m"
+ " WHERE m.user = :user))"
+ " AND p.grantedPrivilege = :privilege"
+ " AND p.object = :object"),
@NamedQuery(name = "findPermissionsBySubjectObjectAndPrivilege",
query = "SELECT p FROM Permission p "
+ "WHERE p.grantee = :subject"
+ " AND p.grantedPrivilege = :privilege"
+ " AND p.object = :object")
}) })
//Can't reduce complexity yet //Can't reduce complexity yet
@SuppressWarnings({"PMD.CyclomaticComplexity", @SuppressWarnings({"PMD.CyclomaticComplexity",

View File

@ -26,6 +26,7 @@ import javax.persistence.EntityManager;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
/** /**
* Repository class for retrieving, storing and deleting permissions.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -34,22 +35,44 @@ public class PermissionRepository
extends AbstractEntityRepository<Long, Permission> { extends AbstractEntityRepository<Long, Permission> {
@Inject @Inject
private EntityManager entityManager; private transient EntityManager entityManager;
/**
* {@inheritDoc}
*
* @return {@inheritDoc}
*/
@Override @Override
public Class<Permission> getEntityClass() { public Class<Permission> getEntityClass() {
return Permission.class; return Permission.class;
} }
/**
* {@inheritDoc }
*
* @param entity {@inheritDoc }
* @return {@inheritDoc }
*/
@Override @Override
public boolean isNew(final Permission entity) { public boolean isNew(final Permission entity) {
if (entity == null) { if (entity == null) {
throw new UnsupportedOperationException( throw new IllegalArgumentException("Entity to save can't be null");
"Entity to save can't be null");
} }
return entity.getPermissionId() == 0; return entity.getPermissionId() == 0;
} }
/**
* Finds all permissions granted to a specific subject (either a user or
* group).
*
* Please note that this method does <strong>not</strong> find permissions
* granted to a user by the groups a user is member of. To get these
* permissions also use the
* {@link #findPermissionsForUser(org.libreccm.core.User)} method instead.
*
* @param subject The subject.
* @return All permissions granted to the provided subject.
*/
public List<Permission> findPermissionsForSubject(final Subject subject) { public List<Permission> findPermissionsForSubject(final Subject subject) {
if (subject == null) { if (subject == null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@ -63,6 +86,17 @@ public class PermissionRepository
return query.getResultList(); return query.getResultList();
} }
/**
* Finds a permissions granted to a user and to the groups the user is
* member of.
*
* If you only need the permissions assigned to the user itself use the
* {@link #findPermissionsForSubject(org.libreccm.core.Subject)} method.
*
* @param user The user.
* @return All permissions granted to the user or the groups the user is
* member of.
*/
public List<Permission> findPermissionsForUser(final User user) { public List<Permission> findPermissionsForUser(final User user) {
if (user == null) { if (user == null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@ -76,6 +110,12 @@ public class PermissionRepository
return query.getResultList(); return query.getResultList();
} }
/**
* Finds all permissions granted on a object.
*
* @param object The object.
* @return All permissions granted on the object.
*/
public List<Permission> findPermissionsForCcmObject(final CcmObject object) { public List<Permission> findPermissionsForCcmObject(final CcmObject object) {
if (object == null) { if (object == null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@ -89,4 +129,22 @@ public class PermissionRepository
return query.getResultList(); return query.getResultList();
} }
// public List<Permission> findPermissionForUserPrivilegeAndObject(
// final User user,
// final Privilege privilege,
// final CcmObject object) {
// if (user == null) {
// throw new IllegalArgumentException(
// "Illegal value 'null' provided for parameter user");
// }
//
// if (privilege == null) {
// throw new IllegalArgumentException(
// "Illegal value 'null' provided for parameter privilege");
// }
//
// final TypedQuery<Permission> query = entityManager.createNamedQuery(
// "findPermissionsForUserPrivilegeAndObject", Permission.class);
//
// }
} }

View File

@ -54,6 +54,9 @@ public class DatasetsTest extends DatasetsVerifier {
"/datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json", "/datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json",
"/datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json", "/datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json",
"/datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json", "/datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json",
"/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-changed.json",
"/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-new.json",
"/datasets/org/libreccm/core/PermissionRepositoryTest/after-delete.json",
"/datasets/org/libreccm/core/PermissionRepositoryTest/data.json", "/datasets/org/libreccm/core/PermissionRepositoryTest/data.json",
"/datasets/org/libreccm/core/RoleRepositoryTest/data.json", "/datasets/org/libreccm/core/RoleRepositoryTest/data.json",
"/datasets/org/libreccm/core/RoleRepositoryTest/after-delete.json", "/datasets/org/libreccm/core/RoleRepositoryTest/after-delete.json",

View File

@ -51,6 +51,10 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import org.jboss.arquillian.container.test.api.ShouldThrowException;
import org.jboss.arquillian.persistence.ShouldMatchDataSet;
/** /**
* *
@ -74,6 +78,9 @@ public class PermissionRepositoryTest {
@Inject @Inject
private transient CcmObjectRepository ccmObjectRepository; private transient CcmObjectRepository ccmObjectRepository;
@Inject
private transient EntityManager entityManager;
public PermissionRepositoryTest() { public PermissionRepositoryTest() {
} }
@ -190,6 +197,15 @@ public class PermissionRepositoryTest {
assertThat(privileges, hasItem("write")); assertThat(privileges, hasItem("write"));
} }
@Test(expected = IllegalArgumentException.class)
@UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ShouldThrowException(IllegalArgumentException.class)
@InSequence(11)
public void findPermissionsForNullSubject() {
permissionRepository.findPermissionsForSubject(null);
}
@Test @Test
@UsingDataSet( @UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json") "datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ -221,7 +237,8 @@ public class PermissionRepositoryTest {
if (result == 0) { if (result == 0) {
return permission1.getGrantee().getClass().getName() return permission1.getGrantee().getClass().getName()
.compareTo(permission2.getGrantee().getClass().getName()); .compareTo(permission2.getGrantee().getClass().
getName());
} else { } else {
return result; return result;
} }
@ -256,6 +273,15 @@ public class PermissionRepositoryTest {
assertThat(mmusterPermissions.get(0).getObject(), is(nullValue())); assertThat(mmusterPermissions.get(0).getObject(), is(nullValue()));
} }
@Test(expected = IllegalArgumentException.class)
@UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ShouldThrowException(IllegalArgumentException.class)
@InSequence(21)
public void findPermissionsForNullUser() {
permissionRepository.findPermissionsForUser(null);
}
@Test @Test
@UsingDataSet( @UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json") "datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ -317,4 +343,99 @@ public class PermissionRepositoryTest {
assertThat(object3Permissions, is(empty())); assertThat(object3Permissions, is(empty()));
} }
@Test(expected = IllegalArgumentException.class)
@UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ShouldThrowException(IllegalArgumentException.class)
@InSequence(31)
public void findPermissionsForNullObject() {
permissionRepository.findPermissionsForCcmObject(null);
}
@Test
@UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ShouldMatchDataSet(value = "datasets/org/libreccm/core/"
+ "PermissionRepositoryTest/after-save-new.json",
excludeColumns = {"permission_id"})
@InSequence(40)
public void saveNewPermission() {
final User mmuster = userRepository.findByScreenName("mmuster");
final TypedQuery<Privilege> query1 = entityManager.createQuery(
"SELECT p FROM Privilege p WHERE p.privilege = 'read'",
Privilege.class);
final TypedQuery<Privilege> query2 = entityManager.createQuery(
"SELECT p FROM Privilege p WHERE p.privilege = 'write'",
Privilege.class);
final CcmObject object = ccmObjectRepository.findById(-40L);
final Privilege read = query1.getSingleResult();
final Privilege write = query2.getSingleResult();
assertThat(mmuster, is(not(nullValue())));
assertThat(read, is(not(nullValue())));
assertThat(write, is(not(nullValue())));
assertThat(object, is(not(nullValue())));
final Permission permission1 = new Permission();
permission1.setGrantee(mmuster);
permission1.setGrantedPrivilege(read);
permission1.setObject(object);
final Permission permission2 = new Permission();
permission2.setGrantee(mmuster);
permission2.setGrantedPrivilege(write);
permission2.setObject(object);
permissionRepository.save(permission1);
permissionRepository.save(permission2);
}
@Test(expected = IllegalArgumentException.class)
@ShouldThrowException(IllegalArgumentException.class)
@InSequence(41)
public void saveNullPermission() {
permissionRepository.save(null);
}
@Test
@UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ShouldMatchDataSet(value = "datasets/org/libreccm/core/"
+ "PermissionRepositoryTest/after-save-changed.json",
excludeColumns = {"permission_id"})
@InSequence(50)
public void saveChangedPermission() {
final Permission permission = entityManager.find(Permission.class, -40L);
final Group users = groupRepository.findByGroupName("users");
assertThat(permission, is(not(nullValue())));
assertThat(users, is(not(nullValue())));
permission.setGrantee(users);
permissionRepository.save(permission);
}
@Test
@UsingDataSet(
"datasets/org/libreccm/core/PermissionRepositoryTest/data.json")
@ShouldMatchDataSet(value = "datasets/org/libreccm/core/"
+ "PermissionRepositoryTest/after-delete.json",
excludeColumns = {"permission_id"})
@InSequence(60)
public void deletePermission() {
final Permission permission = entityManager.find(Permission.class, -35L);
permissionRepository.delete(permission);
}
@Test(expected = IllegalArgumentException.class)
@ShouldThrowException(IllegalArgumentException.class)
@InSequence(61)
public void deleteNullPermission() {
permissionRepository.delete(null);
}
} }

View File

@ -0,0 +1,158 @@
{
"subjects":
[
{
"subject_id": -10
},
{
"subject_id": -20
},
{
"subject_id": -30
},
{
"subject_id": -40
},
{
"subject_id": -50
}
],
"ccm_users":
[
{
"banned": false,
"hash_algorithm": "SHA-512",
"family_name": "Doe",
"given_name": "John",
"password": "C+o2w6mp+eLrbluMEgKMVSdP50A9BMethXN8R3yihtkbzt7WfWsde2nmq/t5gq6im3J8i3jw4Y3YrKHou8JQ2A==",
"password_reset_required": false,
"salt": "Fu8FPgqAal4GZp1hDjkOB+t6ITRCcO7HBoN5Xqf29UnVj5NUdUFZRTyKYMBEx6JmZGmHcMDG9OGVCKcEM9oyScSRreJs4B51wM44NM6KeRwbCf+VhBn14DkBrl40ygraNf+AJacKpMyCpFI0O/Am7mMDWL4flskBsylkxaQn3vKfzgN5MVG2szW//I6Q6YEH9AuL8LauS6fKaVynMzzu3xzD8Hjqvvlnzym898eom2lqScPfg5g4e8Ww13HCHAYe6twupAW/BjUNax5HSioEisZN/P1UGrde8uFEj+hbbavrWYZuilPuEu25+/98jyXx6542agqrWN8j0SFYcIyOgA==",
"screen_name": "jdoe",
"subject_id": -10
},
{
"banned": false,
"hash_algorithm": "SHA-512",
"family_name": "Mustermann",
"given_name": "Max",
"password": "1c9626af429a6291766d15cbfb38689bd8d49450520765973de70aecaf644b7d4fda711266ba9ec8fb6df30c8ab391d40330829aa85adf371bcde6b4c9bc01e6",
"password_reset_required": false,
"salt": "fjiajhigafgapoa",
"screen_name": "mmuster",
"subject_id": -50
}
],
"ccm_groups":
[
{
"name": "admins",
"subject_id": -20
},
{
"name": "users",
"subject_id": -30
},
{
"name": "authors",
"subject_id": -40
}
],
"user_email_addresses":
[
{
"user_id": -10,
"email_address": "john.doe@example.com",
"bouncing": false,
"verified": true
},
{
"user_id": -50,
"email_address": "max.mustermann@example.com",
"bouncing": false,
"verified": true
}
],
"group_memberships":
[
{
"membership_id": -10,
"group_subject_id": -30,
"user_subject_id": -10
},
{
"membership_id": -20,
"group_subject_id": -40,
"user_subject_id": -10
},
{
"membership_id": -30,
"group_subject_id": -20,
"user_subject_id": -50
}
],
"ccm_privileges":
[
{
"privilege_id": -10,
"privilege": "admin"
},
{
"privilege_id": -20,
"privilege": "read"
},
{
"privilege_id": -30,
"privilege": "write"
}
],
"ccm_objects":
[
{
"object_id": -10,
"display_name": "Test Object 1"
},
{
"object_id": -20,
"display_name": "Test Object 2"
},
{
"object_id": -30,
"display_name": "Test Object 3"
},
{
"object_id": -40,
"display_name": "Test Object 4"
}
],
"permissions":
[
{
"permission_id": -10,
"creation_date": "2015-07-29 14:32:46",
"granted_privilege_id": -10,
"grantee_id": -20
},
{
"permission_id": -20,
"creation_date": "2015-07-29 14:34:30",
"granted_privilege_id": -20,
"grantee_id": -30,
"object_id": -10
},
{
"permission_id": -30,
"creation_date": "2015-07-29 14:36:05",
"granted_privilege_id": -30,
"grantee_id": -40,
"object_id": -10
},
{
"permission_id": -40,
"creation_date": "2015-07-29 14:37:22",
"granted_privilege_id": -20,
"grantee_id": -10,
"object_id": -20
}
]
}

View File

@ -0,0 +1,165 @@
{
"subjects":
[
{
"subject_id": -10
},
{
"subject_id": -20
},
{
"subject_id": -30
},
{
"subject_id": -40
},
{
"subject_id": -50
}
],
"ccm_users":
[
{
"banned": false,
"hash_algorithm": "SHA-512",
"family_name": "Doe",
"given_name": "John",
"password": "C+o2w6mp+eLrbluMEgKMVSdP50A9BMethXN8R3yihtkbzt7WfWsde2nmq/t5gq6im3J8i3jw4Y3YrKHou8JQ2A==",
"password_reset_required": false,
"salt": "Fu8FPgqAal4GZp1hDjkOB+t6ITRCcO7HBoN5Xqf29UnVj5NUdUFZRTyKYMBEx6JmZGmHcMDG9OGVCKcEM9oyScSRreJs4B51wM44NM6KeRwbCf+VhBn14DkBrl40ygraNf+AJacKpMyCpFI0O/Am7mMDWL4flskBsylkxaQn3vKfzgN5MVG2szW//I6Q6YEH9AuL8LauS6fKaVynMzzu3xzD8Hjqvvlnzym898eom2lqScPfg5g4e8Ww13HCHAYe6twupAW/BjUNax5HSioEisZN/P1UGrde8uFEj+hbbavrWYZuilPuEu25+/98jyXx6542agqrWN8j0SFYcIyOgA==",
"screen_name": "jdoe",
"subject_id": -10
},
{
"banned": false,
"hash_algorithm": "SHA-512",
"family_name": "Mustermann",
"given_name": "Max",
"password": "1c9626af429a6291766d15cbfb38689bd8d49450520765973de70aecaf644b7d4fda711266ba9ec8fb6df30c8ab391d40330829aa85adf371bcde6b4c9bc01e6",
"password_reset_required": false,
"salt": "fjiajhigafgapoa",
"screen_name": "mmuster",
"subject_id": -50
}
],
"ccm_groups":
[
{
"name": "admins",
"subject_id": -20
},
{
"name": "users",
"subject_id": -30
},
{
"name": "authors",
"subject_id": -40
}
],
"user_email_addresses":
[
{
"user_id": -10,
"email_address": "john.doe@example.com",
"bouncing": false,
"verified": true
},
{
"user_id": -50,
"email_address": "max.mustermann@example.com",
"bouncing": false,
"verified": true
}
],
"group_memberships":
[
{
"membership_id": -10,
"group_subject_id": -30,
"user_subject_id": -10
},
{
"membership_id": -20,
"group_subject_id": -40,
"user_subject_id": -10
},
{
"membership_id": -30,
"group_subject_id": -20,
"user_subject_id": -50
}
],
"ccm_privileges":
[
{
"privilege_id": -10,
"privilege": "admin"
},
{
"privilege_id": -20,
"privilege": "read"
},
{
"privilege_id": -30,
"privilege": "write"
}
],
"ccm_objects":
[
{
"object_id": -10,
"display_name": "Test Object 1"
},
{
"object_id": -20,
"display_name": "Test Object 2"
},
{
"object_id": -30,
"display_name": "Test Object 3"
},
{
"object_id": -40,
"display_name": "Test Object 4"
}
],
"permissions":
[
{
"permission_id": -10,
"creation_date": "2015-07-29 14:32:46",
"granted_privilege_id": -10,
"grantee_id": -20
},
{
"permission_id": -20,
"creation_date": "2015-07-29 14:34:30",
"granted_privilege_id": -20,
"grantee_id": -30,
"object_id": -10
},
{
"permission_id": -30,
"creation_date": "2015-07-29 14:36:05",
"granted_privilege_id": -30,
"grantee_id": -40,
"object_id": -10
},
{
"permission_id": -35,
"creation_date": "2015-07-29 14:57:55",
"granted_privilege_id": -20,
"grantee_id": -40,
"object_id": -10
},
{
"permission_id": -40,
"creation_date": "2015-07-29 14:37:22",
"granted_privilege_id": -20,
"grantee_id": -30,
"object_id": -20
}
]
}

View File

@ -0,0 +1,177 @@
{
"subjects":
[
{
"subject_id": -10
},
{
"subject_id": -20
},
{
"subject_id": -30
},
{
"subject_id": -40
},
{
"subject_id": -50
}
],
"ccm_users":
[
{
"banned": false,
"hash_algorithm": "SHA-512",
"family_name": "Doe",
"given_name": "John",
"password": "C+o2w6mp+eLrbluMEgKMVSdP50A9BMethXN8R3yihtkbzt7WfWsde2nmq/t5gq6im3J8i3jw4Y3YrKHou8JQ2A==",
"password_reset_required": false,
"salt": "Fu8FPgqAal4GZp1hDjkOB+t6ITRCcO7HBoN5Xqf29UnVj5NUdUFZRTyKYMBEx6JmZGmHcMDG9OGVCKcEM9oyScSRreJs4B51wM44NM6KeRwbCf+VhBn14DkBrl40ygraNf+AJacKpMyCpFI0O/Am7mMDWL4flskBsylkxaQn3vKfzgN5MVG2szW//I6Q6YEH9AuL8LauS6fKaVynMzzu3xzD8Hjqvvlnzym898eom2lqScPfg5g4e8Ww13HCHAYe6twupAW/BjUNax5HSioEisZN/P1UGrde8uFEj+hbbavrWYZuilPuEu25+/98jyXx6542agqrWN8j0SFYcIyOgA==",
"screen_name": "jdoe",
"subject_id": -10
},
{
"banned": false,
"hash_algorithm": "SHA-512",
"family_name": "Mustermann",
"given_name": "Max",
"password": "1c9626af429a6291766d15cbfb38689bd8d49450520765973de70aecaf644b7d4fda711266ba9ec8fb6df30c8ab391d40330829aa85adf371bcde6b4c9bc01e6",
"password_reset_required": false,
"salt": "fjiajhigafgapoa",
"screen_name": "mmuster",
"subject_id": -50
}
],
"ccm_groups":
[
{
"name": "admins",
"subject_id": -20
},
{
"name": "users",
"subject_id": -30
},
{
"name": "authors",
"subject_id": -40
}
],
"user_email_addresses":
[
{
"user_id": -10,
"email_address": "john.doe@example.com",
"bouncing": false,
"verified": true
},
{
"user_id": -50,
"email_address": "max.mustermann@example.com",
"bouncing": false,
"verified": true
}
],
"group_memberships":
[
{
"membership_id": -10,
"group_subject_id": -30,
"user_subject_id": -10
},
{
"membership_id": -20,
"group_subject_id": -40,
"user_subject_id": -10
},
{
"membership_id": -30,
"group_subject_id": -20,
"user_subject_id": -50
}
],
"ccm_privileges":
[
{
"privilege_id": -10,
"privilege": "admin"
},
{
"privilege_id": -20,
"privilege": "read"
},
{
"privilege_id": -30,
"privilege": "write"
}
],
"ccm_objects":
[
{
"object_id": -10,
"display_name": "Test Object 1"
},
{
"object_id": -20,
"display_name": "Test Object 2"
},
{
"object_id": -30,
"display_name": "Test Object 3"
},
{
"object_id": -40,
"display_name": "Test Object 4"
}
],
"permissions":
[
{
"permission_id": -10,
"creation_date": "2015-07-29 14:32:46",
"granted_privilege_id": -10,
"grantee_id": -20
},
{
"permission_id": -20,
"creation_date": "2015-07-29 14:34:30",
"granted_privilege_id": -20,
"grantee_id": -30,
"object_id": -10
},
{
"permission_id": -30,
"creation_date": "2015-07-29 14:36:05",
"granted_privilege_id": -30,
"grantee_id": -40,
"object_id": -10
},
{
"permission_id": -35,
"creation_date": "2015-07-29 14:57:55",
"granted_privilege_id": -20,
"grantee_id": -40,
"object_id": -10
},
{
"permission_id": -40,
"creation_date": "2015-07-29 14:37:22",
"granted_privilege_id": -20,
"grantee_id": -10,
"object_id": -20
},
{
"permission_id": -50,
"granted_privilege_id": -20,
"grantee_id": -50,
"object_id": -40
},
{
"permission_id": -50,
"granted_privilege_id": -30,
"grantee_id": -50,
"object_id": -40
}
]
}