Improve RAP security
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.admin / src / main / java / org / argeo / security / ui / admin / editors / ArgeoUserEditor.java
index 9b82e8783985325f4dfd3979e52125d035308a47..a0e4dfc82332faf44b9dfbc04e909e44b02fae4b 100644 (file)
@@ -1,44 +1,62 @@
 package org.argeo.security.ui.admin.editors;
 
+import javax.jcr.Node;
+
 import org.argeo.ArgeoException;
+import org.argeo.jcr.ArgeoNames;
 import org.argeo.security.ArgeoUser;
 import org.argeo.security.SimpleArgeoUser;
 import org.argeo.security.UserAdminService;
+import org.argeo.security.jcr.JcrUserDetails;
 import org.argeo.security.nature.SimpleUserNature;
+import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.views.UsersView;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.forms.editor.FormEditor;
+import org.springframework.security.userdetails.UserDetailsManager;
 
 /** Editor for an Argeo user. */
 public class ArgeoUserEditor extends FormEditor {
        public final static String ID = "org.argeo.security.ui.admin.adminArgeoUserEditor";
 
        private ArgeoUser user;
+       private JcrUserDetails userDetails;
+       private Node userHome;
        private UserAdminService userAdminService;
+       private UserDetailsManager userDetailsManager;
 
        public void init(IEditorSite site, IEditorInput input)
                        throws PartInitException {
                super.init(site, input);
+               userHome = ((ArgeoUserEditorInput) getEditorInput()).getUserHome();
                String username = ((ArgeoUserEditorInput) getEditorInput())
                                .getUsername();
+
+               userDetails = (JcrUserDetails) userDetailsManager
+                               .loadUserByUsername(username);
+
                if (username == null) {// new
                        user = new SimpleArgeoUser();
                        user.getUserNatures().put(SimpleUserNature.TYPE,
                                        new SimpleUserNature());
                } else
                        user = userAdminService.getUser(username);
+
                this.setPartProperty("name", username != null ? username : "<new user>");
                setPartName(username != null ? username : "<new user>");
        }
 
        protected void addPages() {
                try {
-                       addPage(new DefaultUserMainPage(this, userAdminService, user));
-
-               } catch (PartInitException e) {
-                       throw new ArgeoException("Not able to add page ", e);
+                       addPage(new DefaultUserMainPage(this,
+                                       userHome.getNode(ArgeoNames.ARGEO_USER_PROFILE)));
+                       addPage(new UserRolesPage(this, userDetails, userAdminService));
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot add pages", e);
                }
        }
 
@@ -46,15 +64,39 @@ public class ArgeoUserEditor extends FormEditor {
        public void doSave(IProgressMonitor monitor) {
                // list pages
                // TODO: make it more generic
-               findPage(DefaultUserMainPage.ID).doSave(monitor);
+               DefaultUserMainPage defaultUserMainPage = (DefaultUserMainPage) findPage(DefaultUserMainPage.ID);
+               if (defaultUserMainPage.isDirty()) {
+                       defaultUserMainPage.doSave(monitor);
+                       String newPassword = defaultUserMainPage.getNewPassword();
+                       defaultUserMainPage.resetNewPassword();
+                       if (newPassword != null)
+                               userDetails = userDetails.cloneWithNewPassword(newPassword);
+               }
 
-               if (userAdminService.userExists(user.getUsername()))
-                       userAdminService.updateUser(user);
-               else {
-                       userAdminService.newUser(user);
-                       setPartName(user.getUsername());
+               UserRolesPage userRolesPage = (UserRolesPage) findPage(UserRolesPage.ID);
+               if (userRolesPage.isDirty()) {
+                       userRolesPage.doSave(monitor);
+                       userDetails = userDetails.cloneWithNewRoles(userRolesPage
+                                       .getRoles());
                }
+
+               userDetailsManager.updateUser(userDetails);
+
+               // if (userAdminService.userExists(user.getUsername()))
+               // userAdminService.updateUser(user);
+               // else {
+               // userAdminService.newUser(user);
+               // setPartName(user.getUsername());
+               // }
                firePropertyChange(PROP_DIRTY);
+
+               userRolesPage.setUserDetails(userDetails);
+
+               // refresh users view
+               IWorkbench iw = SecurityAdminPlugin.getDefault().getWorkbench();
+               UsersView usersView = (UsersView) iw.getActiveWorkbenchWindow()
+                               .getActivePage().findView(UsersView.ID);
+               usersView.refresh();
        }
 
        @Override
@@ -66,7 +108,17 @@ public class ArgeoUserEditor extends FormEditor {
                return false;
        }
 
+       public void refresh() {
+               UserRolesPage userRolesPage = (UserRolesPage) findPage(UserRolesPage.ID);
+               userRolesPage.refresh();
+       }
+
        public void setUserAdminService(UserAdminService userAdminService) {
                this.userAdminService = userAdminService;
        }
+
+       public void setUserDetailsManager(UserDetailsManager userDetailsManager) {
+               this.userDetailsManager = userDetailsManager;
+       }
+
 }