Integrate base DNs
authorBruno Sinou <bsinou@argeo.org>
Tue, 22 Sep 2015 15:03:28 +0000 (15:03 +0000)
committerBruno Sinou <bsinou@argeo.org>
Tue, 22 Sep 2015 15:03:28 +0000 (15:03 +0000)
Differentiate system roles from other groups

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

12 files changed:
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminImages.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminWrapper.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.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/GroupMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.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/DomainNameLP.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/MailLP.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/RoleIconLP.java

index 3027c364aa062c817b6386de8063e5b679141e2f..f15f8ec9a624ee8c0591a142515218d60eeb9c0b 100644 (file)
@@ -41,5 +41,7 @@ public class SecurityAdminImages {
        public final static Image ICON_USER = ICON_USER_DESC.createImage();
        public final static Image ICON_GROUP = SecurityAdminPlugin
                        .getImageDescriptor(PREFIX + "users.gif").createImage();
+       public final static Image ICON_ROLE = SecurityAdminPlugin
+                       .getImageDescriptor(PREFIX + "role.gif").createImage();
 
 }
index 4dbb358f0963088c2628151b692ecb58a8289b33..848b27993fd0982fda54a5a58a22b3ed893da344 100644 (file)
@@ -11,4 +11,7 @@ public interface UserAdminConstants {
        public final static String KEY_MAIL = "mail";
        public final static String KEY_DESC  = "description";
 
+       // TO BE CLEANED
+       public final static String SYSTEM_ROLE_BASE_DN = "ou=roles,ou=node";
+       
 }
\ No newline at end of file
index 6b077e08f17913efb7704a12401d78bbf8f03dea..41efefa650d50a1af2c38937d29660ed0ac2e4aa 100644 (file)
@@ -4,6 +4,9 @@ import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.List;
 
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
 import javax.transaction.Status;
 import javax.transaction.UserTransaction;
 
@@ -72,17 +75,50 @@ public class UserAdminWrapper {
        public void setUserAdminServiceReference(
                        ServiceReference<UserAdmin> userAdminServiceReference) {
                this.userAdminServiceReference = userAdminServiceReference;
+               // for (String uri : userAdminServiceReference.getPropertyKeys()) {
+               // if (!uri.startsWith("/"))
+               // continue;
+               // log.debug(uri);
+               // Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
+               // log.debug(props);
+               // }
+       }
+
+       public List<String> getKnownBaseDns(boolean onlyWritable) {
+               List<String> dns = new ArrayList<String>();
                for (String uri : userAdminServiceReference.getPropertyKeys()) {
                        if (!uri.startsWith("/"))
                                continue;
-                       log.debug(uri);
                        Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
-                       log.debug(props);
+                       String readOnly = UserAdminConf.readOnly.getValue(props);
+                       String baseDn = UserAdminConf.baseDn.getValue(props);
+
+                       if (onlyWritable && "true".equals(readOnly))
+                               continue;
+                       dns.add(baseDn);
                }
+               return dns;
        }
 
+//     // Returns the human friendly domain name give a dn.
+//     public String getDomainName(String dn) {
+//             if (dn.endsWith("ou=roles, ou=node"))
+//                     return "System roles";
+//             try {
+//
+//                     LdapName name;
+//                     name = new LdapName(dn);
+//                     List<Rdn> rdns = name.getRdns();
+//
+//                     String penultimate = (String) rdns.get(rdns.size() - 2).getValue();
+//                     String last = (String) rdns.get(rdns.size() - 1).getValue();
+//                     return (penultimate + '.' + last);
+//             } catch (InvalidNameException e) {
+//                     throw new ArgeoException("Unable to get domain name for " + dn, e);
+//             }
+//     }
+
        public void setUserTransaction(UserTransaction userTransaction) {
                this.userTransaction = userTransaction;
        }
-
-}
+}
\ No newline at end of file
index b50f67f1eb4ea05701a8249f47b8649d79f15622..b52bf9955e8d63bbd29d42d72f418c55882a8541 100644 (file)
@@ -16,7 +16,9 @@
 package org.argeo.security.ui.admin.internal.commands;
 
 import java.util.Dictionary;
