]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/NewUser.java
Simplify hierarchy units
[lgpl/argeo-commons.git] / eclipse / org.argeo.cms.e4 / src / org / argeo / cms / e4 / users / handlers / NewUser.java
1 package org.argeo.cms.e4.users.handlers;
2
3 import java.util.Dictionary;
4 import java.util.List;
5 import java.util.Map;
6
7 import javax.inject.Inject;
8 import javax.naming.InvalidNameException;
9 import javax.naming.ldap.LdapName;
10 import javax.naming.ldap.Rdn;
11
12 import org.argeo.cms.CmsException;
13 import org.argeo.cms.auth.UserAdminUtils;
14 import org.argeo.cms.e4.users.UiAdminUtils;
15 import org.argeo.cms.e4.users.UserAdminWrapper;
16 import org.argeo.eclipse.ui.EclipseUiUtils;
17 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
18 import org.argeo.osgi.useradmin.UserAdminConf;
19 import org.argeo.util.naming.LdapAttrs;
20 import org.eclipse.e4.core.di.annotations.Execute;
21 import org.eclipse.jface.wizard.Wizard;
22 import org.eclipse.jface.wizard.WizardDialog;
23 import org.eclipse.jface.wizard.WizardPage;
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.events.ModifyEvent;
26 import org.eclipse.swt.events.ModifyListener;
27 import org.eclipse.swt.layout.GridData;
28 import org.eclipse.swt.layout.GridLayout;
29 import org.eclipse.swt.widgets.Combo;
30 import org.eclipse.swt.widgets.Composite;
31 import org.eclipse.swt.widgets.Display;
32 import org.eclipse.swt.widgets.Label;
33 import org.eclipse.swt.widgets.Text;
34 import org.osgi.service.useradmin.Role;
35 import org.osgi.service.useradmin.User;
36 import org.osgi.service.useradmin.UserAdminEvent;
37
38 /** Open a wizard that enables creation of a new user. */
39 public class NewUser {
40 // private final static Log log = LogFactory.getLog(NewUser.class);
41 // public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".newUser";
42
43 /* DEPENDENCY INJECTION */
44 @Inject
45 private UserAdminWrapper userAdminWrapper;
46
47 @Execute
48 public Object execute() {
49 NewUserWizard newUserWizard = new NewUserWizard();
50 newUserWizard.setWindowTitle("User creation");
51 WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), newUserWizard);
52 dialog.open();
53 return null;
54 }
55
56 private class NewUserWizard extends Wizard {
57
58 // pages
59 private MainUserInfoWizardPage mainUserInfo;
60
61 // End user fields
62 private Text dNameTxt, usernameTxt, firstNameTxt, lastNameTxt, primaryMailTxt, pwd1Txt, pwd2Txt;
63 private Combo baseDnCmb;
64
65 public NewUserWizard() {
66
67 }
68
69 @Override
70 public void addPages() {
71 mainUserInfo = new MainUserInfoWizardPage();
72 addPage(mainUserInfo);
73 String message = "Default wizard that also eases user creation tests:\n "
74 + "Mail and last name are automatically "
75 + "generated form the uid. Password are defauted to 'demo'.";
76 mainUserInfo.setMessage(message, WizardPage.WARNING);
77 }
78
79 @SuppressWarnings({ "rawtypes", "unchecked" })
80 @Override
81 public boolean performFinish() {
82 if (!canFinish())
83 return false;
84 String username = mainUserInfo.getUsername();
85 userAdminWrapper.beginTransactionIfNeeded();
86 try {
87 User user = (User) userAdminWrapper.getUserAdmin().createRole(getDn(username), Role.USER);
88
89 Dictionary props = user.getProperties();
90
91 String lastNameStr = lastNameTxt.getText();
92 if (EclipseUiUtils.notEmpty(lastNameStr))
93 props.put(LdapAttrs.sn.name(), lastNameStr);
94
95 String firstNameStr = firstNameTxt.getText();
96 if (EclipseUiUtils.notEmpty(firstNameStr))
97 props.put(LdapAttrs.givenName.name(), firstNameStr);
98
99 String cn = UserAdminUtils.buildDefaultCn(firstNameStr, lastNameStr);
100 if (EclipseUiUtils.notEmpty(cn))
101 props.put(LdapAttrs.cn.name(), cn);
102
103 String mailStr = primaryMailTxt.getText();
104 if (EclipseUiUtils.notEmpty(mailStr))
105 props.put(LdapAttrs.mail.name(), mailStr);
106
107 char[] password = mainUserInfo.getPassword();
108 user.getCredentials().put(null, password);
109 userAdminWrapper.commitOrNotifyTransactionStateChange();
110 userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CREATED, user));
111 return true;
112 } catch (Exception e) {
113 ErrorFeedback.show("Cannot create new user " + username, e);
114 return false;
115 }
116 }
117
118 private class MainUserInfoWizardPage extends WizardPage implements ModifyListener {
119 private static final long serialVersionUID = -3150193365151601807L;
120
121 public MainUserInfoWizardPage() {
122 super("Main");
123 setTitle("Required Information");
124 }
125
126 @Override
127 public void createControl(Composite parent) {
128 Composite composite = new Composite(parent, SWT.NONE);
129 composite.setLayout(new GridLayout(2, false));
130 dNameTxt = EclipseUiUtils.createGridLT(composite, "Distinguished name", this);
131 dNameTxt.setEnabled(false);
132
133 baseDnCmb = createGridLC(composite, "Base DN");
134 initialiseDnCmb(baseDnCmb);
135 baseDnCmb.addModifyListener(this);
136 baseDnCmb.addModifyListener(new ModifyListener() {
137 private static final long serialVersionUID = -1435351236582736843L;
138
139 @Override
140 public void modifyText(ModifyEvent event) {
141 String name = usernameTxt.getText();
142 dNameTxt.setText(getDn(name));
143 }
144 });
145
146 usernameTxt = EclipseUiUtils.createGridLT(composite, "Local ID", this);
147 usernameTxt.addModifyListener(new ModifyListener() {
148 private static final long serialVersionUID = -1435351236582736843L;
149
150 @Override
151 public void modifyText(ModifyEvent event) {
152 String name = usernameTxt.getText();
153 if (name.trim().equals("")) {
154 dNameTxt.setText("");
155 lastNameTxt.setText("");
156 primaryMailTxt.setText("");
157 pwd1Txt.setText("");
158 pwd2Txt.setText("");
159 } else {
160 dNameTxt.setText(getDn(name));
161 lastNameTxt.setText(name.toUpperCase());
162 primaryMailTxt.setText(getMail(name));
163 pwd1Txt.setText("demo");
164 pwd2Txt.setText("demo");
165 }
166 }
167 });
168
169 primaryMailTxt = EclipseUiUtils.createGridLT(composite, "Email", this);
170 firstNameTxt = EclipseUiUtils.createGridLT(composite, "First name", this);
171 lastNameTxt = EclipseUiUtils.createGridLT(composite, "Last name", this);
172 pwd1Txt = EclipseUiUtils.createGridLP(composite, "Password", this);
173 pwd2Txt = EclipseUiUtils.createGridLP(composite, "Repeat password", this);
174 setControl(composite);
175
176 // Initialize buttons
177 setPageComplete(false);
178 getContainer().updateButtons();
179 }
180
181 @Override
182 public void modifyText(ModifyEvent event) {
183 String message = checkComplete();
184 if (message != null) {
185 setMessage(message, WizardPage.ERROR);
186 setPageComplete(false);
187 } else {
188 setMessage("Complete", WizardPage.INFORMATION);
189 setPageComplete(true);
190 }
191 getContainer().updateButtons();
192 }
193
194 /** @return error message or null if complete */
195 protected String checkComplete() {
196 String name = usernameTxt.getText();
197
198 if (name.trim().equals(""))
199 return "User name must not be empty";
200 Role role = userAdminWrapper.getUserAdmin().getRole(getDn(name));
201 if (role != null)
202 return "User " + name + " already exists";
203 if (!primaryMailTxt.getText().matches(UiAdminUtils.EMAIL_PATTERN))
204 return "Not a valid email address";
205 if (lastNameTxt.getText().trim().equals(""))
206 return "Specify a last name";
207 if (pwd1Txt.getText().trim().equals(""))
208 return "Specify a password";
209 if (pwd2Txt.getText().trim().equals(""))
210 return "Repeat the password";
211 if (!pwd2Txt.getText().equals(pwd1Txt.getText()))
212 return "Passwords are different";
213 return null;
214 }
215
216 @Override
217 public void setVisible(boolean visible) {
218 super.setVisible(visible);
219 if (visible)
220 if (baseDnCmb.getSelectionIndex() == -1)
221 baseDnCmb.setFocus();
222 else
223 usernameTxt.setFocus();
224 }
225
226 public String getUsername() {
227 return usernameTxt.getText();
228 }
229
230 public char[] getPassword() {
231 return pwd1Txt.getTextChars();
232 }
233
234 }
235
236 private Map<String, String> getDns() {
237 return userAdminWrapper.getKnownBaseDns(true);
238 }
239
240 private String getDn(String uid) {
241 Map<String, String> dns = getDns();
242 String bdn = baseDnCmb.getText();
243 if (EclipseUiUtils.notEmpty(bdn)) {
244 Dictionary<String, ?> props = UserAdminConf.uriAsProperties(dns.get(bdn));
245 String dn = LdapAttrs.uid.name() + "=" + uid + "," + UserAdminConf.userBase.getValue(props) + "," + bdn;
246 return dn;
247 }
248 return null;
249 }
250
251 private void initialiseDnCmb(Combo combo) {
252 Map<String, String> dns = userAdminWrapper.getKnownBaseDns(true);
253 if (dns.isEmpty())
254 throw new CmsException("No writable base dn found. Cannot create user");
255 combo.setItems(dns.keySet().toArray(new String[0]));
256 if (dns.size() == 1)
257 combo.select(0);
258 }
259
260 private String getMail(String username) {
261 if (baseDnCmb.getSelectionIndex() == -1)
262 return null;
263 String baseDn = baseDnCmb.getText();
264 try {
265 LdapName name = new LdapName(baseDn);
266 List<Rdn> rdns = name.getRdns();
267 return username + "@" + (String) rdns.get(1).getValue() + '.' + (String) rdns.get(0).getValue();
268 } catch (InvalidNameException e) {
269 throw new CmsException("Unable to generate mail for " + username + " with base dn " + baseDn, e);
270 }
271 }
272 }
273
274 private Combo createGridLC(Composite parent, String label) {
275 Label lbl = new Label(parent, SWT.LEAD);
276 lbl.setText(label);
277 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
278 Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
279 combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
280 return combo;
281 }
282
283 /* DEPENDENCY INJECTION */
284 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
285 this.userAdminWrapper = userAdminWrapper;
286 }
287 }