Skip to content

Commit

Permalink
Add selection of Role in the User Group wizard #5285
Browse files Browse the repository at this point in the history
Added support of roles selection in Group wizard.
  • Loading branch information
edloidas committed Jul 29, 2017
1 parent e2f4ce0 commit 6fbd90c
Show file tree
Hide file tree
Showing 15 changed files with 384 additions and 73 deletions.
Expand Up @@ -290,7 +290,16 @@ public PrincipalJson getPrincipalByKey( @PathParam("key") final String keyParam,

case GROUP:
final PrincipalKeys groupMembers = getMembers( principalKey );
return new GroupJson( (Group) principal, groupMembers );
if ( resolveMemberships )
{
final PrincipalKeys membershipKeys = securityService.getMemberships( principalKey );
final Principals memberships = securityService.getPrincipals( membershipKeys );
return new GroupJson( (Group) principal, groupMembers, memberships );
}
else
{
return new GroupJson( (Group) principal, groupMembers );
}

case ROLE:
final PrincipalKeys roleMembers = getMembers( principalKey );
Expand Down Expand Up @@ -490,6 +499,19 @@ private PrincipalKeys getUserMembers( final PrincipalKey principal )
return PrincipalKeys.from( members.stream().filter( PrincipalKey::isUser ).collect( toList() ) );
}

/* private PrincipalKeys getGroupMembers( final PrincipalKey principal )
{
PrincipalKeys members = this.getMembers( principal );
List<PrincipalKey> subMembers = Lists.arrayList();
members.stream().filter( member -> member.isRole() ).forEach( member -> {
subMembers.addAll( getGroupMembers( member ).getSet() );
} );
members = PrincipalKeys.from( members, subMembers );
return PrincipalKeys.from( members.stream().filter( PrincipalKey::isGroup ).collect( toList() ) );
}*/

private AuthDescriptorMode retrieveIdProviderMode( UserStore userStore )
{
final AuthConfig authConfig = userStore.getAuthConfig();
Expand Down
Expand Up @@ -6,6 +6,7 @@
import com.enonic.xp.security.Group;
import com.enonic.xp.security.PrincipalKey;
import com.enonic.xp.security.PrincipalKeys;
import com.enonic.xp.security.Principals;

import static java.util.stream.Collectors.toList;

Expand All @@ -16,15 +17,28 @@ public final class GroupJson

private final List<String> members;

private final List<PrincipalJson> memberships;

public GroupJson( final Group group, final PrincipalKeys members )
{
this( group, members, Principals.empty() );
}

public GroupJson( final Group group, final PrincipalKeys members, final Principals memberships )
{
super( group );
this.group = group;
this.members = members.stream().map( PrincipalKey::toString ).collect( toList() );
this.memberships = new PrincipalsJson( memberships ).getPrincipals();
}

public List<String> getMembers()
{
return members;
}

public List<PrincipalJson> getMemberships()
{
return memberships;
}
}
Expand Up @@ -315,10 +315,10 @@ public void getPrincipalGroupById()
Mockito.<Optional<? extends Principal>>when(
securityService.getPrincipal( PrincipalKey.from( "group:system:group-a" ) ) ).thenReturn( userRes );

PrincipalRelationship membership1 = from( group.getKey() ).to( PrincipalKey.from( "user:system:user1" ) );
PrincipalRelationship membership2 = from( group.getKey() ).to( PrincipalKey.from( "user:system:user2" ) );
PrincipalRelationships memberships = PrincipalRelationships.from( membership1, membership2 );
Mockito.when( securityService.getRelationships( PrincipalKey.from( "group:system:group-a" ) ) ).thenReturn( memberships );
PrincipalRelationship member1 = from( group.getKey() ).to( PrincipalKey.from( "user:system:user1" ) );
PrincipalRelationship member2 = from( group.getKey() ).to( PrincipalKey.from( "user:system:user2" ) );
PrincipalRelationships members = PrincipalRelationships.from( member1, member2 );
Mockito.when( securityService.getRelationships( PrincipalKey.from( "group:system:group-a" ) ) ).thenReturn( members );

String jsonString = request().
path( "security/principals/" + URLEncoder.encode( "group:system:group-a", "UTF-8" ) ).
Expand All @@ -327,6 +327,46 @@ public void getPrincipalGroupById()
assertJson( "getPrincipalGroupById.json", jsonString );
}

@Test
public void getPrincipalGroupByIdWithMemberships()
throws Exception
{
final Group group = Group.create().
key( PrincipalKey.ofGroup( UserStoreKey.system(), "group-a" ) ).
displayName( "Group A" ).
description( "group a" ).
modifiedTime( Instant.now( clock ) ).
build();

final Role role = Role.create().
key( PrincipalKey.ofRole( "superuser" ) ).
displayName( "Super user role" ).
modifiedTime( Instant.now( clock ) ).
description( "super u" ).
build();

final Optional<? extends Principal> userRes = Optional.of( group );
Mockito.<Optional<? extends Principal>>when(
securityService.getPrincipal( PrincipalKey.from( "group:system:group-a" ) ) ).thenReturn( userRes );

PrincipalRelationship member1 = from( group.getKey() ).to( PrincipalKey.from( "user:system:user1" ) );
PrincipalRelationship member2 = from( group.getKey() ).to( PrincipalKey.from( "user:system:user2" ) );
PrincipalRelationships members = PrincipalRelationships.from( member1, member2 );
Mockito.when( securityService.getRelationships( PrincipalKey.from( "group:system:group-a" ) ) ).thenReturn( members );

final PrincipalKeys membershipKeys = PrincipalKeys.from( role.getKey() );
Mockito.when( securityService.getMemberships( PrincipalKey.from( "group:system:group-a" ) ) ).thenReturn( membershipKeys );
final Principals memberships = Principals.from( role );
Mockito.when( securityService.getPrincipals( membershipKeys ) ).thenReturn( memberships );

String jsonString = request().
path( "security/principals/" + URLEncoder.encode( "group:system:group-a", "UTF-8" ) ).
queryParam( "memberships", "true" ).
get().getAsString();

assertJson( "getPrincipalGroupByIdWithMemberships.json", jsonString );
}

