From b24a4a0c22f8fb24800d9484160764544796cc17 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Wed, 17 Dec 2014 20:05:27 +0000 Subject: [PATCH] enhance user management strategies git-svn-id: https://svn.argeo.org/commons/trunk@7579 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- dep/org.argeo.dep.cms/bnd.bnd | 2 +- dep/org.argeo.dep.cms/pom.xml | 2 +- .../src/org/argeo/cms/users/UserPage.java | 16 ++- .../src/org/argeo/cms/users/UserPart.java | 123 +++++++++++++----- .../org/argeo/cms/users/UserRolesPart.java | 15 +-- .../src/org/argeo/cms/users/Users.java | 11 +- .../ui/workbench/osgi/BundlesView.java | 17 ++- .../ui/dialogs/ChangePasswordDialog.java | 2 +- .../ui/dialogs/UserCreationWizard.java | 10 +- 9 files changed, 133 insertions(+), 65 deletions(-) diff --git a/dep/org.argeo.dep.cms/bnd.bnd b/dep/org.argeo.dep.cms/bnd.bnd index 96203b754..c7cb385a4 100644 --- a/dep/org.argeo.dep.cms/bnd.bnd +++ b/dep/org.argeo.dep.cms/bnd.bnd @@ -1 +1 @@ -Import-Package:*, org.argeo.connect.streams +Import-Package:* diff --git a/dep/org.argeo.dep.cms/pom.xml b/dep/org.argeo.dep.cms/pom.xml index 564b00b53..fbf90dc9b 100644 --- a/dep/org.argeo.dep.cms/pom.xml +++ b/dep/org.argeo.dep.cms/pom.xml @@ -37,7 +37,7 @@ - + org.argeo.commons org.argeo.cms diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserPage.java b/org.argeo.cms/src/org/argeo/cms/users/UserPage.java index 3d72ce74a..ef0e9313e 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserPage.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserPage.java @@ -9,7 +9,6 @@ import org.argeo.cms.CmsUtils; import org.argeo.cms.viewers.JcrVersionCmsEditable; import org.argeo.cms.widgets.ScrolledPage; import org.argeo.security.UserAdminService; -import org.argeo.security.jcr.JcrSecurityModel; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -20,6 +19,8 @@ public class UserPage implements CmsUiProvider { // Enable user CRUD // INJECTED private UserAdminService userAdminService; + // private UserDetailsManager userDetailsManager; + // private JcrSecurityModel jcrSecurityModel; // public UserPage(UserAdminService userAdminService, @@ -37,11 +38,17 @@ public class UserPage implements CmsUiProvider { cmsEditable); Control control = userViewer.getControl(); + + // FIXME not satisfying.close + if (control instanceof UserPart) + ((UserPart) control).setUserAdminService(userAdminService); + Composite par = control.getParent(); UserRolesPart rolesPart = new UserRolesPart(par, SWT.NO_FOCUS, context, true); rolesPart.setUserAdminService(userAdminService); + rolesPart.setUserAdminService(userAdminService); rolesPart.createControl(rolesPart, UserStyles.USER_FORM_TEXT); rolesPart.refresh(); rolesPart.setLayoutData(CmsUtils.fillWidth()); @@ -68,7 +75,8 @@ public class UserPage implements CmsUiProvider { this.userAdminService = userAdminService; } -// public void setJcrSecurityModel(JcrSecurityModel jcrSecurityModel) { -// this.jcrSecurityModel = jcrSecurityModel; -// } + // public void setUserDetailsManager(UserDetailsManager userDetailsManager) + // { + // this.userDetailsManager = userDetailsManager; + // } } \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserPart.java b/org.argeo.cms/src/org/argeo/cms/users/UserPart.java index a3a107d01..66f50b885 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserPart.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserPart.java @@ -15,6 +15,8 @@ import org.argeo.cms.viewers.NodePart; import org.argeo.cms.widgets.StyledControl; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.jcr.ArgeoNames; +import org.argeo.security.UserAdminService; +import org.argeo.security.jcr.JcrUserDetails; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; @@ -40,6 +42,13 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, private List texts; private final static String KEY_PROP_NAME = "jcr:propertyName"; + // the 2 password fields + private Text pwd1, pwd2; + + private UserAdminService userAdminService; + + // private UserDetailsManager userDetailsManager; + // TODO implement to provide user creation ability for anonymous user? // public UserPart(Composite parent, int swtStyle) { // super(parent, swtStyle); @@ -71,17 +80,14 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, @Override protected Control createControl(Composite box, String style) { - if (isEditing()) - return createEditLayout(box, style); - else - return createROLayout(box, style); - } - - protected Composite createROLayout(Composite parent, String style) { - Composite body = new Composite(parent, SWT.NO_FOCUS); + Composite body = new Composite(box, SWT.NO_FOCUS); body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); GridLayout layout = new GridLayout(2, false); + // GridLayout layout = CmsUtils.noSpaceGridLayout(new GridLayout(2, + // false)); + body.setLayout(layout); + CmsUtils.style(body, UserStyles.USER_FORM_TEXT); // header Label header = new Label(body, SWT.NONE); @@ -92,7 +98,10 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, // form field createTexts(body, UserStyles.USER_FORM_TEXT); - CmsUtils.style(body, UserStyles.USER_FORM_TEXT); + + if (isEditing()) + for (Text txt : texts) + txt.addFocusListener(this); // Change password link // header @@ -102,26 +111,50 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, 1)); CmsUtils.style(header, UserStyles.USER_FORM_TITLE); + pwd1 = createLP(body, UserStyles.USER_FORM_TEXT, "Enter password"); + pwd2 = createLP(body, UserStyles.USER_FORM_TEXT, "Re-Enter"); + final Link link = new Link(body, SWT.NONE); + link.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 2, 1)); link.setText("Change password"); link.addSelectionListener(new SelectionAdapter() { + private static final long serialVersionUID = 8348668888548451776L; + @Override public void widgetSelected(SelectionEvent e) { - - MessageDialog.openInformation(link.getShell(), - "Not implemented", "Implement This."); - - // ChangePasswordDialog dialog = new ChangePasswordDialog( - // link.getShell(), userDetailsManager); - // if (dialog.open() == Window.OK) { - // MessageDialog.openInformation(HandlerUtil.getActiveShell(event), - // "Password changed", "Password changed."); - // } - // return null; + String msg = null; + if ("".equals(pwd1.getText().trim())) + msg = "Passwords cannot be blank"; + else if (!pwd1.getText().equals(pwd2.getText())) + msg = "Passwords do not match, please try again."; + + if (msg != null) { + MessageDialog.openError(link.getShell(), "Error", msg); + } else { + try { + String username = getNode().getProperty( + ArgeoNames.ARGEO_USER_ID).getString(); + if (userAdminService.userExists(username)) { + JcrUserDetails userDetails = (JcrUserDetails) userAdminService + .loadUserByUsername(username); + userDetails = userDetails.cloneWithNewPassword(pwd1 + .getText()); + userAdminService.updateUser(userDetails); + MessageDialog.openInformation(link.getShell(), + "Password changed", "Password changed."); + } + } catch (Exception re) { + throw new ArgeoException( + "unable to reset password for user " + + getNode(), re); + } + } + + pwd1.setText(""); + pwd2.setText(""); } }); - return body; } @@ -138,19 +171,16 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, Property.JCR_DESCRIPTION)); } - protected Composite createEditLayout(Composite parent, String style) { - Composite body = new Composite(parent, SWT.NO_FOCUS); - GridLayout layout = new GridLayout(2, false); - body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - body.setLayout(layout); - - createTexts(body, UserStyles.USER_FORM_TEXT); - - for (Text txt : texts) - txt.addFocusListener(this); - CmsUtils.style(body, UserStyles.USER_FORM_TEXT); - return body; - } + // protected Composite createEditLayout(Composite parent, String style) { + // Composite body = new Composite(parent, SWT.NO_FOCUS); + // GridLayout layout = new GridLayout(2, false); + // body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + // body.setLayout(layout); + // + // createTexts(body, UserStyles.USER_FORM_TEXT); + // + // return body; + // } void refresh() { for (Text txt : texts) { @@ -160,7 +190,7 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, } } - // THE LISTENER + // his.listener methods @Override public void focusGained(FocusEvent e) { // Do nothing @@ -188,6 +218,19 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, return text; } + // HELPERS + /** Creates label and password text. */ + protected Text createLP(Composite body, String style, String label) { + Label lbl = new Label(body, SWT.NONE); + lbl.setText(label); + lbl.setFont(EclipseUiUtils.getBoldFont(body)); + lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + Text text = new Text(body, SWT.BORDER | SWT.PASSWORD); + text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + CmsUtils.style(text, style); + return text; + } + /** Creates label and multiline text. */ protected Text createLMT(Composite body, String style, String label, String propName) { @@ -244,4 +287,14 @@ public class UserPart extends StyledControl implements EditablePart, NodePart, + node + " with value " + value, e); } } + + /* DEPENDENCY INJECTION */ + // public void setUserDetailsManager(UserDetailsManager userDetailsManager) + // { + // this.userDetailsManager = userDetailsManager; + // } + + public void setUserAdminService(UserAdminService userAdminService) { + this.userAdminService = userAdminService; + } } \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java b/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java index e813a43d5..204158a75 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java @@ -27,6 +27,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; @@ -78,13 +79,14 @@ public class UserRolesPart extends StyledControl implements EditablePart, @Override protected Control createControl(Composite box, String style) { - box.setLayout(CmsUtils.noSpaceGridLayout()); + // box.setLayout(CmsUtils.noSpaceGridLayout()); + box.setLayout(new GridLayout()); Label header = new Label(box, SWT.NONE); header.setText(" Groups"); CmsUtils.style(header, UserStyles.USER_FORM_TITLE); header.setLayoutData(CmsUtils.fillWidth()); - + int swtStyle = SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; if (!isEditing()) swtStyle |= SWT.READ_ONLY; @@ -171,28 +173,23 @@ public class UserRolesPart extends StyledControl implements EditablePart, public void setUserAdminService(UserAdminService userAdminService) { this.userAdminService = userAdminService; - try { String username = getNode().getProperty(ArgeoNames.ARGEO_USER_ID) .getString(); - // ; - if (userAdminService.userExists(username)) { JcrUserDetails userDetails = (JcrUserDetails) userAdminService .loadUserByUsername(username); setUserDetails(userDetails); } } catch (Exception e) { - throw new ArgeoException("Cannot retrieve userDetails for "// + - // username - , e); + throw new ArgeoException("Cannot retrieve userDetails for " + + getNode(), e); } } public void setUserDetails(JcrUserDetails userDetails) { this.userDetails = userDetails; - this.roles = new ArrayList(); for (GrantedAuthority ga : userDetails.getAuthorities()) roles.add(ga.getAuthority()); diff --git a/org.argeo.cms/src/org/argeo/cms/users/Users.java b/org.argeo.cms/src/org/argeo/cms/users/Users.java index 58e0e8862..4336a23d8 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/Users.java +++ b/org.argeo.cms/src/org/argeo/cms/users/Users.java @@ -22,13 +22,13 @@ import org.argeo.jcr.ArgeoNames; import org.argeo.jcr.JcrUtils; import org.argeo.security.UserAdminService; import org.argeo.security.jcr.JcrSecurityModel; +import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; @@ -40,6 +40,7 @@ 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.springframework.security.userdetails.UserDetailsManager; /** * Simple page to manage users of a given repository. We still rely on Argeo @@ -52,6 +53,7 @@ public class Users implements CmsUiProvider { // Enable user CRUD // INJECTED private UserAdminService userAdminService; private JcrSecurityModel jcrSecurityModel; + // private UserDetailsManager userDetailsManager; private String userWkspName; // Local UI Providers @@ -218,7 +220,7 @@ public class Users implements CmsUiProvider { session, userAdminService, jcrSecurityModel); WizardDialog dialog = new WizardDialog(addBtn.getShell(), newUserWizard); - if (dialog.open() == Window.OK) + if (dialog.open() == Dialog.OK) userTableCmp.refresh(); } }); @@ -342,4 +344,9 @@ public class Users implements CmsUiProvider { this.jcrSecurityModel = jcrSecurityModel; // userPage.setJcrSecurityModel(jcrSecurityModel); } + + public void setUserDetailsManager(UserDetailsManager userDetailsManager) { + // this.userDetailsManager = userDetailsManager; + // userPage.setUserDetailsManager(userDetailsManager); + } } \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/BundlesView.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/BundlesView.java index 0734ef56d..68e7d54df 100644 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/BundlesView.java +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/BundlesView.java @@ -34,6 +34,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; /** * Overview of the bundles as a table. Equivalent to Equinox 'ss' console @@ -107,18 +108,13 @@ public class BundlesView extends ViewPart { private static final long serialVersionUID = 6871926308708629989L; public String getText(Object element) { - - // return ""; - // FIXME triggers compilation failure Bundle bundle = (org.osgi.framework.Bundle) element; return bundle.getVersion().toString(); } }); new ColumnViewerComparator(column, new Comparator() { public int compare(Bundle o1, Bundle o2) { - return 0; - // FIXME getVersion() triggers compilation failure - // return o1.getVersion().compareTo(o2.getVersion()); + return o1.getVersion().compareTo(o2.getVersion()); } }); @@ -197,10 +193,13 @@ public class BundlesView extends ViewPart { return "RESOLVED"; case Bundle.STARTING: String activationPolicy = bundle.getHeaders() - .get("Bundle-ActivationPolicy").toString(); + .get(Constants.BUNDLE_ACTIVATIONPOLICY).toString(); + + // .get("Bundle-ActivationPolicy").toString(); // FIXME constant triggers the compilation failure - // .get(Constants.BUNDLE_ACTIVATIONPOLICY).toString(); - if (activationPolicy != null && activationPolicy.equals("lazy")) + if (activationPolicy != null + && activationPolicy.equals(Constants.ACTIVATION_LAZY)) + // && activationPolicy.equals("lazy")) // FIXME constant triggers the compilation failure // && activationPolicy.equals(Constants.ACTIVATION_LAZY)) return "<>"; diff --git a/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/ChangePasswordDialog.java b/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/ChangePasswordDialog.java index ea8c1aba7..09fbc18d6 100644 --- a/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/ChangePasswordDialog.java +++ b/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/ChangePasswordDialog.java @@ -44,7 +44,7 @@ public class ChangePasswordDialog extends TitleAreaDialog { } protected Point getInitialSize() { - return new Point(300, 250); + return new Point(400, 450); } protected Control createDialogArea(Composite parent) { diff --git a/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/UserCreationWizard.java b/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/UserCreationWizard.java index 98531d79f..24ea3cb4c 100644 --- a/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/UserCreationWizard.java +++ b/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/UserCreationWizard.java @@ -53,8 +53,8 @@ public class UserCreationWizard extends Wizard { // pages private MainUserInfoWizardPage mainUserInfo; - public UserCreationWizard(Session session, UserAdminService userAdminService, - JcrSecurityModel jcrSecurityModel) { + public UserCreationWizard(Session session, + UserAdminService userAdminService, JcrSecurityModel jcrSecurityModel) { this.session = session; this.userAdminService = userAdminService; this.jcrSecurityModel = jcrSecurityModel; @@ -99,8 +99,12 @@ public class UserCreationWizard extends Wizard { + username, e1); } } - MessageDialog.openError(getShell(), "Eroor", + // FIXME re-get ErrorFeedback dialog after single sourcing + // refactoring + MessageDialog.openError(getShell(), "Error", "Cannot create new user " + username); + log.error("Cannot create new user " + username); + e.printStackTrace(); return false; } } -- 2.30.2