From 15c69c8b17d393d554f95d7945e379133d6488fd Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Fri, 11 Sep 2015 11:00:31 +0000 Subject: [PATCH] First draft of User Creation wizard git-svn-id: https://svn.argeo.org/commons/trunk@8384 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../security/ui/admin/commands/NewUser.java | 252 ++++++++++++++++-- .../ui/admin/internal/UiAdminUtils.java | 11 + .../security/ui/admin/views/GroupsView.java | 6 +- .../security/ui/admin/views/UsersView.java | 8 +- 4 files changed, 243 insertions(+), 34 deletions(-) diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java index c2442c48a..235e4d7e9 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java @@ -15,52 +15,246 @@ */ 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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java index d1596190a..1cd9c0e3a 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java @@ -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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java index bb64a3d4b..dd9456c8c 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java @@ -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); diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java index 31586085b..d380f0cc1 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java @@ -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() { -- 2.39.2