From: Mathieu Baudier Date: Wed, 15 Nov 2017 11:50:08 +0000 (+0100) Subject: Improve group management X-Git-Tag: argeo-commons-2.1.70~19 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=3247e578b2f430f872efe4115e1fb0264851745c;p=lgpl%2Fargeo-commons.git Improve group management --- 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 000000000..7fef996df Binary files /dev/null and b/org.argeo.cms.ui.workbench/icons/workgroup.png differ diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/SecurityAdminImages.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/SecurityAdminImages.java index ebb45e23a..4b23724f4 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/SecurityAdminImages.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/SecurityAdminImages.java @@ -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(); } diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupMainPage.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupMainPage.java index 2103ec9ad..1f0011d49 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupMainPage.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupMainPage.java @@ -15,6 +15,11 @@ */ 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("Mark 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); }