Adapt to changes in Argeo Commons
[gpl/argeo-suite.git] / swt / org.argeo.app.ui / src / org / argeo / app / ui / people / PersonUiProvider.java
index d1dfd7861ff7ad85fd35d981c24dfdf99876a55f..73b1f738089d0d46e1aa3277d3db12f3261446ad 100644 (file)
@@ -5,17 +5,26 @@ 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.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 +35,12 @@ 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
@@ -43,24 +52,24 @@ public class PersonUiProvider implements SwtUiProvider {
 
                User user = context.adapt(User.class);
 
+               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:");
+               if (context.hasContentClass(LdapObjs.posixAccount.qName())) {
+
+                       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<String> 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);
-                       }
+                       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));
@@ -71,66 +80,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<String> 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 +137,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 +156,35 @@ public class PersonUiProvider implements SwtUiProvider {
                });
        }
 
+       private void addRoleCheckBox(SwtSection parent, Localized msg, SystemRole systemRole, String roleContext,
+                       List<String> 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))
+                       radio.setEnabled(CurrentUser.implies(CmsRole.groupAdmin, roleContext));
+               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<String, Object> properties) {
-               availableRoles = (String[]) properties.get("availableRoles");
-               // cmsUserManager.getRoles(null);
        }
 }