Improve group management
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 15 Nov 2017 11:50:08 +0000 (12:50 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 15 Nov 2017 11:50:08 +0000 (12:50 +0100)
org.argeo.cms.ui.workbench/icons/workgroup.png [new file with mode: 0644]
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/SecurityAdminImages.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupMainPage.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupsView.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserEditor.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserMainPage.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/providers/RoleIconLP.java
org.argeo.cms.ui/src/org/argeo/cms/util/UserAdminUtils.java
org.argeo.node.api/src/org/argeo/node/NodeInstance.java

diff --git a/org.argeo.cms.ui.workbench/icons/workgroup.png b/org.argeo.cms.ui.workbench/icons/workgroup.png
new file mode 100644 (file)
index 0000000..7fef996
Binary files /dev/null and b/org.argeo.cms.ui.workbench/icons/workgroup.png differ
index ebb45e23a2592703f6716db1d2484c1c0a281dde..4b23724f40ce80296c604ec67a3fc462a9269375 100644 (file)
@@ -26,7 +26,8 @@
  */
 package org.argeo.cms.ui.workbench.internal.useradmin;
 
-import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
+import static org.argeo.cms.ui.workbench.WorkbenchUiPlugin.getImageDescriptor;
+
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.graphics.Image;
 
@@ -34,15 +35,12 @@ import org.eclipse.swt.graphics.Image;
 public class SecurityAdminImages {
        private final static String PREFIX = "icons/";
 
-       public final static ImageDescriptor ICON_REMOVE_DESC = WorkbenchUiPlugin
-                       .getImageDescriptor(PREFIX + "remove.gif");
-       public final static ImageDescriptor ICON_USER_DESC = WorkbenchUiPlugin
-                       .getImageDescriptor(PREFIX + "user.gif");
+       public final static ImageDescriptor ICON_REMOVE_DESC = getImageDescriptor(PREFIX + "remove.gif");
+       public final static ImageDescriptor ICON_USER_DESC = getImageDescriptor(PREFIX + "user.gif");
 
        public final static Image ICON_USER = ICON_USER_DESC.createImage();
-       public final static Image ICON_GROUP = WorkbenchUiPlugin.getImageDescriptor(
-                       PREFIX + "users.gif").createImage();
-       public final static Image ICON_ROLE = WorkbenchUiPlugin.getImageDescriptor(
-                       PREFIX + "role.gif").createImage();
+       public final static Image ICON_GROUP = getImageDescriptor(PREFIX + "users.gif").createImage();
+       public final static Image ICON_WORKGROUP = getImageDescriptor(PREFIX + "workgroup.png").createImage();
+       public final static Image ICON_ROLE = getImageDescriptor(PREFIX + "role.gif").createImage();
 
 }
index 2103ec9ada5f0021aeb09d7463a0db5cf5f77f9a..1f0011d49d047a769ec54d67a19a456b07cf8a7a 100644 (file)
  */
 package org.argeo.cms.ui.workbench.internal.useradmin.parts;
 
+import static org.argeo.cms.util.UserAdminUtils.setProperty;
+import static org.argeo.naming.LdapAttrs.businessCategory;
+import static org.argeo.naming.LdapAttrs.description;
+import static org.argeo.node.NodeInstance.WORKGROUP;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -64,6 +69,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.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Cursor;
@@ -136,23 +142,25 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                body.setLayout(layout);
 
                String cn = UserAdminUtils.getProperty(group, LdapAttrs.cn.name());
-               Text cnTxt = createReadOnlyLT(body, "Common Name", cn);
-
-               Text dnTxt = createReadOnlyLT(body, "DN", group.getName());
-
+               createReadOnlyLT(body, "Name", cn);
+               // Text dnTxt = createReadOnlyLT(body, "DN", group.getName());
+               createReadOnlyLT(body, "Domain", UserAdminUtils.getDomainName(group));
+
+               // Description
+               Label descLbl = new Label(body, SWT.LEAD);
+               descLbl.setFont(EclipseUiUtils.getBoldFont(body));
+               descLbl.setText("Description");
+               descLbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, 2, 1));
+               final Text descTxt = new Text(body, SWT.LEAD | SWT.MULTI | SWT.WRAP | SWT.BORDER);
+               GridData gd = EclipseUiUtils.fillAll();
+               gd.heightHint = 50;
+               gd.horizontalSpan = 2;
+               descTxt.setLayoutData(gd);
+
+               // Mark as workgroup
                Link markAsWorkgroupLk = new Link(body, SWT.NONE);
                markAsWorkgroupLk.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
 
