- Make LDIF backend more robust
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 28 Nov 2015 19:51:50 +0000 (19:51 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 28 Nov 2015 19:51:50 +0000 (19:51 +0000)
- Introduce Posix Account

git-svn-id: https://svn.argeo.org/commons/trunk@8651 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.security.core/src/org/argeo/osgi/useradmin/AbstractUserDirectory.java
org.argeo.security.core/src/org/argeo/osgi/useradmin/LdapUserAdmin.java
org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifName.java
org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUser.java
org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUserAdmin.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserBatchUpdateWizard.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/CommonNameLP.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/UserFilter.java

index 671f634969bd8f49db28a20eabace94a02df6c17..0ed712c0b8b8c311a9e2f955fc9e9b989e564572 100644 (file)
@@ -1,10 +1,15 @@
 package org.argeo.osgi.useradmin;
 
+import static org.argeo.osgi.useradmin.LdifName.gidNumber;
+import static org.argeo.osgi.useradmin.LdifName.homeDirectory;
 import static org.argeo.osgi.useradmin.LdifName.inetOrgPerson;
 import static org.argeo.osgi.useradmin.LdifName.objectClass;
 import static org.argeo.osgi.useradmin.LdifName.organizationalPerson;
 import static org.argeo.osgi.useradmin.LdifName.person;
+import static org.argeo.osgi.useradmin.LdifName.posixAccount;
 import static org.argeo.osgi.useradmin.LdifName.top;
+import static org.argeo.osgi.useradmin.LdifName.uid;
+import static org.argeo.osgi.useradmin.LdifName.uidNumber;
 
 import java.io.File;
 import java.net.URI;
@@ -18,6 +23,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
@@ -29,6 +35,7 @@ import javax.transaction.TransactionManager;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoException;
 import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
@@ -56,13 +63,16 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
 
        private String memberAttributeId = "member";
        private List<String> credentialAttributeIds = Arrays
-                       .asList(new String[] { LdifName.userpassword.name() });
+                       .asList(new String[] { LdifName.userPassword.name() });
 
        private TransactionManager transactionManager;
        // private TransactionSynchronizationRegistry transactionRegistry;
        // private Xid editingTransactionXid = null;
        private WcXaResource xaResource = new WcXaResource(this);
 
+       // POSIX
+       private String homeDirectoryBase = "/home";
+
        AbstractUserDirectory(Dictionary<String, ?> props) {
                properties = new Hashtable<String, Object>();
                for (Enumeration<String> keys = props.keys(); keys.hasMoreElements();) {
@@ -259,8 +269,8 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
        protected void doGetUser(String key, String value,
                        List<DirectoryUser> collectedUsers) {
                try {
-                       Filter f = FrameworkUtil.createFilter("(&(" + objectClass + "="
-                                       + getUserObjectClass() + ")(" + key + "=" + value + "))");
+                       Filter f = FrameworkUtil
+                                       .createFilter("(" + key + "=" + value + ")");
                        List<DirectoryUser> users = doGetRoles(f);
                        collectedUsers.addAll(users);
                } catch (InvalidSyntaxException e) {
@@ -303,9 +313,29 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                LdifUser newRole;
                BasicAttribute objClass = new BasicAttribute(objectClass.name());
                if (type == Role.USER) {
-                       String userObjClass = getUserObjectClass();
+                       String userObjClass = newUserObjectClass(dn);
                        objClass.add(userObjClass);
-                       if (inetOrgPerson.name().equals(userObjClass)) {
+                       if (posixAccount.name().equals(userObjClass)) {
+                               objClass.add(inetOrgPerson.name());
+                               objClass.add(organizationalPerson.name());
+                               objClass.add(person.name());
+
+                               String username;
+                               try {
+                                       username = dn.getRdn(dn.size() - 1).toAttributes()
+                                                       .get(uid.name()).get().toString();
+                               } catch (NamingException e) {
+                                       throw new UserDirectoryException(
+                                                       "Cannot extract username from " + dn, e);
+                               }
+                               // TODO look for uid in attributes too?
+                               attrs.put(uidNumber.name(), new Long(max(uidNumber.name()) + 1));
+                               attrs.put(homeDirectory.name(), generateHomeDirectory(username));
+                               // TODO create user private group
+                               // NB: on RHEL, the 'users' group has gid 100
+                               attrs.put(gidNumber.name(), 100);
+                               // attrs.put(LdifName.loginShell.name(),"/sbin/nologin");
+                       } else if (inetOrgPerson.name().equals(userObjClass)) {
                                objClass.add(organizationalPerson.name());
                                objClass.add(person.name());
                        } else if (organizationalPerson.name().equals(userObjClass)) {
@@ -315,7 +345,10 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                        attrs.put(objClass);
                        newRole = new LdifUser(this, dn, attrs);
                } else if (type == Role.GROUP) {
-                       objClass.add(getGroupObjectClass());
+                       String groupObjClass = getGroupObjectClass();
+                       objClass.add(groupObjClass);
+                       objClass.add(LdifName.extensibleObject.name());
+                       attrs.put(gidNumber.name(), new Long(max(gidNumber.name()) + 1));
                        objClass.add(top);
                        attrs.put(objClass);
                        newRole = new LdifGroup(this, dn, attrs);
@@ -345,6 +378,60 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                return actuallyDeleted;
        }
 
+       // POSIX
+       /** Generate path for a new user home */
+       protected String generateHomeDirectory(String username) {
+               String base = homeDirectoryBase;
+               int atIndex = username.indexOf('@');
+               if (atIndex > 0) {
+                       String domain = username.substring(0, atIndex);
+                       String name = username.substring(atIndex + 1);
+                       return base + '/' + firstCharsToPath(domain, 2) + '/' + domain
+                                       + '/' + firstCharsToPath(name, 2) + '/' + name;
+               } else if (atIndex == 0 || atIndex == (username.length() - 1)) {
+                       throw new ArgeoException("Unsupported username " + username);
+               } else {
+                       return base + '/' + firstCharsToPath(username, 2) + '/' + username;
+               }
+       }
+
+       protected long max(String attr) {
+               long max;
+               try {
+                       List<DirectoryUser> users = doGetRoles(FrameworkUtil
+                                       .createFilter("(" + attr + "=*)"));
+                       max = 1000;
+                       for (DirectoryUser user : users) {
+                               long uid = Long.parseLong(user.getAttributes().get(attr).get()
+                                               .toString());
+                               if (uid > max)
+                                       max = uid;
+                       }
+               } catch (Exception e) {
+                       throw new UserDirectoryException("Cannot get max of " + attr, e);
+               }
+               return max;
+       }
+
+       /**
+        * Creates depth from a string (typically a username) by adding levels based
+        * on its first characters: "aBcD",2 => a/aB
+        */
+       public static String firstCharsToPath(String str, Integer nbrOfChars) {
+               if (str.length() < nbrOfChars)
+                       throw new ArgeoException("String " + str
+                                       + " length must be greater or equal than " + nbrOfChars);
+               StringBuffer path = new StringBuffer("");
+               StringBuffer curr = new StringBuffer("");
+               for (int i = 0; i < nbrOfChars; i++) {
+                       curr.append(str.charAt(i));
+                       path.append(curr);
+                       if (i < nbrOfChars - 1)
+                               path.append('/');
+               }
+               return path.toString();
+       }
+
        // TRANSACTION
        protected void prepare(UserDirectoryWorkingCopy wc) {
 
@@ -418,10 +505,19 @@ abstract class AbstractUserDirectory implements UserAdmin, UserDirectory {
                return baseDn;
        }
 
+       /** dn can be null, in that case a default should be returned. */
        protected String getUserObjectClass() {
                return userObjectClass;
        }
 
+       protected String newUserObjectClass(LdapName dn) {
+               if (dn != null
+                               && dn.getRdn(dn.size() - 1).toAttributes().get(uid.name()) != null)
+                       return posixAccount.name();
+               else
+                       return getUserObjectClass();
+       }
+
        protected String getGroupObjectClass() {
                return groupObjectClass;
        }
index 1dc4df981840e0608a8e89c5006cb9a9ec6d4afe..838486b6de609324e27dd81691aef65987605021 100644 (file)
@@ -42,7 +42,7 @@ public class LdapUserAdmin extends AbstractUserDirectory {
                                        "com.sun.jndi.ldap.LdapCtxFactory");
                        connEnv.put(Context.PROVIDER_URL, getUri().toString());
                        connEnv.put("java.naming.ldap.attributes.binary",
-                                       LdifName.userpassword.name());
+                                       LdifName.userPassword.name());
 
                        initialLdapContext = new InitialLdapContext(connEnv, null);
                        // StartTlsResponse tls = (StartTlsResponse) ctx
@@ -111,7 +111,6 @@ public class LdapUserAdmin extends AbstractUserDirectory {
 
        @Override
        protected List<DirectoryUser> doGetRoles(Filter f) {
-               // TODO Auto-generated method stub
                try {
                        String searchFilter = f != null ? f.toString() : "(|("
                                        + objectClass + "=" + getUserObjectClass() + ")("
@@ -127,15 +126,14 @@ public class LdapUserAdmin extends AbstractUserDirectory {
                        while (results.hasMoreElements()) {
                                SearchResult searchResult = results.next();
                                Attributes attrs = searchResult.getAttributes();
+                               LdapName dn = toDn(searchBase, searchResult);
                                LdifUser role;
                                if (attrs.get(objectClass.name()).contains(
                                                getGroupObjectClass()))
-                                       role = new LdifGroup(this, toDn(searchBase, searchResult),
-                                                       attrs);
+                                       role = new LdifGroup(this, dn, attrs);
                                else if (attrs.get(objectClass.name()).contains(
                                                getUserObjectClass()))
-                                       role = new LdifUser(this, toDn(searchBase, searchResult),
-                                                       attrs);
+                                       role = new LdifUser(this, dn, attrs);
                                else
                                        throw new UserDirectoryException(
                                                        "Unsupported LDAP type for "
index a63f51288fcfe36939bc6185c15473938639636c..25125e0fbbfa8dfc7f0db6a857e23f4231cd3182 100644 (file)
@@ -9,9 +9,11 @@ import javax.naming.ldap.LdapName;
  */
 public enum LdifName {
        // Attributes
-       dn, cn, sn, uid, mail, displayName, objectClass, userpassword, givenname, description,
+       dn, cn, sn, uid, mail, displayName, objectClass, userPassword, givenName, description,
+       // POSIX attributes
+       uidNumber, gidNumber, homeDirectory, loginShell, gecos,
        // Object classes
-       inetOrgPerson, organizationalPerson, person, groupOfNames, top;
+       posixAccount, inetOrgPerson, organizationalPerson, person, groupOfNames, groupOfUniqueNames, extensibleObject, top;
 
        public final static String PREFIX = "ldap:";
 
index 41f33c3ba1e36437860ff4eca0635cd83995015e..d5ddba50c17060e7d29db08aa2cb38dc5bdabfb7 100644 (file)
@@ -1,5 +1,6 @@
 package org.argeo.osgi.useradmin;
 
+import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
@@ -8,8 +9,10 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
@@ -73,7 +76,7 @@ class LdifUser implements DirectoryUser {
                        // TODO check other sources (like PKCS12)
                        char[] password = toChars(value);
                        byte[] hashedPassword = hash(password);
-                       return hasCredential(LdifName.userpassword.name(), hashedPassword);
+                       return hasCredential(LdifName.userPassword.name(), hashedPassword);
                }
 
                Object storedValue = getCredentials().get(key);
@@ -161,13 +164,6 @@ class LdifUser implements DirectoryUser {
                publishedAttributes = modifiedAttributes;
        }
 
-       // protected synchronized void stopEditing(boolean apply) {
-       // assert getModifiedAttributes() != null;
-       // if (apply)
-       // publishedAttributes = getModifiedAttributes();
-       // // modifiedAttributes = null;
-       // }
-
        public DirectoryUser getPublished() {
                return new LdifUser(userAdmin, dn, publishedAttributes, true);
        }
@@ -248,12 +244,7 @@ class LdifUser implements DirectoryUser {
                                @Override
                                public Object nextElement() {
                                        String key = it.next();
-                                       try {
-                                               return getAttributes().get(key).get();
-                                       } catch (NamingException e) {
-                                               throw new UserDirectoryException(
-                                                               "Cannot get value for key " + key, e);
-                                       }
+                                       return get(key);
                                }
 
                        };
@@ -265,7 +256,32 @@ class LdifUser implements DirectoryUser {
                                Attribute attr = getAttributes().get(key.toString());
                                if (attr == null)
                                        return null;
-                               return attr.get();
+                               Object value = attr.get();
+                               if (value instanceof byte[]) {
+                                       if (key.equals(LdifName.userPassword.name()))
+                                               // TODO other cases (certificates, images)
+                                               return value;
+                                       value = new String((byte[]) value, Charset.forName("UTF-8"));
+                               }
+                               if (attr.size() == 1)
+                                       return value;
+                               if (!attr.getID().equals(LdifName.objectClass.name()))
+                                       return value;
+                               // special case for object class
+                               NamingEnumeration<?> en = attr.getAll();
+                               Set<String> objectClasses = new HashSet<String>();
+                               while (en.hasMore()) {
+                                       String objectClass = en.next().toString();
+                                       objectClasses.add(objectClass);
+                               }
+
+                               if (objectClasses.contains(userAdmin.getUserObjectClass()))
+                                       return userAdmin.getUserObjectClass();
+                               else if (objectClasses
+                                               .contains(userAdmin.getGroupObjectClass()))
+                                       return userAdmin.getGroupObjectClass();
+                               else
+                                       return value;
                        } catch (NamingException e) {
                                throw new UserDirectoryException(
                                                "Cannot get value for attribute " + key, e);
@@ -278,7 +294,7 @@ class LdifUser implements DirectoryUser {
                                // TODO persist to other sources (like PKCS12)
                                char[] password = toChars(value);
                                byte[] hashedPassword = hash(password);
-                               return put(LdifName.userpassword.name(), hashedPassword);
+                               return put(LdifName.userPassword.name(), hashedPassword);
                        }
 
                        userAdmin.checkEdit();
@@ -299,7 +315,16 @@ class LdifUser implements DirectoryUser {
                                Attribute attribute = getModifiedAttributes().get(
                                                key.toString());
                                attribute = new BasicAttribute(key.toString());
-                               attribute.add(value);
+                               if (value instanceof String
+                                               && !isAsciiPrintable(((String) value)))
+                                       try {
+                                               attribute.add(((String) value).getBytes("UTF-8"));
+                                       } catch (UnsupportedEncodingException e) {
+                                               throw new UserDirectoryException("Cannot encode "
+                                                               + value, e);
+                                       }
+                               else
+                                       attribute.add(value);
                                Attribute previousAttribute = getModifiedAttributes().put(
                                                attribute);
                                if (previousAttribute != null)
@@ -337,4 +362,21 @@ class LdifUser implements DirectoryUser {
                }
        }
 
+       private static boolean isAsciiPrintable(String str) {
+               if (str == null) {
+                       return false;
+               }
+               int sz = str.length();
+               for (int i = 0; i < sz; i++) {
+                       if (isAsciiPrintable(str.charAt(i)) == false) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       private static boolean isAsciiPrintable(char ch) {
+               return ch >= 32 && ch < 127;
+       }
+
 }
index bee73e54df97b6e8337027540cb68a00a8b7b04b..859adde09233f13cb6305311bfed2ef43ba0afae 100644 (file)
@@ -1,5 +1,8 @@
 package org.argeo.osgi.useradmin;
 
+import static org.argeo.osgi.useradmin.LdifName.inetOrgPerson;
+import static org.argeo.osgi.useradmin.LdifName.objectClass;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -7,8 +10,10 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
@@ -98,14 +103,28 @@ public class LdifUserAdmin extends AbstractUserDirectory {
                        SortedMap<LdapName, Attributes> allEntries = ldifParser.read(in);
                        for (LdapName key : allEntries.keySet()) {
                                Attributes attributes = allEntries.get(key);
+                               // check for inconsistency
+                               Set<String> lowerCase = new HashSet<String>();
+                               NamingEnumeration<String> ids = attributes.getIDs();
+                               while (ids.hasMoreElements()) {
+                                       String id = ids.nextElement().toLowerCase();
+                                       if (lowerCase.contains(id))
+                                               throw new UserDirectoryException(key
+                                                               + " has duplicate id " + id);
+                                       lowerCase.add(id);
+                               }
+
+                               // analyse object classes
                                NamingEnumeration<?> objectClasses = attributes.get(
-                                               "objectClass").getAll();
+                                               objectClass.name()).getAll();
+                               // System.out.println(key);
                                objectClasses: while (objectClasses.hasMore()) {
                                        String objectClass = objectClasses.next().toString();
-                                       if (objectClass.equals("inetOrgPerson")) {
+                                       // System.out.println(" " + objectClass);
+                                       if (objectClass.equals(inetOrgPerson.name())) {
                                                users.put(key, new LdifUser(this, key, attributes));
                                                break objectClasses;
-                                       } else if (objectClass.equals("groupOfNames")) {
+                                       } else if (objectClass.equals(getGroupObjectClass())) {
                                                groups.put(key, new LdifGroup(this, key, attributes));
                                                break objectClasses;
                                        }
@@ -143,10 +162,17 @@ public class LdifUserAdmin extends AbstractUserDirectory {
                        res.addAll(users.values());
                        res.addAll(groups.values());
                } else {
-                       // Filter f = FrameworkUtil.createFilter(filter);
-                       for (DirectoryUser user : users.values())
+                       for (DirectoryUser user : users.values()) {
+//                             System.out.println("\n" + user.getName());
+//                             Dictionary<String, Object> props = user.getProperties();
+//                             for (Enumeration<String> keys = props.keys(); keys
+//                                             .hasMoreElements();) {
+//                                     String key = keys.nextElement();
+//                                     System.out.println(" " + key + "=" + props.get(key));
+//                             }
                                if (f.match(user.getProperties()))
                                        res.add(user);
+                       }
                        for (DirectoryUser group : groups.values())
                                if (f.match(group.getProperties()))
                                        res.add(group);
index c336753dc6ec19a1f231d2b840ec3ab2b23bd44b..6d853c91946406d3ffa63fc0c04c11c72402f4ce 100644 (file)
@@ -117,7 +117,7 @@ public class NewUser extends AbstractHandler {
 
                                String firstNameStr = firstNameTxt.getText();
                                if (UiAdminUtils.notNull(firstNameStr))
-                                       props.put(LdifName.givenname.name(), firstNameStr);
+                                       props.put(LdifName.givenName.name(), firstNameStr);
 
                                String cn = UiAdminUtils
                                                .getDefaultCn(firstNameStr, lastNameStr);
index 5edcfbd4b9dea31e5dbbab67de56ed41c55ea354..f2038f2257acdb4d13362eb1c967edd71ef569c1 100644 (file)
@@ -455,7 +455,7 @@ public class UserBatchUpdateWizard extends Wizard {
                        private static final long serialVersionUID = 5080437561015853124L;
                        private final String[] knownProps = { LdifName.uid.name(),
                                        LdifName.dn.name(), LdifName.cn.name(),
-                                       LdifName.givenname.name(), LdifName.sn.name(),
+                                       LdifName.givenName.name(), LdifName.sn.name(),
                                        LdifName.mail.name() };
 
                        public ChooseUserTableViewer(Composite parent, int style) {
index 58acface85c173a02d2a51ec9c449a41e70fbe19..5875698b54aa468609ed5304daec50da298242d5 100644 (file)
@@ -127,7 +127,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                commonName.setEnabled(false);
 
                final Text firstName = createLT(tk, body, "First name",
-                               UiAdminUtils.getProperty(user, LdifName.givenname.name()));
+                               UiAdminUtils.getProperty(user, LdifName.givenName.name()));
 
                final Text lastName = createLT(tk, body, "Last name",
                                UiAdminUtils.getProperty(user, LdifName.sn.name()));
@@ -155,7 +155,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @SuppressWarnings("unchecked")
                        public void commit(boolean onSave) {
                                // TODO Sanity checks (mail validity...)
-                               user.getProperties().put(LdifName.givenname.name(),
+                               user.getProperties().put(LdifName.givenName.name(),
                                                firstName.getText());
                                user.getProperties()
                                                .put(LdifName.sn.name(), lastName.getText());
@@ -172,7 +172,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                                commonName.setText(UiAdminUtils.getProperty(user,
                                                LdifName.cn.name()));
                                firstName.setText(UiAdminUtils.getProperty(user,
-                                               LdifName.givenname.name()));
+                                               LdifName.givenName.name()));
                                lastName.setText(UiAdminUtils.getProperty(user,
                                                LdifName.sn.name()));
                                email.setText(UiAdminUtils.getProperty(user,
index 79e94abc747007affcff44b6a46261725edd10c5..afa278212a0b6ea61bd966f714ae2b24b0535e36 100644 (file)
@@ -115,7 +115,7 @@ public class UsersView extends ViewPart implements ArgeoNames {
 
                private final String[] knownProps = { LdifName.uid.name(),
                                LdifName.dn.name(), LdifName.cn.name(),
-                               LdifName.givenname.name(), LdifName.sn.name(),
+                               LdifName.givenName.name(), LdifName.sn.name(),
                                LdifName.mail.name() };
 
                public MyUserTableViewer(Composite parent, int style) {
index 1bd387e203226d21af827aa2d648b4ec089c59a0..46326d268015be543bc29e7b525982dc4a521015 100644 (file)
@@ -1,6 +1,7 @@
 package org.argeo.security.ui.admin.internal.providers;
 
 import org.argeo.osgi.useradmin.LdifName;
+import org.argeo.security.ui.admin.internal.UiAdminUtils;
 import org.osgi.service.useradmin.User;
 
 /** Simply declare a label provider that returns the common name of a user */
@@ -9,10 +10,6 @@ public class CommonNameLP extends UserAdminAbstractLP {
 
        @Override
        public String getText(User user) {
-               Object obj = user.getProperties().get(LdifName.cn.name());
-               if (obj != null)
-                       return (String) obj;
-               else
-                       return "";
+               return UiAdminUtils.getProperty(user, LdifName.cn.name());
        }
 }
\ No newline at end of file
index 59e83852c805089c51cb83be44b4c401dfd17a65..742b7d3931d2648b8f3d993a92a5eafdfc1ef2a5 100644 (file)
@@ -16,7 +16,7 @@ public class UserFilter extends ViewerFilter {
        private boolean showSystemRole = true;
 
        private final String[] knownProps = { LdifName.dn.name(),
-                       LdifName.cn.name(), LdifName.givenname.name(), LdifName.sn.name(),
+                       LdifName.cn.name(), LdifName.givenName.name(), LdifName.sn.name(),
                        LdifName.uid.name(), LdifName.description.name(),
                        LdifName.mail.name() };