X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Finternal%2Fcommands%2FNewUser.java;h=c04c83562f3cad02fdbbed82a40b5eedf4cd728e;hb=8260f4470f514ea347ca53f5b4dfc632c4a4de66;hp=a0b8da2fa22c6e7c78ad7e109f3703f73b8176de;hpb=732542c8de267ed7d6cbb8c66b84cc90c8ad22d7;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java index a0b8da2fa..c04c83562 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java @@ -16,14 +16,21 @@ package org.argeo.security.ui.admin.internal.commands; import java.util.Dictionary; +import java.util.List; +import java.util.Map; +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import javax.naming.ldap.Rdn; + +import org.argeo.cms.CmsException; +import org.argeo.cms.util.useradmin.UserAdminUtils; 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.osgi.useradmin.LdifName; +import org.argeo.osgi.useradmin.UserAdminConf; 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.internal.UserAdminWrapper; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; @@ -34,8 +41,11 @@ 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.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.handlers.HandlerUtil; import org.osgi.service.useradmin.Role; @@ -44,40 +54,28 @@ 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 this tip. + */ + 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 = SecurityAdminPlugin.PLUGIN_ID + ".newUser"; /* DEPENDENCY INJECTION */ private UserAdminWrapper userAdminWrapper; - // 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 { NewUserWizard newUserWizard = new NewUserWizard(); + newUserWizard.setWindowTitle("User creation"); WizardDialog dialog = new WizardDialog( HandlerUtil.getActiveShell(event), newUserWizard); - dialog.open(); - - // // Force refresh until the listener are implemented - // if (Window.OK == dialog.open()) - // forceRefresh(event); return null; } - // 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(); - // } - private class NewUserWizard extends Wizard { // pages @@ -86,15 +84,18 @@ public class NewUser extends AbstractHandler { // End user fields private Text dNameTxt, usernameTxt, firstNameTxt, lastNameTxt, primaryMailTxt, pwd1Txt, pwd2Txt; + private Combo baseDnCmb; public NewUserWizard() { + } @Override public void addPages() { mainUserInfo = new MainUserInfoWizardPage(); addPage(mainUserInfo); - String message = "Dummy wizard to ease user creation tests:\n Mail and last name are automatically " + String message = "Default wizard that also eases user creation tests:\n " + + "Mail and last name are automatically " + "generated form the uid. Password are defauted to 'demo'."; mainUserInfo.setMessage(message, WizardPage.WARNING); } @@ -105,33 +106,33 @@ public class NewUser extends AbstractHandler { if (!canFinish()) return false; String username = mainUserInfo.getUsername(); + userAdminWrapper.beginTransactionIfNeeded(); try { - userAdminWrapper.beginTransactionIfNeeded(); - char[] password = mainUserInfo.getPassword(); User user = (User) userAdminWrapper.getUserAdmin().createRole( getDn(username), Role.USER); Dictionary props = user.getProperties(); String lastNameStr = lastNameTxt.getText(); - if (UiAdminUtils.notNull(lastNameStr)) - props.put(UserAdminConstants.KEY_LASTNAME, lastNameStr); + if (EclipseUiUtils.notEmpty(lastNameStr)) + props.put(LdifName.sn.name(), lastNameStr); String firstNameStr = firstNameTxt.getText(); - if (UiAdminUtils.notNull(firstNameStr)) - props.put(UserAdminConstants.KEY_FIRSTNAME, firstNameStr); + if (EclipseUiUtils.notEmpty(firstNameStr)) + props.put(LdifName.givenName.name(), firstNameStr); - String cn = UiAdminUtils - .getDefaultCn(firstNameStr, lastNameStr); - if (UiAdminUtils.notNull(cn)) - props.put(UserAdminConstants.KEY_CN, cn); + String cn = UserAdminUtils.buildDefaultCn(firstNameStr, + lastNameStr); + if (EclipseUiUtils.notEmpty(cn)) + props.put(LdifName.cn.name(), cn); String mailStr = primaryMailTxt.getText(); - if (UiAdminUtils.notNull(mailStr)) - props.put(UserAdminConstants.KEY_MAIL, mailStr); + if (EclipseUiUtils.notEmpty(mailStr)) + props.put(LdifName.mail.name(), mailStr); + char[] password = mainUserInfo.getPassword(); user.getCredentials().put(null, password); - + userAdminWrapper.commitOrNotifyTransactionStateChange(); userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CREATED, user)); return true; @@ -157,6 +158,20 @@ public class NewUser extends AbstractHandler { dNameTxt = EclipseUiUtils.createGridLT(composite, "Distinguished name", this); dNameTxt.setEnabled(false); + + baseDnCmb = createGridLC(composite, "Base DN"); + initialiseDnCmb(baseDnCmb); + baseDnCmb.addModifyListener(this); + baseDnCmb.addModifyListener(new ModifyListener() { + private static final long serialVersionUID = -1435351236582736843L; + + @Override + public void modifyText(ModifyEvent event) { + String name = usernameTxt.getText(); + dNameTxt.setText(getDn(name)); + } + }); + usernameTxt = EclipseUiUtils.createGridLT(composite, "Local ID", this); usernameTxt.addModifyListener(new ModifyListener() { @@ -174,7 +189,7 @@ public class NewUser extends AbstractHandler { } else { dNameTxt.setText(getDn(name)); lastNameTxt.setText(name.toUpperCase()); - primaryMailTxt.setText(name + "@example.com"); + primaryMailTxt.setText(getMail(name)); pwd1Txt.setText("demo"); pwd2Txt.setText("demo"); } @@ -221,8 +236,7 @@ public class NewUser extends AbstractHandler { .getRole(getDn(name)); if (role != null) return "User " + name + " already exists"; - if (!primaryMailTxt.getText().matches( - UserAdminService.EMAIL_PATTERN)) + if (!primaryMailTxt.getText().matches(EMAIL_PATTERN)) return "Not a valid email address"; if (lastNameTxt.getText().trim().equals("")) return "Specify a last name"; @@ -239,7 +253,10 @@ public class NewUser extends AbstractHandler { public void setVisible(boolean visible) { super.setVisible(visible); if (visible) - usernameTxt.setFocus(); + if (baseDnCmb.getSelectionIndex() == -1) + baseDnCmb.setFocus(); + else + usernameTxt.setFocus(); } public String getUsername() { @@ -251,6 +268,57 @@ public class NewUser extends AbstractHandler { } } + + private Map getDns() { + return userAdminWrapper.getKnownBaseDns(true); + } + + private String getDn(String uid) { + Map dns = getDns(); + String bdn = baseDnCmb.getText(); + if (EclipseUiUtils.notEmpty(bdn)) { + Dictionary props = UserAdminConf.uriAsProperties(dns + .get(bdn)); + String dn = LdifName.uid.name() + "=" + uid + "," + + UserAdminConf.userBase.getValue(props) + "," + bdn; + return dn; + } + return null; + } + + private void initialiseDnCmb(Combo combo) { + Map dns = userAdminWrapper.getKnownBaseDns(true); + if (dns.isEmpty()) + throw new CmsException( + "No writable base dn found. Cannot create user"); + combo.setItems(dns.keySet().toArray(new String[0])); + if (dns.size() == 1) + combo.select(0); + } + + private String getMail(String username) { + if (baseDnCmb.getSelectionIndex() == -1) + return null; + String baseDn = baseDnCmb.getText(); + try { + LdapName name = new LdapName(baseDn); + List rdns = name.getRdns(); + return username + "@" + (String) rdns.get(1).getValue() + '.' + + (String) rdns.get(0).getValue(); + } catch (InvalidNameException e) { + throw new CmsException("Unable to generate mail for " + + username + " with base dn " + baseDn, e); + } + } + } + + private Combo createGridLC(Composite parent, String label) { + Label lbl = new Label(parent, SWT.LEAD); + lbl.setText(label); + lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY); + combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + return combo; } /* DEPENDENCY INJECTION */