-               // 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)
                final AbstractFormPart part = new SectionPart((Section) body.getParent()) {
 
@@ -172,20 +180,21 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        }
 
                        public void commit(boolean onSave) {
-                               // group.getProperties().put(LdapAttrs.description.name(),
-                               // descTxt.getText());
+                               // group.getProperties().put(LdapAttrs.description.name(), descTxt.getText());
+                               setProperty(group, description, descTxt.getText());
                                super.commit(onSave);
                        }
 
                        @Override
                        public void refresh() {
-                               dnTxt.setText(group.getName());
-                               cnTxt.setText(UserAdminUtils.getProperty(group, LdapAttrs.cn.name()));
+                               // dnTxt.setText(group.getName());
+                               // cnTxt.setText(UserAdminUtils.getProperty(group, LdapAttrs.cn.name()));
+                               descTxt.setText(UserAdminUtils.getProperty(group, LdapAttrs.description.name()));
                                Node workgroupHome = NodeUtils.getGroupHome(session, cn);
                                if (workgroupHome == null)
                                        markAsWorkgroupLk.setText("<a>Mark as workgroup</a>");
                                else
-                                       markAsWorkgroupLk.setText(cn + " is already marked as being a workgroup");
+                                       markAsWorkgroupLk.setText("Configured as workgroup");
                                parent.layout(true, true);
                                super.refresh();
                        }
@@ -206,6 +215,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                                        else
                                                try {
                                                        nodeInstance.createWorkgroup(new LdapName(group.getName()));
+                                                       setProperty(group, businessCategory, WORKGROUP);
                                                        part.refresh();
                                                } catch (InvalidNameException e1) {
                                                        throw new CmsException("Cannot create Workgroup for " + group.toString(), e1);
@@ -215,16 +225,16 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        }
                });
 
-               // ModifyListener defaultListener = editor.new FormPartML(part);
-               // descTxt.addModifyListener(defaultListener);
+               ModifyListener defaultListener = editor.new FormPartML(part);
+               descTxt.addModifyListener(defaultListener);
                getManagedForm().addPart(part);
        }
 
        /** Filtered table with members. Has drag and drop ability */
        protected void appendMembersPart(Composite parent, Group group) {
-
                FormToolkit tk = getManagedForm().getToolkit();
                Section section = tk.createSection(parent, Section.TITLE_BAR);
+               section.setText("Members");
                section.setLayoutData(EclipseUiUtils.fillAll());
 
                Composite body = new Composite(section, SWT.NO_FOCUS);
@@ -233,7 +243,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                LdifUsersTable userTableViewerCmp = createMemberPart(body, group);
 
-               SectionPart part = new GroupMembersPart(section, userTableViewerCmp, group);
+               SectionPart part = new GroupMembersPart(section, userTableViewerCmp);
                getManagedForm().addPart(part);
                addRemoveAbitily(part, userTableViewerCmp.getTableViewer(), group);
        }
@@ -244,8 +254,8 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                // Define the displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
-               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150));
-               columnDefs.add(new ColumnDefinition(new MailLP(), "Primary Mail", 150));
+               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150));
+               columnDefs.add(new ColumnDefinition(new MailLP(), "Mail", 150));
                // columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name",
                // 240));
 