@Test
public void getPrincipalRoleById()
throws Exception
Expand Down
Expand Up @@ -6,5 +6,6 @@
"user:system:user1",
"user:system:user2"
],
"memberships": [],
"modifiedTime": "1970-01-01T00:00:00Z"
}
}
Expand Up @@ -6,5 +6,6 @@
"user:system:user1",
"user:system:user2"
],
"memberships": [],
"modifiedTime": "1970-01-01T00:00:00Z"
}
}
@@ -0,0 +1,18 @@
{
"description": "group a",
"displayName": "Group A",
"key": "group:system:group-a",
"members": [
"user:system:user1",
"user:system:user2"
],
"memberships": [
{
"description": "super u",
"displayName": "Super user role",
"key": "role:superuser",
"modifiedTime": "1970-01-01T00:00:00Z"
}
],
"modifiedTime": "1970-01-01T00:00:00Z"
}
Expand Up @@ -13,14 +13,14 @@ module api.security {
this.includeMemberships = false;
}

includeUserMemberships(includeMemberships: boolean): GetPrincipalByKeyRequest {
setIncludeMemberships(includeMemberships: boolean): GetPrincipalByKeyRequest {
this.includeMemberships = includeMemberships;
return this;
}

getParams(): Object {
return {
memberships: this.includeMemberships && this.principalKey.isUser()
memberships: this.includeMemberships
};
}

Expand Down
Expand Up @@ -4,10 +4,13 @@ module api.security {

private members: PrincipalKey[];

private memberships: Principal[];

constructor(builder: GroupBuilder) {
super(builder);
api.util.assert(this.getKey().isGroup(), 'Expected PrincipalKey of type Group');
this.members = builder.members || [];
this.memberships = builder.memberships || [];
}

getMembers(): PrincipalKey[] {
Expand All @@ -22,13 +25,23 @@ module api.security {
this.members.push(member);
}

getMemberships(): Principal[] {
return this.memberships;
}

setMemberships(memberships: Principal[]) {
this.memberships = memberships;
}

equals(o: api.Equitable): boolean {
if (!api.ObjectHelper.iFrameSafeInstanceOf(o, Group)) {
return false;
}

let other = <Group> o;
return super.equals(o) && api.ObjectHelper.arrayEquals(this.members, other.getMembers());
return super.equals(o) &&
api.ObjectHelper.arrayEquals(this.members, other.getMembers()) &&
api.ObjectHelper.arrayEquals(this.memberships, other.getMemberships());
}

clone(): Group {
Expand All @@ -49,14 +62,19 @@ module api.security {
}

export class GroupBuilder extends PrincipalBuilder {

members: PrincipalKey[];

memberships: Principal[];

constructor(source?: Group) {
if (source) {
super(source);
this.members = source.getMembers().slice(0);
this.memberships = source.getMemberships().slice(0);
} else {
this.members = [];
this.memberships = [];
}
}

Expand All @@ -66,6 +84,9 @@ module api.security {
if (json.members) {
this.members = json.members.map((memberStr) => PrincipalKey.fromString(memberStr));
}
if (json.memberships) {
this.memberships = json.memberships.map((principalJson) => Principal.fromJson(principalJson));
}
return this;
}

Expand All @@ -74,6 +95,11 @@ module api.security {
return this;
}

setMemberships(memberships: Principal[]): GroupBuilder {
this.memberships = memberships || [];
return this;
}

build(): Group {
return new Group(this);
}
Expand Down
Expand Up @@ -4,5 +4,7 @@ module api.security {

members?: string[];

memberships?: PrincipalJson[];

}
}
Expand Up @@ -75,7 +75,7 @@ export class UserItemStatisticsPanel extends ItemStatisticsPanel<UserTreeGridIte
rolesAndGroupsGroup.addDataArray(i18n('field.groups'), []);
this.userDataContainer.appendChild(rolesAndGroupsGroup);

new GetPrincipalByKeyRequest(item.getModel().getPrincipal().getKey()).includeUserMemberships(true).sendAndParse().then(
new GetPrincipalByKeyRequest(item.getModel().getPrincipal().getKey()).setIncludeMemberships(true).sendAndParse().then(
(principal: Principal) => {
userGroup = new ItemDataGroup(i18n('field.user'), 'user');
userGroup.addDataList(i18n('field.email'), principal.asUser().getEmail());
Expand Down Expand Up @@ -122,7 +122,7 @@ export class UserItemStatisticsPanel extends ItemStatisticsPanel<UserTreeGridIte
this.userDataContainer.appendChild(membersGroup);

new GetPrincipalByKeyRequest(item.getModel().getPrincipal().getKey())
.includeUserMemberships(true)
.setIncludeMemberships(true)
.sendAndParse()
.then((principal: Principal) => {

Expand Down

0 comments on commit 6fbd90c

Please sign in to comment.