X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.app.ui%2Fsrc%2Forg%2Fargeo%2Fapp%2Fui%2Fpeople%2FPersonUiProvider.java;h=5ff00a7d124e53a5420d9edfe3f46f58d0151efc;hb=0b492f2cfb8a24ec84e1dd52825624f5e9ab7e81;hp=d1dfd7861ff7ad85fd35d981c24dfdf99876a55f;hpb=d917d2b10162a29cddaf8c81c362efa37abcaab9;p=gpl%2Fargeo-suite.git diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java index d1dfd78..5ff00a7 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java @@ -5,17 +5,27 @@ import java.util.List; import java.util.Map; import org.argeo.api.acr.Content; +import org.argeo.api.acr.QNamed; +import org.argeo.api.acr.ldap.LdapAttrs; +import org.argeo.api.acr.ldap.LdapObjs; +import org.argeo.api.cms.directory.CmsUser; +import org.argeo.api.cms.directory.CmsUserManager; +import org.argeo.app.api.SuiteRole; import org.argeo.app.ui.SuiteMsg; import org.argeo.app.ui.SuiteStyle; import org.argeo.app.ui.SuiteUiUtils; -import org.argeo.cms.CmsUserManager; +import org.argeo.cms.CmsMsg; +import org.argeo.cms.CurrentUser; import org.argeo.cms.Localized; +import org.argeo.cms.RoleNameUtils; +import org.argeo.cms.SystemRole; +import org.argeo.cms.auth.CmsRole; import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.Selected; import org.argeo.cms.swt.acr.SwtSection; import org.argeo.cms.swt.acr.SwtUiProvider; +import org.argeo.cms.swt.dialogs.CmsFeedback; import org.argeo.cms.swt.widgets.EditableText; -import org.argeo.util.naming.LdapAttrs; -import org.argeo.util.naming.LdapObjs; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; @@ -26,12 +36,11 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; -import org.osgi.service.useradmin.User; /** Edit a suite user. */ public class PersonUiProvider implements SwtUiProvider { - private String[] availableRoles; private CmsUserManager cmsUserManager; @Override @@ -41,27 +50,29 @@ public class PersonUiProvider implements SwtUiProvider { main.setLayout(new GridLayout(2, false)); - User user = context.adapt(User.class); + CmsUser user = context.adapt(CmsUser.class); + + Content hierarchyUnitContent = context.getParent().getParent(); + + String roleContext = RoleNameUtils.getContext(user.getName()); if (context.hasContentClass(LdapObjs.person.qName())) { + addFormLine(main, SuiteMsg.firstName, context, LdapAttrs.givenName); addFormLine(main, SuiteMsg.lastName, context, LdapAttrs.sn); addFormLine(main, SuiteMsg.email, context, LdapAttrs.mail); + } - Composite rolesSection = new Composite(main, SWT.NONE); - // rolesSection.setText("Roles"); - rolesSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); - rolesSection.setLayout(new GridLayout()); - // new Label(rolesSection, SWT.NONE).setText("Roles:"); - List roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName())); - for (String role : roles) { - // new Label(rolesSection, SWT.NONE).setText(role); - Button radio = new Button(rolesSection, SWT.CHECK); - radio.setText(role); - if (roles.contains(role)) - radio.setSelection(true); + if (context.hasContentClass(LdapObjs.posixAccount.qName())) { + if (hierarchyUnitContent.hasContentClass(LdapObjs.organization)) { + SwtSection rolesSection = new SwtSection(main, SWT.NONE); + rolesSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + rolesSection.setLayout(new GridLayout(2, false)); + List roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName())); + addRoleCheckBox(rolesSection, SuiteMsg.coworkerRole, SuiteRole.coworker, roleContext, roles); + addRoleCheckBox(rolesSection, SuiteMsg.publisherRole, SuiteRole.publisher, roleContext, roles); + addRoleCheckBox(rolesSection, SuiteMsg.userAdminRole, CmsRole.userAdmin, roleContext, roles); } - // Composite facetsSection = new Composite(main, SWT.NONE); // facetsSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); // facetsSection.setLayout(new GridLayout()); @@ -71,66 +82,56 @@ public class PersonUiProvider implements SwtUiProvider { // new Label(facetsSection, SWT.NONE).setText(member); // } // } + if (CurrentUser.implies(CmsRole.userAdmin, roleContext)) { + SwtSection changePasswordSection = new SwtSection(main, SWT.BORDER); + changePasswordSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + changePasswordSection.setLayout(new GridLayout(2, false)); +// SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.changePassword) +// .setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, 2, 1)); + SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.newPassword); + Text newPasswordT = SuiteUiUtils.addFormTextField(changePasswordSection, null, null, + SWT.PASSWORD | SWT.BORDER); + newPasswordT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.repeatNewPassword); + Text repeatNewPasswordT = SuiteUiUtils.addFormTextField(changePasswordSection, null, null, + SWT.PASSWORD | SWT.BORDER); + repeatNewPasswordT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + Button apply = new Button(changePasswordSection, SWT.FLAT); + apply.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false, 2, 1)); + apply.setText(CmsMsg.changePassword.lead()); + apply.addSelectionListener((Selected) (e) -> { + try { + char[] newPassword = newPasswordT.getTextChars(); + char[] repeatNewPassword = repeatNewPasswordT.getTextChars(); + if (newPassword.length > 0 && Arrays.equals(newPassword, repeatNewPassword)) { + cmsUserManager.resetPassword(user.getName(), newPassword); + CmsFeedback.show(CmsMsg.passwordChanged.lead()); + } else { + CmsFeedback.error(CmsMsg.invalidPassword.lead(), null); + } + } catch (Exception e1) { + CmsFeedback.error(CmsMsg.invalidPassword.lead(), e1); + } + }); + } } -// if (user instanceof Group) { -// String cn = context.getName().getLocalPart(); -// Text cnT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name())); -// cnT.setText(cn); -// -// } else { -// String uid = context.getName().getLocalPart(); -// -//// Text givenName = new Text(main, SWT.SINGLE); -//// givenName.setText(getUserProperty(user, LdapAttrs.givenName.name())); -// Text givenName = SuiteUiUtils.addFormInput(main, SuiteMsg.firstName.lead(), -// getUserProperty(user, LdapAttrs.givenName.name())); -// -// Text sn = SuiteUiUtils.addFormInput(main, SuiteMsg.lastName.lead(), -// getUserProperty(user, LdapAttrs.sn.name())); -// // sn.setText(getUserProperty(user, LdapAttrs.sn.name())); -// -// Text email = SuiteUiUtils.addFormInput(main, SuiteMsg.email.lead(), -// getUserProperty(user, LdapAttrs.mail.name())); -// // email.setText(getUserProperty(user, LdapAttrs.mail.name())); -// -// Text uidT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name())); -// uidT.setText(uid); -// -//// Label dnL = new Label(main, SWT.NONE); -//// dnL.setText(user.getName()); -// -// // roles -// // Section rolesSection = new Section(main, SWT.NONE, context); -// Composite rolesSection = new Composite(main, SWT.NONE); -// // rolesSection.setText("Roles"); -// rolesSection.setLayoutData(CmsSwtUtils.fillWidth()); -// rolesSection.setLayout(new GridLayout()); -// // new Label(rolesSection, SWT.NONE).setText("Roles:"); -// List roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName())); -// for (String role : availableRoles) { -// // new Label(rolesSection, SWT.NONE).setText(role); -// Button radio = new Button(rolesSection, SWT.CHECK); -// radio.setText(role); -// if (roles.contains(role)) -// radio.setSelection(true); -// } -// } - return main; } - private void addFormLine(SwtSection parent, Localized msg, Content context, LdapAttrs attr) { + private void addFormLine(SwtSection parent, Localized msg, Content content, QNamed attr) { SuiteUiUtils.addFormLabel(parent, msg.lead()); EditableText text = new EditableText(parent, SWT.SINGLE | SWT.FLAT); text.setLayoutData(CmsSwtUtils.fillWidth()); text.setStyle(SuiteStyle.simpleInput); - String txt = context.attr(attr.qName()); + String txt = content.attr(attr); if (txt == null) // FIXME understand why email is not found in IPA txt = ""; text.setText(txt); text.setMouseListener(new MouseAdapter() { + private static final long serialVersionUID = 1L; + @Override public void mouseDoubleClick(MouseEvent e) { String currentTxt = text.getText(); @@ -138,6 +139,8 @@ public class PersonUiProvider implements SwtUiProvider { text.setText(currentTxt); ((Text) text.getControl()).addSelectionListener(new SelectionListener() { + private static final long serialVersionUID = 1L; + @Override public void widgetSelected(SelectionEvent e) { } @@ -155,17 +158,40 @@ public class PersonUiProvider implements SwtUiProvider { }); } + private void addRoleCheckBox(SwtSection parent, Localized msg, SystemRole systemRole, String roleContext, + List roles) { + Button radio = new Button(parent, SWT.CHECK); + radio.setSelection(false); + roles: for (String dn : roles) { + if (systemRole.implied(dn, roleContext)) { + radio.setSelection(true); + break roles; + } + } + + if (systemRole.equals(CmsRole.userAdmin)) { + if (!CurrentUser.isUserContext(roleContext) && CurrentUser.implies(CmsRole.userAdmin, roleContext)) { + // a user admin cannot modify the user admins of their own context + radio.setEnabled(true); + } else { + radio.setEnabled(false); + } + } else { + radio.setEnabled(CurrentUser.implies(CmsRole.userAdmin, roleContext)); + } + new Label(parent, 0).setText(msg.lead()); + + } + public void setCmsUserManager(CmsUserManager cmsUserManager) { this.cmsUserManager = cmsUserManager; } - private String getUserProperty(Object element, String key) { - Object value = ((User) element).getProperties().get(key); - return value != null ? value.toString() : null; - } +// private String getUserProperty(Object element, String key) { +// Object value = ((User) element).getProperties().get(key); +// return value != null ? value.toString() : null; +// } public void init(Map properties) { - availableRoles = (String[]) properties.get("availableRoles"); - // cmsUserManager.getRoles(null); } }