enhance user management strategies
authorBruno Sinou <bsinou@argeo.org>
Wed, 17 Dec 2014 20:05:27 +0000 (20:05 +0000)
committerBruno Sinou <bsinou@argeo.org>
Wed, 17 Dec 2014 20:05:27 +0000 (20:05 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@7579 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

dep/org.argeo.dep.cms/bnd.bnd
dep/org.argeo.dep.cms/pom.xml
org.argeo.cms/src/org/argeo/cms/users/UserPage.java
org.argeo.cms/src/org/argeo/cms/users/UserPart.java
org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java
org.argeo.cms/src/org/argeo/cms/users/Users.java
org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/BundlesView.java
org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/ChangePasswordDialog.java
org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/UserCreationWizard.java

index 96203b75401958b3c68e4bcfbb28be02780ca87d..c7cb385a4a98ac2c51dde729c8601b2682ebe930 100644 (file)
@@ -1 +1 @@
-Import-Package:*, org.argeo.connect.streams
+Import-Package:*
index 564b00b5350862dabc5c9ca3d7b1ae895bef9e73..fbf90dc9b515ff0629f0df945455d12b218e6cb0 100644 (file)
@@ -37,7 +37,7 @@
                </plugins>
        </build>
        <dependencies>
-               <!-- Connect -->
+               <!-- Core CMS code -->
                <dependency>
                        <groupId>org.argeo.commons</groupId>
                        <artifactId>org.argeo.cms</artifactId>
index 3d72ce74a98d5905a28c321ce698591e09f2a063..ef0e9313e93b6961c6c24f13408e8aec5c393070 100644 (file)
@@ -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
index a3a107d015830d27aadcca5f4c46452f71fb4bc6..66f50b885a8c1fcc2c8c2665a6c2007e690829c4 100644 (file)
@@ -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<Text> 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("<a>Change password</a>");
                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
index e813a43d59f85ad8c78ce428dabddda97133d06b..204158a75ac22ed645d756e63ed29c74d36a57e8 100644 (file)
@@ -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<String>();
                for (GrantedAuthority ga : userDetails.getAuthorities())
                        roles.add(ga.getAuthority());
index 58e0e88622164be3c722236efedf34b0872d4b2d..4336a23d80b33861bbb3bfc144fd61cbcd64e09d 100644 (file)
@@ -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
index 0734ef56d0ddb9883c10c5ccdc955d4058cbd057..68e7d54df2cd65add7ffa72448142dd9021f4368 100644 (file)
@@ -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<Bundle>(column, new Comparator<Bundle>() {
                        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 "<<LAZY>>";
index ea8c1aba74de7d2266e3ad7fe4eadaa4ed2050b2..09fbc18d60c080c256942daa47bd8101692f9e49 100644 (file)
@@ -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) {
index 98531d79f14014b899f527772227d7b241c10345..24ea3cb4c42cb6ffaa1ef6c3ad57c08c122ea029 100644 (file)
@@ -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;
                }
        }