+import java.util.List;
 
+import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.argeo.jcr.ArgeoNames;
@@ -35,6 +37,7 @@ import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
@@ -52,11 +55,6 @@ public class NewGroup extends AbstractHandler {
        private UserAdminWrapper userAdminWrapper;
        private UserAdmin userAdmin;
 
-       // TODO implement a dynamic choice of the base dn
-       private String getDn(String cn) {
-               return "cn=" + cn + ",dc=example,dc=com";
-       }
-
        public Object execute(ExecutionEvent event) throws ExecutionException {
                NewGroupWizard newGroupWizard = new NewGroupWizard();
                WizardDialog dialog = new WizardDialog(
@@ -73,6 +71,7 @@ public class NewGroup extends AbstractHandler {
 
                // End user fields
                private Text dNameTxt, commonNameTxt, descriptionTxt;
+               private Combo baseDnCmb;
 
                public NewGroupWizard() {
                }
@@ -126,6 +125,19 @@ public class NewGroup extends AbstractHandler {
                                dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
                                                "Distinguished name", this);
                                dNameTxt.setEnabled(false);
+
+                               baseDnCmb = createGridLC(bodyCmp, "Base DN", this);
+                               initialiseDnCmb(baseDnCmb);
+                               baseDnCmb.addModifyListener(new ModifyListener() {
+                                       private static final long serialVersionUID = -1435351236582736843L;
+
+                                       @Override
+                                       public void modifyText(ModifyEvent event) {
+                                               String name = commonNameTxt.getText();
+                                               dNameTxt.setText(getDn(name));
+                                       }
+                               });
+
                                commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
                                                "Common name", this);
                                commonNameTxt.addModifyListener(new ModifyListener() {
@@ -190,6 +202,32 @@ public class NewGroup extends AbstractHandler {
                                        commonNameTxt.setFocus();
                        }
                }
+
+               private String getDn(String cn) {
+                       return "cn=" + cn + ",ou=groups," + baseDnCmb.getText();
+               }
+
+               private void initialiseDnCmb(Combo combo) {
+                       List<String> dns = userAdminWrapper.getKnownBaseDns(true);
+                       if (dns.isEmpty())
+                               throw new ArgeoException(
+                                               "No writable base dn found. Cannot create user");
+                       combo.setItems(dns.toArray(new String[0]));
+                       // combo.select(0);
+               }
+
+       }
+
+       private Combo createGridLC(Composite parent, String label,
+                       ModifyListener modifyListener) {
+               Label lbl = new Label(parent, SWT.LEAD);
+               lbl.setText(label);
+               lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+               Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
+               combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+               if (modifyListener != null)
+                       combo.addModifyListener(modifyListener);
+               return combo;
        }
 
        /* DEPENDENCY INJECTION */
index d8d697a1f17aa08a8ab4498ef7cb0b159d815d43..838e66ff57cb554264218195a84ebf95d689410c 100644 (file)
 package org.argeo.security.ui.admin.internal.commands;
 
 import java.util.Dictionary;
+import java.util.List;
 
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
+
+import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.argeo.jcr.ArgeoNames;
@@ -34,8 +40,11 @@ import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.osgi.service.useradmin.Role;
@@ -50,11 +59,6 @@ public class NewUser extends AbstractHandler {
        /* DEPENDENCY INJECTION */
        private UserAdminWrapper userAdminWrapper;
 
-       // TODO implement a dynamic choice of the base dn
-       private String getDn(String uid) {
-               return "uid=" + uid + ",ou=users,dc=example,dc=com";
-       }
-
        public Object execute(ExecutionEvent event) throws ExecutionException {
                NewUserWizard newUserWizard = new NewUserWizard();
                WizardDialog dialog = new WizardDialog(
@@ -86,6 +90,7 @@ public class NewUser extends AbstractHandler {
                // End user fields
                private Text dNameTxt, usernameTxt, firstNameTxt, lastNameTxt,
                                primaryMailTxt, pwd1Txt, pwd2Txt;
+               private Combo baseDnCmb;
 
                public NewUserWizard() {
                }
@@ -157,6 +162,19 @@ public class NewUser extends AbstractHandler {
                                dNameTxt = EclipseUiUtils.createGridLT(composite,
                                                "Distinguished name", this);
                                dNameTxt.setEnabled(false);
+
+                               baseDnCmb = createGridLC(composite, "Base DN", this);
+                               initialiseDnCmb(baseDnCmb);
+                               baseDnCmb.addModifyListener(new ModifyListener() {
+                                       private static final long serialVersionUID = -1435351236582736843L;
+
+                                       @Override
+                                       public void modifyText(ModifyEvent event) {
+                                               String name = usernameTxt.getText();
+                                               dNameTxt.setText(getDn(name));
+                                       }
+                               });
+
                                usernameTxt = EclipseUiUtils.createGridLT(composite,
                                                "Local ID", this);
                                usernameTxt.addModifyListener(new ModifyListener() {
@@ -174,7 +192,7 @@ public class NewUser extends AbstractHandler {
                                                } else {
                                                        dNameTxt.setText(getDn(name));
                                                        lastNameTxt.setText(name.toUpperCase());
-                                                       primaryMailTxt.setText(name + "@example.com");
+                                                       primaryMailTxt.setText(getMail(name));
                                                        pwd1Txt.setText("demo");
                                                        pwd2Txt.setText("demo");
                                                }
@@ -251,6 +269,47 @@ public class NewUser extends AbstractHandler {
                        }
 
                }
+
+               private String getDn(String uid) {
+                       return "uid=" + uid + ",ou=users," + baseDnCmb.getText();
+               }
+
+               private void initialiseDnCmb(Combo combo) {
+                       List<String> dns = userAdminWrapper.getKnownBaseDns(true);
+                       if (dns.isEmpty())
+                               throw new ArgeoException(
+                                               "No writable base dn found. Cannot create user");
+                       combo.setItems(dns.toArray(new String[0]));
+                       // combo.select(0);
+               }
+
+               private String getMail(String username) {
+                       if (baseDnCmb.getSelectionIndex() == -1)
+                               return null;
+                       String baseDn = baseDnCmb.getText();
+                       try {
+                               LdapName name = new LdapName(baseDn);
+                               List<Rdn> rdns = name.getRdns();
+                               return username + "@" + (String) rdns.get(1).getValue() + '.'
+                                               + (String) rdns.get(0).getValue();
+                       } catch (InvalidNameException e) {
+                               throw new ArgeoException("Unable to generate mail for "
+                                               + username + " with base dn " + baseDn, e);
+                       }
+               }
+
+       }
+
+       private Combo createGridLC(Composite parent, String label,
+                       ModifyListener modifyListener) {
+               Label lbl = new Label(parent, SWT.LEAD);
+               lbl.setText(label);
+               lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+               Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
+               combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+               if (modifyListener != null)
+                       combo.addModifyListener(modifyListener);
+               return combo;
        }
 
        /* DEPENDENCY INJECTION */
index f3fdabfb19ccf16650e664280ef4963686aca5b7..5270e1463ef2a30c5515fac03a22528aee84a4a8 100644 (file)
@@ -50,6 +50,7 @@ import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.dnd.TransferData;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.graphics.Cursor;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -105,13 +106,22 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                GridLayout layout = new GridLayout(2, false);
                body.setLayout(layout);
 
-               final Text distinguishedName = createLT(body, "Group Name",
-                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_UID));
-               distinguishedName.setEnabled(false);
+               final Text dnTxt = createLT(body, "DN",
+                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_DN));
+               dnTxt.setEnabled(false);
 
-               final Text commonName = createLT(body, "Common Name",
+               final Text cnTxt = createLT(body, "Common Name",
                                UiAdminUtils.getProperty(group, UserAdminConstants.KEY_CN));
-               commonName.setEnabled(false);
+               cnTxt.setEnabled(false);
+
+               Label descLbl = new Label(body, SWT.LEAD);
+               descLbl.setText("Description");
+               descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
+               final Text descTxt = new Text(body, SWT.LEAD | SWT.MULTI | SWT.WRAP
+                               | SWT.BORDER);
+               GridData gd = EclipseUiUtils.fillAll();
+               gd.heightHint = 100;
+               descTxt.setLayoutData(gd);
 
                // create form part (controller)
                AbstractFormPart part = new SectionPart((Section) body.getParent()) {
@@ -131,16 +141,31 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                                super.dispose();
                        }
 
+                       @SuppressWarnings("unchecked")
+                       public void commit(boolean onSave) {
+                               group.getProperties().put(UserAdminConstants.KEY_DESC,
+                                               descTxt.getText());
+                               // Enable common name ?
+                               // editor.setProperty(UserAdminConstants.KEY_CN,
+                               // email.getText());
+                               super.commit(onSave);
+                       }
+
                        @Override
                        public void refresh() {
                                refreshFormTitle(group);
-                               distinguishedName.setText(UiAdminUtils.getProperty(group,
-                                               UserAdminConstants.KEY_UID));
-                               commonName.setText(UiAdminUtils.getProperty(group,
+                               dnTxt.setText(group.getName());
+                               cnTxt.setText(UiAdminUtils.getProperty(group,
                                                UserAdminConstants.KEY_CN));
+                               descTxt.setText(UiAdminUtils.getProperty(group,
+                                               UserAdminConstants.KEY_DESC));
+
                                super.refresh();
                        }
                };
+
+               ModifyListener defaultListener = editor.new FormPartML(part);
+               descTxt.addModifyListener(defaultListener);
                getManagedForm().addPart(part);
        }
 
index e9a4b0411f239e9fa8b2473337c7ee3b10a70176..0f4d12ccfef357f317325b2d95704f2656682141 100644 (file)
@@ -28,6 +28,8 @@ import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.UserTableViewer;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
+import org.argeo.security.ui.admin.internal.providers.DomainNameLP;
+import org.argeo.security.ui.admin.internal.providers.RoleIconLP;
 import org.argeo.security.ui.admin.internal.providers.UserDragListener;
 import org.argeo.security.ui.admin.internal.providers.UserNameLP;
 import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener;
@@ -64,8 +66,10 @@ public class GroupsView extends ViewPart implements ArgeoNames {
        public void createPartControl(Composite parent) {
                parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
                // Define the displayed columns
+               columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 26));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
+               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 120));
                columnDefs.add(new ColumnDefinition(new UserNameLP(),
                                "Distinguished Name", 300));
 
index e344083596ca2e3082fa82cf532d30d550680800..154be42f3a01568035c045fe5f997abceff1ca74 100644 (file)
@@ -31,6 +31,7 @@ import org.argeo.security.ui.admin.internal.UserTableViewer;
 import org.argeo.security.ui.admin.internal.parts.UserEditor.GroupChangeListener;
 import org.argeo.security.ui.admin.internal.parts.UserEditor.MainInfoListener;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
+import org.argeo.security.ui.admin.internal.providers.DomainNameLP;
 import org.argeo.security.ui.admin.internal.providers.RoleIconLP;
 import org.argeo.security.ui.admin.internal.providers.UserNameLP;
 import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener;
@@ -155,15 +156,14 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                                                lastName.getText());
                                user.getProperties().put(UserAdminConstants.KEY_CN,
                                                commonName.getText());
-                               user.getProperties().put(UserAdminConstants.KEY_MAIL, email.getText());
+                               user.getProperties().put(UserAdminConstants.KEY_MAIL,
+                                               email.getText());
                                // Enable common name ?
                                // editor.setProperty(UserAdminConstants.KEY_CN,
                                // email.getText());
                                super.commit(onSave);
                        }
 
-                       
-                       
                        @Override
                        public void refresh() {
                                distinguishedName.setText(UiAdminUtils.getProperty(user,
@@ -256,6 +256,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
+               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain Name",
+                               120));
                columnDefs.add(new ColumnDefinition(new UserNameLP(),
                                "Distinguished Name", 300));
 
index b7682394a3e6b35eee17133dfb3391643b84f1a1..70e79daec6f0167363bf5bc396d169e3b7c33eb0 100644 (file)
@@ -28,6 +28,7 @@ import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.UserTableViewer;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
+import org.argeo.security.ui.admin.internal.providers.DomainNameLP;
 import org.argeo.security.ui.admin.internal.providers.MailLP;
 import org.argeo.security.ui.admin.internal.providers.UserDragListener;
 import org.argeo.security.ui.admin.internal.providers.UserNameLP;
@@ -71,6 +72,7 @@ public class UsersView extends ViewPart implements ArgeoNames {
                // Define the displayed columns
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
+               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 120));
                columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
                columnDefs.add(new ColumnDefinition(new UserNameLP(),
                                "Distinguished Name", 300));
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/DomainNameLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/DomainNameLP.java
new file mode 100644 (file)
index 0000000..ddd771a
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.security.ui.admin.internal.providers;
+
+import java.util.List;
+
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
+
+import org.argeo.ArgeoException;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
+import org.osgi.service.useradmin.User;
+
+/** Returns the human friendly domain name for the corresponding user. */
+public class DomainNameLP extends UserAdminAbstractLP {
+       private static final long serialVersionUID = 5256703081044911941L;
+
+       @Override
+       public String getText(User user) {
+               String dn = (String) user.getProperties().get(KEY_DN);
+               if (dn.endsWith(UserAdminConstants.SYSTEM_ROLE_BASE_DN))
+                       return "System roles";
+               try {
+                       LdapName name;
+                       name = new LdapName(dn);
+                       List<Rdn> rdns = name.getRdns();
+                       return (String) rdns.get(1).getValue() + '.'
+                                       + (String) rdns.get(0).getValue();
+               } catch (InvalidNameException e) {
+                       throw new ArgeoException("Unable to get domain name for " + dn, e);
+               }
+       }
+}
\ No newline at end of file
index 7b8d96ce0cc5b6df31f3cc443367a444d7bf840b..b567767959bef0cb4e3a4924e81ab1a7f455d80e 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.security.ui.admin.internal.providers;
 
+import java.util.Dictionary;
+
 import org.osgi.service.useradmin.User;
 
 /** Simply declare a label provider that returns the Primary Mail for a user */
@@ -8,7 +10,9 @@ public class MailLP extends UserAdminAbstractLP {
 
        @Override
        public String getText(User user) {
-               Object obj = user.getProperties().get(KEY_MAIL);
+               @SuppressWarnings("rawtypes")
+               Dictionary props = user.getProperties();
+               Object obj = props.get(KEY_MAIL);
                if (obj != null)
                        return (String) obj;
                else
index 8b7414d9401d25f189d8063cba435f8f9534ce57..8bda4042981b49266eeb3a9c81d8b1794ea1e3dc 100644 (file)
@@ -1,6 +1,7 @@
 package org.argeo.security.ui.admin.internal.providers;
 
 import org.argeo.security.ui.admin.SecurityAdminImages;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.eclipse.swt.graphics.Image;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
@@ -16,7 +17,10 @@ public class RoleIconLP extends UserAdminAbstractLP {
        @Override
        public Image getImage(Object element) {
                User user = (User) element;
-               if (user.getType() == Role.GROUP)
+               String dn = (String) user.getProperties().get(KEY_DN);
+               if (dn.endsWith(UserAdminConstants.SYSTEM_ROLE_BASE_DN))
+                       return SecurityAdminImages.ICON_ROLE;
+               else if (user.getType() == Role.GROUP)
                        return SecurityAdminImages.ICON_GROUP;
                else
                        return SecurityAdminImages.ICON_USER;