Hi guys,

i might be mistaken but it seems like PortalSecurityPermissionCollection has a 
bug in loadPermission method.
The error conditions are as follows
when a user is a memeber of several roles the loadPermission method constructs 
permissions list which corresponds to the Role that appears to be first in the 
set ("Roles" principal). As a result, if "Admin" is NOT the first role 
returned, the user will not have the permissions granted to Admin role.

I've fixed this error in my source but not very clear where should I 
post(publish) the fix.

below is the fixed loadPermission method


  | protected void loadPermission(String permType, String uri) throws Exception 
{
  |     String rootP = "/portalobject/";
  |     if (PermissionTypes.INSTANCE.equals(permType)) {
  |             rootP = "/instance/";
  |     }
  | 
  |     Enumeration roles = this.getAllRoles();
  | 
  |     this.permissionsList.clear();
  | 
  |     MBeanServer server = MBeanServerLocator.locateJBoss();
  |     ObjectName oname = new 
ObjectName("portal:service=TreeCache,type=persistent");
  |     Fqn fqn = Fqn.fromString(rootP + uri);
  | 
  |     ObjectEntry oe = (ObjectEntry) server.invoke(oname, "get", new Object[] 
{ fqn, "constraints" }, new String[] {
  |                     "org.jboss.cache.Fqn", "java.lang.Object" });
  |     if (oe != null) {
  |             Set constraints = (Set) oe.getValue();
  |             int len = constraints != null ? constraints.size() : 0;
  |             Object[] scarr = constraints.toArray();
  | 
  |             // check if at lest one user Role has permissions fo the uri
  |             if (roles != null) {
  |                     while (roles.hasMoreElements()) {
  |                             Principal rolePrincipal = (Principal) 
roles.nextElement();
  |                             String role = rolePrincipal.getName();
  | 
  |                             for (int i1 = 0; i1 < len; i1++) {
  |                                     SecurityConstraint sc = 
(SecurityConstraint) scarr[i1];
  |                                     String scrole = sc.getRole();
  |                                     if 
(scrole.equals(SecurityConstants.UNCHECKED_ROLE_NAME) == false && 
!role.equals(scrole))
  |                                             continue;
  |                                     Iterator iter = 
sc.getActions().iterator();
  |                                     while (iter.hasNext()) {
  |                                             String actionstr = (String) 
iter.next();
  |                                             
this.permissionsList.add(getPortalPermission(permType, actionstr, uri));
  |                                     }
  |                             }
  |                     }
  |             }
  |     }
  | }
  | 
  | private Enumeration getAllRoles() throws Exception {
  |     Subject subject = (Subject) 
PolicyContext.getContext("javax.security.auth.Subject.container");
  |     log.debug("Subject=" + subject);
  |     Enumeration roles;
  | 
  |     List uncheckedRole = new LinkedList();
  |     uncheckedRole.add(new 
SimpleGroup(SecurityConstants.UNCHECKED_ROLE_NAME));
  |     roles = Collections.enumeration(uncheckedRole);
  | 
  |     if (subject != null) {
  |             Set principals = subject.getPrincipals();
  |             Iterator iter = principals != null ? principals.iterator() : 
null;
  |             while (iter != null && iter.hasNext()) {
  |                     Principal p = (Principal) iter.next();
  |                     if (p instanceof Group) {
  |                             Group gp = (Group) p;
  |                             if ("Roles".equals(gp.getName()) == false)
  |                                     continue;
  |                             roles = gp.members();
  |                             break;
  |                     }
  |             }
  |     }
  |     return roles;
  | }
  | 
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3926331#3926331

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3926331


-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
JBoss-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to