]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java
9f1ae8d0d0d37363b670c0ba250ad8c8028fb3d6
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / commands / 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.security.ui.admin.commands;
17
18 import java.util.Dictionary;
19
20 import javax.transaction.Status;
21 import javax.transaction.UserTransaction;
22
23 import org.argeo.ArgeoException;
24 import org.argeo.eclipse.ui.EclipseUiUtils;
25 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
26 import org.argeo.jcr.ArgeoNames;
27 import org.argeo.security.UserAdminService;
28 import org.argeo.security.ui.admin.SecurityAdminPlugin;
29 import org.argeo.security.ui.admin.internal.UiAdminUtils;
30 import org.argeo.security.ui.admin.internal.UserAdminConstants;
31 import org.argeo.security.ui.admin.views.UsersView;
32 import org.eclipse.core.commands.AbstractHandler;
33 import org.eclipse.core.commands.ExecutionEvent;
34 import org.eclipse.core.commands.ExecutionException;
35 import org.eclipse.jface.window.Window;
36 import org.eclipse.jface.wizard.Wizard;
37 import org.eclipse.jface.wizard.WizardDialog;
38 import org.eclipse.jface.wizard.WizardPage;
39 import org.eclipse.swt.SWT;
40 import org.eclipse.swt.events.ModifyEvent;
41 import org.eclipse.swt.events.ModifyListener;
42 import org.eclipse.swt.layout.GridLayout;
43 import org.eclipse.swt.widgets.Composite;
44 import org.eclipse.swt.widgets.Text;
45 import org.eclipse.ui.IWorkbenchPage;
46 import org.eclipse.ui.IWorkbenchPart;
47 import org.eclipse.ui.IWorkbenchWindow;
48 import org.eclipse.ui.handlers.HandlerUtil;
49 import org.osgi.service.useradmin.Role;
50 import org.osgi.service.useradmin.User;
51 import org.osgi.service.useradmin.UserAdmin;
52
53 /** Open a wizard that enables creation of a new user. */
54 public class NewUser extends AbstractHandler {
55 // private final static Log log = LogFactory.getLog(NewUser.class);
56 public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newUser";
57
58 /* DEPENDENCY INJECTION */
59 private UserAdmin userAdmin;
60 private UserTransaction userTransaction;
61
62 // TODO implement a dynamic choice of the base dn
63 private String getDn(String uid) {
64 return "uid=" + uid + ",ou=users,dc=example,dc=com";
65 }
66
67 public Object execute(ExecutionEvent event) throws ExecutionException {
68 NewUserWizard newUserWizard = new NewUserWizard();
69 WizardDialog dialog = new WizardDialog(
70 HandlerUtil.getActiveShell(event), newUserWizard);
71
72 // Force refresh until the listener are implemented
73 if (Window.OK == dialog.open())
74 forceRefresh(event);
75 return null;
76 }
77
78 private void forceRefresh(ExecutionEvent event) {
79 IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
80 if (iww == null)
81 return;
82 IWorkbenchPage activePage = iww.getActivePage();
83 IWorkbenchPart part = activePage.getActivePart();
84 if (part instanceof UsersView)
85 ((UsersView) part).refresh();
86 }
87
88 private class NewUserWizard extends Wizard {
89
90 // pages
91 private MainUserInfoWizardPage mainUserInfo;
92
93 // End user fields
94 private Text dNameTxt, usernameTxt, firstNameTxt, lastNameTxt,
95 primaryMailTxt, pwd1Txt, pwd2Txt;
96
97 public NewUserWizard() {
98 }
99
100 @Override
101 public void addPages() {
102 mainUserInfo = new MainUserInfoWizardPage();
103 addPage(mainUserInfo);
104 String message = "Dummy wizard to ease user creation tests:\n Mail and last name are automatically "
105 + "generated form the uid. Password are defauted to 'demo'.";
106 mainUserInfo.setMessage(message, WizardPage.WARNING);
107 }
108
109 @SuppressWarnings({ "rawtypes", "unchecked" })
110 @Override
111 public boolean performFinish() {
112 if (!canFinish())
113 return false;
114 String username = mainUserInfo.getUsername();
115
116 // Begin transaction if needed
117 try {
118 if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
119 userTransaction.begin();
120 } catch (Exception e) {
121 throw new ArgeoException("Unable to start "
122 + "transaction to create user " + username, e);
123 }
124
125 try {
126 char[] password = mainUserInfo.getPassword();
127 User user = (User) userAdmin.createRole(getDn(username),
128 Role.USER);
129
130 Dictionary props = user.getProperties();
131
132 String lastNameStr = lastNameTxt.getText();
133 if (UiAdminUtils.notNull(lastNameStr))
134 props.put(UserAdminConstants.KEY_LASTNAME, lastNameStr);
135
136 String firstNameStr = firstNameTxt.getText();
137 if (UiAdminUtils.notNull(firstNameStr))
138 props.put(UserAdminConstants.KEY_FIRSTNAME, firstNameStr);
139
140 String cn = UiAdminUtils
141 .getDefaultCn(firstNameStr, lastNameStr);
142 if (UiAdminUtils.notNull(cn))
143 props.put(UserAdminConstants.KEY_CN, cn);
144
145 String mailStr = primaryMailTxt.getText();
146 if (UiAdminUtils.notNull(mailStr))
147 props.put(UserAdminConstants.KEY_MAIL, mailStr);
148
149 // TODO MANAGE Password
150 // pwd1Txt.getText();
151 return true;
152 } catch (Exception e) {
153 ErrorFeedback.show("Cannot create new user " + username, e);
154 return false;
155 }
156 }
157
158 private class MainUserInfoWizardPage extends WizardPage implements
159 ModifyListener, ArgeoNames {
160 private static final long serialVersionUID = -3150193365151601807L;
161
162 public MainUserInfoWizardPage() {
163 super("Main");
164 setTitle("Required Information");
165 }
166
167 @Override
168 public void createControl(Composite parent) {
169 Composite composite = new Composite(parent, SWT.NONE);
170 composite.setLayout(new GridLayout(2, false));
171 dNameTxt = EclipseUiUtils.createGridLT(composite,
172 "Distinguished name", this);
173 dNameTxt.setEnabled(false);
174 usernameTxt = EclipseUiUtils.createGridLT(composite,
175 "Local ID", this);
176 usernameTxt.addModifyListener(new ModifyListener() {
177 private static final long serialVersionUID = -1435351236582736843L;
178
179 @Override
180 public void modifyText(ModifyEvent event) {
181 String name = usernameTxt.getText();
182 if (name.trim().equals("")) {
183 dNameTxt.setText("");
184 lastNameTxt.setText("");
185 primaryMailTxt.setText("");
186 pwd1Txt.setText("");
187 pwd2Txt.setText("");
188 } else {
189 dNameTxt.setText(getDn(name));
190 lastNameTxt.setText(name.toUpperCase());
191 primaryMailTxt.setText(name + "@example.com");
192 pwd1Txt.setText("demo");
193 pwd2Txt.setText("demo");
194 }
195 }
196 });
197
198 primaryMailTxt = EclipseUiUtils.createGridLT(composite,
199 "Email", this);
200 firstNameTxt = EclipseUiUtils.createGridLT(composite,
201 "First name", this);
202 lastNameTxt = EclipseUiUtils.createGridLT(composite,
203 "Last name", this);
204 pwd1Txt = EclipseUiUtils.createGridLP(composite, "Password",
205 this);
206 pwd2Txt = EclipseUiUtils.createGridLP(composite,
207 "Repeat password", this);
208 setControl(composite);
209
210 // Initialize buttons
211 setPageComplete(false);
212 getContainer().updateButtons();
213 }
214
215 @Override
216 public void modifyText(ModifyEvent event) {
217 String message = checkComplete();
218 if (message != null) {
219 setMessage(message, WizardPage.ERROR);
220 setPageComplete(false);
221 } else {
222 setMessage("Complete", WizardPage.INFORMATION);
223 setPageComplete(true);
224 }
225 getContainer().updateButtons();
226 }
227
228 /** @return error message or null if complete */
229 protected String checkComplete() {
230 String name = usernameTxt.getText();
231
232 if (name.trim().equals(""))
233 return "User name must not be empty";
234 Role role = userAdmin.getRole(getDn(name));
235 if (role != null)
236 return "User " + name + " already exists";
237 if (!primaryMailTxt.getText().matches(
238 UserAdminService.EMAIL_PATTERN))
239 return "Not a valid email address";
240 if (lastNameTxt.getText().trim().equals(""))
241 return "Specify a last name";
242 if (pwd1Txt.getText().trim().equals(""))
243 return "Specify a password";
244 if (pwd2Txt.getText().trim().equals(""))
245 return "Repeat the password";
246 if (!pwd2Txt.getText().equals(pwd1Txt.getText()))
247 return "Passwords are different";
248 return null;
249 }
250
251 @Override
252 public void setVisible(boolean visible) {
253 super.setVisible(visible);
254 if (visible)
255 usernameTxt.setFocus();
256 }
257
258 public String getUsername() {
259 return usernameTxt.getText();
260 }
261
262 public char[] getPassword() {
263 return pwd1Txt.getTextChars();
264 }
265
266 }
267 }
268
269 /* DEPENDENCY INJECTION */
270 public void setUserAdmin(UserAdmin userAdmin) {
271 this.userAdmin = userAdmin;
272 }
273
274 public void setUserTransaction(UserTransaction userTransaction) {
275 this.userTransaction = userTransaction;
276 }
277 }