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