X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.core%2Fsrc%2Forg%2Fargeo%2Fosgi%2Fuseradmin%2FLdifGroup.java;h=bd129119b2592366a49fdba8582fa892d9795e0c;hb=8260f4470f514ea347ca53f5b4dfc632c4a4de66;hp=4154d55a74ffec26983324055449d80ff55eebae;hpb=270c84f092b77b6f101a742cff565d29ee756011;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 4154d55a7..bd129119b 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 @@ -8,20 +8,33 @@ import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.ldap.LdapName; -import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; -public class LdifGroup extends LdifUser implements Group { - // optimisation - List directMembers = null; +/** Directory group implementation */ +class LdifGroup extends LdifUser implements DirectoryGroup { + private final String memberAttributeId; - public LdifGroup(LdapName dn, Attributes attributes) { - super(dn, attributes); + LdifGroup(AbstractUserDirectory userAdmin, LdapName dn, + Attributes attributes) { + super(userAdmin, dn, attributes); + memberAttributeId = userAdmin.getMemberAttributeId(); } @Override public boolean addMember(Role role) { - throw new UnsupportedOperationException(); + getUserAdmin().checkEdit(); + if (!isEditing()) + startEditing(); + + Attribute member = getAttributes().get(memberAttributeId); + if (member != null) { + if (member.contains(role.getName())) + return false; + else + member.add(role.getName()); + } else + getAttributes().put(memberAttributeId, role.getName()); + return true; } @Override @@ -31,50 +44,41 @@ public class LdifGroup extends LdifUser implements Group { @Override public boolean removeMember(Role role) { - throw new UnsupportedOperationException(); + getUserAdmin().checkEdit(); + if (!isEditing()) + startEditing(); + + Attribute member = getAttributes().get(memberAttributeId); + if (member != null) { + if (!member.contains(role.getName())) + return false; + member.remove(role.getName()); + 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."); - - // Attribute memberAttribute = getAttributes().get("member"); - // if (memberAttribute == null) - // return new Role[0]; - // try { - // List roles = new ArrayList(); - // NamingEnumeration values = memberAttribute.getAll(); - // while (values.hasMore()) { - // LdapName dn = new LdapName(values.next().toString()); - // roles.add(new LdifUser(dn, null)); - // } - // return roles.toArray(new Role[roles.size()]); - // } catch (Exception e) { - // throw new ArgeoUserAdminException("Cannot get members", e); - // } - } - - void loadMembers(LdifUserAdmin userAdmin) { - directMembers = new ArrayList(); + List 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 " + Role role = getUserAdmin().getRole(ldapName.toString()); + if (role == null) { + if (getUserAdmin().getExternalRoles() != null) + role = getUserAdmin().getExternalRoles().getRole( + ldapName.toString()); + } + if (role == null) + throw new UserDirectoryException("No role found for " + ldapName); - role.directMemberOf.add(this); directMembers.add(role); } + return directMembers.toArray(new Role[directMembers.size()]); } - List getMemberNames() { - Attribute memberAttribute = getAttributes().get("member"); + @Override + public List getMemberNames() { + Attribute memberAttribute = getAttributes().get(memberAttributeId); if (memberAttribute == null) return new ArrayList(); try { @@ -86,7 +90,7 @@ public class LdifGroup extends LdifUser implements Group { } return roles; } catch (Exception e) { - throw new ArgeoUserAdminException("Cannot get members", e); + throw new UserDirectoryException("Cannot get members", e); } }