X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.ui.workbench%2Fsrc%2Forg%2Fargeo%2Fcms%2Fui%2Fworkbench%2Finternal%2Fuseradmin%2Fparts%2FUserMainPage.java;h=04111c4a8d322d6a6371f3f346d0898547ded04f;hb=5b444174cd13680f99944026877f6cac2e1faba1;hp=d96dfbc90e5a052932552d0a5cac904d6dbc8dc9;hpb=fd8f2c91e47d38445ba9702b40559939162f666d;p=lgpl%2Fargeo-commons.git 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 d96dfbc90..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 @@ -15,11 +15,20 @@ */ package org.argeo.cms.ui.workbench.internal.useradmin.parts; +import static org.argeo.cms.util.UserAdminUtils.getProperty; +import static org.argeo.naming.LdapAttrs.cn; +import static org.argeo.naming.LdapAttrs.givenName; +import static org.argeo.naming.LdapAttrs.mail; +import static org.argeo.naming.LdapAttrs.sn; +import static org.argeo.naming.LdapAttrs.uid; + import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.argeo.cms.CmsException; +import org.argeo.cms.ArgeoNames; +import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.ui.workbench.CmsWorkbenchStyles; import org.argeo.cms.ui.workbench.internal.useradmin.SecurityAdminImages; import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper; import org.argeo.cms.ui.workbench.internal.useradmin.parts.UserEditor.GroupChangeListener; @@ -28,17 +37,18 @@ import org.argeo.cms.ui.workbench.internal.useradmin.providers.CommonNameLP; import org.argeo.cms.ui.workbench.internal.useradmin.providers.DomainNameLP; import org.argeo.cms.ui.workbench.internal.useradmin.providers.RoleIconLP; import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserFilter; -import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserNameLP; import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserTableDefaultDClickListener; -import org.argeo.cms.util.useradmin.UserAdminUtils; +import org.argeo.cms.util.CmsUtils; +import org.argeo.cms.util.UserAdminUtils; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.parts.LdifUsersTable; -import org.argeo.node.ArgeoNames; +import org.argeo.naming.LdapAttrs; import org.argeo.node.NodeConstants; -import org.argeo.osgi.useradmin.LdifName; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; @@ -62,7 +72,11 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.forms.AbstractFormPart; @@ -105,8 +119,6 @@ public class UserMainPage extends FormPage implements ArgeoNames { appendOverviewPart(body, user); // Remove to ability to force the password for his own user. The user // must then use the change pwd feature - if (!UserAdminUtils.isCurrentUser(user)) - appendPasswordPart(body, user); appendMemberOfPart(body, user); } @@ -114,26 +126,27 @@ public class UserMainPage extends FormPage implements ArgeoNames { private void appendOverviewPart(final Composite parent, final User user) { FormToolkit tk = getManagedForm().getToolkit(); - Section section = addSection(tk, parent, "Main information"); - Composite body = (Composite) section.getClient(); + Section section = tk.createSection(parent, SWT.NO_FOCUS); + GridData gd = EclipseUiUtils.fillWidth(); + // gd.verticalAlignment = PRE_TITLE_INDENT; + section.setLayoutData(gd); + Composite body = tk.createComposite(section, SWT.WRAP); + body.setLayoutData(EclipseUiUtils.fillAll()); + section.setClient(body); + // body.setLayout(new GridLayout(6, false)); body.setLayout(new GridLayout(2, false)); - final Text distinguishedName = createLT(tk, body, "User Name", - UserAdminUtils.getProperty(user, LdifName.uid.name())); - distinguishedName.setEnabled(false); - - final Text commonName = createLT(tk, body, "Common Name", - UserAdminUtils.getProperty(user, LdifName.cn.name())); - commonName.setEnabled(false); - - final Text firstName = createLT(tk, body, "First name", - UserAdminUtils.getProperty(user, LdifName.givenName.name())); + Text commonName = createReadOnlyLT(tk, body, "Name", getProperty(user, cn)); + Text distinguishedName = createReadOnlyLT(tk, body, "Login", getProperty(user, uid)); + Text firstName = createLT(tk, body, "First name", getProperty(user, givenName)); + Text lastName = createLT(tk, body, "Last name", getProperty(user, sn)); + Text email = createLT(tk, body, "Email", getProperty(user, mail)); - final Text lastName = createLT(tk, body, "Last name", - UserAdminUtils.getProperty(user, LdifName.sn.name())); - - final Text email = createLT(tk, body, "Email", - UserAdminUtils.getProperty(user, LdifName.mail.name())); + Link resetPwdLk = new Link(body, SWT.NONE); + if (!UserAdminUtils.isCurrentUser(user)) { + resetPwdLk.setText("Reset password"); + } + resetPwdLk.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); // create form part (controller) AbstractFormPart part = new SectionPart((Section) body.getParent()) { @@ -142,8 +155,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { @Override public void initialize(IManagedForm form) { super.initialize(form); - listener = editor.new MainInfoListener(parent.getDisplay(), - this); + listener = editor.new MainInfoListener(parent.getDisplay(), this); userAdminWrapper.addListener(listener); } @@ -156,28 +168,20 @@ 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(), - firstName.getText()); - user.getProperties() - .put(LdifName.sn.name(), lastName.getText()); - user.getProperties().put(LdifName.cn.name(), - commonName.getText()); - user.getProperties().put(LdifName.mail.name(), email.getText()); + user.getProperties().put(LdapAttrs.givenName.name(), firstName.getText()); + user.getProperties().put(LdapAttrs.sn.name(), lastName.getText()); + user.getProperties().put(LdapAttrs.cn.name(), commonName.getText()); + user.getProperties().put(LdapAttrs.mail.name(), email.getText()); super.commit(onSave); } @Override public void refresh() { - distinguishedName.setText(UserAdminUtils.getProperty(user, - LdifName.uid.name())); - commonName.setText(UserAdminUtils.getProperty(user, - LdifName.cn.name())); - firstName.setText(UserAdminUtils.getProperty(user, - LdifName.givenName.name())); - lastName.setText(UserAdminUtils.getProperty(user, - LdifName.sn.name())); - email.setText(UserAdminUtils.getProperty(user, - LdifName.mail.name())); + distinguishedName.setText(UserAdminUtils.getProperty(user, LdapAttrs.uid.name())); + commonName.setText(UserAdminUtils.getProperty(user, LdapAttrs.cn.name())); + firstName.setText(UserAdminUtils.getProperty(user, LdapAttrs.givenName.name())); + lastName.setText(UserAdminUtils.getProperty(user, LdapAttrs.sn.name())); + email.setText(UserAdminUtils.getProperty(user, LdapAttrs.mail.name())); refreshFormTitle(user); super.refresh(); } @@ -195,7 +199,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { String cn = first.trim() + " " + last.trim() + " "; cn = cn.trim(); commonName.setText(cn); - getManagedForm().getForm().setText(cn); + // getManagedForm().getForm().setText(cn); editor.updateEditorTitle(cn); } }; @@ -206,45 +210,76 @@ public class UserMainPage extends FormPage implements ArgeoNames { firstName.addModifyListener(defaultListener); lastName.addModifyListener(defaultListener); email.addModifyListener(defaultListener); + + if (!UserAdminUtils.isCurrentUser(user)) + resetPwdLk.addSelectionListener(new SelectionAdapter() { + private static final long serialVersionUID = 5881800534589073787L; + + @Override + public void widgetSelected(SelectionEvent e) { + new ChangePasswordDialog(tk, user, "Reset password").open(); + } + }); + getManagedForm().addPart(part); } - /** Creates the password section */ - private void appendPasswordPart(Composite parent, final User user) { - FormToolkit tk = getManagedForm().getToolkit(); - Section section = addSection(tk, parent, "Password"); - Composite body = (Composite) section.getClient(); - body.setLayout(new GridLayout(2, false)); + private class ChangePasswordDialog extends TrayDialog { + private static final long serialVersionUID = 2843538207460082349L; - // add widgets (view) - final Text password1 = createLP(tk, body, "New password", ""); - final Text password2 = createLP(tk, body, "Repeat password", ""); + private User user; + private Text password1; + private Text password2; + private String title; + private FormToolkit tk; - // create form part (controller) - AbstractFormPart part = new SectionPart((Section) body.getParent()) { - @SuppressWarnings("unchecked") - public void commit(boolean onSave) { - if (!password1.getText().equals("") - || !password2.getText().equals("")) { - if (password1.getText().equals(password2.getText())) { - char[] newPassword = password1.getText().toCharArray(); - // userAdminWrapper.beginTransactionIfNeeded(); - user.getCredentials().put(null, newPassword); - password1.setText(""); - password2.setText(""); - super.commit(onSave); - } else { - password1.setText(""); - password2.setText(""); - throw new CmsException("Passwords are not equals"); - } - } + public ChangePasswordDialog(FormToolkit tk, User user, String title) { + super(Display.getDefault().getActiveShell()); + this.tk = tk; + this.user = user; + this.title = title; + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Composite body = new Composite(dialogarea, SWT.NO_FOCUS); + body.setLayoutData(EclipseUiUtils.fillAll()); + GridLayout layout = new GridLayout(2, false); + body.setLayout(layout); + + password1 = createLP(tk, body, "New password", ""); + password2 = createLP(tk, body, "Repeat password", ""); + parent.pack(); + return body; + } + + @SuppressWarnings("unchecked") + @Override + protected void okPressed() { + String msg = null; + + if (password1.getText().equals("")) + msg = "Password cannot be empty"; + else if (password1.getText().equals(password2.getText())) { + char[] newPassword = password1.getText().toCharArray(); + // userAdminWrapper.beginTransactionIfNeeded(); + userAdminWrapper.beginTransactionIfNeeded(); + user.getCredentials().put(null, newPassword); + userAdminWrapper.commitOrNotifyTransactionStateChange(); + super.okPressed(); + } else { + msg = "Passwords are not equals"; } - }; - ModifyListener defaultListener = editor.new FormPartML(part); - password1.addModifyListener(defaultListener); - password2.addModifyListener(defaultListener); - getManagedForm().addPart(part); + + if (EclipseUiUtils.notEmpty(msg)) + MessageDialog.openError(getParentShell(), "Cannot reset pasword", msg); + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText(title); + } } private LdifUsersTable appendMemberOfPart(final Composite parent, User user) { @@ -253,31 +288,28 @@ public class UserMainPage extends FormPage implements ArgeoNames { Composite body = (Composite) section.getClient(); body.setLayout(EclipseUiUtils.noSpaceGridLayout()); - boolean isAdmin = UserAdminUtils.isUserInRole(NodeConstants.ROLE_ADMIN); + // boolean isAdmin = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN); // 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", - 200)); + 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", 120)); + // if (isAdmin) + // columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name", + // 300)); // Create and configure the table - final LdifUsersTable userViewerCmp = new MyUserTableViewer(body, - SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, user); + final LdifUsersTable userViewerCmp = new MyUserTableViewer(body, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, user); userViewerCmp.setColumnDefinitions(columnDefs); - if (isAdmin) - userViewerCmp.populateWithStaticFilters(false, false); - else - userViewerCmp.populate(true, false); + // if (isAdmin) + // userViewerCmp.populateWithStaticFilters(false, false); + // else + userViewerCmp.populate(true, false); GridData gd = EclipseUiUtils.fillAll(); - gd.heightHint = 300; + gd.heightHint = 500; userViewerCmp.setLayoutData(gd); // Controllers @@ -285,8 +317,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { userViewer.addDoubleClickListener(new UserTableDefaultDClickListener()); int operations = DND.DROP_COPY | DND.DROP_MOVE; Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; - GroupDropListener dropL = new GroupDropListener(userAdminWrapper, - userViewer, user); + GroupDropListener dropL = new GroupDropListener(userAdminWrapper, userViewer, user); userViewer.addDropSupport(operations, tt, dropL); SectionPart part = new SectionPart((Section) body.getParent()) { @@ -296,8 +327,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { @Override public void initialize(IManagedForm form) { super.initialize(form); - listener = editor.new GroupChangeListener(parent.getDisplay(), - this); + listener = editor.new GroupChangeListener(parent.getDisplay(), this); userAdminWrapper.addListener(listener); } @@ -334,20 +364,21 @@ public class UserMainPage extends FormPage implements ArgeoNames { super(parent, style, true); this.user = user; userFilter = new UserFilter(); - userFilter.setShowSystemRole(false); } protected void populateStaticFilters(Composite staticFilterCmp) { staticFilterCmp.setLayout(new GridLayout()); showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK); showSystemRoleBtn.setText("Show system roles"); + boolean showSysRole = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN); + showSystemRoleBtn.setSelection(showSysRole); + userFilter.setShowSystemRole(showSysRole); showSystemRoleBtn.addSelectionListener(new SelectionAdapter() { private static final long serialVersionUID = -7033424592697691676L; @Override public void widgetSelected(SelectionEvent e) { - userFilter.setShowSystemRole(showSystemRoleBtn - .getSelection()); + userFilter.setShowSystemRole(showSystemRoleBtn.getSelection()); refresh(); } }); @@ -367,13 +398,11 @@ public class UserMainPage extends FormPage implements ArgeoNames { } } - private void addRemoveAbitily(SectionPart sectionPart, - TableViewer userViewer, User user) { + private void addRemoveAbitily(SectionPart sectionPart, TableViewer userViewer, User user) { Section section = sectionPart.getSection(); ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); ToolBar toolbar = toolBarManager.createControl(section); - final Cursor handCursor = new Cursor(section.getDisplay(), - SWT.CURSOR_HAND); + final Cursor handCursor = new Cursor(section.getDisplay(), SWT.CURSOR_HAND); toolbar.setCursor(handCursor); toolbar.addDisposeListener(new DisposeListener() { private static final long serialVersionUID = 3882131405820522925L; @@ -385,10 +414,8 @@ public class UserMainPage extends FormPage implements ArgeoNames { } }); - String tooltip = "Remove " + UserAdminUtils.getUsername(user) - + " from the below selected groups"; - Action action = new RemoveMembershipAction(userViewer, user, tooltip, - SecurityAdminImages.ICON_REMOVE_DESC); + String tooltip = "Remove " + UserAdminUtils.getUserLocalId(user.getName()) + " from the below selected groups"; + Action action = new RemoveMembershipAction(userViewer, user, tooltip, SecurityAdminImages.ICON_REMOVE_DESC); toolBarManager.add(action); toolBarManager.update(true); section.setTextClient(toolbar); @@ -400,8 +427,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { private final TableViewer userViewer; private final User user; - RemoveMembershipAction(TableViewer userViewer, User user, String name, - ImageDescriptor img) { + RemoveMembershipAction(TableViewer userViewer, User user, String name, ImageDescriptor img) { super(name, img); this.userViewer = userViewer; this.user = user; @@ -427,8 +453,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { } userAdminWrapper.commitOrNotifyTransactionStateChange(); for (Group group : groups) { - userAdminWrapper.notifyListeners(new UserAdminEvent(null, - UserAdminEvent.ROLE_CHANGED, group)); + userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, group)); } } } @@ -443,16 +468,14 @@ public class UserMainPage extends FormPage implements ArgeoNames { private final UserAdminWrapper myUserAdminWrapper; private final User myUser; - public GroupDropListener(UserAdminWrapper userAdminWrapper, - Viewer userViewer, User user) { + public GroupDropListener(UserAdminWrapper userAdminWrapper, Viewer userViewer, User user) { super(userViewer); this.myUserAdminWrapper = userAdminWrapper; this.myUser = user; } @Override - public boolean validateDrop(Object target, int operation, - TransferData transferType) { + public boolean validateDrop(Object target, int operation, TransferData transferType) { // Target is always OK in a list only view // TODO check if not a string boolean validDrop = true; @@ -472,8 +495,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { Group group = (Group) role; group.addMember(myUser); userAdminWrapper.commitOrNotifyTransactionStateChange(); - myUserAdminWrapper.notifyListeners(new UserAdminEvent(null, - UserAdminEvent.ROLE_CHANGED, group)); + myUserAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, group)); } super.drop(event); } @@ -487,8 +509,8 @@ public class UserMainPage extends FormPage implements ArgeoNames { // LOCAL HELPERS private void refreshFormTitle(User group) { - getManagedForm().getForm().setText( - UserAdminUtils.getProperty(group, LdifName.cn.name())); + // getManagedForm().getForm().setText(UserAdminUtils.getProperty(group, + // LdapAttrs.cn.name())); } /** Appends a section with a title */ @@ -508,8 +530,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { } /** Creates label and multiline text. */ - Text createLMT(FormToolkit toolkit, Composite body, String label, - String value) { + Text createLMT(FormToolkit toolkit, Composite body, String label, String value) { Label lbl = toolkit.createLabel(body, label); lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); Text text = toolkit.createText(body, value, SWT.BORDER | SWT.MULTI); @@ -518,22 +539,33 @@ public class UserMainPage extends FormPage implements ArgeoNames { } /** Creates label and password. */ - Text createLP(FormToolkit toolkit, Composite body, String label, - String value) { + 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; } /** Creates label and text. */ - Text createLT(FormToolkit toolkit, Composite body, String label, - String value) { - Label lbl = toolkit.createLabel(body, label); - lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); - Text text = toolkit.createText(body, value, SWT.BORDER); + Text createLT(FormToolkit toolkit, Composite parent, String label, String value) { + 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(FormToolkit toolkit, Composite parent, String label, String value) { + 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.NONE); text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + text.setEditable(false); + CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT); return text; } -} \ No newline at end of file +}