From: Bruno Sinou Date: Fri, 16 Oct 2015 15:31:14 +0000 (+0000) Subject: Work on user UI X-Git-Tag: argeo-commons-2.1.30~81 X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=935a76bdd458e4fb8502783946cb910324388da8;p=lgpl%2Fargeo-commons.git Work on user UI git-svn-id: https://svn.argeo.org/commons/trunk@8497 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/commands/AddPrivileges.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/commands/AddPrivileges.java index 49ed4378f..4e0a04546 100644 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/commands/AddPrivileges.java +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/commands/AddPrivileges.java @@ -24,7 +24,7 @@ import org.argeo.eclipse.ui.dialogs.ErrorFeedback; import org.argeo.eclipse.ui.workbench.WorkbenchUiPlugin; import org.argeo.eclipse.ui.workbench.jcr.internal.model.SingleJcrNodeElem; import org.argeo.eclipse.ui.workbench.jcr.internal.model.WorkspaceElem; -import org.argeo.eclipse.ui.workbench.jcr.internal.parts.ChangeRightsWizard; +import org.argeo.eclipse.ui.workbench.jcr.internal.parts.AddPrivilegeWizard; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; @@ -61,17 +61,17 @@ public class AddPrivileges extends AbstractHandler { return null; try { - ChangeRightsWizard wizard = new ChangeRightsWizard( - jcrParentNode.getSession(), jcrParentNode.getPath(), - userAdmin); + String targetPath = jcrParentNode.getPath(); + AddPrivilegeWizard wizard = new AddPrivilegeWizard( + jcrParentNode.getSession(), targetPath, userAdmin); WizardDialog dialog = new WizardDialog( HandlerUtil.getActiveShell(event), wizard); dialog.open(); return null; } catch (RepositoryException re) { - throw new ArgeoException( - "Unexpected error while creating the new workspace.", - re); + throw new ArgeoException("Unable to retrieve " + + "path or JCR session to add privilege on " + + jcrParentNode, re); } } else { ErrorFeedback.show("Cannot add privileges"); diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/AddPrivilegeWizard.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/AddPrivilegeWizard.java new file mode 100644 index 000000000..52cf08715 --- /dev/null +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/AddPrivilegeWizard.java @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.eclipse.ui.workbench.jcr.internal.parts; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.security.Privilege; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.eclipse.ui.workbench.users.PickUpUserDialog; +import org.argeo.eclipse.ui.workbench.users.internal.UsersUtils; +import org.argeo.jcr.JcrUtils; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.window.Window; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +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.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Text; +import org.osgi.service.useradmin.User; +import org.osgi.service.useradmin.UserAdmin; + +/** Add Jcr privileges to the chosen user group on a given node */ +public class AddPrivilegeWizard extends Wizard { + + // Context + private UserAdmin userAdmin; + private Session currentSession; + private String targetPath; + // Chosen parameters + private User chosenUser; + private String jcrPrivilege; + + // UI Object + private DefinePrivilegePage page; + + // TODO enable external definition of possible values and corresponding + // description + protected static final Map AUTH_TYPE_LABELS; + static { + Map tmpMap = new HashMap(); + tmpMap.put(Privilege.JCR_READ, "jcr:read"); + tmpMap.put(Privilege.JCR_WRITE, "jcr:write"); + tmpMap.put(Privilege.JCR_ALL, "jcr:all"); + AUTH_TYPE_LABELS = Collections.unmodifiableMap(tmpMap); + } + + protected static final Map AUTH_TYPE_DESC; + static { + Map tmpMap = new HashMap(); + tmpMap.put(Privilege.JCR_READ, + "The privilege to retrieve a node and get its properties and their values."); + tmpMap.put(Privilege.JCR_WRITE, "An aggregate privilege that " + + "contains: jcr:modifyProperties, jcr:addChildNodes, " + + "jcr:removeNode, jcr:removeChildNodes"); + tmpMap.put(Privilege.JCR_ALL, "An aggregate privilege that " + + "contains all JCR predefined privileges, " + + "plus all implementation-defined privileges. "); + AUTH_TYPE_DESC = Collections.unmodifiableMap(tmpMap); + } + + public AddPrivilegeWizard(Session currentSession, String path, + UserAdmin userAdmin) { + super(); + this.userAdmin = userAdmin; + this.currentSession = currentSession; + this.targetPath = path; + } + + @Override + public void addPages() { + try { + setWindowTitle("Add privilege on " + targetPath); + page = new DefinePrivilegePage(userAdmin, targetPath); + addPage(page); + } catch (Exception e) { + throw new ArgeoException("Cannot add page to wizard ", e); + } + } + + @Override + public boolean performFinish() { + if (!canFinish()) + return false; + try { + JcrUtils.addPrivilege(currentSession, targetPath, + chosenUser.getName(), jcrPrivilege); + } catch (RepositoryException re) { + throw new ArgeoException("Cannot set " + jcrPrivilege + " for " + + chosenUser.getName() + " on " + targetPath, re); + } + return true; + } + + private class DefinePrivilegePage extends WizardPage implements + ModifyListener { + private static final long serialVersionUID = 8084431378762283920L; + + // Context + final private UserAdmin userAdmin; + + public DefinePrivilegePage(UserAdmin userAdmin, String path) { + super("Main"); + this.userAdmin = userAdmin; + setTitle("Define the privilege to apply to " + path); + setMessage("Please choose a user or a group and relevant JCR Privilege."); + } + + public void createControl(Composite parent) { + final Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout(3, false)); + + // specify subject + createBoldLabel(composite, "User or group name"); + final Label groupNameLbl = new Label(composite, SWT.LEAD); + groupNameLbl.setLayoutData(EclipseUiUtils.fillWidth()); + + Link pickUpLk = new Link(composite, SWT.LEFT); + pickUpLk.setText(" Change "); + + createBoldLabel(composite, "User or group DN"); + final Text groupNameTxt = new Text(composite, SWT.LEAD | SWT.BORDER); + groupNameTxt.setLayoutData(EclipseUiUtils.fillWidth(2)); + + pickUpLk.addSelectionListener(new SelectionAdapter() { + private static final long serialVersionUID = 1L; + + @Override + public void widgetSelected(SelectionEvent e) { + PickUpUserDialog dialog = new PickUpUserDialog( + getShell(), "Choose a group or a user", userAdmin); + if (dialog.open() == Window.OK) { + chosenUser = dialog.getSelected(); + groupNameLbl.setText(UsersUtils + .getCommonName(chosenUser)); + groupNameTxt.setText(chosenUser.getName()); + } + } + }); + + groupNameTxt.addFocusListener(new FocusListener() { + private static final long serialVersionUID = 1965498600105667738L; + + @Override + public void focusLost(FocusEvent event) { + String dn = groupNameTxt.getText(); + User newChosen = null; + try { + newChosen = (User) userAdmin.getRole(dn); + } catch (Exception e) { + boolean tryAgain = MessageDialog.openQuestion( + getShell(), "Unvalid DN", + "DN " + dn + " is not valid.\nError message: " + + e.getMessage() + + "\n\t\tDo you want to try again?"); + if (tryAgain) + groupNameTxt.setFocus(); + else + resetOnFail(); + } + + if (userAdmin.getRole(dn) == null) { + boolean tryAgain = MessageDialog.openQuestion( + getShell(), "Unexisting role", "User/group " + + dn + " does not exist. " + + "Do you want to try again?"); + if (tryAgain) + groupNameTxt.setFocus(); + else + resetOnFail(); + } else { + chosenUser = newChosen; + groupNameLbl.setText(UsersUtils + .getCommonName(chosenUser)); + } + } + + private void resetOnFail() { + String oldDn = chosenUser == null ? "" : chosenUser + .getName(); + groupNameTxt.setText(oldDn); + } + + @Override + public void focusGained(FocusEvent event) { + } + }); + + // JCR Privileges + createBoldLabel(composite, "Privilege type"); + Combo authorizationCmb = new Combo(composite, SWT.BORDER + | SWT.READ_ONLY | SWT.V_SCROLL); + authorizationCmb.setItems(AUTH_TYPE_LABELS.values().toArray( + new String[0])); + authorizationCmb.setLayoutData(EclipseUiUtils.fillWidth(2)); + createBoldLabel(composite, ""); // empty cell + final Label descLbl = new Label(composite, SWT.WRAP); + descLbl.setLayoutData(EclipseUiUtils.fillWidth(2)); + + authorizationCmb.addSelectionListener(new SelectionAdapter() { + private static final long serialVersionUID = 1L; + + @Override + public void widgetSelected(SelectionEvent e) { + String chosenPrivStr = ((Combo) e.getSource()).getText(); + if (AUTH_TYPE_LABELS.containsValue(chosenPrivStr)) { + loop: for (String key : AUTH_TYPE_LABELS.keySet()) { + if (AUTH_TYPE_LABELS.get(key).equals(chosenPrivStr)) { + jcrPrivilege = key; + break loop; + } + } + } + + if (jcrPrivilege != null) { + descLbl.setText(AUTH_TYPE_DESC.get(jcrPrivilege)); + composite.layout(true, true); + } + } + }); + + // Compulsory + setControl(composite); + } + + public void modifyText(ModifyEvent event) { + String message = checkComplete(); + if (message != null) + setMessage(message, WizardPage.ERROR); + else { + setMessage("Complete", WizardPage.INFORMATION); + setPageComplete(true); + } + } + + /** @return error message or null if complete */ + protected String checkComplete() { + if (chosenUser == null) + return "Please choose a relevant group or user"; + else if (userAdmin.getRole(chosenUser.getName()) == null) + return "Please choose a relevant group or user"; + else if (jcrPrivilege == null) + return "Please choose a relevant JCR privilege"; + return null; + } + } + + private Label createBoldLabel(Composite parent, String value) { + Label label = new Label(parent, SWT.RIGHT); + label.setText(" " + value); + label.setFont(EclipseUiUtils.getBoldFont(parent)); + label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + return label; + } +} \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/ChangeRightsWizard.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/ChangeRightsWizard.java deleted file mode 100644 index 2339ce1a3..000000000 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/ChangeRightsWizard.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.eclipse.ui.workbench.jcr.internal.parts; - -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.security.Privilege; - -import org.argeo.ArgeoException; -import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.workbench.users.PickUpGroupDialog; -import org.argeo.jcr.JcrUtils; -import org.eclipse.jface.window.Window; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -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.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.eclipse.swt.widgets.Text; -import org.osgi.service.useradmin.UserAdmin; - -/** Add Jcr privileges to the chosen user group on a given node */ -public class ChangeRightsWizard extends Wizard { - - private UserAdmin userAdmin; - private Session currentSession; - private String path; - - // This page widget - private DefinePrivilegePage page; - - // USABLE SHORTCUTS - protected final static String[] validAuthType = { Privilege.JCR_READ, - Privilege.JCR_WRITE, Privilege.JCR_ALL }; - - public ChangeRightsWizard(Session currentSession, String path, - UserAdmin userAdmin) { - super(); - this.userAdmin = userAdmin; - this.currentSession = currentSession; - this.path = path; - } - - @Override - public void addPages() { - try { - page = new DefinePrivilegePage(userAdmin, path); - addPage(page); - } catch (Exception e) { - throw new ArgeoException("Cannot add page to wizard ", e); - } - } - - @Override - public boolean performFinish() { - if (!canFinish()) - return false; - try { - JcrUtils.addPrivilege(currentSession, path, page.getGroupName(), - page.getAuthTypeStr()); - } catch (RepositoryException re) { - throw new ArgeoException( - "Unexpected error while setting privileges", re); - } - return true; - } - - private class DefinePrivilegePage extends WizardPage implements ModifyListener { - private static final long serialVersionUID = 8084431378762283920L; - - // Context - final private UserAdmin userAdmin; - - // This page widget - private Text groupNameTxt; - private Combo authorizationCmb; - - public DefinePrivilegePage(UserAdmin userAdmin, String path) { - super("Main"); - this.userAdmin = userAdmin; - setTitle("Define the privilege to apply to " + path); - } - - public void createControl(Composite parent) { - // specify subject - Composite composite = new Composite(parent, SWT.NONE); - composite.setLayout(new GridLayout(3, false)); - Label lbl = new Label(composite, SWT.LEAD); - lbl.setText("Group name"); - lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); - groupNameTxt = new Text(composite, SWT.LEAD | SWT.BORDER); - groupNameTxt.setLayoutData(EclipseUiUtils.fillWidth()); - if (groupNameTxt != null) - groupNameTxt.addModifyListener(this); - - Link pickUpLk = new Link(composite, SWT.LEFT); - pickUpLk.setText(" Pick up "); - pickUpLk.addSelectionListener(new SelectionAdapter() { - private static final long serialVersionUID = 1L; - - @Override - public void widgetSelected(SelectionEvent e) { - PickUpGroupDialog dialog = new PickUpGroupDialog( - getShell(), "Choose a group", userAdmin); - if (dialog.open() == Window.OK) - groupNameTxt.setText(dialog.getSelected()); - } - - }); - - // Choose rigths - new Label(composite, SWT.NONE) - .setText("Choose corresponding rights"); - authorizationCmb = new Combo(composite, SWT.BORDER | SWT.V_SCROLL); - authorizationCmb.setItems(validAuthType); - authorizationCmb.setLayoutData(EclipseUiUtils.fillWidth(2)); - authorizationCmb.select(0); - - // Compulsory - setControl(composite); - } - - protected String getGroupName() { - return groupNameTxt.getText(); - } - - protected String getAuthTypeStr() { - return authorizationCmb.getItem(authorizationCmb - .getSelectionIndex()); - } - - public void modifyText(ModifyEvent event) { - String message = checkComplete(); - if (message != null) - setMessage(message, WizardPage.ERROR); - else { - setMessage("Complete", WizardPage.INFORMATION); - setPageComplete(true); - } - } - - /** @return error message or null if complete */ - protected String checkComplete() { - String groupStr = groupNameTxt.getText(); - if (groupStr == null || "".equals(groupStr)) - return "Please enter the name of the corresponding group."; - return null; - } - } -} \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/ChooseRightsPage.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/ChooseRightsPage.java deleted file mode 100644 index 09c653cdb..000000000 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/jcr/internal/parts/ChooseRightsPage.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.eclipse.ui.workbench.jcr.internal.parts; - -import javax.jcr.security.Privilege; - -import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.workbench.users.PickUpGroupDialog; -import org.eclipse.jface.window.Window; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -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.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.eclipse.swt.widgets.Text; -import org.osgi.service.useradmin.UserAdmin; - -/** Simple wizard page to choose a group and corresponding rights to assign */ -public class ChooseRightsPage extends WizardPage implements ModifyListener { - private static final long serialVersionUID = 8084431378762283920L; - - // Context - final private UserAdmin userAdmin; - - // This page widget - private Text groupNameTxt; - private Combo authorizationCmb; - - // USABLE SHORTCUTS - protected final static String[] validAuthType = { Privilege.JCR_READ, - Privilege.JCR_WRITE, Privilege.JCR_ALL }; - - public ChooseRightsPage(UserAdmin userAdmin, String path) { - super("Main"); - this.userAdmin = userAdmin; - setTitle("Add privilege to " + path); - } - - public void createControl(Composite parent) { - // specify subject - Composite composite = new Composite(parent, SWT.NONE); - composite.setLayout(new GridLayout(3, false)); - Label lbl = new Label(composite, SWT.LEAD); - lbl.setText("Group name"); - // lbl.setText("Group or user name (no blank, no special chars)"); - lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); - groupNameTxt = new Text(composite, SWT.LEAD | SWT.BORDER); - groupNameTxt.setLayoutData(EclipseUiUtils.fillWidth()); - if (groupNameTxt != null) - groupNameTxt.addModifyListener(this); - - Link pickUpLk = new Link(composite, SWT.LEFT); - pickUpLk.setText("Pick up"); - pickUpLk.addSelectionListener(new SelectionAdapter() { - private static final long serialVersionUID = 1L; - - @Override - public void widgetSelected(SelectionEvent e) { - PickUpGroupDialog dialog = new PickUpGroupDialog(getShell(), - "Choose a group", userAdmin); - if (dialog.open() == Window.OK) - groupNameTxt.setText(dialog.getSelected()); - } - - }); - - // Choose rigths - new Label(composite, SWT.NONE).setText("Choose corresponding rights"); - authorizationCmb = new Combo(composite, SWT.BORDER | SWT.V_SCROLL); - authorizationCmb.setItems(validAuthType); - authorizationCmb.setLayoutData(EclipseUiUtils.fillWidth(2)); - authorizationCmb.select(0); - - // Compulsory - setControl(composite); - } - - protected String getGroupName() { - return groupNameTxt.getText(); - } - - protected String getAuthTypeStr() { - return authorizationCmb.getItem(authorizationCmb.getSelectionIndex()); - } - - public void modifyText(ModifyEvent event) { - String message = checkComplete(); - if (message != null) - setMessage(message, WizardPage.ERROR); - else { - setMessage("Complete", WizardPage.INFORMATION); - setPageComplete(true); - } - } - - /** @return error message or null if complete */ - protected String checkComplete() { - String groupStr = groupNameTxt.getText(); - if (groupStr == null || "".equals(groupStr)) - return "Please enter the name of the corresponding group."; - return null; - } -} diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/GroupLP.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/GroupLP.java deleted file mode 100644 index 5e054dca4..000000000 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/GroupLP.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.argeo.eclipse.ui.workbench.users; - -import java.util.List; - -import javax.naming.InvalidNameException; -import javax.naming.ldap.LdapName; -import javax.naming.ldap.Rdn; - -import org.argeo.ArgeoException; -import org.argeo.eclipse.ui.workbench.users.internal.UsersImages; -import org.argeo.eclipse.ui.workbench.users.internal.UsersUtils; -import org.argeo.osgi.useradmin.LdifName; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.osgi.service.useradmin.Role; -import org.osgi.service.useradmin.User; - -/** Centralize label providers for the group table */ -class GroupLP extends ColumnLabelProvider { - private static final long serialVersionUID = -4645930210988368571L; - - // TODO this constant is defined in the CMS - final static String ROLES_BASEDN = "ou=roles,ou=node"; - - final static String COL_ICON = "colID.icon"; - final static String COL_DN = "colID.dn"; - final static String COL_DISPLAY_NAME = "colID.displayName"; - final static String COL_DOMAIN = "colID.domain"; - - final String currType; - - // private Font italic; - private Font bold; - - GroupLP(String colId) { - this.currType = colId; - } - - @Override - public Font getFont(Object element) { - // Self as bold - try { - LdapName selfUserName = UsersUtils.getLdapName(); - String userName = UsersUtils.getProperty((User) element, - LdifName.dn.name()); - LdapName userLdapName = new LdapName(userName); - if (userLdapName.equals(selfUserName)) { - if (bold == null) - bold = JFaceResources.getFontRegistry() - .defaultFontDescriptor().setStyle(SWT.BOLD) - .createFont(Display.getCurrent()); - return bold; - } - } catch (InvalidNameException e) { - throw new ArgeoException("cannot parse dn for " + element, e); - } - - // Disabled as Italic - // Node userProfile = (Node) elem; - // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean()) - // return italic; - - return null; - // return super.getFont(element); - } - - @Override - public Image getImage(Object element) { - if (COL_ICON.equals(currType)) { - User user = (User) element; - String dn = (String) user.getProperties().get(LdifName.dn.name()); - if (dn.endsWith(ROLES_BASEDN)) - return UsersImages.ICON_ROLE; - else if (user.getType() == Role.GROUP) - return UsersImages.ICON_GROUP; - else - return UsersImages.ICON_USER; - } else - return null; - } - - @Override - public String getText(Object element) { - User user = (User) element; - return getText(user); - - } - - public String getText(User user) { - if (COL_DN.equals(currType)) - return user.getName(); - else if (COL_DISPLAY_NAME.equals(currType)) { - Object obj = user.getProperties().get(LdifName.cn.name()); - if (obj != null) - return (String) obj; - else - return ""; - } else if (COL_DOMAIN.equals(currType)) { - String dn = (String) user.getProperties().get(LdifName.dn.name()); - if (dn.endsWith(ROLES_BASEDN)) - return "System roles"; - try { - LdapName name; - name = new LdapName(dn); - List rdns = name.getRdns(); - return (String) rdns.get(1).getValue() + '.' - + (String) rdns.get(0).getValue(); - } catch (InvalidNameException e) { - throw new ArgeoException("Unable to get domain name for " + dn, - e); - } - } else - return ""; - } -} \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpGroupDialog.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpGroupDialog.java deleted file mode 100644 index e9c31e3f2..000000000 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpGroupDialog.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.eclipse.ui.workbench.users; - -import java.util.ArrayList; -import java.util.List; - -import org.argeo.ArgeoException; -import org.argeo.eclipse.ui.ColumnDefinition; -import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.eclipse.ui.parts.LdifUsersTable; -import org.argeo.osgi.useradmin.LdifName; -import org.eclipse.jface.dialogs.TrayDialog; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -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.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; -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.Shell; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.service.useradmin.Group; -import org.osgi.service.useradmin.Role; -import org.osgi.service.useradmin.User; -import org.osgi.service.useradmin.UserAdmin; - -/** Dialog with a group list to pick up one */ -public class PickUpGroupDialog extends TrayDialog { - private static final long serialVersionUID = -1420106871173920369L; - - // Business objects - private final UserAdmin userAdmin; - private Group selectedGroup; - - // this page widgets and UI objects - private String title; - private LdifUsersTable groupTableViewerCmp; - private TableViewer userViewer; - private List columnDefs = new ArrayList(); - - public PickUpGroupDialog(Shell parentShell, String title, - UserAdmin userAdmin) { - super(parentShell); - this.title = title; - this.userAdmin = userAdmin; - - // Define the displayed columns - columnDefs.add(new ColumnDefinition(new GroupLP(GroupLP.COL_ICON), "", - 26, 0)); - columnDefs.add(new ColumnDefinition(new GroupLP( - GroupLP.COL_DISPLAY_NAME), "Common Name", 150, 100)); - columnDefs.add(new ColumnDefinition(new GroupLP(GroupLP.COL_DOMAIN), - "Domain", 100, 120)); - columnDefs.add(new ColumnDefinition(new GroupLP(GroupLP.COL_DN), - "Distinguished Name", 300, 100)); - } - - protected Point getInitialSize() { - return new Point(600, 450); - } - - protected Control createDialogArea(Composite parent) { - Composite dialogArea = (Composite) super.createDialogArea(parent); - dialogArea.setLayout(new FillLayout()); - - Composite bodyCmp = new Composite(dialogArea, SWT.NO_FOCUS); - bodyCmp.setLayout(new GridLayout()); - - // Create and configure the table - groupTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI - | SWT.H_SCROLL | SWT.V_SCROLL); - - groupTableViewerCmp.setColumnDefinitions(columnDefs); - groupTableViewerCmp.populateWithStaticFilters(false, false); - groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); - groupTableViewerCmp.refresh(); - - // Controllers - userViewer = groupTableViewerCmp.getTableViewer(); - userViewer.addDoubleClickListener(new MyDoubleClickListener()); - userViewer - .addSelectionChangedListener(new MySelectionChangedListener()); - - parent.pack(); - return dialogArea; - } - - public String getSelected() { - if (selectedGroup == null) - return null; - else - return selectedGroup.getName(); - } - - protected void configureShell(Shell shell) { - super.configureShell(shell); - shell.setText(title); - } - - class MyDoubleClickListener implements IDoubleClickListener { - public void doubleClick(DoubleClickEvent evt) { - if (evt.getSelection().isEmpty()) - return; - - Object obj = ((IStructuredSelection) evt.getSelection()) - .getFirstElement(); - if (obj instanceof Group) { - selectedGroup = (Group) obj; - okPressed(); - } - } - } - - class MySelectionChangedListener implements ISelectionChangedListener { - @Override - public void selectionChanged(SelectionChangedEvent event) { - if (event.getSelection().isEmpty()) { - selectedGroup = null; - return; - } - Object obj = ((IStructuredSelection) event.getSelection()) - .getFirstElement(); - if (obj instanceof Group) { - selectedGroup = (Group) obj; - } - } - } - - private class MyUserTableViewer extends LdifUsersTable { - private static final long serialVersionUID = 8467999509931900367L; - - private final String[] knownProps = { LdifName.uid.name(), - LdifName.cn.name(), LdifName.dn.name() }; - - private Button showSystemRoleBtn; - - public MyUserTableViewer(Composite parent, int style) { - super(parent, style); - } - - protected void populateStaticFilters(Composite staticFilterCmp) { - staticFilterCmp.setLayout(new GridLayout()); - showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK); - showSystemRoleBtn.setText("Show system roles "); - showSystemRoleBtn.addSelectionListener(new SelectionAdapter() { - private static final long serialVersionUID = -7033424592697691676L; - - @Override - public void widgetSelected(SelectionEvent e) { - refresh(); - } - - }); - } - - @Override - protected List listFilteredElements(String filter) { - Role[] roles; - try { - StringBuilder builder = new StringBuilder(); - StringBuilder tmpBuilder = new StringBuilder(); - if (notNull(filter)) - for (String prop : knownProps) { - tmpBuilder.append("("); - tmpBuilder.append(prop); - tmpBuilder.append("=*"); - tmpBuilder.append(filter); - tmpBuilder.append("*)"); - } - if (tmpBuilder.length() > 1) { - builder.append("(&(objectclass=groupOfNames)"); - if (!showSystemRoleBtn.getSelection()) - builder.append("(!(").append(LdifName.dn.name()) - .append("=*").append(GroupLP.ROLES_BASEDN) - .append("))"); - builder.append("(|"); - builder.append(tmpBuilder.toString()); - builder.append("))"); - } else { - if (!showSystemRoleBtn.getSelection()) - builder.append("(&(objectclass=groupOfNames)(!(") - .append(LdifName.dn.name()).append("=*") - .append(GroupLP.ROLES_BASEDN).append(")))"); - else - builder.append("(objectclass=groupOfNames)"); - - } - roles = userAdmin.getRoles(builder.toString()); - } catch (InvalidSyntaxException e) { - throw new ArgeoException("Unable to get roles with filter: " - + filter, e); - } - List users = new ArrayList(); - for (Role role : roles) - users.add((User) role); - return users; - } - } - - private boolean notNull(String string) { - if (string == null) - return false; - else - return !"".equals(string.trim()); - } -} \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpUserDialog.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpUserDialog.java new file mode 100644 index 000000000..23d9c5a72 --- /dev/null +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpUserDialog.java @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.eclipse.ui.workbench.users; + +import java.util.ArrayList; +import java.util.List; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.ColumnDefinition; +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.eclipse.ui.parts.LdifUsersTable; +import org.argeo.eclipse.ui.workbench.users.internal.UsersUtils; +import org.argeo.osgi.useradmin.LdifName; +import org.eclipse.jface.dialogs.TrayDialog; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +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.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FillLayout; +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.Shell; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.useradmin.Group; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; +import org.osgi.service.useradmin.UserAdmin; + +/** Dialog with a group list to pick up one */ +public class PickUpUserDialog extends TrayDialog { + private static final long serialVersionUID = -1420106871173920369L; + + // Business objects + private final UserAdmin userAdmin; + private User selectedUser; + + // this page widgets and UI objects + private String title; + private LdifUsersTable userTableViewerCmp; + private TableViewer userViewer; + private List columnDefs = new ArrayList(); + + public PickUpUserDialog(Shell parentShell, String title, UserAdmin userAdmin) { + super(parentShell); + this.title = title; + this.userAdmin = userAdmin; + + // Define the displayed columns + columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_ICON), "", + 26, 0)); + columnDefs.add(new ColumnDefinition( + new UserLP(UserLP.COL_DISPLAY_NAME), "Common Name", 150, 100)); + columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DOMAIN), + "Domain", 100, 120)); + columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DN), + "Distinguished Name", 300, 100)); + } + + protected Point getInitialSize() { + return new Point(700, 450); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogArea = (Composite) super.createDialogArea(parent); + dialogArea.setLayout(new FillLayout()); + + Composite bodyCmp = new Composite(dialogArea, SWT.NO_FOCUS); + bodyCmp.setLayout(new GridLayout()); + + // Create and configure the table + userTableViewerCmp = new MyUserTableViewer(bodyCmp, SWT.MULTI + | SWT.H_SCROLL | SWT.V_SCROLL); + + userTableViewerCmp.setColumnDefinitions(columnDefs); + userTableViewerCmp.populateWithStaticFilters(false, false); + userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); + userTableViewerCmp.refresh(); + + // Controllers + userViewer = userTableViewerCmp.getTableViewer(); + userViewer.addDoubleClickListener(new MyDoubleClickListener()); + userViewer + .addSelectionChangedListener(new MySelectionChangedListener()); + + parent.pack(); + return dialogArea; + } + + public User getSelected() { + if (selectedUser == null) + return null; + else + return selectedUser; + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText(title); + } + + class MyDoubleClickListener implements IDoubleClickListener { + public void doubleClick(DoubleClickEvent evt) { + if (evt.getSelection().isEmpty()) + return; + + Object obj = ((IStructuredSelection) evt.getSelection()) + .getFirstElement(); + if (obj instanceof User) { + selectedUser = (User) obj; + okPressed(); + } + } + } + + class MySelectionChangedListener implements ISelectionChangedListener { + @Override + public void selectionChanged(SelectionChangedEvent event) { + if (event.getSelection().isEmpty()) { + selectedUser = null; + return; + } + Object obj = ((IStructuredSelection) event.getSelection()) + .getFirstElement(); + if (obj instanceof Group) { + selectedUser = (Group) obj; + } + } + } + + private class MyUserTableViewer extends LdifUsersTable { + private static final long serialVersionUID = 8467999509931900367L; + + private final String[] knownProps = { LdifName.uid.name(), + LdifName.cn.name(), LdifName.dn.name() }; + + private Button showSystemRoleBtn; + private Button showUserBtn; + + public MyUserTableViewer(Composite parent, int style) { + super(parent, style); + } + + protected void populateStaticFilters(Composite staticFilterCmp) { + staticFilterCmp.setLayout(new GridLayout()); + showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK); + showSystemRoleBtn.setText("Show system roles "); + + showUserBtn = new Button(staticFilterCmp, SWT.CHECK); + showUserBtn.setText("Show users "); + + SelectionListener sl = new SelectionAdapter() { + private static final long serialVersionUID = -7033424592697691676L; + + @Override + public void widgetSelected(SelectionEvent e) { + refresh(); + } + }; + + showSystemRoleBtn.addSelectionListener(sl); + showUserBtn.addSelectionListener(sl); + } + + @Override + protected List listFilteredElements(String filter) { + Role[] roles; + try { + StringBuilder builder = new StringBuilder(); + + StringBuilder filterBuilder = new StringBuilder(); + if (notNull(filter)) + for (String prop : knownProps) { + filterBuilder.append("("); + filterBuilder.append(prop); + filterBuilder.append("=*"); + filterBuilder.append(filter); + filterBuilder.append("*)"); + } + + String typeStr = "(" + LdifName.objectClass.name() + "=" + + LdifName.groupOfNames.name() + ")"; + if ((showUserBtn.getSelection())) + typeStr = "(|(" + LdifName.objectClass.name() + "=" + + LdifName.inetOrgPerson.name() + ")" + typeStr + + ")"; + + if (!showSystemRoleBtn.getSelection()) + typeStr = "(& " + typeStr + "(!(" + LdifName.dn.name() + + "=*" + UsersUtils.ROLES_BASEDN + ")))"; + + if (filterBuilder.length() > 1) { + builder.append("(&" + typeStr); + builder.append("(|"); + builder.append(filterBuilder.toString()); + builder.append("))"); + } else { + builder.append(typeStr); + } + roles = userAdmin.getRoles(builder.toString()); + } catch (InvalidSyntaxException e) { + throw new ArgeoException("Unable to get roles with filter: " + + filter, e); + } + List users = new ArrayList(); + for (Role role : roles) + if (!users.contains(role)) + users.add((User) role); + return users; + } + } + + private boolean notNull(String string) { + if (string == null) + return false; + else + return !"".equals(string.trim()); + } +} \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/UserLP.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/UserLP.java new file mode 100644 index 000000000..0b74e7e91 --- /dev/null +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/UserLP.java @@ -0,0 +1,97 @@ +package org.argeo.eclipse.ui.workbench.users; + +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.workbench.users.internal.UsersImages; +import org.argeo.eclipse.ui.workbench.users.internal.UsersUtils; +import org.argeo.osgi.useradmin.LdifName; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; + +/** Centralize label providers for the group table */ +class UserLP extends ColumnLabelProvider { + private static final long serialVersionUID = -4645930210988368571L; + + final static String COL_ICON = "colID.icon"; + final static String COL_DN = "colID.dn"; + final static String COL_DISPLAY_NAME = "colID.displayName"; + final static String COL_DOMAIN = "colID.domain"; + + final String currType; + + // private Font italic; + private Font bold; + + UserLP(String colId) { + this.currType = colId; + } + + @Override + public Font getFont(Object element) { + // Self as bold + try { + LdapName selfUserName = UsersUtils.getLdapName(); + String userName = UsersUtils.getProperty((User) element, + LdifName.dn.name()); + LdapName userLdapName = new LdapName(userName); + if (userLdapName.equals(selfUserName)) { + if (bold == null) + bold = JFaceResources.getFontRegistry() + .defaultFontDescriptor().setStyle(SWT.BOLD) + .createFont(Display.getCurrent()); + return bold; + } + } catch (InvalidNameException e) { + throw new ArgeoException("cannot parse dn for " + element, e); + } + + // Disabled as Italic + // Node userProfile = (Node) elem; + // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean()) + // return italic; + + return null; + // return super.getFont(element); + } + + @Override + public Image getImage(Object element) { + if (COL_ICON.equals(currType)) { + User user = (User) element; + String dn = (String) user.getProperties().get(LdifName.dn.name()); + if (dn.endsWith(UsersUtils.ROLES_BASEDN)) + return UsersImages.ICON_ROLE; + else if (user.getType() == Role.GROUP) + return UsersImages.ICON_GROUP; + else + return UsersImages.ICON_USER; + } else + return null; + } + + @Override + public String getText(Object element) { + User user = (User) element; + return getText(user); + + } + + public String getText(User user) { + if (COL_DN.equals(currType)) + return user.getName(); + else if (COL_DISPLAY_NAME.equals(currType)) + return UsersUtils.getCommonName(user); + else if (COL_DOMAIN.equals(currType)) + return UsersUtils.getDomainName(user); + else + return ""; + } +} \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/internal/UsersUtils.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/internal/UsersUtils.java index e6c29f340..7470ea121 100644 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/internal/UsersUtils.java +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/internal/UsersUtils.java @@ -1,9 +1,11 @@ package org.argeo.eclipse.ui.workbench.users.internal; import java.security.AccessController; +import java.util.List; import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; +import javax.naming.ldap.Rdn; import javax.security.auth.Subject; import javax.security.auth.x500.X500Principal; @@ -14,6 +16,8 @@ import org.osgi.service.useradmin.User; /** Utility methods to manage user concepts in the ui.workbench bundle */ public class UsersUtils { + // TODO this constant is defined in the CMS + public final static String ROLES_BASEDN = "ou=roles,ou=node"; public final static boolean isCurrentUser(User user) { String userName = getProperty(user, LdifName.dn.name()); @@ -43,6 +47,37 @@ public class UsersUtils { return dn; } + public final static String getCommonName(User user) { + return getProperty(user, LdifName.cn.name()); + } + + /** Simply retrieves a display name of the relevant domain */ + public final static String getDomainName(User user) { + String dn = (String) user.getProperties().get(LdifName.dn.name()); + if (dn.endsWith(ROLES_BASEDN)) + return "System roles"; + try { + LdapName name; + name = new LdapName(dn); + List rdns = name.getRdns(); + String dname = null; + int i = 0; + loop: while (i < rdns.size()) { + Rdn currrRdn = rdns.get(i); + if (!"dc".equals(currrRdn.getType())) + break loop; + else { + String currVal = (String) currrRdn.getValue(); + dname = dname == null ? currVal : currVal + "." + dname; + } + i++; + } + return dname; + } catch (InvalidNameException e) { + throw new ArgeoException("Unable to get domain name for " + dn, e); + } + } + public final static String getProperty(Role role, String key) { Object obj = role.getProperties().get(key); if (obj != null) @@ -61,4 +96,5 @@ public class UsersUtils { else return !"".equals(string.trim()); } + } \ No newline at end of file diff --git a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifName.java b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifName.java index 24d13ad7c..a63f51288 100644 --- a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifName.java +++ b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifName.java @@ -9,7 +9,7 @@ import javax.naming.ldap.LdapName; */ public enum LdifName { // Attributes - dn, cn, sn, uid, mail, displayName, objectClass, userpassword, + dn, cn, sn, uid, mail, displayName, objectClass, userpassword, givenname, description, // Object classes inetOrgPerson, organizationalPerson, person, groupOfNames, top; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java index 4419d80a9..c23f01cff 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java @@ -1,9 +1,11 @@ package org.argeo.security.ui.admin.internal; import java.security.AccessController; +import java.util.List; import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; +import javax.naming.ldap.Rdn; import javax.security.auth.Subject; import javax.security.auth.x500.X500Principal; import javax.transaction.Status; @@ -68,6 +70,33 @@ public class UiAdminUtils { return cn; } + /** Simply retrieves a display name of the relevant domain */ + public final static String getDomainName(User user) { + String dn = (String) user.getProperties().get(LdifName.dn.name()); + if (dn.endsWith(UserAdminConstants.SYSTEM_ROLE_BASE_DN)) + return "System roles"; + try { + LdapName name; + name = new LdapName(dn); + List rdns = name.getRdns(); + String dname = null; + int i = 0; + loop: while (i < rdns.size()) { + Rdn currrRdn = rdns.get(i); + if (!"dc".equals(currrRdn.getType())) + break loop; + else { + String currVal = (String) currrRdn.getValue(); + dname = dname == null ? currVal : currVal + "." + dname; + } + i++; + } + return dname; + } catch (InvalidNameException e) { + throw new ArgeoException("Unable to get domain name for " + dn, e); + } + } + public final static String getProperty(Role role, String key) { Object obj = role.getProperties().get(key); if (obj != null) diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java index a2e28b02d..ee7708b99 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java @@ -3,10 +3,6 @@ package org.argeo.security.ui.admin.internal; /** Temporary centralization of the user admin constants */ public interface UserAdminConstants { - public final static String KEY_DESC = "description"; - public final static String KEY_FIRSTNAME = "givenname"; - public final static String KEY_LASTNAME = "sn"; - // TO BE CLEANED public final static String SYSTEM_ROLE_BASE_DN = "ou=roles,ou=node"; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.java index ddf0dceb7..fba2d3920 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.java @@ -22,9 +22,9 @@ import org.argeo.ArgeoException; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.dialogs.ErrorFeedback; import org.argeo.jcr.ArgeoNames; +import org.argeo.osgi.useradmin.LdifName; import org.argeo.security.ui.admin.SecurityAdminPlugin; import org.argeo.security.ui.admin.internal.UiAdminUtils; -import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.argeo.security.ui.admin.internal.UserAdminWrapper; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; @@ -96,7 +96,7 @@ public class NewGroup extends AbstractHandler { Dictionary props = group.getProperties(); String descStr = descriptionTxt.getText(); if (UiAdminUtils.notNull(descStr)) - props.put(UserAdminConstants.KEY_DESC, descStr); + props.put(LdifName.description.name(), descStr); userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CREATED, group)); return true; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java index 7f89b6ab2..9d4151caf 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewUser.java @@ -29,7 +29,6 @@ import org.argeo.jcr.ArgeoNames; import org.argeo.osgi.useradmin.LdifName; import org.argeo.security.ui.admin.SecurityAdminPlugin; import org.argeo.security.ui.admin.internal.UiAdminUtils; -import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.argeo.security.ui.admin.internal.UserAdminWrapper; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; @@ -115,7 +114,7 @@ public class NewUser extends AbstractHandler { String firstNameStr = firstNameTxt.getText(); if (UiAdminUtils.notNull(firstNameStr)) - props.put(UserAdminConstants.KEY_FIRSTNAME, firstNameStr); + props.put(LdifName.givenname.name(), firstNameStr); String cn = UiAdminUtils .getDefaultCn(firstNameStr, lastNameStr); diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java index 5df5b662d..1e6cd4f10 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java @@ -26,13 +26,13 @@ import org.argeo.jcr.ArgeoNames; import org.argeo.osgi.useradmin.LdifName; import org.argeo.security.ui.admin.SecurityAdminImages; import org.argeo.security.ui.admin.internal.UiAdminUtils; -import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.argeo.security.ui.admin.internal.UserAdminWrapper; import org.argeo.security.ui.admin.internal.parts.UserEditor.GroupChangeListener; import org.argeo.security.ui.admin.internal.parts.UserEditor.MainInfoListener; import org.argeo.security.ui.admin.internal.providers.CommonNameLP; import org.argeo.security.ui.admin.internal.providers.MailLP; import org.argeo.security.ui.admin.internal.providers.RoleIconLP; +import org.argeo.security.ui.admin.internal.providers.UserFilter; import org.argeo.security.ui.admin.internal.providers.UserNameLP; import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener; import org.eclipse.jface.action.Action; @@ -144,7 +144,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames { @SuppressWarnings("unchecked") public void commit(boolean onSave) { - group.getProperties().put(UserAdminConstants.KEY_DESC, + group.getProperties().put(LdifName.description.name(), descTxt.getText()); // Enable common name ? // editor.setProperty(UserAdminConstants.KEY_CN, @@ -159,8 +159,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames { cnTxt.setText(UiAdminUtils.getProperty(group, LdifName.cn.name())); descTxt.setText(UiAdminUtils.getProperty(group, - UserAdminConstants.KEY_DESC)); - + LdifName.description.name())); super.refresh(); } }; @@ -227,9 +226,13 @@ public class GroupMainPage extends FormPage implements ArgeoNames { private class MyUserTableViewer extends LdifUsersTable { private static final long serialVersionUID = 8467999509931900367L; + private final UserFilter userFilter; + public MyUserTableViewer(Composite parent, int style, UserAdmin userAdmin) { super(parent, style, true); + userFilter = new UserFilter(); + } @Override @@ -237,9 +240,11 @@ public class GroupMainPage extends FormPage implements ArgeoNames { Group group = (Group) editor.getDisplayedUser(); Role[] roles = group.getMembers(); List users = new ArrayList(); + userFilter.setSearchText(filter); for (Role role : roles) // if (role.getType() == Role.GROUP) - users.add((User) role); + if (userFilter.select(null, null, role)) + users.add((User) role); return users; } } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java index fd1931a4f..450a4a959 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java @@ -155,7 +155,9 @@ public class GroupsView extends ViewPart implements ArgeoNames { tmpBuilder.append("*)"); } if (tmpBuilder.length() > 1) { - builder.append("(&(objectclass=groupOfNames)"); + builder.append("(&(").append(LdifName.objectClass.name()) + .append("=").append(LdifName.groupOfNames.name()) + .append(")"); if (!showSystemRoleBtn.getSelection()) builder.append("(!(").append(LdifName.dn.name()) .append("=*") @@ -166,12 +168,19 @@ public class GroupsView extends ViewPart implements ArgeoNames { builder.append("))"); } else { if (!showSystemRoleBtn.getSelection()) - builder.append("(&(objectclass=groupOfNames)(!(") - .append(LdifName.dn.name()).append("=*") + builder.append("(&(") + .append(LdifName.objectClass.name()) + .append("=") + .append(LdifName.groupOfNames.name()) + .append(")(!(").append(LdifName.dn.name()) + .append("=*") .append(UserAdminConstants.SYSTEM_ROLE_BASE_DN) .append(")))"); else - builder.append("(objectclass=groupOfNames)"); + builder.append("(").append(LdifName.objectClass.name()) + .append("=") + .append(LdifName.groupOfNames.name()) + .append(")"); } roles = userAdminWrapper.getUserAdmin().getRoles( diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java index ab8ea3216..d732e7e7f 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java @@ -27,13 +27,13 @@ import org.argeo.jcr.ArgeoNames; import org.argeo.osgi.useradmin.LdifName; import org.argeo.security.ui.admin.SecurityAdminImages; import org.argeo.security.ui.admin.internal.UiAdminUtils; -import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.argeo.security.ui.admin.internal.UserAdminWrapper; import org.argeo.security.ui.admin.internal.parts.UserEditor.GroupChangeListener; import org.argeo.security.ui.admin.internal.parts.UserEditor.MainInfoListener; import org.argeo.security.ui.admin.internal.providers.CommonNameLP; import org.argeo.security.ui.admin.internal.providers.DomainNameLP; import org.argeo.security.ui.admin.internal.providers.RoleIconLP; +import org.argeo.security.ui.admin.internal.providers.UserFilter; import org.argeo.security.ui.admin.internal.providers.UserNameLP; import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener; import org.eclipse.jface.action.Action; @@ -122,11 +122,10 @@ public class UserMainPage extends FormPage implements ArgeoNames { commonName.setEnabled(false); final Text firstName = createLT(tk, body, "First name", - UiAdminUtils - .getProperty(user, UserAdminConstants.KEY_FIRSTNAME)); + UiAdminUtils.getProperty(user, LdifName.givenname.name())); final Text lastName = createLT(tk, body, "Last name", - UiAdminUtils.getProperty(user, UserAdminConstants.KEY_LASTNAME)); + UiAdminUtils.getProperty(user, LdifName.sn.name())); final Text email = createLT(tk, body, "Email", UiAdminUtils.getProperty(user, LdifName.mail.name())); @@ -151,10 +150,10 @@ public class UserMainPage extends FormPage implements ArgeoNames { @SuppressWarnings("unchecked") public void commit(boolean onSave) { // TODO Sanity checks (mail validity...) - user.getProperties().put(UserAdminConstants.KEY_FIRSTNAME, + user.getProperties().put(LdifName.givenname.name(), firstName.getText()); - user.getProperties().put(UserAdminConstants.KEY_LASTNAME, - lastName.getText()); + user.getProperties() + .put(LdifName.sn.name(), lastName.getText()); user.getProperties().put(LdifName.cn.name(), commonName.getText()); user.getProperties().put(LdifName.mail.name(), email.getText()); @@ -171,9 +170,9 @@ public class UserMainPage extends FormPage implements ArgeoNames { commonName.setText(UiAdminUtils.getProperty(user, LdifName.cn.name())); firstName.setText(UiAdminUtils.getProperty(user, - UserAdminConstants.KEY_FIRSTNAME)); + LdifName.givenname.name())); lastName.setText(UiAdminUtils.getProperty(user, - UserAdminConstants.KEY_LASTNAME)); + LdifName.sn.name())); email.setText(LdifName.mail.name()); refreshFormTitle(user); super.refresh(); @@ -315,18 +314,25 @@ public class UserMainPage extends FormPage implements ArgeoNames { private static final long serialVersionUID = 8467999509931900367L; private final User user; + private final UserFilter userFilter; public MyUserTableViewer(Composite parent, int style, User user) { super(parent, style, true); this.user = user; + userFilter = new UserFilter(); } @Override protected List listFilteredElements(String filter) { List users = (List) editor.getFlatGroups(null); + List filteredUsers = new ArrayList(); if (users.contains(user)) users.remove(user); - return users; + userFilter.setSearchText(filter); + for (User user : users) + if (userFilter.select(null, null, user)) + filteredUsers.add(user); + return filteredUsers; } } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java index 837d6a17e..b52e8591e 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java @@ -26,7 +26,6 @@ import org.argeo.jcr.ArgeoNames; import org.argeo.osgi.useradmin.LdifName; import org.argeo.security.ui.admin.SecurityAdminPlugin; import org.argeo.security.ui.admin.internal.UiAdminUtils; -import org.argeo.security.ui.admin.internal.UserAdminConstants; import org.argeo.security.ui.admin.internal.UserAdminWrapper; import org.argeo.security.ui.admin.internal.providers.CommonNameLP; import org.argeo.security.ui.admin.internal.providers.DomainNameLP; @@ -50,7 +49,7 @@ import org.osgi.service.useradmin.UserAdminListener; /** List all users with filter - based on Ldif userAdmin */ public class UsersView extends ViewPart implements ArgeoNames { // private final static Log log = LogFactory.getLog(UsersView.class); - + public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".usersView"; @@ -114,8 +113,8 @@ public class UsersView extends ViewPart implements ArgeoNames { private final String[] knownProps = { LdifName.uid.name(), LdifName.dn.name(), LdifName.cn.name(), - UserAdminConstants.KEY_FIRSTNAME, - UserAdminConstants.KEY_LASTNAME, LdifName.mail.name() }; + LdifName.givenname.name(), LdifName.sn.name(), + LdifName.mail.name() }; public MyUserTableViewer(Composite parent, int style) { super(parent, style); @@ -138,11 +137,15 @@ public class UsersView extends ViewPart implements ArgeoNames { tmpBuilder.append("*)"); } if (tmpBuilder.length() > 1) { - builder.append("(&(objectclass=inetOrgPerson)(|"); + builder.append("(&(").append(LdifName.objectClass.name()) + .append("=").append(LdifName.inetOrgPerson.name()) + .append(")(|"); builder.append(tmpBuilder.toString()); builder.append("))"); } else - builder.append("(objectclass=inetOrgPerson)"); + builder.append("(").append(LdifName.objectClass.name()) + .append("=").append(LdifName.inetOrgPerson.name()) + .append(")"); roles = userAdminWrapper.getUserAdmin().getRoles( builder.toString()); } catch (InvalidSyntaxException e) { diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/DomainNameLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/DomainNameLP.java index 287d2facc..107a4d1ae 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/DomainNameLP.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/DomainNameLP.java @@ -1,14 +1,6 @@ package org.argeo.security.ui.admin.internal.providers; -import java.util.List; - -import javax.naming.InvalidNameException; -import javax.naming.ldap.LdapName; -import javax.naming.ldap.Rdn; - -import org.argeo.ArgeoException; -import org.argeo.osgi.useradmin.LdifName; -import org.argeo.security.ui.admin.internal.UserAdminConstants; +import org.argeo.security.ui.admin.internal.UiAdminUtils; import org.osgi.service.useradmin.User; /** The human friendly domain name for the corresponding user. */ @@ -17,17 +9,6 @@ public class DomainNameLP extends UserAdminAbstractLP { @Override public String getText(User user) { - String dn = (String) user.getProperties().get(LdifName.dn.name()); - if (dn.endsWith(UserAdminConstants.SYSTEM_ROLE_BASE_DN)) - return "System roles"; - try { - LdapName name; - name = new LdapName(dn); - List rdns = name.getRdns(); - return (String) rdns.get(1).getValue() + '.' - + (String) rdns.get(0).getValue(); - } catch (InvalidNameException e) { - throw new ArgeoException("Unable to get domain name for " + dn, e); - } + return UiAdminUtils.getDomainName(user); } } \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/MailLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/MailLP.java index 1037446c9..f71d77a7f 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/MailLP.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/MailLP.java @@ -1,8 +1,7 @@ package org.argeo.security.ui.admin.internal.providers; -import java.util.Dictionary; - import org.argeo.osgi.useradmin.LdifName; +import org.argeo.security.ui.admin.internal.UiAdminUtils; import org.osgi.service.useradmin.User; /** Simply declare a label provider that returns the Primary Mail of a user */ @@ -11,12 +10,6 @@ public class MailLP extends UserAdminAbstractLP { @Override public String getText(User user) { - @SuppressWarnings("rawtypes") - Dictionary props = user.getProperties(); - Object obj = props.get(LdifName.mail.name()); - if (obj != null) - return (String) obj; - else - return ""; + return UiAdminUtils.getProperty(user, LdifName.mail.name()); } } \ No newline at end of file diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/UserFilter.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/UserFilter.java new file mode 100644 index 000000000..43c36eb20 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/providers/UserFilter.java @@ -0,0 +1,50 @@ +package org.argeo.security.ui.admin.internal.providers; + +import org.argeo.osgi.useradmin.LdifName; +import org.argeo.security.ui.admin.internal.UiAdminUtils; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.osgi.service.useradmin.User; + +public class UserFilter extends ViewerFilter { + private static final long serialVersionUID = 5082509381672880568L; + + private String searchString; + + private final String[] knownProps = { LdifName.dn.name(), + LdifName.cn.name(), LdifName.givenname.name(), LdifName.sn.name(), + LdifName.uid.name(), LdifName.description.name(), + LdifName.mail.name() }; + + public void setSearchText(String s) { + // ensure that the value can be used for matching + if (notNull(s)) + searchString = ".*" + s.toLowerCase() + ".*"; + else + searchString = ".*"; + } + + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (searchString == null || searchString.length() == 0) { + return true; + } + User user = (User) element; + + if (user.getName().matches(searchString)) + return true; + + for (String key : knownProps) { + String currVal = UiAdminUtils.getProperty(user, key); + if (notNull(currVal) && currVal.toLowerCase().matches(searchString)) + return true; + } + + return false; + } + + private boolean notNull(String str) { + return !(str == null || "".equals(str.trim())); + } + +} \ No newline at end of file