First draft of User Creation wizard
authorBruno Sinou <bsinou@argeo.org>
Fri, 11 Sep 2015 11:00:31 +0000 (11:00 +0000)
committerBruno Sinou <bsinou@argeo.org>
Fri, 11 Sep 2015 11:00:31 +0000 (11:00 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@8384 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java

index c2442c48ac9327ac3bd7020969a8b62bb7c390b7..235e4d7e9d084bb0b9370eb8e1ba47eaba5803c8 100644 (file)
  */
 package org.argeo.security.ui.admin.commands;
 
-import javax.jcr.Repository;
-import javax.jcr.Session;
+import java.util.Dictionary;
 
-import org.argeo.cms.users.NewUserWizard;
-import org.argeo.jcr.JcrUtils;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
+import org.argeo.jcr.ArgeoNames;
 import org.argeo.security.UserAdminService;
+import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.internal.UiAdminUtils;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
+import org.argeo.security.ui.admin.views.UsersView;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.handlers.HandlerUtil;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
 
-/** Launch a wizard that enables creation of a new user. */
+/** Open a wizard that enables creation of a new user. */
 public class NewUser extends AbstractHandler {
-       private Repository repository;
-       private UserAdminService userAdminService;
+       // private final static Log log = LogFactory.getLog(NewUser.class);
 
-       // private JcrSecurityModel jcrSecurityModel;
+       public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newUser";
+
+       private UserAdmin userAdmin;
+
+       // TODO implement a dynamic choice of the base dn
+       private String getDn(String uid) {
+               return "uid=" + uid + ",ou=users,dc=example,dc=com";
+       }
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
-               Session session = null;
-               try {
-                       session = repository.login();
-                       NewUserWizard newUserWizard = new NewUserWizard(session,
-                                       userAdminService);
-                       WizardDialog dialog = new WizardDialog(
-                                       HandlerUtil.getActiveShell(event), newUserWizard);
-                       dialog.open();
-               } catch (Exception e) {
-                       throw new ExecutionException("Cannot open wizard", e);
-               } finally {
-                       JcrUtils.logoutQuietly(session);
-               }
+               NewUserWizard newUserWizard = new NewUserWizard();
+               WizardDialog dialog = new WizardDialog(
+                               HandlerUtil.getActiveShell(event), newUserWizard);
+
+               // Force refresh until the listener are implemented
+               if (Window.OK == dialog.open())
+                       forceRefresh(event);
                return null;
        }
 
-       public void setRepository(Repository repository) {
-               this.repository = repository;
+       private void forceRefresh(ExecutionEvent event) {
+               IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
+               if (iww == null)
+                       return;
+               IWorkbenchPage activePage = iww.getActivePage();
+               IWorkbenchPart part = activePage.getActivePart();
+               if (part instanceof UsersView)
+                       ((UsersView) part).refresh();
        }
 
-       public void setUserAdminService(UserAdminService userAdminService) {
-               this.userAdminService = userAdminService;
+       public void setUserAdmin(UserAdmin userAdmin) {
+               this.userAdmin = userAdmin;
+       }
+
+       private class NewUserWizard extends Wizard {
+
+               // pages
+               private MainUserInfoWizardPage mainUserInfo;
+
+               // End user fields
+               private Text dNameTxt, usernameTxt, firstNameTxt, lastNameTxt,
+                               primaryMailTxt, pwd1Txt, pwd2Txt;
+
+               public NewUserWizard() {
+               }
+
+               @Override
+               public void addPages() {
+                       mainUserInfo = new MainUserInfoWizardPage();
+                       addPage(mainUserInfo);
+                       String message = "Dummy wizard to ease user creation tests: mail, last name are automatically "
+                                       + "generated form the uid, password are defauted to 'demo'.";
+                       mainUserInfo.setMessage(message, WizardPage.WARNING);
+               }
+
+               @SuppressWarnings({ "rawtypes", "unchecked" })
+               @Override
+               public boolean performFinish() {
+                       if (!canFinish())
+                               return false;
+                       String username = mainUserInfo.getUsername();
+                       try {
+                               char[] password = mainUserInfo.getPassword();
+                               User user = (User) userAdmin.createRole(getDn(username),
+                                               Role.USER);
+
+                               Dictionary props = user.getProperties();
+
+                               String lastNameStr = lastNameTxt.getText();
+                               if (UiAdminUtils.notNull(lastNameStr))
+                                       props.put(UserAdminConstants.KEY_LASTNAME, lastNameStr);
+
+                               String firstNameStr = firstNameTxt.getText();
+                               if (UiAdminUtils.notNull(firstNameStr))
+                                       props.put(UserAdminConstants.KEY_FIRSTNAME, firstNameStr);
+
+                               String cn = UiAdminUtils
+                                               .getDefaultCn(firstNameStr, lastNameStr);
+                               if (UiAdminUtils.notNull(cn))
+                                       props.put(UserAdminConstants.KEY_CN, cn);
+
+                               String mailStr = primaryMailTxt.getText();
+                               if (UiAdminUtils.notNull(mailStr))
+                                       props.put(UserAdminConstants.KEY_MAIL, mailStr);
+
+                               // TODO MANAGE Password
+                               // pwd1Txt.getText();
+                               return true;
+                       } catch (Exception e) {
+                               ErrorFeedback.show("Cannot create new user " + username, e);
+                               return false;
+                       }
+               }
+
+               private class MainUserInfoWizardPage extends WizardPage implements
+                               ModifyListener, ArgeoNames {
+                       private static final long serialVersionUID = -3150193365151601807L;
+
+                       public MainUserInfoWizardPage() {
+                               super("Main");
+                               setTitle("Required Information");
+                       }
+
+                       @Override
+                       public void createControl(Composite parent) {
+                               Composite composite = new Composite(parent, SWT.NONE);
+                               composite.setLayout(new GridLayout(2, false));
+                               dNameTxt = EclipseUiUtils.createGridLT(composite,
+                                               "Distinguished name", this);
+                               dNameTxt.setEnabled(false);
+                               usernameTxt = EclipseUiUtils.createGridLT(composite,
+                                               "Local ID", this);
+                               usernameTxt.addModifyListener(new ModifyListener() {
+                                       private static final long serialVersionUID = -1435351236582736843L;
+
+                                       @Override
+                                       public void modifyText(ModifyEvent event) {
+                                               String name = usernameTxt.getText();
+                                               if (name.trim().equals("")) {
+                                                       dNameTxt.setText("");
+                                                       lastNameTxt.setText("");
+                                                       primaryMailTxt.setText("");
+                                                       pwd1Txt.setText("");
+                                                       pwd2Txt.setText("");
+                                               } else {
+                                                       dNameTxt.setText(getDn(name));
+                                                       lastNameTxt.setText(name.toUpperCase());
+                                                       primaryMailTxt.setText(name + "@example.com");
+                                                       pwd1Txt.setText("demo");
+                                                       pwd2Txt.setText("demo");
+                                               }
+                                       }
+                               });
+
+                               primaryMailTxt = EclipseUiUtils.createGridLT(composite,
+                                               "Email", this);
+                               firstNameTxt = EclipseUiUtils.createGridLT(composite,
+                                               "First name", this);
+                               lastNameTxt = EclipseUiUtils.createGridLT(composite,
+                                               "Last name", this);
+                               pwd1Txt = EclipseUiUtils.createGridLP(composite, "Password",
+                                               this);
+                               pwd2Txt = EclipseUiUtils.createGridLP(composite,
+                                               "Repeat password", this);
+                               setControl(composite);
+
+                               // Initialize buttons
+                               setPageComplete(false);
+                               getContainer().updateButtons();
+                       }
+
+                       @Override
+                       public void modifyText(ModifyEvent event) {
+                               String message = checkComplete();
+                               if (message != null) {
+                                       setMessage(message, WizardPage.ERROR);
+                                       setPageComplete(false);
+                               } else {
+                                       setMessage("Complete", WizardPage.INFORMATION);
+                                       setPageComplete(true);
+                               }
+                               getContainer().updateButtons();
+                       }
+
+                       /** @return error message or null if complete */
+                       protected String checkComplete() {
+                               String name = usernameTxt.getText();
+
+                               if (name.trim().equals(""))
+                                       return "User name must not be empty";
+                               Role role = userAdmin.getRole(getDn(name));
+                               if (role != null)
+                                       return "User " + name + " already exists";
+                               if (!primaryMailTxt.getText().matches(
+                                               UserAdminService.EMAIL_PATTERN))
+                                       return "Not a valid email address";
+                               if (lastNameTxt.getText().trim().equals(""))
+                                       return "Specify a last name";
+                               if (pwd1Txt.getText().trim().equals(""))
+                                       return "Specify a password";
+                               if (pwd2Txt.getText().trim().equals(""))
+                                       return "Repeat the password";
+                               if (!pwd2Txt.getText().equals(pwd1Txt.getText()))
+                                       return "Passwords are different";
+                               return null;
+                       }
+
+                       @Override
+                       public void setVisible(boolean visible) {
+                               super.setVisible(visible);
+                               if (visible)
+                                       usernameTxt.setFocus();
+                       }
+
+                       public String getUsername() {
+                               return usernameTxt.getText();
+                       }
+
+                       public char[] getPassword() {
+                               return pwd1Txt.getTextChars();
+                       }
+
+               }
        }
 
-       // public void setJcrSecurityModel(JcrSecurityModel jcrSecurityModel) {
-       // this.jcrSecurityModel = jcrSecurityModel;
-       // }
+       // Local helpers
 
-}
+}
\ No newline at end of file
index d1596190a906b3a7812046a13268dc833fa0a974..1cd9c0e3a5f7da528e35a4d0b4dd833651b7c337 100644 (file)
@@ -16,8 +16,19 @@ public class UiAdminUtils {
 
        }
 
+       public final static String getDefaultCn(String firstName, String lastName) {
+               return (firstName.trim() + " " + lastName.trim() + " ").trim();
+       }
+
        /*
         * INTERNAL METHODS: Below methods are meant to stay here and are not part
         * of a potential generic backend to manage the useradmin
         */
+       public final static boolean notNull(String string) {
+               if (string == null)
+                       return false;
+               else
+                       return !"".equals(string.trim());
+       }
+
 }
