X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fusers%2FUsers.java;h=2637ed4d9afeeb923af00e3a6bb3a829805c0071;hb=566b27535d7f8ebf90529ec2f714a4ac17f1cc60;hp=c8a9cc497fb3ba28b67655c5683f525949dbadfa;hpb=b5a45cd0f6a753c25d72d6e8df1ce5fdb7e6651d;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/users/Users.java b/org.argeo.cms/src/org/argeo/cms/users/Users.java index c8a9cc497..2637ed4d9 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/Users.java +++ b/org.argeo.cms/src/org/argeo/cms/users/Users.java @@ -1,48 +1,147 @@ package org.argeo.cms.users; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.security.AccessControlManager; import javax.jcr.security.Privilege; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; import org.argeo.cms.CmsUiProvider; -import org.argeo.cms.CmsUtils; import org.argeo.cms.maintenance.NonAdminPage; +import org.argeo.cms.util.CmsUtils; import org.argeo.eclipse.ui.parts.UsersTable; +import org.argeo.jcr.ArgeoNames; import org.argeo.jcr.JcrUtils; +import org.argeo.security.UserAdminService; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +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.springframework.security.provisioning.UserDetailsManager; +/** + * Simple page to manage users of a given repository. We still rely on Argeo + * model; with user stored in the main workspace + */ public class Users implements CmsUiProvider { + private final static Log log = LogFactory.getLog(Users.class); + + // Enable user CRUD // INJECTED + private UserAdminService userAdminService; + // private UserDetailsManager userDetailsManager; + private String userWkspName; + + // Local UI Providers NonAdminPage nap = new NonAdminPage(); + UserPage userPage = new UserPage(); + // Manage authorization @Override public Control createUi(Composite parent, Node context) throws RepositoryException { - if (isAdmin(context)) { Session session = context.getSession().getRepository() - .login("main"); - return createUsersTable(parent, session); + .login(userWkspName); + return createMainLayout(parent, session); } else nap.createUi(parent, context); return null; + } + + // Main layout + // Left: User Table - Right User Details Edition + private Control createMainLayout(Composite parent, final Session session) + throws RepositoryException { + + Composite layoutCmp = new Composite(parent, SWT.NO_FOCUS); + layoutCmp.setLayoutData(CmsUtils.fillAll()); + layoutCmp + .setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(2, true))); + + Composite left = new Composite(layoutCmp, SWT.NO_FOCUS); + left.setLayoutData(CmsUtils.fillAll()); + UsersTable table = createUsersTable(left, session); + + final Composite right = new Composite(layoutCmp, SWT.NO_FOCUS); + right.setLayoutData(CmsUtils.fillAll()); + // Composite innerPage = createUserPage(right); + // final UserViewerOld userViewer = new UserViewerOld(innerPage); + + final TableViewer viewer = table.getTableViewer(); + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + @Override + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection selection = (IStructuredSelection) viewer + .getSelection(); + if (selection.isEmpty()) { + // Should we clean the right column? + return; + } else { + Node context = (Node) selection.getFirstElement(); + try { + CmsUtils.clear(right); + userPage.createUi(right, context); + right.layout(); + right.getParent().layout(); + } catch (RepositoryException e) { + e.printStackTrace(); + throw new ArgeoException("unable to create " + + "editor for user " + context, e); + } + } + } + }); + return left; } - private Control createUsersTable(Composite parent, final Session session) + private UsersTable createUsersTable(Composite parent, final Session session) throws RepositoryException { + parent.setLayout(CmsUtils.noSpaceGridLayout()); + + // Add user CRUD buttons + Composite buttonCmp = new Composite(parent, SWT.NO_FOCUS); + buttonCmp.setLayoutData(CmsUtils.fillWidth()); + buttonCmp.setLayout(new GridLayout(2, false)); + // Delete + final Button deleteBtn = new Button(buttonCmp, SWT.PUSH); + deleteBtn.setText("Delete selected"); + deleteBtn + .setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false)); + + // Add + final Button addBtn = new Button(buttonCmp, SWT.PUSH); + addBtn.setText("Create"); + // Create the composite that displays the list and a filter - UsersTable userTableCmp = new UsersTable(parent, SWT.NO_FOCUS, session); + final UsersTable userTableCmp = new UsersTable(parent, SWT.NO_FOCUS, + session); userTableCmp.populate(true, false); - userTableCmp.setLayoutData(CmsUtils.fillAll()); + // The various listeners userTableCmp.addDisposeListener(new DisposeListener() { private static final long serialVersionUID = -8854052549807709846L; @@ -52,6 +151,77 @@ public class Users implements CmsUiProvider { } }); + deleteBtn.addSelectionListener(new SelectionAdapter() { + private static final long serialVersionUID = -7340611909297995666L; + + @Override + public void widgetSelected(SelectionEvent e) { + + TableViewer viewer = userTableCmp.getTableViewer(); + ISelection selection = viewer.getSelection(); + if (selection.isEmpty()) + return; + + Map toDelete = new TreeMap(); + @SuppressWarnings("unchecked") + Iterator it = ((IStructuredSelection) selection) + .iterator(); + nodes: while (it.hasNext()) { + Node profileNode = it.next(); + try { + String userName = profileNode.getProperty( + ArgeoNames.ARGEO_USER_ID).getString(); + if (userName.equals(profileNode.getSession() + .getUserID())) { + log.warn("Cannot delete its own user: " + userName); + continue nodes; + } + toDelete.put(userName, profileNode); + } catch (RepositoryException re) { + log.warn("Cannot interpred user " + profileNode); + } + } + + if (!MessageDialog.openQuestion( + userTableCmp.getShell(), + "Delete User", + "Are you sure that you want to delete users " + + toDelete.keySet() + + "?\n" + + "This may lead to inconsistencies in the application.")) + return; + + for (String username : toDelete.keySet()) { + Session session = null; + try { + Node profileNode = toDelete.get(username); + userAdminService.deleteUser(username); + profileNode.getParent().remove(); + session = profileNode.getSession(); + session.save(); + } catch (RepositoryException re) { + JcrUtils.discardQuietly(session); + throw new ArgeoException("Cannot list users", re); + } + } + userTableCmp.refresh(); + } + }); + + addBtn.addSelectionListener(new SelectionAdapter() { + private static final long serialVersionUID = 9214984636836267786L; + + @Override + public void widgetSelected(SelectionEvent e) { + NewUserWizard newUserWizard = new NewUserWizard(session, + userAdminService); + WizardDialog dialog = new WizardDialog(addBtn.getShell(), + newUserWizard); + if (dialog.open() == Dialog.OK) + userTableCmp.refresh(); + } + }); + // Configure // userTableCmp.getTableViewer().addDoubleClickListener( // new ViewDoubleClickListener()); @@ -73,8 +243,23 @@ public class Users implements CmsUiProvider { return userTableCmp; } + // protected Composite createUserPage(Composite parent) { + // parent.setLayout(CmsUtils.noSpaceGridLayout()); + // ScrolledPage scrolled = new ScrolledPage(parent, SWT.NONE); + // scrolled.setLayoutData(CmsUtils.fillAll()); + // scrolled.setLayout(CmsUtils.noSpaceGridLayout()); + // // TODO manage style + // // CmsUtils.style(scrolled, "maintenance_user_form"); + // + // Composite page = new Composite(scrolled, SWT.NONE); + // page.setLayout(CmsUtils.noSpaceGridLayout()); + // page.setBackgroundMode(SWT.INHERIT_NONE); + // + // return page; + // } + private boolean isAdmin(Node node) throws RepositoryException { - // FIXME clean this check one new user management policy has been + // FIXME clean this once new user management policy has been // implemented. AccessControlManager acm = node.getSession().getAccessControlManager(); Privilege[] privs = new Privilege[1]; @@ -142,4 +327,18 @@ public class Users implements CmsUiProvider { // } // } -} + /* DEPENDENCY INJECTION */ + public void setWorkspaceName(String workspaceName) { + this.userWkspName = workspaceName; + } + + public void setUserAdminService(UserAdminService userAdminService) { + this.userAdminService = userAdminService; + userPage.setUserAdminService(userAdminService); + } + + public void setUserDetailsManager(UserDetailsManager userDetailsManager) { + // this.userDetailsManager = userDetailsManager; + // userPage.setUserDetailsManager(userDetailsManager); + } +} \ No newline at end of file