@@ -282,6 +292,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                @Override
                protected List<User> listFilteredElements(String filter) {
+                       // reload user and set it in the editor
                        Group group = (Group) editor.getDisplayedUser();
                        Role[] roles = group.getMembers();
                        List<User> users = new ArrayList<User>();
@@ -356,14 +367,14 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        // LOCAL CONTROLLERS
        private class GroupMembersPart extends SectionPart {
                private final LdifUsersTable userViewer;
-               private final Group group;
+               // private final Group group;
 
                private GroupChangeListener listener;
 
-               public GroupMembersPart(Section section, LdifUsersTable userViewer, Group group) {
+               public GroupMembersPart(Section section, LdifUsersTable userViewer) {
                        super(section);
                        this.userViewer = userViewer;
-                       this.group = group;
+                       // this.group = group;
                }
 
                @Override
@@ -381,7 +392,6 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                @Override
                public void refresh() {
-                       getSection().setText("Members of group " + UserAdminUtils.getProperty(group, LdapAttrs.cn.name()));
                        userViewer.refresh();
                        super.refresh();
                }
@@ -482,21 +492,21 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        }
 
        /** Creates label and text. */
-//     private Text createLT(Composite parent, String label, String value) {
-//             FormToolkit toolkit = getManagedForm().getToolkit();
-//             Label lbl = toolkit.createLabel(parent, label);
-//             lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
-//             lbl.setFont(EclipseUiUtils.getBoldFont(parent));
-//             Text text = toolkit.createText(parent, value, SWT.BORDER);
-//             text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-//             CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
-//             return text;
-//     }
-//     
+       // private Text createLT(Composite parent, String label, String value) {
+       // FormToolkit toolkit = getManagedForm().getToolkit();
+       // Label lbl = toolkit.createLabel(parent, label);
+       // lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
+       // lbl.setFont(EclipseUiUtils.getBoldFont(parent));
+       // Text text = toolkit.createText(parent, value, SWT.BORDER);
+       // text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+       // CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
+       // return text;
+       // }
+       //
        Text createReadOnlyLT(Composite parent, String label, String value) {
                FormToolkit toolkit = getManagedForm().getToolkit();
                Label lbl = toolkit.createLabel(parent, label);
-               lbl.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
                lbl.setFont(EclipseUiUtils.getBoldFont(parent));
                Text text = toolkit.createText(parent, value, SWT.NONE);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
index 545a7c89663edc14fa85c5ab105114bb02311b65..453fa7d5577c7aaa7b6a1cb885860db0895db38f 100644 (file)
@@ -79,7 +79,7 @@ public class GroupsView extends ViewPart implements ArgeoNames {
 
                // Define the displayed columns
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 19));
-               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150));
+               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150));
                columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 100));
                // Only show technical DN to admin
                // if (isAdmin)
