X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.core%2Fsrc%2Forg%2Fargeo%2Fosgi%2Fuseradmin%2FLdifGroup.java;h=a19052425491759a9c2c55687522fa9532a49397;hb=d8b62960ec3c9d991840348c63dc0c8ce980233e;hp=845094820c84e897df2844ce31e83ed8e20d7eac;hpb=3439a3b6aba14618b06c72cf59b220e216135c96;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifGroup.java b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifGroup.java index 845094820..a19052425 100644 --- a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifGroup.java +++ b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifGroup.java @@ -10,18 +10,32 @@ import javax.naming.ldap.LdapName; import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.UserAdmin; public class LdifGroup extends LdifUser implements Group { // optimisation - List directMembers = null; + // List directMembers = null; - public LdifGroup(LdapName dn, Attributes attributes) { + private final UserAdmin userAdmin; + private String memberAttrName = "member"; + + public LdifGroup(UserAdmin userAdmin, LdapName dn, Attributes attributes) { super(dn, attributes); + this.userAdmin = userAdmin; } @Override public boolean addMember(Role role) { - throw new UnsupportedOperationException(); + Attribute member = getAttributes().get(memberAttrName); + if (member != null) { + if (member.contains(role.getName())) + return false; + } else + getAttributes().put(memberAttrName, role.getName()); + // directMembers.add(role); + // if (role instanceof LdifUser) + // ((LdifUser) role).directMemberOf.add(this); + return true; } @Override @@ -31,17 +45,46 @@ public class LdifGroup extends LdifUser implements Group { @Override public boolean removeMember(Role role) { - throw new UnsupportedOperationException(); + Attribute member = getAttributes().get(memberAttrName); + if (member != null) { + if (!member.contains(role.getName())) + return false; + member.remove(role.getName()); + // directMembers.remove(role); + // if (role instanceof LdifUser) + // ((LdifUser) role).directMemberOf.remove(this); + return true; + } else + return false; } @Override public Role[] getMembers() { - if (directMembers != null) - return directMembers.toArray(new Role[directMembers.size()]); - else - throw new ArgeoUserAdminException("Members have not been loaded."); + List directMembers = new ArrayList(); + for (LdapName ldapName : getMemberNames()) { + Role role = userAdmin.getRole(ldapName.toString()); + if (role == null && userAdmin instanceof AbstractLdapUserAdmin) { + AbstractLdapUserAdmin ua = (AbstractLdapUserAdmin) userAdmin; + if (ua.getExternalRoles() != null) + role = ua.getExternalRoles().getRole(ldapName.toString()); + } + if (role == null) + throw new ArgeoUserAdminException("No role found for " + + ldapName); + + // role.directMemberOf.add(group); + // if (!directMemberOf.containsKey(role.getDn())) + // directMemberOf.put(role.getDn(), new ArrayList()); + // directMemberOf.get(role.getDn()).add(group); + directMembers.add(role); + } + return directMembers.toArray(new Role[directMembers.size()]); + // if (directMembers != null) + // return directMembers.toArray(new Role[directMembers.size()]); + // else + // throw new ArgeoUserAdminException("Members have not been loaded."); - // Attribute memberAttribute = getAttributes().get("member"); + // Attribute memberAttribute = getAttributes().get(memberAttrName); // if (memberAttribute == null) // return new Role[0]; // try { @@ -57,29 +100,29 @@ public class LdifGroup extends LdifUser implements Group { // } } - void loadMembers(LdifUserAdmin userAdmin) { - directMembers = new ArrayList(); - for (LdapName ldapName : getMemberNames()) { - LdifUser role; - if (userAdmin.groups.containsKey(ldapName)) - role = userAdmin.groups.get(ldapName); - else if (userAdmin.users.containsKey(ldapName)) - role = userAdmin.users.get(ldapName); - else - throw new ArgeoUserAdminException("No roel found for " - + ldapName); - role.directMemberOf.add(this); - directMembers.add(role); - } - } + // void loadMembers(LdifUserAdmin userAdmin) { + // directMembers = new ArrayList(); + // for (LdapName ldapName : getMemberNames()) { + // LdifUser role; + // if (userAdmin.groups.containsKey(ldapName)) + // role = userAdmin.groups.get(ldapName); + // else if (userAdmin.users.containsKey(ldapName)) + // role = userAdmin.users.get(ldapName); + // else + // throw new ArgeoUserAdminException("No role found for " + // + ldapName); + // role.directMemberOf.add(this); + // directMembers.add(role); + // } + // } List getMemberNames() { - Attribute memberAttribute = getAttributes().get("member"); + Attribute memberAttribute = getAttributes().get(memberAttrName); if (memberAttribute == null) return new ArrayList(); try { List roles = new ArrayList(); - NamingEnumeration values = memberAttribute.getAll(); + NamingEnumeration values = memberAttribute.getAll(); while (values.hasMore()) { LdapName dn = new LdapName(values.next().toString()); roles.add(dn); @@ -99,4 +142,9 @@ public class LdifGroup extends LdifUser implements Group { public int getType() { return GROUP; } + + public String getMemberAttrName() { + return memberAttrName; + } + }