Skip to content

Commit c91ccf1

Browse files
committed
Merge pull request picketlink#500 from pedroigor/master
[PLINK-726] - Wrong resourceClass value in result list entries in listing permissions by identity type.
2 parents 361190c + b87629d commit c91ccf1

File tree

9 files changed

+251
-26
lines changed

9 files changed

+251
-26
lines changed

modules/base/impl/src/test/java/org/picketlink/http/test/SecurityInitializer.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.picketlink.idm.RelationshipManager;
2525
import org.picketlink.idm.credential.Digest;
2626
import org.picketlink.idm.credential.Password;
27+
import org.picketlink.idm.model.IdentityType;
2728
import org.picketlink.idm.model.Partition;
2829
import org.picketlink.idm.model.basic.Grant;
2930
import org.picketlink.idm.model.basic.Group;
@@ -106,6 +107,11 @@ private void configureDefaultPartition() {
106107

107108
// add an user as a member of a group
108109
addMember(defaultUser, administratorGroup);
110+
111+
// user must inherit roles from group Administrators, in this case role Administrator
112+
Role administratorRole = addRole("Administrator", realm, this.partitionManager);
113+
114+
grantRole(administratorGroup, administratorRole);
109115
}
110116

111117
public void addPartition(Partition partition) {
@@ -185,10 +191,10 @@ public Group addGroup(String groupName, Partition partition, PartitionManager pa
185191
return group;
186192
}
187193

188-
public void grantRole(User user, Role role) {
194+
public void grantRole(IdentityType assignee, Role role) {
189195
RelationshipManager relationshipManager = getRelationshipManager();
190196

191-
relationshipManager.add(new Grant(user, role));
197+
relationshipManager.add(new Grant(assignee, role));
192198
}
193199

194200
/**

modules/base/impl/src/test/java/org/picketlink/http/test/authorization/RoleBasedAuthorizationTestCase.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,25 @@ public void testOnlyManagers() throws Exception {
7979

8080
this.securityFilter.doFilter(this.request, this.response, this.filterChain);
8181

82-
doAnswer(new Answer() {
83-
@Override
84-
public Object answer(InvocationOnMock invocation) throws Throwable {
85-
assertEquals("/onlyManagerRole", picketLinkRequest.get().getServletPath());
86-
return null;
87-
}
88-
}).when(this.filterChain).doFilter(this.request, this.response);
82+
verify(this.filterChain, times(1)).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
83+
}
84+
85+
@Test
86+
public void testOnlyAdministrator() throws Exception {
87+
when(this.request.getServletPath()).thenReturn("/formProtectedUri/" + FormAuthenticationConfiguration.DEFAULT_AUTHENTICATION_URI);
88+
when(this.request.getParameter(FormAuthenticationScheme.J_USERNAME)).thenReturn("picketlink");
89+
when(this.request.getParameter(FormAuthenticationScheme.J_PASSWORD)).thenReturn("picketlink");
90+
91+
this.securityFilter.doFilter(this.request, this.response, this.filterChain);
92+
verify(this.filterChain, times(0)).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
93+
verify(this.response).sendRedirect(CONTEXT_PATH);
94+
95+
when(this.request.getServletPath()).thenReturn("/admin/manage");
96+
reset(this.response);
97+
98+
this.securityFilter.doFilter(this.request, this.response, this.filterChain);
99+
100+
verify(this.filterChain, times(1)).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
89101
}
90102

91103
@Test
@@ -120,7 +132,10 @@ public void configureHttpSecurity(@Observes SecurityConfigurationEvent event) {
120132
.role("Manager")
121133
.forPath("/onlyCustomerRole")
122134
.authorizeWith()
123-
.role("Customer");
135+
.role("Customer")
136+
.forPath("/admin/*")
137+
.authorizeWith()
138+
.role("Administrator");
124139
}
125140
}
126141
}

modules/idm/impl/src/main/java/org/picketlink/idm/jpa/internal/JPAIdentityStore.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,15 +1736,17 @@ public List<Permission> listPermissions(IdentityContext ctx, IdentityPermission
17361736
owner, resourceClass, resourceIdentifier));
17371737
}
17381738

1739-
if (resourceClass == null) {
1739+
Class<?> actualResourceClass = resourceClass;
1740+
1741+
if (actualResourceClass == null) {
17401742
try {
1741-
resourceClass = classForName((String) resourceClassProperty.getValue(result));
1743+
actualResourceClass = classForName((String) resourceClassProperty.getValue(result));
17421744
} catch (ClassNotFoundException e) {
17431745
throw new IdentityManagementException("Could not load type.", e);
17441746
}
17451747
}
17461748

1747-
PermissionOperationSet opSet = new PermissionOperationSet(result, resourceClass, mapper);
1749+
PermissionOperationSet opSet = new PermissionOperationSet(result, actualResourceClass, mapper);
17481750
String operation = query.getOperation();
17491751
Set<String> operationsToreturn;
17501752

@@ -1760,7 +1762,7 @@ public List<Permission> listPermissions(IdentityContext ctx, IdentityPermission
17601762
if (resource != null) {
17611763
perms.add(new IdentityPermission(resource, ownerIdentityType, op));
17621764
} else {
1763-
perms.add(new IdentityPermission(resourceClass, (Serializable) resourceIdentifierProperty
1765+
perms.add(new IdentityPermission(actualResourceClass, (Serializable) resourceIdentifierProperty
17641766
.getValue(result), ownerIdentityType, op));
17651767
}
17661768
}

modules/idm/tests/src/test/java/org/picketlink/test/idm/permission/PermissionTestCase.java

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
import org.picketlink.test.idm.AbstractPartitionManagerTestCase;
3636
import org.picketlink.test.idm.Configuration;
3737
import org.picketlink.test.idm.permission.entity.AllowedOperationTypeEntity;
38-
import org.picketlink.test.idm.permission.entity.ProtectedEntity;
38+
import org.picketlink.test.idm.permission.entity.EntityB;
39+
import org.picketlink.test.idm.permission.entity.EntityA;
40+
import org.picketlink.test.idm.permission.entity.EntityC;
3941
import org.picketlink.test.idm.testers.FileStoreConfigurationTester;
4042
import org.picketlink.test.idm.testers.IdentityConfigurationTester;
4143
import org.picketlink.test.idm.testers.JPAPermissionStoreConfigurationTester;
@@ -330,12 +332,12 @@ public void testRevokeClassBasedPermission() {
330332

331333
@Test
332334
public void testGrantAndRevokeEntityBasedPermission() {
333-
ProtectedEntity entity = new ProtectedEntity();
335+
EntityA entity = new EntityA();
334336

335337
entity.setId(1l);
336338
entity.setName("Confidential");
337339

338-
ProtectedEntity entity2 = new ProtectedEntity();
340+
EntityA entity2 = new EntityA();
339341

340342
entity2.setId(2l);
341343
entity2.setName("Confidential");
@@ -345,20 +347,20 @@ public void testGrantAndRevokeEntityBasedPermission() {
345347

346348
permissionManager.grantPermission(bob, entity, "load");
347349

348-
assertTrue(hasPermission(bob, permissionManager.listPermissions(ProtectedEntity.class, entity.getId())));
349-
assertFalse(hasPermission(bob, permissionManager.listPermissions(ProtectedEntity.class, entity2.getId(), "load")));
350+
assertTrue(hasPermission(bob, permissionManager.listPermissions(EntityA.class, entity.getId())));
351+
assertFalse(hasPermission(bob, permissionManager.listPermissions(EntityA.class, entity2.getId(), "load")));
350352

351353
permissionManager.revokePermission(bob, entity, "load");
352354
permissionManager.grantPermission(bob, entity2, "load");
353355

354-
assertFalse(hasPermission(bob, permissionManager.listPermissions(ProtectedEntity.class, entity.getId(), "load")));
355-
List<Permission> permissions = permissionManager.listPermissions(ProtectedEntity.class, entity2.getId(), "load");
356+
assertFalse(hasPermission(bob, permissionManager.listPermissions(EntityA.class, entity.getId(), "load")));
357+
List<Permission> permissions = permissionManager.listPermissions(EntityA.class, entity2.getId(), "load");
356358

357359
assertTrue(hasPermission(bob, permissions));
358360

359361
Permission permission = permissions.get(0);
360362

361-
assertEquals(ProtectedEntity.class, permission.getResourceClass());
363+
assertEquals(EntityA.class, permission.getResourceClass());
362364
assertEquals(entity2.getId().toString(), permission.getResourceIdentifier());
363365
assertEquals("load", permission.getOperation());
364366

@@ -372,6 +374,64 @@ public void testGrantAndRevokeEntityBasedPermission() {
372374
assertEquals("load", permission.getOperation());
373375
}
374376

377+
@Test
378+
@Configuration(exclude = {FileStoreConfigurationTester.class, LDAPUserGroupJPARoleConfigurationTester.class})
379+
public void testListDifferentEntityPermissions() {
380+
User bob = createUser("bob");
381+
EntityA entityA = new EntityA();
382+
383+
entityA.setId(1l);
384+
entityA.setName("Entity A");
385+
386+
EntityB entityB = new EntityB();
387+
388+
entityB.setId(1l);
389+
entityB.setName("Entity B");
390+
391+
EntityC entityC = new EntityC();
392+
393+
entityC.setId(1l);
394+
entityC.setName("Entity C");
395+
396+
PermissionManager permissionManager = getPermissionManager();
397+
398+
permissionManager.grantPermission(bob, entityA, "load");
399+
permissionManager.grantPermission(bob, entityB, "create");
400+
401+
List<Permission> permissionsA = permissionManager.listPermissions(EntityA.class, entityA.getId());
402+
403+
assertEquals(1, permissionsA.size());
404+
assertEquals(EntityA.class, permissionsA.get(0).getResourceClass());
405+
406+
assertTrue(hasPermission(bob, permissionsA));
407+
408+
List<Permission> permissionsB = permissionManager.listPermissions(EntityB.class, entityB.getId());
409+
410+
assertEquals(1, permissionsB.size());
411+
assertEquals(EntityB.class, permissionsB.get(0).getResourceClass());
412+
413+
assertTrue(hasPermission(bob, permissionsB));
414+
415+
List<Permission> permissions = permissionManager.listPermissions(bob);
416+
417+
assertEquals(2, permissions.size());
418+
419+
permissionManager.grantPermission(bob, entityC, "write");
420+
421+
List<Permission> permissionsC = permissionManager.listPermissions(EntityC.class, entityC.getId());
422+
423+
assertEquals(1, permissionsC.size());
424+
assertEquals(EntityC.class, permissionsC.get(0).getResourceClass());
425+
426+
assertEquals(1, permissionManager.listPermissions(EntityA.class, "load"));
427+
assertEquals(1, permissionManager.listPermissions(EntityB.class, "create"));
428+
assertEquals(1, permissionManager.listPermissions(EntityC.class, "write"));
429+
430+
assertTrue(permissionManager.listPermissions(EntityA.class, "create").isEmpty());
431+
assertTrue(permissionManager.listPermissions(EntityB.class, "write").isEmpty());
432+
assertTrue(permissionManager.listPermissions(EntityC.class, "load").isEmpty());
433+
}
434+
375435
@Test
376436
public void testGrantAndRevokeMultipleUsers() {
377437
User bob = createUser("bob");
@@ -411,7 +471,7 @@ public void testPermissionStorePartitioningByResourceType() {
411471

412472
assertTrue(hasPermission(bob, permissionManager.listPermissions("fileA.txt", "read")));
413473

414-
ProtectedEntity entity = new ProtectedEntity();
474+
EntityA entity = new EntityA();
415475

416476
entity.setName("Confidential");
417477

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
* @author Pedro Igor
3131
*/
3232
@Entity
33-
public class ProtectedEntity {
33+
public class EntityA {
3434

3535
@Id
3636
@GeneratedValue
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* JBoss, Home of Professional Open Source.
3+
* Copyright 2012, Red Hat, Inc., and individual contributors
4+
* as indicated by the @author tags. See the copyright.txt file in the
5+
* distribution for a full listing of individual contributors.
6+
*
7+
* This is free software; you can redistribute it and/or modify it
8+
* under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation; either version 2.1 of
10+
* the License, or (at your option) any later version.
11+
*
12+
* This software is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+
* Lesser General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public
18+
* License along with this software; if not, write to the Free
19+
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20+
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21+
*/
22+
package org.picketlink.test.idm.permission.entity;
23+
24+
import javax.persistence.Column;
25+
import javax.persistence.Entity;
26+
import javax.persistence.GeneratedValue;
27+
import javax.persistence.Id;
28+
29+
/**
30+
* @author Pedro Igor
31+
*/
32+
@Entity
33+
public class EntityB {
34+
35+
@Id
36+
@GeneratedValue
37+
private Long id;
38+
39+
@Column
40+
private String name;
41+
42+
public Long getId() {
43+
return this.id;
44+
}
45+
46+
public void setId(Long id) {
47+
this.id = id;
48+
}
49+
50+
public String getName() {
51+
return this.name;
52+
}
53+
54+
public void setName(String name) {
55+
this.name = name;
56+
}
57+
58+
@Override
59+
public boolean equals(Object o) {
60+
if (this == o) return true;
61+
if (o == null || this.getClass() != o.getClass()) return false;
62+
EntityB that = (EntityB) o;
63+
return this.id.equals(that.id);
64+
}
65+
66+
@Override
67+
public int hashCode() {
68+
return this.id.hashCode();
69+
}
70+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* JBoss, Home of Professional Open Source.
3+
* Copyright 2012, Red Hat, Inc., and individual contributors
4+
* as indicated by the @author tags. See the copyright.txt file in the
5+
* distribution for a full listing of individual contributors.
6+
*
7+
* This is free software; you can redistribute it and/or modify it
8+
* under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation; either version 2.1 of
10+
* the License, or (at your option) any later version.
11+
*
12+
* This software is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+
* Lesser General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public
18+
* License along with this software; if not, write to the Free
19+
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20+
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21+
*/
22+
package org.picketlink.test.idm.permission.entity;
23+
24+
import javax.persistence.Column;
25+
import javax.persistence.Entity;
26+
import javax.persistence.GeneratedValue;
27+
import javax.persistence.Id;
28+
29+
/**
30+
* @author Pedro Igor
31+
*/
32+
@Entity
33+
public class EntityC {
34+
35+
@Id
36+
@GeneratedValue
37+
private Long id;
38+
39+
@Column
40+
private String name;
41+
42+
public Long getId() {
43+
return this.id;
44+
}
45+
46+
public void setId(Long id) {
47+
this.id = id;
48+
}
49+
50+
public String getName() {
51+
return this.name;
52+
}
53+
54+
public void setName(String name) {
55+
this.name = name;
56+
}
57+
58+
@Override
59+
public boolean equals(Object o) {
60+
if (this == o) return true;
61+
if (o == null || this.getClass() != o.getClass()) return false;
62+
EntityC that = (EntityC) o;
63+
return this.id.equals(that.id);
64+
}
65+
66+
@Override
67+
public int hashCode() {
68+
return this.id.hashCode();
69+
}
70+
}

modules/idm/tests/src/test/java/org/picketlink/test/idm/permission/entity/TypedPermissionTypeEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
* @author Pedro Igor
3636
*/
3737
@Entity
38-
@PermissionManaged(resourceClasses = ProtectedEntity.class)
38+
@PermissionManaged(resourceClasses = EntityA.class)
3939
public class TypedPermissionTypeEntity {
4040

4141
@Id

0 commit comments

Comments
 (0)