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.eclipse.ui.dialogs.UserCreationWizard;
import org.argeo.eclipse.ui.parts.UsersTable;
+import org.argeo.jcr.ArgeoNames;
import org.argeo.jcr.JcrUtils;
import org.argeo.security.UserAdminService;
import org.argeo.security.jcr.JcrSecurityModel;
+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.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.events.SelectionListener;
+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
*/
public class Users implements CmsUiProvider {
+ private final static Log log = LogFactory.getLog(Users.class);
+
// Enable user CRUD // INJECTED
private UserAdminService userAdminService;
private JcrSecurityModel jcrSecurityModel;
+ // private UserDetailsManager userDetailsManager;
private String userWkspName;
// Local UI Providers
// 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");
- addBtn.addSelectionListener(new SelectionListener() {
- private static final long serialVersionUID = 9214984636836267786L;
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- UserCreationWizard newUserWizard = new UserCreationWizard(
- session, userAdminService, jcrSecurityModel);
- WizardDialog dialog = new WizardDialog(addBtn.getShell(),
- newUserWizard);
- dialog.open();
- // TODO refresh list if user has been created
- }
-
- @Override
- public void widgetDefaultSelected(SelectionEvent e) {
- }
- });
// 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;
}
});
+ 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<String, Node> toDelete = new TreeMap<String, Node>();
+ @SuppressWarnings("unchecked")
+ Iterator<Node> 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) {
+ UserCreationWizard newUserWizard = new UserCreationWizard(
+ session, userAdminService, jcrSecurityModel);
+ WizardDialog dialog = new WizardDialog(addBtn.getShell(),
+ newUserWizard);
+ if (dialog.open() == Dialog.OK)
+ userTableCmp.refresh();
+ }
+ });
+
// Configure
// userTableCmp.getTableViewer().addDoubleClickListener(
// new ViewDoubleClickListener());
public void setJcrSecurityModel(JcrSecurityModel jcrSecurityModel) {
this.jcrSecurityModel = jcrSecurityModel;
- userPage.setJcrSecurityModel(jcrSecurityModel);
+ // userPage.setJcrSecurityModel(jcrSecurityModel);
+ }
+
+ public void setUserDetailsManager(UserDetailsManager userDetailsManager) {
+ // this.userDetailsManager = userDetailsManager;
+ // userPage.setUserDetailsManager(userDetailsManager);
}
}
\ No newline at end of file