X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2Fpeople%2FNewUserForm.java;fp=org.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2Fpeople%2FNewUserForm.java;h=ed9c4f40712c6fd2c45498fbb72635a0e128adf0;hb=b32a7ed960be8dbaa50e605a409c14402db5b489;hp=0000000000000000000000000000000000000000;hpb=84dffc3e1e2b16317533d13bf30d160f25ec7ced;p=gpl%2Fargeo-suite.git 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 index 0000000..ed9c4f4 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java @@ -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 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 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 additionalProperties = new HashMap<>(); + additionalProperties.put(LdapAttrs.uidNumber.name(), nextUserId.toString()); + additionalProperties.put(LdapAttrs.gidNumber.name(), huGidNumber.toString()); + additionalProperties.put(LdapAttrs.homeDirectory.name(), homeDirectory); + + Set 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(); + } + } +}