Add batch feature to reset multiple user mails, clean code.
authorBruno Sinou <bsinou@argeo.org>
Tue, 22 Nov 2016 11:25:03 +0000 (11:25 +0000)
committerBruno Sinou <bsinou@argeo.org>
Tue, 22 Nov 2016 11:25:03 +0000 (11:25 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@9318 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

12 files changed:
org.argeo.cms.ui.workbench/META-INF/spring/common.xml
org.argeo.cms.ui.workbench/META-INF/spring/jcr.xml [deleted file]
org.argeo.cms.ui.workbench/META-INF/spring/keyring.xml [deleted file]
org.argeo.cms.ui.workbench/META-INF/spring/osgi.xml
org.argeo.cms.ui.workbench/META-INF/spring/parts.xml
org.argeo.cms.ui.workbench/META-INF/spring/views.xml [deleted file]
org.argeo.cms.ui.workbench/plugin.xml
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/WorkbenchUiPlugin.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/commands/OpenChangePasswordDialog.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/UiAdminUtils.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/commands/NewUser.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserBatchUpdateWizard.java

index ff4304d16d39d8fbbb91f58376bfd2f05ff8335b..e88329254d83884d8711649ec1346a8372fb752b 100644 (file)
                <property name="userAdmin" ref="userAdmin" />\r
                <property name="userAdminServiceReference" ref="userAdmin" />\r
        </bean>\r
-\r
-<!--   <bean -->\r
-<!--           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> -->\r
-<!--           <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> -->\r
-<!--           <property name="locations"> -->\r
-<!--                   <value>osgibundle:keyring.properties</value> -->\r
-<!--           </property> -->\r
-<!--   </bean> -->\r
-\r
-</beans>
\ No newline at end of file
+       \r
+       <bean id="repositoryRegister" class="org.argeo.jcr.DefaultRepositoryRegister" />\r
+       \r
+</beans>\r
diff --git a/org.argeo.cms.ui.workbench/META-INF/spring/jcr.xml b/org.argeo.cms.ui.workbench/META-INF/spring/jcr.xml
deleted file mode 100644 (file)
index e074154..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
-
-       <bean id="repositoryRegister" class="org.argeo.jcr.DefaultRepositoryRegister" />
-
-</beans>
diff --git a/org.argeo.cms.ui.workbench/META-INF/spring/keyring.xml b/org.argeo.cms.ui.workbench/META-INF/spring/keyring.xml
deleted file mode 100644 (file)
index 004e9b3..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
-<!--   <bean id="nodeSession" class="org.argeo.jcr.spring.ThreadBoundSession" -->
-<!--           destroy-method="dispose"> -->
-<!--           <property name="repository" ref="nodeRepository" /> -->
-<!--   </bean> -->
-
-<!--   <bean id="keyring" class="org.argeo.cms.security.JcrKeyring"> -->
-<!--           <property name="session" ref="nodeSession" /> -->
-<!--           <property name="defaultCallbackHandler" ref="defaultCallbackHandler" /> -->
-<!--           <property name="secreteKeyLength" value="${argeo.keyring.secreteKeyLength}" /> -->
-<!--   </bean> -->
-
-</beans>
index 366a42e7df4a43ca1d38750e19bf4ccdb16f8d0c..b2b42fcf0fd0e11f65a62a4b148ff1393f30fe16 100644 (file)
@@ -8,34 +8,25 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"\r
        osgi:default-timeout="30000">\r
 \r
-\r
+       <!-- JCR -->\r
+       <reference id="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
+       <reference id="keyring" interface="org.argeo.node.security.CryptoKeyring" />\r
        <list id="repositories" interface="javax.jcr.Repository"\r
                cardinality="0..N">\r
                <listener ref="repositoryRegister" bind-method="register"\r
                        unbind-method="unregister" />\r
        </list>\r
-       <reference id="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
-       <reference id="keyring" interface="org.argeo.node.security.CryptoKeyring" />\r
 \r
-       <!-- <reference id="nodeRepository" interface="javax.jcr.Repository" -->\r
-       <!-- filter="(cn=node)" /> -->\r
        <reference id="nodeRepository" interface="javax.jcr.Repository"\r
                filter="(cn=home)" />\r
 \r
-\r
-       <!-- New user admin -->\r
+       <!-- UserAdmin -->\r
        <reference id="userAdmin" interface="org.osgi.service.useradmin.UserAdmin" />\r
        <reference id="userTransaction" interface="javax.transaction.UserTransaction" />\r
 \r
+\r
        <reference id="secureLogger" interface="org.argeo.node.ArgeoLogger"\r
                cardinality="0..1" />\r
-\r
-\r
        <reference id="defaultCallbackHandler" interface="javax.security.auth.callback.CallbackHandler" />\r
 \r
-\r
-\r
-\r
-       <!-- SERVICES -->\r
-<!--   <service interface="org.argeo.node.security.CryptoKeyring" ref="keyring" /> -->\r
-</beans:beans>
\ No newline at end of file
+</beans:beans>\r
index 131b180de67eab3972a454c2e295529ce722d7d9..8fc1adb66518721e8338f00f867cc7ed07144cd3 100644 (file)
@@ -4,42 +4,41 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">
 
-
-       <!-- SECURITY  -->
-
+       <!-- SECURITY -->
        <!-- Editors -->
-       <bean id="userEditor" class="org.argeo.cms.ui.workbench.internal.useradmin.parts.UserEditor"
+       <bean id="userEditor"
+               class="org.argeo.cms.ui.workbench.internal.useradmin.parts.UserEditor"
                scope="prototype">
                <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
 
-       <bean id="groupEditor" class="org.argeo.cms.ui.workbench.internal.useradmin.parts.UserEditor"
+       <bean id="groupEditor"
+               class="org.argeo.cms.ui.workbench.internal.useradmin.parts.UserEditor"
                scope="prototype">
                <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
-       
        <!-- Views -->
-       <bean id="usersView" class="org.argeo.cms.ui.workbench.internal.useradmin.parts.UsersView"
+       <bean id="usersView"
+               class="org.argeo.cms.ui.workbench.internal.useradmin.parts.UsersView"
                scope="prototype">
                <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
-       <bean id="groupsView" class="org.argeo.cms.ui.workbench.internal.useradmin.parts.GroupsView"
+       <bean id="groupsView"
+               class="org.argeo.cms.ui.workbench.internal.useradmin.parts.GroupsView"
                scope="prototype">
                <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
 
 
-       <!-- DATA EXPLORER  -->
+       <!-- DATA EXPLORER -->
        <!-- Editors -->
-       <bean id="genericJcrQueryEditor"
-               class="org.argeo.cms.ui.workbench.jcr.GenericJcrQueryEditor"
+       <bean id="genericJcrQueryEditor" class="org.argeo.cms.ui.workbench.jcr.GenericJcrQueryEditor"
                scope="prototype">
-               <property name="session" ref="nodeSession" />
+               <property name="nodeRepository" ref="nodeRepository" />
        </bean>
        <bean id="defaultNodeEditor" class="org.argeo.cms.ui.workbench.jcr.DefaultNodeEditor"
                scope="prototype">
        </bean>
-
        <!-- Views -->
        <bean id="jcrBrowserView" class="org.argeo.cms.ui.workbench.jcr.JcrBrowserView"
                scope="prototype">
                <property name="keyring" ref="keyring" />
        </bean>
 
-
-</beans>
\ No newline at end of file
+       <!-- LOGGERS -->
+       <bean id="logView" class="org.argeo.cms.ui.workbench.useradmin.LogView"
+               scope="prototype">
+               <property name="argeoLogger" ref="secureLogger" />
+       </bean>
+       <bean id="adminLogView" class="org.argeo.cms.ui.workbench.useradmin.AdminLogView"
+               scope="prototype">
+               <property name="argeoLogger" ref="secureLogger" />
+       </bean>
+</beans>
diff --git a/org.argeo.cms.ui.workbench/META-INF/spring/views.xml b/org.argeo.cms.ui.workbench/META-INF/spring/views.xml
deleted file mode 100644 (file)
index 7674640..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-        http://www.springframework.org/schema/beans/spring-beans.xsd">
-
-       <bean id="logView" class="org.argeo.cms.ui.workbench.useradmin.LogView"
-               scope="prototype">
-               <property name="argeoLogger" ref="secureLogger" />
-       </bean>
-
-       <bean id="adminLogView" class="org.argeo.cms.ui.workbench.useradmin.AdminLogView"
-               scope="prototype">
-               <property name="argeoLogger" ref="secureLogger" />
-       </bean>
-
-</beans>
index 5c77ab7d87b12f883591e1cb0d78d1b25d3c3579..691e893f39460aa7151a009dffc3163728d46629 100644 (file)
    <!-- VIEWS -->
    <extension
                point="org.eclipse.ui.views">
-      <!-- Security -->
-      <view
-            id="org.argeo.cms.ui.workbench.usersView"
-            class="org.argeo.eclipse.spring.SpringExtensionFactory"
-            icon="icons/users.gif"
-            name="Users"
-            restorable="true">
-      </view>
-      <view
-            class="org.argeo.eclipse.spring.SpringExtensionFactory"
-            icon="icons/role.gif"
-            id="org.argeo.cms.ui.workbench.groupsView"
-            name="Groups"
-            restorable="false">
-      </view>
-      <!-- Home -->
-      <view
-            id="org.argeo.cms.ui.workbench.userProfile"
-            class="org.argeo.cms.ui.workbench.useradmin.UserProfile"
-            icon="icons/user.gif"
-            name="Profile"
-            restorable="true">
-      </view>
-      <!-- Maintenance -->
-      <view
-            id="org.argeo.cms.ui.workbench.logView"
-            class="org.argeo.eclipse.spring.SpringExtensionFactory"
-            name="Log"
-            icon="icons/log.gif"
-            restorable="true">
-      </view>
-      <view
+               <!-- Security -->
+               <view
+                       id="org.argeo.cms.ui.workbench.usersView"
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                       icon="icons/users.gif"
+                       name="Users"
+                       restorable="true">
+               </view>
+               <view
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                       icon="icons/role.gif"
+                       id="org.argeo.cms.ui.workbench.groupsView"
+                       name="Groups"
+                       restorable="false">
+               </view>
+               <!-- Home -->
+               <view
+                       id="org.argeo.cms.ui.workbench.userProfile"
+                       class="org.argeo.cms.ui.workbench.useradmin.UserProfile"
+                       icon="icons/user.gif"
+                       name="Profile"
+                       restorable="true">
+               </view>
+               <!-- Maintenance -->
+               <view
+                       id="org.argeo.cms.ui.workbench.logView"
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                       name="Log"
+                       icon="icons/log.gif"
+                       restorable="true">
+               </view>
+               <view
             id="org.argeo.cms.ui.workbench.adminLogView"
             class="org.argeo.eclipse.spring.SpringExtensionFactory"
             name="Admin Log"
             icon="icons/adminLog.gif"
             restorable="true">
-      </view>
-         <!-- OSGi Monitor -->
-      <view
+               </view>
+               <!-- OSGi Monitor -->
+               <view
                name="Modules"
             id="org.argeo.cms.ui.workbench.modulesView"
             icon="icons/service_published.gif"
        <!-- EDITORS -->
        <extension
                point="org.eclipse.ui.editors">
+               <!-- Security -->
                <editor
                        class="org.argeo.eclipse.spring.SpringExtensionFactory"
             id="org.argeo.cms.ui.workbench.userEditor"
                        class="org.argeo.eclipse.spring.SpringExtensionFactory"
                        default="false">
                </editor>
-               
        </extension>
     
     <extension
                        name="Delete User">
                </command>
                <command
-                       defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
-            id="org.argeo.cms.ui.workbench.userBatchUpdate"
+               id="org.argeo.cms.ui.workbench.userBatchUpdate"
+               defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
             name="User batch update">
                </command>
                <!-- Group CRUD -->
                                        name="begin, commit or rollback">
                        </commandParameter>
                </command>
-
-         <!-- Force the refresh when the various listener are not enough -->
-      <command
+               <!-- Force the refresh when the various listener are not enough -->
+               <command
             defaultHandler="org.argeo.cms.ui.workbench.internal.useradmin.commands.ForceRefresh"
             id="org.argeo.cms.ui.workbench.forceRefresh"
             name="Force Refresh">
-      </command>
-      <!-- Data Explorer -->
-      <command
+       </command>
+               <!-- Data Explorer -->
+               <command
                        defaultHandler="org.argeo.cms.ui.workbench.commands.OpenEditor"
             id="org.argeo.cms.ui.workbench.openEditor"
             name="Open an editor given its ID">
                   tooltip="Create a new group">
             </command>
         </menuContribution>
-         
-               <!--            <menuContribution
-            locationURI="toolbar:org.argeo.cms.ui.workbench.admin.adminRolesView">
-            <command
-                  commandId="org.argeo.cms.ui.workbench.admin.refreshRoles"
-                  icon="icons/sync.gif"
-                  label="LDAP Roles Sync"
-                  tooltip="Synchronize roles from LDAP">
-            </command>
-        </menuContribution> -->
+
         <!-- Browser view specific menu --> 
                <menuContribution
                        locationURI="menu:org.argeo.cms.ui.workbench.jcrBrowserView">
                        pattern="org.argeo.cms.ui.workbench/org.argeo.cms.ui.workbench.osgiPerspective"
                        isEqualityPattern="true"
                        activityId="org.argeo.cms.ui.workbench.adminActivity">
-                       <!-- activityId="org.argeo.security.ui.adminActivity" -->
         </activityPatternBinding>
         <activityPatternBinding
                        pattern="org.argeo.cms.ui.workbench/org.argeo.cms.ui.workbench.jcrBrowserPerspective"
               isEqualityPattern="true"
               pattern="org.argeo.cms.ui.workbench/org.argeo.cms.ui.workbench.userProfile">
         </activityPatternBinding>
-               
        </extension>
        
        <!-- STARTUP  --> 
        <extension point="org.eclipse.ui.startup">
                <startup class="org.argeo.cms.ui.workbench.internal.useradmin.PartStateChanged"/>
        </extension>
-</plugin>
\ No newline at end of file
+</plugin>
index e6e43a0d383a3c6ca4201a550153e9a27c5a52e5..02f8ac9ecc3ee4aefd1cd61832dafac09e29b8d6 100644 (file)
@@ -37,12 +37,14 @@ import org.osgi.framework.ServiceRegistration;
 
 /** The activator class controls the plug-in life cycle */
 public class WorkbenchUiPlugin extends AbstractUIPlugin implements ILogListener {
-
        private final static Log log = LogFactory.getLog(WorkbenchUiPlugin.class);
 
+       // The plug-in ID
+       public final static String PLUGIN_ID = "org.argeo.cms.ui.workbench"; //$NON-NLS-1$
+       
        private ResourceBundle messages;
-
        private static BundleContext bundleContext;
+
        public static InheritableThreadLocal<Display> display = new InheritableThreadLocal<Display>() {
 
                @Override
@@ -51,9 +53,6 @@ public class WorkbenchUiPlugin extends AbstractUIPlugin implements ILogListener
                }
        };
 
-       // The plug-in ID
-       //      public final static String PLUGIN_ID = "org.argeo.security.ui"; //$NON-NLS-1$
-       public final static String PLUGIN_ID = "org.argeo.cms.ui.workbench"; //$NON-NLS-1$
 
        final static String CONTEXT_KEYRING = "KEYRING";
 
@@ -65,9 +64,7 @@ public class WorkbenchUiPlugin extends AbstractUIPlugin implements ILogListener
 
        public void start(BundleContext context) throws Exception {
                super.start(context);
-
                bundleContext = context;
-
                defaultCallbackHandler = new DefaultCallbackHandler();
                defaultCallbackHandlerReg = context.registerService(
                                CallbackHandler.class, defaultCallbackHandler, null);
@@ -77,7 +74,6 @@ public class WorkbenchUiPlugin extends AbstractUIPlugin implements ILogListener
                Platform.addLogListener(this);
                if (log.isTraceEnabled())
                        log.trace("Eclipse logging now directed to standard logging");
-
        }
 
        public void stop(BundleContext context) throws Exception {
index 960c5fffbc90aa2f429dc1aa3e05c7eca85fe3c0..cd48598746c3e30dd6bff7201626ba1f679a6489 100644 (file)
@@ -55,17 +55,15 @@ import org.osgi.service.useradmin.UserAdmin;
 
 /** Open the change password dialog */
 public class OpenChangePasswordDialog extends AbstractHandler {
-       private final static Log log = LogFactory
-                       .getLog(OpenChangePasswordDialog.class);
+       private final static Log log = LogFactory.getLog(OpenChangePasswordDialog.class);
        private UserAdmin userAdmin;
        private UserTransaction userTransaction;
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
-               ChangePasswordDialog dialog = new ChangePasswordDialog(
-                               HandlerUtil.getActiveShell(event), userAdmin);
+               ChangePasswordDialog dialog = new ChangePasswordDialog(HandlerUtil.getActiveShell(event), userAdmin);
                if (dialog.open() == Dialog.OK) {
-                       MessageDialog.openInformation(HandlerUtil.getActiveShell(event),
-                                       passwordChanged.lead(), passwordChanged.lead());
+                       MessageDialog.openInformation(HandlerUtil.getActiveShell(event), passwordChanged.lead(),
+                                       passwordChanged.lead());
                }
                return null;
        }
@@ -73,8 +71,7 @@ public class OpenChangePasswordDialog extends AbstractHandler {
        @SuppressWarnings("unchecked")
        protected void changePassword(char[] oldPassword, char[] newPassword) {
                Subject subject = Subject.getSubject(AccessController.getContext());
-               String name = subject.getPrincipals(X500Principal.class).iterator()
-                               .next().toString();
+               String name = subject.getPrincipals(X500Principal.class).iterator().next().toString();
                LdapName dn;
                try {
                        dn = new LdapName(name);
@@ -103,14 +100,6 @@ public class OpenChangePasswordDialog extends AbstractHandler {
                }
        }
 
-       public void setUserAdmin(UserAdmin userDetailsManager) {
-               this.userAdmin = userDetailsManager;
-       }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
-       }
-
        class ChangePasswordDialog extends TitleAreaDialog {
                private static final long serialVersionUID = -6963970583882720962L;
                private Text oldPassword, newPassword1, newPassword2;
@@ -125,12 +114,10 @@ public class OpenChangePasswordDialog extends AbstractHandler {
 
                protected Control createDialogArea(Composite parent) {
                        Composite dialogarea = (Composite) super.createDialogArea(parent);
-                       dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                       true));
+                       dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
                        Composite composite = new Composite(dialogarea, SWT.NONE);
                        composite.setLayout(new GridLayout(2, false));
-                       composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-                                       false));
+                       composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
                        oldPassword = createLP(composite, currentPassword.lead());
                        newPassword1 = createLP(composite, newPassword.lead());
                        newPassword2 = createLP(composite, repeatNewPassword.lead());
@@ -145,8 +132,7 @@ public class OpenChangePasswordDialog extends AbstractHandler {
                        try {
                                if (!newPassword1.getText().equals(newPassword2.getText()))
                                        throw new CmsException("New passwords are different");
-                               changePassword(oldPassword.getTextChars(),
-                                               newPassword1.getTextChars());
+                               changePassword(oldPassword.getTextChars(), newPassword1.getTextChars());
                                close();
                        } catch (Exception e) {
                                ErrorFeedback.show("Cannot change password", e);
@@ -156,8 +142,7 @@ public class OpenChangePasswordDialog extends AbstractHandler {
                /** Creates label and password. */
                protected Text createLP(Composite parent, String label) {
                        new Label(parent, SWT.NONE).setText(label);
-                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.PASSWORD
-                                       | SWT.BORDER);
+                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.PASSWORD | SWT.BORDER);
                        text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
                        return text;
                }
@@ -167,4 +152,12 @@ public class OpenChangePasswordDialog extends AbstractHandler {
                        shell.setText(changePassword.lead());
                }
        }
+
+       public void setUserAdmin(UserAdmin userAdmin) {
+               this.userAdmin = userAdmin;
+       }
+
+       public void setUserTransaction(UserTransaction userTransaction) {
+               this.userTransaction = userTransaction;
+       }
 }
index 1e29276c15fd6158060c5129d332887188b467f6..8f5588b76f48cde16fab9fa4213c704c01741347 100644 (file)
@@ -29,4 +29,12 @@ public class UiAdminUtils {
                        throw new CmsException("Unable to begin transaction", e);
                }
        }
