*/
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