index be1ce47cafad3dfec5a520f972ba0f28b7c83e1a..75e25f51a5514cd8d9d6e8934a95c77fcefaef02 100644 (file)
@@ -68,14 +68,14 @@ public class UserEditor extends FormEditor {
                username = ((UserEditorInput) getEditorInput()).getUsername();
                user = (User) userAdmin.getRole(username);
 
-               listener = new NameChangeListener(site.getShell().getDisplay(), user);
+               listener = new NameChangeListener(site.getShell().getDisplay());
                userAdminWrapper.addListener(listener);
                updateEditorTitle(null);
        }
 
        /**
-        * returns the list of all authorization for the given user or of the
-        * current displayed user if parameter is null
+        * returns the list of all authorization for the given user or of the current
+        * displayed user if parameter is null
         */
        protected List<User> getFlatGroups(User aUser) {
                Authorization currAuth;
@@ -100,6 +100,10 @@ public class UserEditor extends FormEditor {
                return user;
        }
 
+       private void setDisplayedUser(User user) {
+               this.user = user;
+       }
+
        void updateEditorTitle(String title) {
                if (title == null) {
                        String commonName = UserAdminUtils.getProperty(user, LdapAttrs.cn.name());
@@ -146,19 +150,18 @@ public class UserEditor extends FormEditor {
        // CONTROLERS FOR THIS EDITOR AND ITS PAGES
 
        private class NameChangeListener extends UiUserAdminListener {
-
-               private final User user;
-
-               public NameChangeListener(Display display, User user) {
+               public NameChangeListener(Display display) {
                        super(display);
-                       this.user = user;
                }
 
                @Override
                public void roleChangedToUiThread(UserAdminEvent event) {
                        Role changedRole = event.getRole();
-                       if (changedRole == null || changedRole.equals(user))
+                       if (changedRole == null || changedRole.equals(user)) {
                                updateEditorTitle(null);
+                               User reloadedUser = (User) userAdminWrapper.getUserAdmin().getRole(user.getName());
+                               setDisplayedUser(reloadedUser);
+                       }
                }
        }
 
index 1edbee1a7da6b3e409d843a87963e9abb7e57c24..04111c4a8d322d6a6371f3f346d0898547ded04f 100644 (file)
@@ -293,8 +293,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                // Displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                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", 100));
+               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150));
+               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 100));
                // Only show technical DN to administrators
                // if (isAdmin)
                // columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name",
@@ -541,7 +541,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        /** Creates label and password. */
        Text createLP(FormToolkit toolkit, Composite body, String label, String value) {
                Label lbl = toolkit.createLabel(body, label);
-               lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
                Text text = toolkit.createText(body, value, SWT.BORDER | SWT.PASSWORD);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
                return text;
@@ -550,7 +550,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        /** Creates label and text. */
        Text createLT(FormToolkit toolkit, Composite parent, String label, String value) {
                Label lbl = toolkit.createLabel(parent, label);
-               lbl.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
                lbl.setFont(EclipseUiUtils.getBoldFont(parent));
                Text text = toolkit.createText(parent, value, SWT.BORDER);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
@@ -560,7 +560,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
 
        Text createReadOnlyLT(FormToolkit toolkit, Composite parent, String label, String value) {
                Label lbl = toolkit.createLabel(parent, label);
-               lbl.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+               lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
                lbl.setFont(EclipseUiUtils.getBoldFont(parent));
                Text text = toolkit.createText(parent, value, SWT.NONE);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
index ca13dfe146b3e13dc3d869077af2c253d18a2d05..d7e25c64528a438b90f9059f9da61e2ab7f8165a 100644 (file)
@@ -1,7 +1,10 @@
 package org.argeo.cms.ui.workbench.internal.useradmin.providers;
 
 import org.argeo.cms.ui.workbench.internal.useradmin.SecurityAdminImages;
+import org.argeo.cms.util.UserAdminUtils;
+import org.argeo.naming.LdapAttrs;
 import org.argeo.node.NodeConstants;
+import org.argeo.node.NodeInstance;
 import org.eclipse.swt.graphics.Image;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
@@ -21,9 +24,12 @@ public class RoleIconLP extends UserAdminAbstractLP {
                String dn = user.getName();
                if (dn.endsWith(NodeConstants.ROLES_BASEDN))
                        return SecurityAdminImages.ICON_ROLE;
-               else if (user.getType() == Role.GROUP)
+               else if (user.getType() == Role.GROUP) {
+                       String businessCategory = UserAdminUtils.getProperty(user, LdapAttrs.businessCategory);
+                       if (businessCategory != null && businessCategory.equals(NodeInstance.WORKGROUP))
+                               return SecurityAdminImages.ICON_WORKGROUP;
                        return SecurityAdminImages.ICON_GROUP;
-               else
+               else
                        return SecurityAdminImages.ICON_USER;
        }
 }
index f8c7a57209cb70cba96ca1e6a6d2a109d1d9b8d3..5116c75937a806d1354f0f7f16f46f1f4d26d089 100644 (file)
@@ -116,6 +116,15 @@ public class UserAdminUtils {
                        return "";
        }
 
+       @SuppressWarnings("unchecked")
+       public final static void setProperty(Role role, String key, String value) {
+               role.getProperties().put(key, value);
+       }
+
+       public final static void setProperty(Role role, Enum<?> key, String value) {
+               setProperty(role, key.name(), value);
+       }
+
        /**
         * Simply retrieves a LDAP name from a {@link LdapAttrs.DN} with no exception
         */
@@ -133,6 +142,7 @@ public class UserAdminUtils {
                if (dn.endsWith(NodeConstants.ROLES_BASEDN))
                        return "System roles";
                try {
+                       // FIXME deal with non-DC
                        LdapName name = new LdapName(dn);
                        List<Rdn> rdns = name.getRdns();
                        String dname = null;
index 3a39abd147783476bdc50178e1aee80f57e6738d..aa1b5cee3872f44f1c228287ed537b458209e460 100644 (file)
@@ -4,6 +4,12 @@ import javax.naming.ldap.LdapName;
 
 /** The structured data */
 public interface NodeInstance {
+       /**
+        * To be used as an identifier of a workgroup, typically as a value for the
+        * 'businessCategory' attribute in LDAP.
+        */
+       public final static String WORKGROUP = "workgroup";
+
        /** Mark this group as a workgroup */
        void createWorkgroup(LdapName groupDn);
 }