Create new user as a POSIX account
[gpl/argeo-suite.git] / org.argeo.app.ui / src / org / argeo / app / ui / people / NewUserForm.java
diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java b/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java
new file mode 100644 (file)
index 0000000..ed9c4f4
--- /dev/null
@@ -0,0 +1,162 @@
+package org.argeo.app.ui.people;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.argeo.api.acr.Content;
+import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.ui.SuiteMsg;
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
+import org.argeo.cms.ux.widgets.AbstractGuidedForm;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.util.directory.HierarchyUnit;
+import org.argeo.util.naming.LdapAttrs;
+import org.argeo.util.naming.LdapObjs;
+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.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.osgi.service.useradmin.User;
+
+/** Ask first & last name. Update the passed node on finish */
+public class NewUserForm extends AbstractGuidedForm {
+       private Content hierarchyUnit;
+       private CmsUserManager cmsUserManager;
+
+       protected Text lastNameT;
+       protected Text firstNameT;
+       protected Text emailT;
+
+       public NewUserForm(CmsUserManager cmsUserManager, Content hierarchyUnit) {
+               this.hierarchyUnit = hierarchyUnit;
+               if (!hierarchyUnit.hasContentClass(LdapObjs.posixGroup.qName()))
+                       throw new IllegalArgumentException(hierarchyUnit + " is not a POSIX group");
+               this.cmsUserManager = cmsUserManager;
+       }
+
+       @Override
+       public void addPages() {
+               try {
+                       MainInfoPage page = new MainInfoPage("Main page");
+                       addPage(page);
+               } catch (Exception e) {
+                       throw new RuntimeException("Cannot add page to wizard", e);
+               }
+               setFormTitle(SuiteMsg.personWizardWindowTitle.lead());
+       }
+
+       /**
+        * Called when the user click on 'Finish' in the wizard. The task is then
+        * created and the corresponding session saved.
+        */
+       @Override
+       public boolean performFinish() {
+               String lastName = lastNameT.getText();
+               String firstName = firstNameT.getText();
+               String email = emailT.getText();
+               if (EclipseUiUtils.isEmpty(lastName) || EclipseUiUtils.isEmpty(firstName) || EclipseUiUtils.isEmpty(email)) {
+                       CmsFeedback.show(SuiteMsg.allFieldsMustBeSet.lead());
+                       return false;
+               } else {
+                       UUID uuid = UUID.randomUUID();
+                       String shortId = uuid.toString().split("-")[0];
+                       String uid = "u" + shortId;
+                       HierarchyUnit hu = hierarchyUnit.adapt(HierarchyUnit.class);
+                       String username = "uid=" + uid + ",ou=People," + hu.getBase();
+
+                       Map<String, Object> properties = new HashMap<>();
+                       properties.put(LdapAttrs.givenName.name(), firstName);
+                       properties.put(LdapAttrs.sn.name(), lastName);
+                       properties.put(LdapAttrs.mail.name(), email);
+                       properties.put(LdapAttrs.cn.name(), firstName + " " + lastName);
+                       properties.put(LdapAttrs.employeeNumber.name(), uuid.toString());
+
+                       Map<String, Object> credentials = new HashMap<>();
+                       User user = cmsUserManager.createUser(username, properties, credentials);
+
+                       Long huGidNumber = hierarchyUnit.get(LdapAttrs.gidNumber.qName(), Long.class).orElseThrow();
+                       Long nextUserId = SuiteUtils.findNextId(hierarchyUnit, LdapObjs.posixAccount.qName());
+                       String homeDirectory = "/home/" + uid;
+                       Map<String, Object> additionalProperties = new HashMap<>();
+                       additionalProperties.put(LdapAttrs.uidNumber.name(), nextUserId.toString());
+                       additionalProperties.put(LdapAttrs.gidNumber.name(), huGidNumber.toString());
+                       additionalProperties.put(LdapAttrs.homeDirectory.name(), homeDirectory);
+
+                       Set<String> objectClasses = new HashSet<>();
+                       objectClasses.add(LdapObjs.posixAccount.name());
+                       cmsUserManager.addObjectClasses(user, objectClasses, additionalProperties);
+                       return true;
+               }
+       }
+
+       @Override
+       public boolean performCancel() {
+               return true;
+       }
+
+       @Override
+       public boolean canFinish() {
+               String lastName = lastNameT.getText();
+               String firstName = firstNameT.getText();
+               String email = emailT.getText();
+               if (isEmpty(lastName) || isEmpty(firstName) || isEmpty(email)) {
+                       return false;
+               } else
+                       return true;
+       }
+
+       protected class MainInfoPage extends SwtGuidedFormPage {
+
+               public MainInfoPage(String pageName) {
+                       super(pageName);
+                       setTitle(SuiteMsg.personWizardPageTitle.lead());
+               }
+
+               public void createControl(Composite parent) {
+                       parent.setLayout(new GridLayout(2, false));
+
+                       // FirstName
+                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.firstName);
+                       firstNameT = new Text(parent, SWT.BORDER);
+                       // firstNameTxt.setMessage("a first name");
+                       firstNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       // LastName
+                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.lastName);
+                       lastNameT = new Text(parent, SWT.BORDER);
+                       // lastNameTxt.setMessage("a last name");
+                       lastNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.email);
+                       emailT = new Text(parent, SWT.BORDER);
+                       emailT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       ModifyListener ml = new ModifyListener() {
+                               private static final long serialVersionUID = 1939491923843870844L;
+
+                               @Override
+                               public void modifyText(ModifyEvent event) {
+                                       getView().updateButtons();
+                               }
+                       };
+
+                       firstNameT.addModifyListener(ml);
+                       lastNameT.addModifyListener(ml);
+                       emailT.addModifyListener(ml);
+
+                       firstNameT.setFocus();
+               }
+       }
+}