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(); } } }