1 package org
.argeo
.cms
.e4
.users
.handlers
;
3 import java
.util
.Dictionary
;
7 import jakarta
.inject
.Inject
;
8 import javax
.naming
.InvalidNameException
;
9 import javax
.naming
.ldap
.LdapName
;
10 import javax
.naming
.ldap
.Rdn
;
12 import org
.argeo
.api
.acr
.ldap
.LdapAttr
;
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
.cms
.runtime
.DirectoryConf
;
17 import org
.argeo
.cms
.swt
.CmsException
;
18 import org
.argeo
.eclipse
.ui
.EclipseUiUtils
;
19 import org
.argeo
.eclipse
.ui
.dialogs
.ErrorFeedback
;
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
;
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";
43 /* DEPENDENCY INJECTION */
45 private UserAdminWrapper userAdminWrapper
;
48 public Object
execute() {
49 NewUserWizard newUserWizard
= new NewUserWizard();
50 newUserWizard
.setWindowTitle("User creation");
51 WizardDialog dialog
= new WizardDialog(Display
.getCurrent().getActiveShell(), newUserWizard
);
56 private class NewUserWizard
extends Wizard
{
59 private MainUserInfoWizardPage mainUserInfo
;
62 private Text dNameTxt
, usernameTxt
, firstNameTxt
, lastNameTxt
, primaryMailTxt
, pwd1Txt
, pwd2Txt
;
63 private Combo baseDnCmb
;
65 public NewUserWizard() {
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
);
79 @SuppressWarnings({ "rawtypes", "unchecked" })
81 public boolean performFinish() {
84 String username
= mainUserInfo
.getUsername();
85 userAdminWrapper
.beginTransactionIfNeeded();
87 User user
= (User
) userAdminWrapper
.getUserAdmin().createRole(getDn(username
), Role
.USER
);
89 Dictionary props
= user
.getProperties();
91 String lastNameStr
= lastNameTxt
.getText();
92 if (EclipseUiUtils
.notEmpty(lastNameStr
))
93 props
.put(LdapAttr
.sn
.name(), lastNameStr
);
95 String firstNameStr
= firstNameTxt
.getText();
96 if (EclipseUiUtils
.notEmpty(firstNameStr
))
97 props
.put(LdapAttr
.givenName
.name(), firstNameStr
);
99 String cn
= UserAdminUtils
.buildDefaultCn(firstNameStr
, lastNameStr
);
100 if (EclipseUiUtils
.notEmpty(cn
))
101 props
.put(LdapAttr
.cn
.name(), cn
);
103 String mailStr
= primaryMailTxt
.getText();
104 if (EclipseUiUtils
.notEmpty(mailStr
))
105 props
.put(LdapAttr
.mail
.name(), mailStr
);
107 char[] password
= mainUserInfo
.getPassword();
108 user
.getCredentials().put(null, password
);
109 userAdminWrapper
.commitOrNotifyTransactionStateChange();
110 userAdminWrapper
.notifyListeners(new UserAdminEvent(null, UserAdminEvent
.ROLE_CREATED
, user
));
112 } catch (Exception e
) {
113 ErrorFeedback
.show("Cannot create new user " + username
, e
);
118 private class MainUserInfoWizardPage
extends WizardPage
implements ModifyListener
{
119 private static final long serialVersionUID
= -3150193365151601807L;
121 public MainUserInfoWizardPage() {
123 setTitle("Required Information");
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);
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;
140 public void modifyText(ModifyEvent event
) {
141 String name
= usernameTxt
.getText();
142 dNameTxt
.setText(getDn(name
));
146 usernameTxt
= EclipseUiUtils
.createGridLT(composite
, "Local ID", this);
147 usernameTxt
.addModifyListener(new ModifyListener() {
148 private static final long serialVersionUID
= -1435351236582736843L;
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("");
160 dNameTxt
.setText(getDn(name
));
161 lastNameTxt
.setText(name
.toUpperCase());
162 primaryMailTxt
.setText(getMail(name
));
163 pwd1Txt
.setText("demo");
164 pwd2Txt
.setText("demo");
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
);
176 // Initialize buttons
177 setPageComplete(false);
178 getContainer().updateButtons();
182 public void modifyText(ModifyEvent event
) {
183 String message
= checkComplete();
184 if (message
!= null) {
185 setMessage(message
, WizardPage
.ERROR
);
186 setPageComplete(false);
188 setMessage("Complete", WizardPage
.INFORMATION
);
189 setPageComplete(true);
191 getContainer().updateButtons();
194 /** @return error message or null if complete */
195 protected String
checkComplete() {
196 String name
= usernameTxt
.getText();
198 if (name
.trim().equals(""))
199 return "User name must not be empty";
200 Role role
= userAdminWrapper
.getUserAdmin().getRole(getDn(name
));
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";
217 public void setVisible(boolean visible
) {
218 super.setVisible(visible
);
220 if (baseDnCmb
.getSelectionIndex() == -1)
221 baseDnCmb
.setFocus();
223 usernameTxt
.setFocus();
226 public String
getUsername() {
227 return usernameTxt
.getText();
230 public char[] getPassword() {
231 return pwd1Txt
.getTextChars();
236 private Map
<String
, String
> getDns() {
237 return userAdminWrapper
.getKnownBaseDns(true);
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
= DirectoryConf
.uriAsProperties(dns
.get(bdn
));
245 String dn
= LdapAttr
.uid
.name() + "=" + uid
+ "," + DirectoryConf
.userBase
.getValue(props
) + "," + bdn
;
251 private void initialiseDnCmb(Combo combo
) {
252 Map
<String
, String
> dns
= userAdminWrapper
.getKnownBaseDns(true);
254 throw new CmsException("No writable base dn found. Cannot create user");
255 combo
.setItems(dns
.keySet().toArray(new String
[0]));
260 private String
getMail(String username
) {
261 if (baseDnCmb
.getSelectionIndex() == -1)
263 String baseDn
= baseDnCmb
.getText();
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
);
274 private Combo
createGridLC(Composite parent
, String label
) {
275 Label lbl
= new Label(parent
, SWT
.LEAD
);
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));
283 /* DEPENDENCY INJECTION */
284 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper
) {
285 this.userAdminWrapper
= userAdminWrapper
;