]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java
Plug password management
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / editors / UserMainPage.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.editors;
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21
22 import org.argeo.ArgeoException;
23 import org.argeo.eclipse.ui.EclipseUiUtils;
24 import org.argeo.jcr.ArgeoNames;
25 import org.argeo.security.ui.admin.internal.ColumnDefinition;
26 import org.argeo.security.ui.admin.internal.CommonNameLP;
27 import org.argeo.security.ui.admin.internal.RoleIconLP;
28 import org.argeo.security.ui.admin.internal.UserAdminConstants;
29 import org.argeo.security.ui.admin.internal.UserNameLP;
30 import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
31 import org.argeo.security.ui.admin.internal.UserTableViewer;
32 import org.eclipse.jface.viewers.TableViewer;
33 import org.eclipse.jface.viewers.Viewer;
34 import org.eclipse.jface.viewers.ViewerDropAdapter;
35 import org.eclipse.swt.SWT;
36 import org.eclipse.swt.dnd.DND;
37 import org.eclipse.swt.dnd.DropTargetEvent;
38 import org.eclipse.swt.dnd.TextTransfer;
39 import org.eclipse.swt.dnd.Transfer;
40 import org.eclipse.swt.dnd.TransferData;
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.Composite;
46 import org.eclipse.swt.widgets.Label;
47 import org.eclipse.swt.widgets.Text;
48 import org.eclipse.ui.forms.AbstractFormPart;
49 import org.eclipse.ui.forms.IManagedForm;
50 import org.eclipse.ui.forms.SectionPart;
51 import org.eclipse.ui.forms.editor.FormEditor;
52 import org.eclipse.ui.forms.editor.FormPage;
53 import org.eclipse.ui.forms.widgets.FormToolkit;
54 import org.eclipse.ui.forms.widgets.ScrolledForm;
55 import org.eclipse.ui.forms.widgets.Section;
56 import org.osgi.service.useradmin.Group;
57 import org.osgi.service.useradmin.Role;
58 import org.osgi.service.useradmin.User;
59 import org.osgi.service.useradmin.UserAdmin;
60
61 /** Display/edit the properties common to all users */
62 public class UserMainPage extends FormPage implements ArgeoNames {
63 final static String ID = "argeoUserEditor.mainPage";
64
65 // private final static Log log = LogFactory.getLog(UserMainPage.class);
66
67 private final UserEditor editor;
68 private UserAdmin userAdmin;
69
70 private char[] newPassword;
71
72 // Local configuration
73 private final int PRE_TITLE_INDENT = 10;
74
75 public UserMainPage(FormEditor editor, UserAdmin userAdmin) {
76 super(editor, ID, "Main");
77 this.editor = (UserEditor) editor;
78 this.userAdmin = userAdmin;
79 }
80
81 public String getNewPassword() {
82 if (newPassword != null)
83 return new String(newPassword);
84 else
85 return null;
86 }
87
88 public void resetNewPassword() {
89 if (newPassword != null)
90 Arrays.fill(newPassword, 'x');
91 newPassword = null;
92 }
93
94 protected void createFormContent(final IManagedForm mf) {
95 ScrolledForm form = mf.getForm();
96 // Form page main title
97 form.setText(editor.getProperty(UserAdminConstants.KEY_CN));
98
99 // Body
100 Composite body = form.getBody();
101 GridLayout mainLayout = new GridLayout(1, true);
102 body.setLayout(mainLayout);
103 appendOverviewPart(body);
104 appendPasswordPart(body);
105 appendMemberOfPart(body);
106 }
107
108 /** Creates the general section */
109 protected void appendOverviewPart(Composite parent) {
110 FormToolkit tk = getManagedForm().getToolkit();
111 Composite body = addSection(tk, parent, "Main information");
112 body.setLayout(new GridLayout(2, false));
113
114 Text distinguishedName = createLT(body, "User Name",
115 editor.getProperty(UserAdminConstants.KEY_UID));
116 distinguishedName.setEnabled(false);
117
118 final Text commonName = createLT(body, "Common Name",
119 editor.getProperty(UserAdminConstants.KEY_CN));
120 commonName.setEnabled(false);
121
122 final Text firstName = createLT(body, "First name",
123 editor.getProperty(UserAdminConstants.KEY_FIRSTNAME));
124
125 final Text lastName = createLT(body, "Last name",
126 editor.getProperty(UserAdminConstants.KEY_LASTNAME));
127
128 final Text email = createLT(body, "Email",
129 editor.getProperty(UserAdminConstants.KEY_MAIL));
130
131 // create form part (controller)
132 AbstractFormPart part = new SectionPart((Section) body.getParent()) {
133 public void commit(boolean onSave) {
134 // TODO check changed ?
135 // TODO Sanity checks
136
137 editor.setProperty(UserAdminConstants.KEY_FIRSTNAME,
138 firstName.getText());
139 editor.setProperty(UserAdminConstants.KEY_LASTNAME,
140 lastName.getText());
141 editor.setProperty(UserAdminConstants.KEY_CN,
142 commonName.getText());
143 // TODO check mail validity
144 editor.setProperty(UserAdminConstants.KEY_MAIL, email.getText());
145
146 // Enable common name ?
147 // editor.setProperty(UserAdminConstants.KEY_CN,
148 // email.getText());
149 super.commit(onSave);
150 }
151 };
152
153 ModifyListener cnML = new ModifyListener() {
154 private static final long serialVersionUID = 4298649222869835486L;
155
156 @Override
157 public void modifyText(ModifyEvent event) {
158 String first = firstName.getText();
159 String last = lastName.getText();
160 String cn = first.trim() + " " + last.trim() + " ";
161 cn = cn.trim();
162 commonName.setText(cn);
163 getManagedForm().getForm().setText(cn);
164 editor.updateEditorTitle(cn);
165 }
166 };
167 firstName.addModifyListener(cnML);
168 lastName.addModifyListener(cnML);
169 firstName.addModifyListener(new FormPartML(part));
170 lastName.addModifyListener(new FormPartML(part));
171 email.addModifyListener(new FormPartML(part));
172 getManagedForm().addPart(part);
173 }
174
175 /** Creates the password section */
176 protected void appendPasswordPart(Composite parent) {
177 FormToolkit tk = getManagedForm().getToolkit();
178 Composite body = addSection(tk, parent, "Password");
179
180 // Section section = tk.createSection(parent, Section.TITLE_BAR);
181 // section.setLayoutData(EclipseUiUtils.fillWidth());
182 // section.setText("Password");
183 // Composite body = tk.createComposite(section, SWT.NO_FOCUS);
184 // section.setClient(body);
185 // body.setLayoutData(EclipseUiUtils.fillWidth());
186
187 body.setLayout(new GridLayout(2, false));
188 // add widgets (view)
189 final Text password1 = createLP(body, "New password", "");
190 final Text password2 = createLP(body, "Repeat password", "");
191 // create form part (controller)
192 AbstractFormPart part = new SectionPart((Section) body.getParent()) {
193
194 public void commit(boolean onSave) {
195 if (!password1.getText().equals("")
196 || !password2.getText().equals("")) {
197 if (password1.getText().equals(password2.getText())) {
198 newPassword = password1.getText().toCharArray();
199 // TODO real set password
200 password1.setText("");
201 password2.setText("");
202 super.commit(onSave);
203 } else {
204 password1.setText("");
205 password2.setText("");
206 throw new ArgeoException("Passwords are not equals");
207 }
208 }
209 }
210
211 };
212 password1.addModifyListener(new FormPartML(part));
213 password2.addModifyListener(new FormPartML(part));
214 getManagedForm().addPart(part);
215 }
216
217 private UserTableViewer userTableViewerCmp;
218 private TableViewer userViewer;
219
220 private void appendMemberOfPart(Composite parent) {
221 FormToolkit tk = getManagedForm().getToolkit();
222 Composite body = addSection(tk, parent, "Roles");
223 body.setLayout(EclipseUiUtils.noSpaceGridLayout());
224
225 // Define the displayed columns
226 List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
227 columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
228 columnDefs.add(new ColumnDefinition(new UserNameLP(),
229 "Distinguished Name", 300));
230 columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
231 150));
232
233 // Create and configure the table
234 userTableViewerCmp = new MyUserTableViewer(body, SWT.MULTI
235 | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
236
237 userTableViewerCmp.setColumnDefinitions(columnDefs);
238 userTableViewerCmp.populate(true, false);
239 GridData gd = EclipseUiUtils.fillAll();
240 gd.heightHint = 300;
241 userTableViewerCmp.setLayoutData(gd);
242
243 // Links
244 userViewer = userTableViewerCmp.getTableViewer();
245 userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
246 // Really?
247 userTableViewerCmp.refresh();
248
249 // Drag and drop
250 int operations = DND.DROP_COPY | DND.DROP_MOVE;
251 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
252 userViewer.addDropSupport(operations, tt, new GroupDropListener(
253 userViewer, userAdmin, editor.getDisplayedUser()));
254
255 }
256
257 private class MyUserTableViewer extends UserTableViewer {
258 private static final long serialVersionUID = 8467999509931900367L;
259
260 public MyUserTableViewer(Composite parent, int style,
261 UserAdmin userAdmin) {
262 super(parent, style, userAdmin, true);
263 }
264
265 @Override
266 protected List<User> listFilteredElements(String filter) {
267 return (List<User>) editor.getFlatGroups(null);
268 }
269 }
270
271 /**
272 * Defines this table as being a potential target to add group membership
273 * (roles) to this user
274 */
275 private class GroupDropListener extends ViewerDropAdapter {
276 private static final long serialVersionUID = 2893468717831451621L;
277
278 private final UserAdmin myUserAdmin;
279 private final User myUser;
280
281 public GroupDropListener(Viewer viewer, UserAdmin userAdmin, User user) {
282 super(viewer);
283 this.myUserAdmin = userAdmin;
284 this.myUser = user;
285 }
286
287 @Override
288 public boolean validateDrop(Object target, int operation,
289 TransferData transferType) {
290 // Target is always OK in a list only view
291 // TODO check if not a string
292 boolean validDrop = true;
293 return validDrop;
294 }
295
296 @Override
297 public void drop(DropTargetEvent event) {
298 String name = (String) event.data;
299 Role role = myUserAdmin.getRole(name);
300 // TODO this check should be done before.
301 if (role.getType() == Role.GROUP) {
302 // TODO check if the user is already member of this group
303 // we expect here that there is already a begun transaction
304 // TODO implement the dirty state
305 editor.beginTransactionIfNeeded();
306 Group group = (Group) role;
307 group.addMember(myUser);
308 }
309 super.drop(event);
310 }
311
312 @Override
313 public boolean performDrop(Object data) {
314 userTableViewerCmp.refresh();
315 return true;
316 }
317 }
318
319 // LOCAL HELPERS
320 /** Appends a section with a title */
321 private Composite addSection(FormToolkit tk, Composite parent, String title) {
322 Section section = tk.createSection(parent, Section.TITLE_BAR);
323 GridData gd = EclipseUiUtils.fillWidth();
324 gd.verticalAlignment = PRE_TITLE_INDENT;
325 section.setLayoutData(gd);
326 section.setText(title);
327 Composite body = tk.createComposite(section, SWT.WRAP);
328 body.setLayoutData(EclipseUiUtils.fillAll());
329 section.setClient(body);
330 return body;
331 }
332
333 /** Creates label and multiline text. */
334 protected Text createLMT(Composite body, String label, String value) {
335 FormToolkit toolkit = getManagedForm().getToolkit();
336 Label lbl = toolkit.createLabel(body, label);
337 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
338 Text text = toolkit.createText(body, value, SWT.BORDER | SWT.MULTI);
339 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
340 return text;
341 }
342
343 /** Creates label and password. */
344 protected Text createLP(Composite body, String label, String value) {
345 FormToolkit toolkit = getManagedForm().getToolkit();
346 Label lbl = toolkit.createLabel(body, label);
347 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
348 Text text = toolkit.createText(body, value, SWT.BORDER | SWT.PASSWORD);
349 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
350 return text;
351 }
352
353 /** Creates label and text. */
354 protected Text createLT(Composite body, String label, String value) {
355 FormToolkit toolkit = getManagedForm().getToolkit();
356 Label lbl = toolkit.createLabel(body, label);
357 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
358 Text text = toolkit.createText(body, value, SWT.BORDER);
359 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
360 return text;
361 }
362
363 private class FormPartML implements ModifyListener {
364 private static final long serialVersionUID = 6299808129505381333L;
365 private AbstractFormPart formPart;
366
367 public FormPartML(AbstractFormPart generalPart) {
368 this.formPart = generalPart;
369 }
370
371 public void modifyText(ModifyEvent e) {
372 formPart.markDirty();
373 }
374 }
375 }