\ No newline at end of file
index bb64a3d4b26518ef0dc9d9ca391fa589651ce19f..dd9456c8c2d2b58d95d1a4e2e60e178c5b9f7707 100644 (file)
@@ -52,11 +52,11 @@ public class GroupsView extends UsersView implements ArgeoNames {
        public void createPartControl(Composite parent) {
                parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
                // Define the displayed columns
-               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 200));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
-
+               columnDefs.add(new ColumnDefinition(new UserNameLP(),
+                               "Distinguished Name", 300));
+               
                // Create and configure the table
                userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
                                | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
index 31586085bddbd62969e627d2b6c39f11e52055f2..d380f0cc1ed8b4204d68f25989edd7a4cd64384c 100644 (file)
@@ -54,11 +54,11 @@ public class UsersView extends ViewPart implements ArgeoNames {
        public void createPartControl(Composite parent) {
                parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
                // Define the displayed columns
-               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 200));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
                columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
+               columnDefs.add(new ColumnDefinition(new UserNameLP(),
+                               "Distinguished Name", 300));
 
                // Create and configure the table
                userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
@@ -102,6 +102,10 @@ public class UsersView extends ViewPart implements ArgeoNames {
                }
        }
 
+       public void refresh() {
+               userTableViewerCmp.refresh();
+       }
+
        // Override generic view methods
        @Override
        public void dispose() {