public final static Image ICON_USER = ICON_USER_DESC.createImage();
public final static Image ICON_GROUP = SecurityAdminPlugin
.getImageDescriptor(PREFIX + "users.gif").createImage();
+ public final static Image ICON_ROLE = SecurityAdminPlugin
+ .getImageDescriptor(PREFIX + "role.gif").createImage();
}
public final static String KEY_MAIL = "mail";
public final static String KEY_DESC = "description";
+ // TO BE CLEANED
+ public final static String SYSTEM_ROLE_BASE_DN = "ou=roles,ou=node";
+
}
\ No newline at end of file
import java.util.Dictionary;
import java.util.List;
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
public void setUserAdminServiceReference(
ServiceReference<UserAdmin> userAdminServiceReference) {
this.userAdminServiceReference = userAdminServiceReference;
+ // for (String uri : userAdminServiceReference.getPropertyKeys()) {
+ // if (!uri.startsWith("/"))
+ // continue;
+ // log.debug(uri);
+ // Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
+ // log.debug(props);
+ // }
+ }
+
+ public List<String> getKnownBaseDns(boolean onlyWritable) {
+ List<String> dns = new ArrayList<String>();
for (String uri : userAdminServiceReference.getPropertyKeys()) {
if (!uri.startsWith("/"))
continue;
- log.debug(uri);
Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
- log.debug(props);
+ String readOnly = UserAdminConf.readOnly.getValue(props);
+ String baseDn = UserAdminConf.baseDn.getValue(props);
+
+ if (onlyWritable && "true".equals(readOnly))
+ continue;
+ dns.add(baseDn);
}
+ return dns;
}
+// // Returns the human friendly domain name give a dn.
+// public String getDomainName(String dn) {
+// if (dn.endsWith("ou=roles, ou=node"))
+// return "System roles";
+// try {
+//
+// LdapName name;
+// name = new LdapName(dn);
+// List<Rdn> rdns = name.getRdns();
+//
+// String penultimate = (String) rdns.get(rdns.size() - 2).getValue();
+// String last = (String) rdns.get(rdns.size() - 1).getValue();
+// return (penultimate + '.' + last);
+// } catch (InvalidNameException e) {
+// throw new ArgeoException("Unable to get domain name for " + dn, e);
+// }
+// }
+
public void setUserTransaction(UserTransaction userTransaction) {
this.userTransaction = userTransaction;
}
-
-}
+}
\ No newline at end of file
package org.argeo.security.ui.admin.internal.commands;
import java.util.Dictionary;
+import java.util.List;
+import org.argeo.ArgeoException;
import org.argeo.eclipse.ui.EclipseUiUtils;
import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
import org.argeo.jcr.ArgeoNames;
import org.eclipse.swt.events.ModifyListener;
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.Text;
private UserAdminWrapper userAdminWrapper;
private UserAdmin userAdmin;
- // TODO implement a dynamic choice of the base dn
- private String getDn(String cn) {
- return "cn=" + cn + ",dc=example,dc=com";
- }
-
public Object execute(ExecutionEvent event) throws ExecutionException {
NewGroupWizard newGroupWizard = new NewGroupWizard();
WizardDialog dialog = new WizardDialog(
// End user fields
private Text dNameTxt, commonNameTxt, descriptionTxt;
+ private Combo baseDnCmb;
public NewGroupWizard() {
}
dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
"Distinguished name", this);
dNameTxt.setEnabled(false);
+
+ baseDnCmb = createGridLC(bodyCmp, "Base DN", this);
+ initialiseDnCmb(baseDnCmb);
+ baseDnCmb.addModifyListener(new ModifyListener() {
+ private static final long serialVersionUID = -1435351236582736843L;
+
+ @Override
+ public void modifyText(ModifyEvent event) {
+ String name = commonNameTxt.getText();
+ dNameTxt.setText(getDn(name));
+ }
+ });
+
commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
"Common name", this);
commonNameTxt.addModifyListener(new ModifyListener() {
commonNameTxt.setFocus();
}
}
+
+ private String getDn(String cn) {
+ return "cn=" + cn + ",ou=groups," + baseDnCmb.getText();
+ }
+
+ private void initialiseDnCmb(Combo combo) {
+ List<String> dns = userAdminWrapper.getKnownBaseDns(true);
+ if (dns.isEmpty())
+ throw new ArgeoException(
+ "No writable base dn found. Cannot create user");
+ combo.setItems(dns.toArray(new String[0]));
+ // combo.select(0);
+ }
+
+ }
+
+ private Combo createGridLC(Composite parent, String label,
+ ModifyListener modifyListener) {
+ Label lbl = new Label(parent, SWT.LEAD);
+ lbl.setText(label);
+ lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
+ combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ if (modifyListener != null)
+ combo.addModifyListener(modifyListener);
+ return combo;
}
/* DEPENDENCY INJECTION */
package org.argeo.security.ui.admin.internal.commands;
import java.util.Dictionary;
+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.EclipseUiUtils;
import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
import org.argeo.jcr.ArgeoNames;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
+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.Text;
import org.eclipse.ui.handlers.HandlerUtil;
import org.osgi.service.useradmin.Role;
/* DEPENDENCY INJECTION */
private UserAdminWrapper userAdminWrapper;
- // TODO implement a dynamic choice of the base dn
- private String getDn(String uid) {
- return "uid=" + uid + ",ou=users,dc=example,dc=com";
- }
-
public Object execute(ExecutionEvent event) throws ExecutionException {
NewUserWizard newUserWizard = new NewUserWizard();
WizardDialog dialog = new WizardDialog(
// End user fields
private Text dNameTxt, usernameTxt, firstNameTxt, lastNameTxt,
primaryMailTxt, pwd1Txt, pwd2Txt;
+ private Combo baseDnCmb;
public NewUserWizard() {
}
dNameTxt = EclipseUiUtils.createGridLT(composite,
"Distinguished name", this);
dNameTxt.setEnabled(false);
+
+ baseDnCmb = createGridLC(composite, "Base DN", this);
+ initialiseDnCmb(baseDnCmb);
+ baseDnCmb.addModifyListener(new ModifyListener() {
+ private static final long serialVersionUID = -1435351236582736843L;
+
+ @Override
+ public void modifyText(ModifyEvent event) {
+ String name = usernameTxt.getText();
+ dNameTxt.setText(getDn(name));
+ }
+ });
+
usernameTxt = EclipseUiUtils.createGridLT(composite,
"Local ID", this);
usernameTxt.addModifyListener(new ModifyListener() {
} else {
dNameTxt.setText(getDn(name));
lastNameTxt.setText(name.toUpperCase());
- primaryMailTxt.setText(name + "@example.com");
+ primaryMailTxt.setText(getMail(name));
pwd1Txt.setText("demo");
pwd2Txt.setText("demo");
}
}
}
+
+ private String getDn(String uid) {
+ return "uid=" + uid + ",ou=users," + baseDnCmb.getText();
+ }
+
+ private void initialiseDnCmb(Combo combo) {
+ List<String> dns = userAdminWrapper.getKnownBaseDns(true);
+ if (dns.isEmpty())
+ throw new ArgeoException(
+ "No writable base dn found. Cannot create user");
+ combo.setItems(dns.toArray(new String[0]));
+ // combo.select(0);
+ }
+
+ private String getMail(String username) {
+ if (baseDnCmb.getSelectionIndex() == -1)
+ return null;
+ String baseDn = baseDnCmb.getText();
+ try {
+ LdapName name = new LdapName(baseDn);
+ List<Rdn> rdns = name.getRdns();
+ return username + "@" + (String) rdns.get(1).getValue() + '.'
+ + (String) rdns.get(0).getValue();
+ } catch (InvalidNameException e) {
+ throw new ArgeoException("Unable to generate mail for "
+ + username + " with base dn " + baseDn, e);
+ }
+ }
+
+ }
+
+ private Combo createGridLC(Composite parent, String label,
+ ModifyListener modifyListener) {
+ Label lbl = new Label(parent, SWT.LEAD);
+ lbl.setText(label);
+ lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
+ combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ if (modifyListener != null)
+ combo.addModifyListener(modifyListener);
+ return combo;
}
/* DEPENDENCY INJECTION */
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
GridLayout layout = new GridLayout(2, false);
body.setLayout(layout);
- final Text distinguishedName = createLT(body, "Group Name",
- UiAdminUtils.getProperty(group, UserAdminConstants.KEY_UID));
- distinguishedName.setEnabled(false);
+ final Text dnTxt = createLT(body, "DN",
+ UiAdminUtils.getProperty(group, UserAdminConstants.KEY_DN));
+ dnTxt.setEnabled(false);
- final Text commonName = createLT(body, "Common Name",
+ final Text cnTxt = createLT(body, "Common Name",
UiAdminUtils.getProperty(group, UserAdminConstants.KEY_CN));
- commonName.setEnabled(false);
+ cnTxt.setEnabled(false);
+
+ Label descLbl = new Label(body, SWT.LEAD);
+ descLbl.setText("Description");
+ descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
+ final Text descTxt = new Text(body, SWT.LEAD | SWT.MULTI | SWT.WRAP
+ | SWT.BORDER);
+ GridData gd = EclipseUiUtils.fillAll();
+ gd.heightHint = 100;
+ descTxt.setLayoutData(gd);
// create form part (controller)
AbstractFormPart part = new SectionPart((Section) body.getParent()) {
super.dispose();
}
+ @SuppressWarnings("unchecked")
+ public void commit(boolean onSave) {
+ group.getProperties().put(UserAdminConstants.KEY_DESC,
+ descTxt.getText());
+ // Enable common name ?
+ // editor.setProperty(UserAdminConstants.KEY_CN,
+ // email.getText());
+ super.commit(onSave);
+ }
+
@Override
public void refresh() {
refreshFormTitle(group);
- distinguishedName.setText(UiAdminUtils.getProperty(group,
- UserAdminConstants.KEY_UID));
- commonName.setText(UiAdminUtils.getProperty(group,
+ dnTxt.setText(group.getName());
+ cnTxt.setText(UiAdminUtils.getProperty(group,
UserAdminConstants.KEY_CN));
+ descTxt.setText(UiAdminUtils.getProperty(group,
+ UserAdminConstants.KEY_DESC));
+
super.refresh();
}
};
+
+ ModifyListener defaultListener = editor.new FormPartML(part);
+ descTxt.addModifyListener(defaultListener);
getManagedForm().addPart(part);
}
import org.argeo.security.ui.admin.internal.UserAdminWrapper;
import org.argeo.security.ui.admin.internal.UserTableViewer;
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.UserDragListener;
import org.argeo.security.ui.admin.internal.providers.UserNameLP;
import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener;
public void createPartControl(Composite parent) {
parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
// Define the displayed columns
+ columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 26));
columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
150));
+ columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 120));
columnDefs.add(new ColumnDefinition(new UserNameLP(),
"Distinguished Name", 300));
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.UserNameLP;
import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener;
lastName.getText());
user.getProperties().put(UserAdminConstants.KEY_CN,
commonName.getText());
- user.getProperties().put(UserAdminConstants.KEY_MAIL, email.getText());
+ user.getProperties().put(UserAdminConstants.KEY_MAIL,
+ email.getText());
// Enable common name ?
// editor.setProperty(UserAdminConstants.KEY_CN,
// email.getText());
super.commit(onSave);
}
-
-
@Override
public void refresh() {
distinguishedName.setText(UiAdminUtils.getProperty(user,
columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
150));
+ columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain Name",
+ 120));
columnDefs.add(new ColumnDefinition(new UserNameLP(),
"Distinguished Name", 300));
import org.argeo.security.ui.admin.internal.UserAdminWrapper;
import org.argeo.security.ui.admin.internal.UserTableViewer;
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.MailLP;
import org.argeo.security.ui.admin.internal.providers.UserDragListener;
import org.argeo.security.ui.admin.internal.providers.UserNameLP;
// Define the displayed columns
columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
150));
+ columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 120));
columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
columnDefs.add(new ColumnDefinition(new UserNameLP(),
"Distinguished Name", 300));
--- /dev/null
+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.security.ui.admin.internal.UserAdminConstants;
+import org.osgi.service.useradmin.User;
+
+/** Returns the human friendly domain name for the corresponding user. */
+public class DomainNameLP extends UserAdminAbstractLP {
+ private static final long serialVersionUID = 5256703081044911941L;
+
+ @Override
+ public String getText(User user) {
+ String dn = (String) user.getProperties().get(KEY_DN);
+ if (dn.endsWith(UserAdminConstants.SYSTEM_ROLE_BASE_DN))
+ return "System roles";
+ try {
+ LdapName name;
+ name = new LdapName(dn);
+ List<Rdn> 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);
+ }
+ }
+}
\ No newline at end of file
package org.argeo.security.ui.admin.internal.providers;
+import java.util.Dictionary;
+
import org.osgi.service.useradmin.User;
/** Simply declare a label provider that returns the Primary Mail for a user */
@Override
public String getText(User user) {
- Object obj = user.getProperties().get(KEY_MAIL);
+ @SuppressWarnings("rawtypes")
+ Dictionary props = user.getProperties();
+ Object obj = props.get(KEY_MAIL);
if (obj != null)
return (String) obj;
else
package org.argeo.security.ui.admin.internal.providers;
import org.argeo.security.ui.admin.SecurityAdminImages;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
import org.eclipse.swt.graphics.Image;
import org.osgi.service.useradmin.Role;
import org.osgi.service.useradmin.User;
@Override
public Image getImage(Object element) {
User user = (User) element;
- if (user.getType() == Role.GROUP)
+ String dn = (String) user.getProperties().get(KEY_DN);
+ if (dn.endsWith(UserAdminConstants.SYSTEM_ROLE_BASE_DN))
+ return SecurityAdminImages.ICON_ROLE;
+ else if (user.getType() == Role.GROUP)
return SecurityAdminImages.ICON_GROUP;
else
return SecurityAdminImages.ICON_USER;