+
+       /**
+        * Email addresses must match this regexp pattern ({@value #EMAIL_PATTERN}.
+        * Thanks to <a href=
+        * "http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/"
+        * >this tip</a>.
+        */
+       public final static String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
 }
index e6072f178577e25a22ff85113aaa4c196031fb20..c342342dc48904c37e565d5aad19ec1ac215f5f7 100644 (file)
@@ -25,6 +25,7 @@ import javax.naming.ldap.Rdn;
 
 import org.argeo.cms.CmsException;
 import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
+import org.argeo.cms.ui.workbench.internal.useradmin.UiAdminUtils;
 import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper;
 import org.argeo.cms.util.UserAdminUtils;
 import org.argeo.eclipse.ui.EclipseUiUtils;
@@ -54,13 +55,6 @@ import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Open a wizard that enables creation of a new user. */
 public class NewUser extends AbstractHandler {
-       /**
-        * Email addresses must match this regexp pattern ({@value #EMAIL_PATTERN}.
-        * Thanks to <a href=
-        * "http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/"
-        * >this tip</a>.
-        */
-       public final static String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
        // private final static Log log = LogFactory.getLog(NewUser.class);
        public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".newUser";
 
@@ -236,7 +230,7 @@ public class NewUser extends AbstractHandler {
                                                .getRole(getDn(name));
                                if (role != null)
                                        return "User " + name + " already exists";
-                               if (!primaryMailTxt.getText().matches(EMAIL_PATTERN))
+                               if (!primaryMailTxt.getText().matches(UiAdminUtils.EMAIL_PATTERN))
                                        return "Not a valid email address";
                                if (lastNameTxt.getText().trim().equals(""))
                                        return "Specify a last name";
index 4fade3804cedbae3e8053118dd7c0e140581f761..7e3540f7617951cce3b9dfb17855e9c49e629416 100644 (file)
@@ -12,6 +12,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
 import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.workbench.internal.useradmin.UiAdminUtils;
 import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper;
 import org.argeo.cms.ui.workbench.internal.useradmin.providers.CommonNameLP;
 import org.argeo.cms.ui.workbench.internal.useradmin.providers.DomainNameLP;
@@ -45,12 +46,12 @@ import org.eclipse.swt.widgets.Text;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Wizard to update users */
 public class UserBatchUpdateWizard extends Wizard {
 
-       private final static Log log = LogFactory
-                       .getLog(UserBatchUpdateWizard.class);
+       private final static Log log = LogFactory.getLog(UserBatchUpdateWizard.class);
        private UserAdminWrapper userAdminWrapper;
 
        // pages
@@ -60,12 +61,14 @@ public class UserBatchUpdateWizard extends Wizard {
 
        // Various implemented commands keys
        private final static String CMD_UPDATE_PASSWORD = "resetPassword";
+       private final static String CMD_UPDATE_EMAIL = "resetEmail";
        private final static String CMD_GROUP_MEMBERSHIP = "groupMembership";
 
        private final Map<String, String> commands = new HashMap<String, String>() {
                private static final long serialVersionUID = 1L;
                {
                        put("Reset password(s)", CMD_UPDATE_PASSWORD);
+                       put("Reset email(s)", CMD_UPDATE_EMAIL);
                        // TODO implement role / group management
                        // put("Add/Remove from group", CMD_GROUP_MEMBERSHIP);
                }
@@ -92,14 +95,11 @@ public class UserBatchUpdateWizard extends Wizard {
                UserTransaction ut = userAdminWrapper.getUserTransaction();
                try {
                        if (ut.getStatus() != javax.transaction.Status.STATUS_NO_TRANSACTION
-                                       && !MessageDialog.openConfirm(getShell(),
-                                                       "Existing Transaction",
-                                                       "A user transaction is already existing, "
-                                                                       + "are you sure you want to proceed ?"))
+                                       && !MessageDialog.openConfirm(getShell(), "Existing Transaction",
+                                                       "A user transaction is already existing, " + "are you sure you want to proceed ?"))
                                return false;
                } catch (SystemException e) {
-                       throw new CmsException("Cannot get user transaction state "
-                                       + "before user batch update", e);
+                       throw new CmsException("Cannot get user transaction state " + "before user batch update", e);
                }
 
                // We cannot use jobs, user modifications are still meant to be done in
@@ -111,10 +111,14 @@ public class UserBatchUpdateWizard extends Wizard {
                if (CMD_UPDATE_PASSWORD.equals(chooseCommandPage.getCommand())) {
                        char[] newValue = chooseCommandPage.getPwdValue();
                        if (newValue == null)
-                               throw new CmsException(
-                                               "Password cannot be null or an empty string");
-                       ResetPassword job = new ResetPassword(userAdminWrapper,
-                                       userListPage.getSelectedUsers(), newValue);
+                               throw new CmsException("Password cannot be null or an empty string");
+                       ResetPassword job = new ResetPassword(userAdminWrapper, userListPage.getSelectedUsers(), newValue);
+                       job.doUpdate();
+               } else if (CMD_UPDATE_EMAIL.equals(chooseCommandPage.getCommand())) {
+                       String newValue = chooseCommandPage.getEmailValue();
+                       if (newValue == null)
+                               throw new CmsException("Password cannot be null or an empty string");
+                       ResetEmail job = new ResetEmail(userAdminWrapper, userListPage.getSelectedUsers(), newValue);
                        job.doUpdate();
                }
                return true;
@@ -131,8 +135,7 @@ public class UserBatchUpdateWizard extends Wizard {
                private UserAdminWrapper userAdminWrapper;
                private List<User> usersToUpdate;
 
-               public ResetPassword(UserAdminWrapper userAdminWrapper,
-                               List<User> usersToUpdate, char[] newPwd) {
+               public ResetPassword(UserAdminWrapper userAdminWrapper, List<User> usersToUpdate, char[] newPwd) {
                        this.newPwd = newPwd;
                        this.usersToUpdate = usersToUpdate;
                        this.userAdminWrapper = userAdminWrapper;
@@ -148,17 +151,53 @@ public class UserBatchUpdateWizard extends Wizard {
                                }
                                userAdminWrapper.commitOrNotifyTransactionStateChange();
                        } catch (Exception e) {
-                               throw new CmsException("Cannot perform batch update on users",
-                                               e);
+                               throw new CmsException("Cannot perform batch update on users", e);
                        } finally {
                                UserTransaction ut = userAdminWrapper.getUserTransaction();
                                try {
                                        if (ut.getStatus() != javax.transaction.Status.STATUS_NO_TRANSACTION)
                                                ut.rollback();
-                               } catch (IllegalStateException | SecurityException
-                                               | SystemException e) {
-                                       log.error("Unable to rollback session in 'finally', "
-                                                       + "the system might be in a dirty state");
+                               } catch (IllegalStateException | SecurityException | SystemException e) {
+                                       log.error("Unable to rollback session in 'finally', " + "the system might be in a dirty state");
+                                       e.printStackTrace();
+                               }
+                       }
+               }
+       }
+
+       private class ResetEmail {
+               private String newEmail;
+               private UserAdminWrapper userAdminWrapper;
+               private List<User> usersToUpdate;
+
+               public ResetEmail(UserAdminWrapper userAdminWrapper, List<User> usersToUpdate, String newEmail) {
+                       this.newEmail = newEmail;
+                       this.usersToUpdate = usersToUpdate;
+                       this.userAdminWrapper = userAdminWrapper;
+               }
+
+               @SuppressWarnings("unchecked")
+               protected void doUpdate() {
+                       userAdminWrapper.beginTransactionIfNeeded();
+                       try {
+                               for (User user : usersToUpdate) {
+                                       // the char array is emptied after being used.
+                                       user.getProperties().put(LdapAttrs.mail.name(), newEmail);
+                               }
+
+                               userAdminWrapper.commitOrNotifyTransactionStateChange();
+                               if (!usersToUpdate.isEmpty())
+                                       userAdminWrapper.notifyListeners(
+                                                       new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, usersToUpdate.get(0)));
+                       } catch (Exception e) {
+                               throw new CmsException("Cannot perform batch update on users", e);
+                       } finally {
+                               UserTransaction ut = userAdminWrapper.getUserTransaction();
+                               try {
+                                       if (ut.getStatus() != javax.transaction.Status.STATUS_NO_TRANSACTION)
+                                               ut.rollback();
+                               } catch (IllegalStateException | SecurityException | SystemException e) {
+                                       log.error("Unable to rollback session in finally block, the system might be in a dirty state");
                                        e.printStackTrace();
                                }
                        }
@@ -240,7 +279,9 @@ public class UserBatchUpdateWizard extends Wizard {
        // }
 
        // PAGES
-       /** Displays a combo box that enables user to choose which action to perform */
+       /**
+        * Displays a combo box that enables user to choose which action to perform
+        */
        private class ChooseCommandWizardPage extends WizardPage {
                private static final long serialVersionUID = -8069434295293996633L;
                private Combo chooseCommandCmb;
@@ -276,6 +317,8 @@ public class UserBatchUpdateWizard extends Wizard {
                                public void widgetSelected(SelectionEvent e) {
                                        if (getCommand().equals(CMD_UPDATE_PASSWORD))
                                                populatePasswordCmp(bottomPart);
+                                       else if (getCommand().equals(CMD_UPDATE_EMAIL))
+                                               populateEmailCmp(bottomPart);
                                        else if (getCommand().equals(CMD_GROUP_MEMBERSHIP))
                                                populateGroupCmp(bottomPart);
                                        else
@@ -314,13 +357,33 @@ public class UserBatchUpdateWizard extends Wizard {
                        pwd2Txt = EclipseUiUtils.createGridLP(body, "Repeat password", ml);
                }
 
+               private void populateEmailCmp(Composite parent) {
+                       EclipseUiUtils.clear(parent);
+                       Composite body = new Composite(parent, SWT.NO_FOCUS);
+
+                       ModifyListener ml = new ModifyListener() {
+                               private static final long serialVersionUID = 2147704227294268317L;
+
+                               @Override
+                               public void modifyText(ModifyEvent event) {
+                                       checkPageComplete();
+                               }
+                       };
+
+                       body.setLayout(new GridLayout(2, false));
+                       body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                       valueTxt = EclipseUiUtils.createGridLT(body, "New e-mail", ml);
+               }
+
                private void checkPageComplete() {
                        String errorMsg = null;
                        if (chooseCommandCmb.getSelectionIndex() < 0)
                                errorMsg = "Please select an action";
-                       else if (CMD_UPDATE_PASSWORD.equals(getCommand())) {
-                               if (EclipseUiUtils.isEmpty(pwdTxt.getText())
-                                               || pwdTxt.getText().length() < 4)
+                       else if (CMD_UPDATE_EMAIL.equals(getCommand())) {
+                               if (!valueTxt.getText().matches(UiAdminUtils.EMAIL_PATTERN))
+                                       errorMsg = "Not a valid e-mail address";
+                       } else if (CMD_UPDATE_PASSWORD.equals(getCommand())) {
+                               if (EclipseUiUtils.isEmpty(pwdTxt.getText()) || pwdTxt.getText().length() < 4)
                                        errorMsg = "Please enter a password that is at least 4 character long";
                                else if (!pwdTxt.getText().equals(pwd2Txt.getText()))
                                        errorMsg = "Passwords are different";
@@ -329,8 +392,7 @@ public class UserBatchUpdateWizard extends Wizard {
                                setMessage(errorMsg, WizardPage.ERROR);
                                setPageComplete(false);
                        } else {
-                               setMessage("Page complete, you can proceed to user choice",
-                                               WizardPage.INFORMATION);
+                               setMessage("Page complete, you can proceed to user choice", WizardPage.INFORMATION);
                                setPageComplete(true);
                        }
 
@@ -340,20 +402,17 @@ public class UserBatchUpdateWizard extends Wizard {
                private void populateGroupCmp(Composite parent) {
                        EclipseUiUtils.clear(parent);
                        trueChk = new Button(parent, SWT.CHECK);
-                       trueChk.setText("Add to group. (It will remove user(s) from the "
-                                       + "corresponding group if unchecked)");
+                       trueChk.setText("Add to group. (It will remove user(s) from the " + "corresponding group if unchecked)");
                        trueChk.setSelection(true);
                        trueChk.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
                }
 
                protected String getCommand() {
-                       return commands.get(chooseCommandCmb.getItem(chooseCommandCmb
-                                       .getSelectionIndex()));
+                       return commands.get(chooseCommandCmb.getItem(chooseCommandCmb.getSelectionIndex()));
                }
 
                protected String getCommandLbl() {
-                       return chooseCommandCmb.getItem(chooseCommandCmb
-                                       .getSelectionIndex());
+                       return chooseCommandCmb.getItem(chooseCommandCmb.getSelectionIndex());
                }
 
                @SuppressWarnings("unused")
@@ -386,14 +445,24 @@ public class UserBatchUpdateWizard extends Wizard {
                        else
                                return pwdTxt.getText().toCharArray();
                }
+
+               protected String getEmailValue() {
+                       // We do not directly reset the password text fields: There is no
+                       // need to over secure this process: setting a pwd to multi users
+                       // at the same time is anyhow a bad practice and should be used only
+                       // in test environment or for temporary access
+                       if (valueTxt == null || valueTxt.isDisposed())
+                               return null;
+                       else
+                               return valueTxt.getText();
+               }
        }
 
        /**
         * Displays a list of users with a check box to be able to choose some of
         * them
         */
-       private class ChooseUsersWizardPage extends WizardPage implements
-                       IPageChangedListener {
+       private class ChooseUsersWizardPage extends WizardPage implements IPageChangedListener {
                private static final long serialVersionUID = 7651807402211214274L;
                private ChooseUserTableViewer userTableCmp;
 
@@ -409,19 +478,15 @@ public class UserBatchUpdateWizard extends Wizard {
 
                        // Define the displayed columns
                        List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-                       columnDefs.add(new ColumnDefinition(new CommonNameLP(),
-                                       "Common Name", 150));
+                       columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150));
                        columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
-                       columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain",
-                                       200));
+                       columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 200));
 
                        // Only show technical DN to admin
                        if (CurrentUser.isInRole(NodeConstants.ROLE_ADMIN))
-                               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                                               "Distinguished Name", 300));
+                               columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name", 300));
 
-                       userTableCmp = new ChooseUserTableViewer(pageCmp, SWT.MULTI
-                                       | SWT.H_SCROLL | SWT.V_SCROLL);
+                       userTableCmp = new ChooseUserTableViewer(pageCmp, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
                        userTableCmp.setLayoutData(EclipseUiUtils.fillAll());
                        userTableCmp.setColumnDefinitions(columnDefs);
                        userTableCmp.populate(true, true);
@@ -440,8 +505,7 @@ public class UserBatchUpdateWizard extends Wizard {
                @Override
                public void pageChanged(PageChangedEvent event) {
                        if (event.getSelectedPage() == this) {
-                               String msg = "Chosen batch action: "
-                                               + chooseCommandPage.getCommandLbl();
+                               String msg = "Chosen batch action: " + chooseCommandPage.getCommandLbl();
                                ((WizardPage) event.getSelectedPage()).setMessage(msg);
                        }
                }
@@ -452,10 +516,8 @@ public class UserBatchUpdateWizard extends Wizard {
 
                private class ChooseUserTableViewer extends LdifUsersTable {
                        private static final long serialVersionUID = 5080437561015853124L;
-                       private final String[] knownProps = { LdapAttrs.uid.name(),
-                                       LdapAttrs.DN, LdapAttrs.cn.name(),
-                                       LdapAttrs.givenName.name(), LdapAttrs.sn.name(),
-                                       LdapAttrs.mail.name() };
+                       private final String[] knownProps = { LdapAttrs.uid.name(), LdapAttrs.DN, LdapAttrs.cn.name(),
+                                       LdapAttrs.givenName.name(), LdapAttrs.sn.name(), LdapAttrs.mail.name() };
 
                        public ChooseUserTableViewer(Composite parent, int style) {
                                super(parent, style);
@@ -478,24 +540,16 @@ public class UserBatchUpdateWizard extends Wizard {
                                                        tmpBuilder.append("*)");
                                                }
                                        if (tmpBuilder.length() > 1) {
-                                               builder.append("(&(")
-                                                               .append(LdapAttrs.objectClass.name())
-                                                               .append("=")
-                                                               .append(LdapObjs.inetOrgPerson.name())
-                                                               .append(")(|");
+                                               builder.append("(&(").append(LdapAttrs.objectClass.name()).append("=")
+                                                               .append(LdapObjs.inetOrgPerson.name()).append(")(|");
                                                builder.append(tmpBuilder.toString());
                                                builder.append("))");
                                        } else
-                                               builder.append("(")
-                                                               .append(LdapAttrs.objectClass.name())
-                                                               .append("=")
-                                                               .append(LdapObjs.inetOrgPerson.name())
-                                                               .append(")");
-                                       roles = userAdminWrapper.getUserAdmin().getRoles(
-                                                       builder.toString());
+                                               builder.append("(").append(LdapAttrs.objectClass.name()).append("=")
+                                                               .append(LdapObjs.inetOrgPerson.name()).append(")");
+                                       roles = userAdminWrapper.getUserAdmin().getRoles(builder.toString());
                                } catch (InvalidSyntaxException e) {
-                                       throw new CmsException("Unable to get roles with filter: "
-                                                       + filter, e);
+                                       throw new CmsException("Unable to get roles with filter: " + filter, e);
                                }
                                List<User> users = new ArrayList<User>();
                                for (Role role : roles)
@@ -509,8 +563,7 @@ public class UserBatchUpdateWizard extends Wizard {
        }
 
        /** Summary of input data before launching the process */
-       private class ValidateAndLaunchWizardPage extends WizardPage implements
-                       IPageChangedListener {
+       private class ValidateAndLaunchWizardPage extends WizardPage implements IPageChangedListener {
                private static final long serialVersionUID = 7098918351451743853L;
                private ChosenUsersTableViewer userTableCmp;
 
@@ -525,17 +578,13 @@ public class UserBatchUpdateWizard extends Wizard {
                        pageCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
 
                        List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-                       columnDefs.add(new ColumnDefinition(new CommonNameLP(),
-                                       "Common Name", 150));
+                       columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150));
                        columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
-                       columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain",
-                                       200));
+                       columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 200));
                        // Only show technical DN to admin
                        if (CurrentUser.isInRole(NodeConstants.ROLE_ADMIN))
-                               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                                               "Distinguished Name", 300));
-                       userTableCmp = new ChosenUsersTableViewer(pageCmp, SWT.MULTI
-                                       | SWT.H_SCROLL | SWT.V_SCROLL);
+                               columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name", 300));
+                       userTableCmp = new ChosenUsersTableViewer(pageCmp, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
                        userTableCmp.setLayoutData(EclipseUiUtils.fillAll());
                        userTableCmp.setColumnDefinitions(columnDefs);
                        userTableCmp.populate(false, false);
@@ -553,11 +602,9 @@ public class UserBatchUpdateWizard extends Wizard {
                        if (event.getSelectedPage() == this) {
                                @SuppressWarnings({ "unchecked", "rawtypes" })
                                Object[] values = ((ArrayList) userListPage.getSelectedUsers())
-                                               .toArray(new Object[userListPage.getSelectedUsers()
-                                                               .size()]);
+                                               .toArray(new Object[userListPage.getSelectedUsers().size()]);
                                userTableCmp.getTableViewer().setInput(values);
-                               String msg = "Following batch action: ["
-                                               + chooseCommandPage.getCommandLbl()
+                               String msg = "Following batch action: [" + chooseCommandPage.getCommandLbl()
                                                + "] will be perfomed on the users listed below.\n";
                                // + "Are you sure you want to proceed?";
                                setMessage(msg);