From 3247e578b2f430f872efe4115e1fb0264851745c Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 15 Nov 2017 12:50:08 +0100 Subject: [PATCH] Improve group management --- .../icons/workgroup.png | Bin 0 -> 744 bytes .../useradmin/SecurityAdminImages.java | 16 ++- .../useradmin/parts/GroupMainPage.java | 92 ++++++++++-------- .../internal/useradmin/parts/GroupsView.java | 2 +- .../internal/useradmin/parts/UserEditor.java | 21 ++-- .../useradmin/parts/UserMainPage.java | 10 +- .../useradmin/providers/RoleIconLP.java | 10 +- .../org/argeo/cms/util/UserAdminUtils.java | 10 ++ .../src/org/argeo/node/NodeInstance.java | 6 ++ 9 files changed, 100 insertions(+), 67 deletions(-) create mode 100644 org.argeo.cms.ui.workbench/icons/workgroup.png diff --git a/org.argeo.cms.ui.workbench/icons/workgroup.png b/org.argeo.cms.ui.workbench/icons/workgroup.png new file mode 100644 index 0000000000000000000000000000000000000000..7fef996df81185952a0fff9f45f03d2b9f366b42 GIT binary patch literal 744 zcmVP)sQr5zTgou@-)nI4Q z_z97qenKOSpDL*l{YhFW9YNcv%;*zQED7qe%C8o}I33Ja_elEM9j)j-0tI0QVlg z;P8PBJWYJ~oqqGs!p1~jQf}Pqltf=rM5OU#!w%`_8J6l*2j!=O&AU%Yb4y#%fdlaD zbZuj0{i*$*Mlxi_C#YFkO`u{f_d1If%w^ev>GUV_jE6!6u>BUZdyU= z(|df+kpBFRom*EIBe-a^v6Bvru@Ft5lp+jrJZkR(Q^0ctF$H3dfGP0!X@W@QC@6)| z@(aKMT2byh%$nijIu2NkBbG1-z-X`$F~^~Dx=&dg%#Rvk0GFN&w=SQSTc6BStbE?l z$9Q@IUo`Dc`ly;3r?Yc_s&bFSn;~9x4Uo+QY(IXpw)lyE)1G6k($hUa<*X`hHSKWt aANmG6@Ks~v8-MHo0000Mark as workgroup"); 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 columnDefs = new ArrayList(); 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 listFilteredElements(String filter) { + // reload user and set it in the editor Group group = (Group) editor.getDisplayedUser(); Role[] roles = group.getMembers(); List users = new ArrayList(); @@ -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)); diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupsView.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupsView.java index 545a7c896..453fa7d55 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupsView.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupsView.java @@ -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) diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserEditor.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserEditor.java index be1ce47ca..75e25f51a 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserEditor.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserEditor.java @@ -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 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); + } } } diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserMainPage.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserMainPage.java index 1edbee1a7..04111c4a8 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserMainPage.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserMainPage.java @@ -293,8 +293,8 @@ public class UserMainPage extends FormPage implements ArgeoNames { // Displayed columns List columnDefs = new ArrayList(); 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)); diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/providers/RoleIconLP.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/providers/RoleIconLP.java index ca13dfe14..d7e25c645 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/providers/RoleIconLP.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/providers/RoleIconLP.java @@ -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; } } diff --git a/org.argeo.cms.ui/src/org/argeo/cms/util/UserAdminUtils.java b/org.argeo.cms.ui/src/org/argeo/cms/util/UserAdminUtils.java index f8c7a5720..5116c7593 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/util/UserAdminUtils.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/util/UserAdminUtils.java @@ -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 rdns = name.getRdns(); String dname = null; diff --git a/org.argeo.node.api/src/org/argeo/node/NodeInstance.java b/org.argeo.node.api/src/org/argeo/node/NodeInstance.java index 3a39abd14..aa1b5cee3 100644 --- a/org.argeo.node.api/src/org/argeo/node/NodeInstance.java +++ b/org.argeo.node.api/src/org/argeo/node/NodeInstance.java @@ -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); } -- 2.30.2