Bug in PortalSecurityPermissionCollection?
al_kiev Feb 26, 2006 3:19 AMHi 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;
}