X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fosgi%2Fuseradmin%2FLdifGroup.java;fp=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fosgi%2Fuseradmin%2FLdifGroup.java;h=882f34a178e397c2905dc52a4d6a026bf0d40893;hb=54df376a9c2dd458a82eaa09bfbb718fe699dd0d;hp=0000000000000000000000000000000000000000;hpb=3c1cdc594d954520b14646102b366290bdad58c7;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/LdifGroup.java b/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/LdifGroup.java new file mode 100644 index 000000000..882f34a17 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/LdifGroup.java @@ -0,0 +1,127 @@ +package org.argeo.cms.osgi.useradmin; + +import java.util.ArrayList; +import java.util.List; + +import javax.naming.InvalidNameException; +import javax.naming.directory.Attribute; +import javax.naming.ldap.LdapName; + +import org.argeo.cms.directory.ldap.AbstractLdapDirectory; +import org.osgi.service.useradmin.Role; + +/** Directory group implementation */ +class LdifGroup extends LdifUser implements DirectoryGroup { + private final String memberAttributeId; + + LdifGroup(AbstractLdapDirectory userAdmin, LdapName dn) { + super(userAdmin, dn); + memberAttributeId = userAdmin.getMemberAttributeId(); + } + + @Override + public boolean addMember(Role role) { + try { + Role foundRole = findRole(new LdapName(role.getName())); + if (foundRole == null) + throw new UnsupportedOperationException( + "Adding role " + role.getName() + " is unsupported within this context."); + } catch (InvalidNameException e) { + throw new IllegalArgumentException("Role name" + role.getName() + " is badly formatted"); + } + + 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 + public boolean addRequiredMember(Role role) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean removeMember(Role role) { + 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() { + List directMembers = new ArrayList(); + for (LdapName ldapName : getReferences(memberAttributeId)) { + Role role = findRole(ldapName); + if (role == null) { + throw new IllegalStateException("Role " + ldapName + " not found."); + } + directMembers.add(role); + } + return directMembers.toArray(new Role[directMembers.size()]); + } + + /** + * Whether a role with this name can be found from this context. + * + * @return The related {@link Role} or null. + */ + protected Role findRole(LdapName ldapName) { + Role role = getUserAdmin().getRole(ldapName.toString()); + if (role == null) { + if (getUserAdmin().getExternalRoles() != null) + role = getUserAdmin().getExternalRoles().getRole(ldapName.toString()); + } + return role; + } + +// @Override +// public List getMemberNames() { +// Attribute memberAttribute = getAttributes().get(memberAttributeId); +// if (memberAttribute == null) +// return new ArrayList(); +// try { +// List roles = new ArrayList(); +// NamingEnumeration values = memberAttribute.getAll(); +// while (values.hasMore()) { +// LdapName dn = new LdapName(values.next().toString()); +// roles.add(dn); +// } +// return roles; +// } catch (NamingException e) { +// throw new IllegalStateException("Cannot get members", e); +// } +// } + + @Override + public Role[] getRequiredMembers() { + throw new UnsupportedOperationException(); + } + + @Override + public int getType() { + return GROUP; + } + + protected DirectoryUserAdmin getUserAdmin() { + return (DirectoryUserAdmin) getDirectory(); + } +}