CCM NG: Repository and Manager class for Groups. Repository is finished, Manager not yet
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3530 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
91cb6dddb0
commit
7c43e82068
|
|
@ -33,24 +33,24 @@ public class CcmSessionContext implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 6110177865273823685L;
|
private static final long serialVersionUID = 6110177865273823685L;
|
||||||
|
|
||||||
private Subject currentParty;
|
private Subject currentSubject;
|
||||||
private Subject effectiveParty;
|
private Subject effectiveSubject;
|
||||||
|
|
||||||
public Subject getCurrentParty() {
|
public Subject getCurrentSubject() {
|
||||||
return currentParty;
|
return currentSubject;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCurrentParty(final Subject currentParty) {
|
public void setCurrentSubject(final Subject currentSubject) {
|
||||||
this.currentParty = currentParty;
|
this.currentSubject = currentSubject;
|
||||||
this.effectiveParty = currentParty;
|
this.effectiveSubject = currentSubject;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Subject getEffectiveParty() {
|
public Subject getEffectiveSubject() {
|
||||||
return effectiveParty;
|
return effectiveSubject;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setEffectiveParty(final Subject effectiveParty) {
|
protected void setEffectiveSubject(final Subject effectiveSubject) {
|
||||||
this.effectiveParty = effectiveParty;
|
this.effectiveSubject = effectiveSubject;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -60,15 +60,15 @@ public class CcmSessionContext implements Serializable {
|
||||||
* The there is a current user the method will check if the current user
|
* The there is a current user the method will check if the current user
|
||||||
* has the permission to use the {@code sudo} method.
|
* has the permission to use the {@code sudo} method.
|
||||||
*
|
*
|
||||||
* @param party The party with which permissions the code is executed.
|
* @param subject The party with which permissions the code is executed.
|
||||||
* @param runnable The code to execute.
|
* @param runnable The code to execute.
|
||||||
*/
|
*/
|
||||||
public void sudo(final Subject party, final Runnable runnable) {
|
public void sudo(final Subject subject, final Runnable runnable) {
|
||||||
//ToDo: Check if current user is permitted to use sudo.
|
//ToDo: Check if current user is permitted to use sudo.
|
||||||
|
|
||||||
effectiveParty = party;
|
effectiveSubject = subject;
|
||||||
runnable.run();
|
runnable.run();
|
||||||
effectiveParty = currentParty;
|
effectiveSubject = currentSubject;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,8 @@ import javax.persistence.Table;
|
||||||
|
|
||||||
import org.hibernate.validator.constraints.NotBlank;
|
import org.hibernate.validator.constraints.NotBlank;
|
||||||
|
|
||||||
|
import javax.persistence.NamedQueries;
|
||||||
|
import javax.persistence.NamedQuery;
|
||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
import javax.xml.bind.annotation.XmlElementWrapper;
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
@ -44,12 +46,16 @@ import javax.xml.bind.annotation.XmlRootElement;
|
||||||
*/
|
*/
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "ccm_groups")
|
@Table(name = "ccm_groups")
|
||||||
|
@NamedQueries({
|
||||||
|
@NamedQuery(name = "findGroupByName",
|
||||||
|
query = "SELECT g FROM Group g WHERE g.name = :groupName")
|
||||||
|
})
|
||||||
@XmlRootElement(name = "user-group", namespace = CORE_XML_NS)
|
@XmlRootElement(name = "user-group", namespace = CORE_XML_NS)
|
||||||
public class Group extends Subject implements Serializable {
|
public class Group extends Subject implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = -5555063356689597270L;
|
private static final long serialVersionUID = -5555063356689597270L;
|
||||||
|
|
||||||
@Column(name = "name", length = 512, nullable = false)
|
@Column(name = "name", length = 512, unique = true, nullable = false)
|
||||||
@NotBlank
|
@NotBlank
|
||||||
@XmlElement(name = "name", namespace = CORE_XML_NS)
|
@XmlElement(name = "name", namespace = CORE_XML_NS)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.libreccm.core;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class GroupManager {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a user to a group. If the user is already a member of the group, this
|
||||||
|
* method will do nothing.
|
||||||
|
*
|
||||||
|
* @param user The user to add to the group
|
||||||
|
* @param group The group to add the user to.
|
||||||
|
*/
|
||||||
|
public void addUserToGroup(final User user, final Group group) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a user from a group. If the user is not member of the group this
|
||||||
|
* method will do nothing.
|
||||||
|
*
|
||||||
|
* @param user The user to remove from the group.
|
||||||
|
* @param group The group to remove the user from.
|
||||||
|
*/
|
||||||
|
public void removeUserFromGroup(final User user, final Group group) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a user is member of a group.
|
||||||
|
*
|
||||||
|
* @param user The user to check
|
||||||
|
* @param group The group to check
|
||||||
|
*
|
||||||
|
* @return {@code true} if the provided user is a member of the provided
|
||||||
|
* group, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean isMemberOfGroup(final User user, final Group group) {
|
||||||
|
boolean result = false;
|
||||||
|
|
||||||
|
for (final GroupMembership membership : user.getGroupMemberships()) {
|
||||||
|
if (group.equals(membership.getGroup())) {
|
||||||
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.libreccm.core;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.TypedQuery;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class GroupRepository extends AbstractEntityRepository<Long, Group> {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private transient EntityManager entityManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Group> getEntityClass() {
|
||||||
|
return Group.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(final Group entity) {
|
||||||
|
if (entity == null) {
|
||||||
|
throw new IllegalArgumentException("Can't save null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return entity.getSubjectId() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Group findByGroupName(final String groupName) {
|
||||||
|
final TypedQuery<Group> query = entityManager.createNamedQuery(
|
||||||
|
"findGroupByName", Group.class);
|
||||||
|
query.setParameter("groupName", groupName);
|
||||||
|
|
||||||
|
final List<Group> result = query.getResultList();
|
||||||
|
|
||||||
|
//Check if result list is empty and if not return the first element.
|
||||||
|
//If their ist a result than there can only be one because the
|
||||||
|
//name column of group has a unique constraint.
|
||||||
|
if (result.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return result.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -63,15 +63,6 @@ public class Subject implements Serializable {
|
||||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||||
private long subjectId;
|
private long subjectId;
|
||||||
|
|
||||||
@ElementCollection(fetch = FetchType.EAGER)
|
|
||||||
@CollectionTable(name = "subject_email_addresses",
|
|
||||||
joinColumns = {
|
|
||||||
@JoinColumn(name = "subject_id")})
|
|
||||||
@Size(min = 1)
|
|
||||||
@XmlElementWrapper(name = "email-addresses", namespace = CORE_XML_NS)
|
|
||||||
@XmlElement(name = "email-address", namespace = CORE_XML_NS)
|
|
||||||
private List<EmailAddress> emailAddresses;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "grantee")
|
@OneToMany(mappedBy = "grantee")
|
||||||
//Can't shorten this variable name without reducing descriptiveness
|
//Can't shorten this variable name without reducing descriptiveness
|
||||||
@SuppressWarnings("PMD.LongVariable")
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
|
|
@ -82,7 +73,6 @@ public class Subject implements Serializable {
|
||||||
public Subject() {
|
public Subject() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
emailAddresses = new ArrayList<>();
|
|
||||||
grantedPermissions = new ArrayList<>();
|
grantedPermissions = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,26 +84,6 @@ public class Subject implements Serializable {
|
||||||
this.subjectId = subjectId;
|
this.subjectId = subjectId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<EmailAddress> getEmailAddresses() {
|
|
||||||
if (emailAddresses == null) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return Collections.unmodifiableList(emailAddresses);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setEmailAddresses(final List<EmailAddress> eMailAddresses) {
|
|
||||||
this.emailAddresses = eMailAddresses;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void addEmailAddress(final EmailAddress emailAddress) {
|
|
||||||
emailAddresses.add(emailAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void removeEmailAddress(final EmailAddress emailAddress) {
|
|
||||||
emailAddresses.remove(emailAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Permission> getGrantedPermissions() {
|
public List<Permission> getGrantedPermissions() {
|
||||||
return Collections.unmodifiableList(grantedPermissions);
|
return Collections.unmodifiableList(grantedPermissions);
|
||||||
}
|
}
|
||||||
|
|
@ -172,12 +142,10 @@ public class Subject implements Serializable {
|
||||||
public String toString(final String data) {
|
public String toString(final String data) {
|
||||||
return String.format("%s{ "
|
return String.format("%s{ "
|
||||||
+ "subjectId = %d, "
|
+ "subjectId = %d, "
|
||||||
+ "emailAddresses = %s"
|
|
||||||
+ "%s"
|
+ "%s"
|
||||||
+ " }",
|
+ " }",
|
||||||
super.toString(),
|
super.toString(),
|
||||||
subjectId,
|
subjectId,
|
||||||
Objects.toString(emailAddresses),
|
|
||||||
data);
|
data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,9 +38,13 @@ import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.CollectionTable;
|
||||||
|
import javax.persistence.ElementCollection;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.NamedQueries;
|
import javax.persistence.NamedQueries;
|
||||||
import javax.persistence.NamedQuery;
|
import javax.persistence.NamedQuery;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
|
import javax.validation.constraints.Size;
|
||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
import javax.xml.bind.annotation.XmlElementWrapper;
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
@ -95,6 +99,15 @@ public class User extends Subject implements Serializable {
|
||||||
@XmlElement(name = "screen-name", namespace = CORE_XML_NS)
|
@XmlElement(name = "screen-name", namespace = CORE_XML_NS)
|
||||||
private String screenName;
|
private String screenName;
|
||||||
|
|
||||||
|
@ElementCollection(fetch = FetchType.EAGER)
|
||||||
|
@CollectionTable(name = "user_email_addresses",
|
||||||
|
joinColumns = {
|
||||||
|
@JoinColumn(name = "user_id")})
|
||||||
|
@Size(min = 1)
|
||||||
|
@XmlElementWrapper(name = "email-addresses", namespace = CORE_XML_NS)
|
||||||
|
@XmlElement(name = "email-address", namespace = CORE_XML_NS)
|
||||||
|
private List<EmailAddress> emailAddresses;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A user can be banned which means that he or she can't login into the
|
* A user can be banned which means that he or she can't login into the
|
||||||
* system anymore.
|
* system anymore.
|
||||||
|
|
@ -171,6 +184,7 @@ public class User extends Subject implements Serializable {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
name = new PersonName();
|
name = new PersonName();
|
||||||
|
emailAddresses = new ArrayList<>();
|
||||||
this.groupMemberships = new ArrayList<>();
|
this.groupMemberships = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -190,6 +204,26 @@ public class User extends Subject implements Serializable {
|
||||||
this.screenName = screenName;
|
this.screenName = screenName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<EmailAddress> getEmailAddresses() {
|
||||||
|
if (emailAddresses == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return Collections.unmodifiableList(emailAddresses);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setEmailAddresses(final List<EmailAddress> eMailAddresses) {
|
||||||
|
this.emailAddresses = eMailAddresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addEmailAddress(final EmailAddress emailAddress) {
|
||||||
|
emailAddresses.add(emailAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeEmailAddress(final EmailAddress emailAddress) {
|
||||||
|
emailAddresses.remove(emailAddress);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isBanned() {
|
public boolean isBanned() {
|
||||||
return banned;
|
return banned;
|
||||||
}
|
}
|
||||||
|
|
@ -353,12 +387,14 @@ public class User extends Subject implements Serializable {
|
||||||
public String toString(final String data) {
|
public String toString(final String data) {
|
||||||
return super.toString(String.format(", name = %s, "
|
return super.toString(String.format(", name = %s, "
|
||||||
+ "screenName = \"%s\", "
|
+ "screenName = \"%s\", "
|
||||||
|
+ "emailAddress = { %s }"
|
||||||
+ "banned = %b, "
|
+ "banned = %b, "
|
||||||
+ "ssoLogin = \"%s\" "
|
+ "ssoLogin = \"%s\" "
|
||||||
+ "hashAlgorithm = \"%s\" "
|
+ "hashAlgorithm = \"%s\" "
|
||||||
+ "passwordResetRequired = %b%s",
|
+ "passwordResetRequired = %b%s",
|
||||||
Objects.toString(name),
|
Objects.toString(name),
|
||||||
screenName,
|
screenName,
|
||||||
|
Objects.toString(emailAddresses),
|
||||||
banned,
|
banned,
|
||||||
ssoLogin,
|
ssoLogin,
|
||||||
hashAlgorithm,
|
hashAlgorithm,
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ public class LoginManager {
|
||||||
final UserPrincipal principal = iterator.next();
|
final UserPrincipal principal = iterator.next();
|
||||||
final User user = principal.getUser();
|
final User user = principal.getUser();
|
||||||
|
|
||||||
sessionContext.setCurrentParty(user);
|
sessionContext.setCurrentSubject(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,17 @@ public class DatasetsTest extends DatasetsVerifier {
|
||||||
@Parameterized.Parameters(name = "Dataset {0}")
|
@Parameterized.Parameters(name = "Dataset {0}")
|
||||||
public static Collection<String> data() {
|
public static Collection<String> data() {
|
||||||
return Arrays.asList(new String[]{
|
return Arrays.asList(new String[]{
|
||||||
|
"/datasets/org/libreccm/core/authentication/LoginManagerTest/data.json",
|
||||||
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/data.json",
|
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/data.json",
|
||||||
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-delete.json",
|
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-delete.json",
|
||||||
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-changed.json",
|
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-changed.json",
|
||||||
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-new.json",
|
"/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-new.json",
|
||||||
|
"/datasets/org/libreccm/core/GroupManagerTest/users-groups.json",
|
||||||
|
"/datasets/org/libreccm/core/GroupRepositoryTest/data.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-new.json",
|
||||||
|
"/datasets/org/libreccm/core/UserManagerTest/verify-password.json",
|
||||||
"/datasets/org/libreccm/core/UserRepositoryTest/data.json",
|
"/datasets/org/libreccm/core/UserRepositoryTest/data.json",
|
||||||
"/datasets/org/libreccm/core/UserRepositoryTest/after-delete.json",
|
"/datasets/org/libreccm/core/UserRepositoryTest/after-delete.json",
|
||||||
"/datasets/org/libreccm/core/UserRepositoryTest/after-save-changed.json",
|
"/datasets/org/libreccm/core/UserRepositoryTest/after-save-changed.json",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.libreccm.core;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.*;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.container.test.api.Deployment;
|
||||||
|
import org.jboss.arquillian.junit.Arquillian;
|
||||||
|
import org.jboss.arquillian.junit.InSequence;
|
||||||
|
import org.jboss.arquillian.persistence.PersistenceTest;
|
||||||
|
import org.jboss.arquillian.persistence.UsingDataSet;
|
||||||
|
import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
|
||||||
|
import org.jboss.arquillian.transaction.api.annotation.Transactional;
|
||||||
|
import org.jboss.shrinkwrap.api.ShrinkWrap;
|
||||||
|
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
|
||||||
|
import org.jboss.shrinkwrap.api.spec.WebArchive;
|
||||||
|
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
|
||||||
|
import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.experimental.categories.Category;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.libreccm.tests.categories.IntegrationTest;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@Category(IntegrationTest.class)
|
||||||
|
@RunWith(Arquillian.class)
|
||||||
|
@PersistenceTest
|
||||||
|
@Transactional(TransactionMode.COMMIT)
|
||||||
|
public class GroupManagerTest {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private transient GroupManager groupManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private transient UserRepository userRepository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private transient GroupRepository groupRepository;
|
||||||
|
|
||||||
|
public GroupManagerTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDownClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deployment
|
||||||
|
public static WebArchive createDeployment() {
|
||||||
|
final PomEquippedResolveStage pom = Maven
|
||||||
|
.resolver()
|
||||||
|
.loadPomFromFile("pom.xml");
|
||||||
|
final PomEquippedResolveStage dependencies = pom.
|
||||||
|
importCompileAndRuntimeDependencies();
|
||||||
|
final File[] libs = dependencies.resolve().withTransitivity().asFile();
|
||||||
|
|
||||||
|
for (File lib : libs) {
|
||||||
|
System.err.printf("Adding file '%s' to test archive...%n",
|
||||||
|
lib.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ShrinkWrap
|
||||||
|
.create(WebArchive.class,
|
||||||
|
"LibreCCM-org.libreccm.core.GroupManagerTest.war")
|
||||||
|
.addPackage(User.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.web.Application.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.categorization.Category.class.
|
||||||
|
getPackage())
|
||||||
|
.addPackage(org.libreccm.l10n.LocalizedString.class.getPackage()).
|
||||||
|
addPackage(org.libreccm.jpa.EntityManagerProducer.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.jpa.utils.MimeTypeConverter.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.testutils.EqualsVerifier.class.
|
||||||
|
getPackage())
|
||||||
|
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||||
|
.getPackage())
|
||||||
|
.addAsLibraries(libs)
|
||||||
|
.addAsResource("test-persistence.xml",
|
||||||
|
"META-INF/persistence.xml")
|
||||||
|
.addAsWebInfResource("test-web.xml", "WEB-INF/web.xml")
|
||||||
|
.addAsWebInfResource(EmptyAsset.INSTANCE, "WEB-INF/beans.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(10)
|
||||||
|
@UsingDataSet("datasets/org/libreccm/core/GroupManagerTest/users-groups.json")
|
||||||
|
public void verifyIsMemberOfGroup() {
|
||||||
|
final User jdoe = userRepository.findByScreenName("jdoe");
|
||||||
|
final Group admins = groupRepository.findByGroupName("admins");
|
||||||
|
final Group users = groupRepository.findByGroupName("users");
|
||||||
|
final Group authors = groupRepository.findByGroupName("authors");
|
||||||
|
|
||||||
|
assertThat(groupManager.isMemberOfGroup(jdoe, admins), is(false));
|
||||||
|
assertThat(groupManager.isMemberOfGroup(jdoe, users), is(true));
|
||||||
|
assertThat(groupManager.isMemberOfGroup(jdoe, authors), is(true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,207 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.libreccm.core;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.*;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.container.test.api.Deployment;
|
||||||
|
import org.jboss.arquillian.container.test.api.ShouldThrowException;
|
||||||
|
import org.jboss.arquillian.junit.Arquillian;
|
||||||
|
import org.jboss.arquillian.junit.InSequence;
|
||||||
|
import org.jboss.arquillian.persistence.PersistenceTest;
|
||||||
|
import org.jboss.arquillian.persistence.ShouldMatchDataSet;
|
||||||
|
import org.jboss.arquillian.persistence.UsingDataSet;
|
||||||
|
import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
|
||||||
|
import org.jboss.arquillian.transaction.api.annotation.Transactional;
|
||||||
|
import org.jboss.shrinkwrap.api.ShrinkWrap;
|
||||||
|
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
|
||||||
|
import org.jboss.shrinkwrap.api.spec.WebArchive;
|
||||||
|
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
|
||||||
|
import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.experimental.categories.Category;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.libreccm.tests.categories.IntegrationTest;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@Category(IntegrationTest.class)
|
||||||
|
@RunWith(Arquillian.class)
|
||||||
|
@PersistenceTest
|
||||||
|
@Transactional(TransactionMode.COMMIT)
|
||||||
|
public class GroupRepositoryTest {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private transient GroupRepository groupRepository;
|
||||||
|
|
||||||
|
public GroupRepositoryTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDownClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deployment
|
||||||
|
public static WebArchive createDeployment() {
|
||||||
|
final PomEquippedResolveStage pom = Maven
|
||||||
|
.resolver()
|
||||||
|
.loadPomFromFile("pom.xml");
|
||||||
|
final PomEquippedResolveStage dependencies = pom.
|
||||||
|
importCompileAndRuntimeDependencies();
|
||||||
|
final File[] libs = dependencies.resolve().withTransitivity().asFile();
|
||||||
|
|
||||||
|
for (File lib : libs) {
|
||||||
|
System.err.printf("Adding file '%s' to test archive...%n",
|
||||||
|
lib.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ShrinkWrap
|
||||||
|
.create(WebArchive.class,
|
||||||
|
"LibreCCM-org.libreccm.core.UserRepositoryTest.war")
|
||||||
|
.addPackage(User.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.web.Application.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.categorization.Category.class.
|
||||||
|
getPackage())
|
||||||
|
.addPackage(org.libreccm.l10n.LocalizedString.class.getPackage()).
|
||||||
|
addPackage(org.libreccm.jpa.EntityManagerProducer.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.jpa.utils.MimeTypeConverter.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.testutils.EqualsVerifier.class.
|
||||||
|
getPackage())
|
||||||
|
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||||
|
.getPackage())
|
||||||
|
.addAsLibraries(libs)
|
||||||
|
.addAsResource("test-persistence.xml",
|
||||||
|
"META-INF/persistence.xml")
|
||||||
|
.addAsWebInfResource("test-web.xml", "WEB-INF/web.xml")
|
||||||
|
.addAsWebInfResource(EmptyAsset.INSTANCE, "WEB-INF/beans.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyGroups(final Group admins,
|
||||||
|
final Group users,
|
||||||
|
final Group authors,
|
||||||
|
final Group none) {
|
||||||
|
assertThat(admins, is(not(nullValue())));
|
||||||
|
assertThat(admins.getName(), is(equalTo("admins")));
|
||||||
|
|
||||||
|
assertThat(users, is(not(nullValue())));
|
||||||
|
assertThat(users.getName(), is(equalTo("users")));
|
||||||
|
|
||||||
|
assertThat(authors, is(not(nullValue())));
|
||||||
|
assertThat(authors.getName(), is(equalTo("authors")));
|
||||||
|
|
||||||
|
assertThat(none, is(nullValue()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence
|
||||||
|
@UsingDataSet("datasets/org/libreccm/core/GroupRepositoryTest/data.json")
|
||||||
|
public void findGroupById() {
|
||||||
|
final Group admins = groupRepository.findById(-10L);
|
||||||
|
final Group users = groupRepository.findById(-20L);
|
||||||
|
final Group authors = groupRepository.findById(-30L);
|
||||||
|
final Group none = groupRepository.findById(-999L);
|
||||||
|
|
||||||
|
verifyGroups(admins, users, authors, none);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(20)
|
||||||
|
@UsingDataSet("datasets/org/libreccm/core/GroupRepositoryTest/data.json")
|
||||||
|
public void findGroupByName() {
|
||||||
|
final Group admins = groupRepository.findByGroupName("admins");
|
||||||
|
final Group users = groupRepository.findByGroupName("users");
|
||||||
|
final Group authors = groupRepository.findByGroupName("authors");
|
||||||
|
final Group none = groupRepository.findByGroupName("none");
|
||||||
|
|
||||||
|
verifyGroups(admins, users, authors, none);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(30)
|
||||||
|
@UsingDataSet("datasets/org/libreccm/core/GroupRepositoryTest/data.json")
|
||||||
|
@ShouldMatchDataSet(value
|
||||||
|
= "datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json",
|
||||||
|
excludeColumns = "subject_id")
|
||||||
|
public void saveNewGroup() {
|
||||||
|
final Group publishers = new Group();
|
||||||
|
publishers.setName("publishers");
|
||||||
|
|
||||||
|
groupRepository.save(publishers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(40)
|
||||||
|
@UsingDataSet("datasets/org/libreccm/core/GroupRepositoryTest/data.json")
|
||||||
|
@ShouldMatchDataSet(value
|
||||||
|
= "datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json",
|
||||||
|
excludeColumns = {"subject_id"})
|
||||||
|
public void saveChangedGroup() {
|
||||||
|
final Group group = groupRepository.findByGroupName("authors");
|
||||||
|
group.setName("editors");
|
||||||
|
|
||||||
|
groupRepository.save(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
@ShouldThrowException(IllegalArgumentException.class)
|
||||||
|
@InSequence(50)
|
||||||
|
public void saveNullValue() {
|
||||||
|
groupRepository.save(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(60)
|
||||||
|
@UsingDataSet("datasets/org/libreccm/core/GroupRepositoryTest/data.json")
|
||||||
|
@ShouldMatchDataSet(
|
||||||
|
"datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json")
|
||||||
|
public void deleteGroup() {
|
||||||
|
final Group group = groupRepository.findByGroupName("users");
|
||||||
|
|
||||||
|
groupRepository.delete(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -40,7 +40,6 @@ import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import static org.libreccm.core.CoreConstants.*;
|
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.jboss.arquillian.container.test.api.ShouldThrowException;
|
import org.jboss.arquillian.container.test.api.ShouldThrowException;
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,6 @@ import org.libreccm.tests.categories.IntegrationTest;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.persistence.Query;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -252,7 +251,7 @@ public class UserRepositoryTest {
|
||||||
@UsingDataSet("datasets/org/libreccm/core/UserRepositoryTest/data.json")
|
@UsingDataSet("datasets/org/libreccm/core/UserRepositoryTest/data.json")
|
||||||
@ShouldMatchDataSet(value
|
@ShouldMatchDataSet(value
|
||||||
= "datasets/org/libreccm/core/UserRepositoryTest/after-save-new.json",
|
= "datasets/org/libreccm/core/UserRepositoryTest/after-save-new.json",
|
||||||
excludeColumns = {"subject_id"})
|
excludeColumns = {"subject_id", "user_id"})
|
||||||
@InSequence(500)
|
@InSequence(500)
|
||||||
public void saveNewUser() {
|
public void saveNewUser() {
|
||||||
final User user = new User();
|
final User user = new User();
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ import org.junit.runner.RunWith;
|
||||||
import org.libreccm.core.CcmObject;
|
import org.libreccm.core.CcmObject;
|
||||||
import org.libreccm.core.CcmSessionContext;
|
import org.libreccm.core.CcmSessionContext;
|
||||||
import org.libreccm.core.EmailAddress;
|
import org.libreccm.core.EmailAddress;
|
||||||
|
import org.libreccm.core.Subject;
|
||||||
|
import org.libreccm.core.User;
|
||||||
import org.libreccm.tests.categories.IntegrationTest;
|
import org.libreccm.tests.categories.IntegrationTest;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
@ -175,13 +177,17 @@ public class LoginManagerTest {
|
||||||
public void loginValidCredentials() throws LoginException {
|
public void loginValidCredentials() throws LoginException {
|
||||||
loginManager.login("jdoe@example.com", "foobar");
|
loginManager.login("jdoe@example.com", "foobar");
|
||||||
|
|
||||||
assertThat(ccmSessionContext.getCurrentParty(), is(not(nullValue())));
|
assertThat(ccmSessionContext.getCurrentSubject(), is(not(nullValue())));
|
||||||
final EmailAddress emailAddress = new EmailAddress();
|
final EmailAddress emailAddress = new EmailAddress();
|
||||||
emailAddress.setAddress("jdoe@example.com");
|
emailAddress.setAddress("jdoe@example.com");
|
||||||
emailAddress.setBouncing(false);
|
emailAddress.setBouncing(false);
|
||||||
emailAddress.setVerified(true);
|
emailAddress.setVerified(true);
|
||||||
assertThat(ccmSessionContext.getCurrentParty().getEmailAddresses(),
|
|
||||||
contains(equalTo(emailAddress)));
|
final Subject subject = ccmSessionContext.getCurrentSubject();
|
||||||
|
assertThat(subject, is(instanceOf(User.class)));
|
||||||
|
|
||||||
|
final User user = (User) subject;
|
||||||
|
assertThat(user.getEmailAddresses(), contains(equalTo(emailAddress)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -192,7 +198,7 @@ public class LoginManagerTest {
|
||||||
try {
|
try {
|
||||||
loginManager.login("jdoe@example.com", "wrong-pw");
|
loginManager.login("jdoe@example.com", "wrong-pw");
|
||||||
} catch (LoginException ex) {
|
} catch (LoginException ex) {
|
||||||
assertThat(ccmSessionContext.getCurrentParty(), is(nullValue()));
|
assertThat(ccmSessionContext.getCurrentSubject(), is(nullValue()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -207,7 +213,7 @@ public class LoginManagerTest {
|
||||||
try {
|
try {
|
||||||
loginManager.login("jdoe@example.com", "");
|
loginManager.login("jdoe@example.com", "");
|
||||||
} catch (LoginException ex) {
|
} catch (LoginException ex) {
|
||||||
assertThat(ccmSessionContext.getCurrentParty(), is(nullValue()));
|
assertThat(ccmSessionContext.getCurrentSubject(), is(nullValue()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -222,7 +228,7 @@ public class LoginManagerTest {
|
||||||
try {
|
try {
|
||||||
loginManager.login("", "correct-pw");
|
loginManager.login("", "correct-pw");
|
||||||
} catch (LoginException ex) {
|
} catch (LoginException ex) {
|
||||||
assertThat(ccmSessionContext.getCurrentParty(), is(nullValue()));
|
assertThat(ccmSessionContext.getCurrentSubject(), is(nullValue()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -237,7 +243,7 @@ public class LoginManagerTest {
|
||||||
try {
|
try {
|
||||||
loginManager.login("jdoe@example.com", null);
|
loginManager.login("jdoe@example.com", null);
|
||||||
} catch (LoginException ex) {
|
} catch (LoginException ex) {
|
||||||
assertThat(ccmSessionContext.getCurrentParty(), is(nullValue()));
|
assertThat(ccmSessionContext.getCurrentSubject(), is(nullValue()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -252,7 +258,7 @@ public class LoginManagerTest {
|
||||||
try {
|
try {
|
||||||
loginManager.login(null, "correct-pw");
|
loginManager.login(null, "correct-pw");
|
||||||
} catch (LoginException ex) {
|
} catch (LoginException ex) {
|
||||||
assertThat(ccmSessionContext.getCurrentParty(), is(nullValue()));
|
assertThat(ccmSessionContext.getCurrentSubject(), is(nullValue()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
{
|
||||||
|
"subjects":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -40
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_memberships":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"membership_id": -10,
|
||||||
|
"group_subject_id": -30,
|
||||||
|
"user_subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"membership_id": -20,
|
||||||
|
"group_subject_id": -40,
|
||||||
|
"user_subject_id": -10
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"subjects":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -30
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ccm_groups":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "admins",
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "authors",
|
||||||
|
"subject_id": -30
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"subjects":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -30
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ccm_groups":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "admins",
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "users",
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "editors",
|
||||||
|
"subject_id": -30
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
"subjects":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -40
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ccm_groups":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "admins",
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "users",
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "authors",
|
||||||
|
"subject_id": -30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "publishers",
|
||||||
|
"subject_id": -40
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"subjects":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subject_id": -30
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ccm_groups":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "admins",
|
||||||
|
"subject_id": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "users",
|
||||||
|
"subject_id": -20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "authors",
|
||||||
|
"subject_id": -30
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -5,15 +5,6 @@
|
||||||
"subject_id": -10
|
"subject_id": -10
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "john.doe@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -27,5 +18,14 @@
|
||||||
"screen_name": "jdoe",
|
"screen_name": "jdoe",
|
||||||
"subject_id": -10
|
"subject_id": -10
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "john.doe@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -8,21 +8,6 @@
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "john.doe@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -30,
|
|
||||||
"email_address": "joe.public@example.com",
|
|
||||||
"bouncing": true,
|
|
||||||
"verified": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -47,5 +32,20 @@
|
||||||
"screen_name": "joe",
|
"screen_name": "joe",
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "john.doe@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -30,
|
||||||
|
"email_address": "joe.public@example.com",
|
||||||
|
"bouncing": true,
|
||||||
|
"verified": false
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -11,33 +11,6 @@
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "jd@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "max.mustermann@example.org",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "mm@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -30,
|
|
||||||
"email_address": "joe.public@example.com",
|
|
||||||
"bouncing": true,
|
|
||||||
"verified": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -74,5 +47,32 @@
|
||||||
"screen_name": "joe",
|
"screen_name": "joe",
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "jd@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "max.mustermann@example.org",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "mm@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -30,
|
||||||
|
"email_address": "joe.public@example.com",
|
||||||
|
"bouncing": true,
|
||||||
|
"verified": false
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -14,39 +14,6 @@
|
||||||
"subject_id": -40
|
"subject_id": -40
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "john.doe@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "max.mustermann@example.org",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "mm@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -30,
|
|
||||||
"email_address": "joe.public@example.com",
|
|
||||||
"bouncing": true,
|
|
||||||
"verified": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -40,
|
|
||||||
"email_address": "jane.doe@example.org",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -95,5 +62,38 @@
|
||||||
"screen_name": "jane",
|
"screen_name": "jane",
|
||||||
"subject_id": -40
|
"subject_id": -40
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "john.doe@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "max.mustermann@example.org",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "mm@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -30,
|
||||||
|
"email_address": "joe.public@example.com",
|
||||||
|
"bouncing": true,
|
||||||
|
"verified": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -40,
|
||||||
|
"email_address": "jane.doe@example.org",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": false
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -11,33 +11,6 @@
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "john.doe@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "max.mustermann@example.org",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "mm@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -30,
|
|
||||||
"email_address": "max.mustermann@example.org",
|
|
||||||
"bouncing": true,
|
|
||||||
"verified": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -73,5 +46,32 @@
|
||||||
"screen_name": "joe",
|
"screen_name": "joe",
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "john.doe@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "max.mustermann@example.org",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "mm@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -30,
|
||||||
|
"email_address": "max.mustermann@example.org",
|
||||||
|
"bouncing": true,
|
||||||
|
"verified": false
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -11,33 +11,6 @@
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "john.doe@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "max.mustermann@example.org",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -20,
|
|
||||||
"email_address": "mm@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"subject_id": -30,
|
|
||||||
"email_address": "joe.public@example.com",
|
|
||||||
"bouncing": true,
|
|
||||||
"verified": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -73,5 +46,32 @@
|
||||||
"screen_name": "joe",
|
"screen_name": "joe",
|
||||||
"subject_id": -30
|
"subject_id": -30
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "john.doe@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "max.mustermann@example.org",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -20,
|
||||||
|
"email_address": "mm@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"user_id": -30,
|
||||||
|
"email_address": "joe.public@example.com",
|
||||||
|
"bouncing": true,
|
||||||
|
"verified": false
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -5,15 +5,6 @@
|
||||||
"subject_id": -10
|
"subject_id": -10
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"subject_email_addresses":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"subject_id": -10,
|
|
||||||
"email_address": "jdoe@example.com",
|
|
||||||
"bouncing": false,
|
|
||||||
"verified": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ccm_users":
|
"ccm_users":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
@ -27,5 +18,14 @@
|
||||||
"screen_name": "jdoe",
|
"screen_name": "jdoe",
|
||||||
"subject_id": -10
|
"subject_id": -10
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"user_email_addresses":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"user_id": -10,
|
||||||
|
"email_address": "jdoe@example.com",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
DELETE FROM ccm_objects;
|
DELETE FROM ccm_objects;
|
||||||
|
|
||||||
DELETE FROM subject_email_addresses;
|
DELETE FROM group_memberships;
|
||||||
|
|
||||||
|
DELETE FROM ccm_groups;
|
||||||
|
|
||||||
|
DELETE FROM user_email_addresses;
|
||||||
|
|
||||||
DELETE FROM ccm_users;
|
DELETE FROM ccm_users;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,10 @@ DELETE FROM ccm_objects;
|
||||||
|
|
||||||
DELETE FROM subject_email_addresses;
|
DELETE FROM subject_email_addresses;
|
||||||
|
|
||||||
|
DELETE FROM group_memberships;
|
||||||
|
|
||||||
|
DELETE FROM ccm_groups;
|
||||||
|
|
||||||
DELETE FROM ccm_users;
|
DELETE FROM ccm_users;
|
||||||
|
|
||||||
DELETE FROM subjects;
|
DELETE FROM subjects;
|
||||||
|
|
@ -2,6 +2,10 @@ DELETE FROM ccm_objects;
|
||||||
|
|
||||||
DELETE FROM subject_email_addresses;
|
DELETE FROM subject_email_addresses;
|
||||||
|
|
||||||
|
DELETE FROM group_memberships;
|
||||||
|
|
||||||
|
DELETE FROM ccm_groups;
|
||||||
|
|
||||||
DELETE FROM ccm_users;
|
DELETE FROM ccm_users;
|
||||||
|
|
||||||
DELETE FROM subjects;
|
DELETE FROM subjects;
|
||||||
Loading…
Reference in New Issue