1 |
slords |
1.1 |
diff -Nur -x '*.orig' -x '*.rej' smeserver-kronolith-1.1.sme/createlinks smeserver-kronolith-1.1/createlinks |
2 |
|
|
--- smeserver-kronolith-1.1.sme/createlinks 2006-11-09 21:37:18.000000000 -0700 |
3 |
|
|
+++ smeserver-kronolith-1.1/createlinks 2008-04-01 09:38:16.000000000 -0600 |
4 |
|
|
@@ -28,22 +28,5 @@ |
5 |
|
|
qw(post-upgrade)); |
6 |
|
|
} |
7 |
|
|
|
8 |
|
|
-sub panel_link |
9 |
|
|
-{ |
10 |
|
|
- my ($function, $panel) = @_; |
11 |
|
|
- |
12 |
|
|
- my $cgibin = "root/etc/e-smith/web/panels/$panel/cgi-bin"; |
13 |
|
|
- |
14 |
|
|
- safe_symlink("../../../functions/$function", |
15 |
|
|
- "$cgibin/$function") |
16 |
|
|
-} |
17 |
|
|
- |
18 |
|
|
-#-------------------------------------------------- |
19 |
|
|
-# functions for manager panel |
20 |
|
|
-#-------------------------------------------------- |
21 |
|
|
-my $panel = "manager"; |
22 |
|
|
- |
23 |
|
|
-panel_link("advuseraccounts", $panel); |
24 |
|
|
- |
25 |
|
|
event_link("adv-ldap-update", "user-create", "27"); |
26 |
|
|
event_link("adv-ldap-update", "user-modify", "27"); |
27 |
|
|
diff -Nur -x '*.orig' -x '*.rej' smeserver-kronolith-1.1.sme/root/etc/e-smith/locale/en-us/etc/e-smith/web/functions/advuseraccounts smeserver-kronolith-1.1/root/etc/e-smith/locale/en-us/etc/e-smith/web/functions/advuseraccounts |
28 |
|
|
--- smeserver-kronolith-1.1.sme/root/etc/e-smith/locale/en-us/etc/e-smith/web/functions/advuseraccounts 2008-04-01 09:33:48.000000000 -0600 |
29 |
|
|
+++ smeserver-kronolith-1.1/root/etc/e-smith/locale/en-us/etc/e-smith/web/functions/advuseraccounts 1969-12-31 17:00:00.000000000 -0700 |
30 |
|
|
@@ -1,446 +0,0 @@ |
31 |
|
|
-<!-- vim: ft=xml ts=8 sw=4 et |
32 |
|
|
---> |
33 |
|
|
-<lexicon lang="en-us"> |
34 |
|
|
- <entry> |
35 |
|
|
- <base>FORM_TITLE</base> |
36 |
|
|
- <trans>Create, modify, or remove user accounts</trans> |
37 |
|
|
- </entry> |
38 |
|
|
- <entry> |
39 |
|
|
- <base>FIRSTPAGE_DESC</base> |
40 |
|
|
- <trans> |
41 |
|
|
- <![CDATA[ |
42 |
|
|
- <p> |
43 |
|
|
- <a class="button-like" |
44 |
|
|
- href="advuseraccounts?page=1&page_stack=&Next=Next">Add |
45 |
|
|
- user account</a> |
46 |
|
|
- </p> |
47 |
|
|
- <p> |
48 |
|
|
- You can modify, lock or remove any account or reset the |
49 |
|
|
- account's password by clicking on the |
50 |
|
|
- corresponding command next to the account. |
51 |
|
|
- </p> |
52 |
|
|
- <p> |
53 |
|
|
- If the account is marked as locked, that means that the |
54 |
|
|
- user's password needs to be reset. Please note |
55 |
|
|
- that newly created accounts are automatically locked until |
56 |
|
|
- the password is changed. |
57 |
|
|
- </p> |
58 |
|
|
- ]]> |
59 |
|
|
- </trans> |
60 |
|
|
- </entry> |
61 |
|
|
- <entry> |
62 |
|
|
- <base>P2_TITLE</base> |
63 |
|
|
- <trans>Create or modify</trans> |
64 |
|
|
- </entry> |
65 |
|
|
- <entry> |
66 |
|
|
- <base>CREATE_MODIFY_DESC</base> |
67 |
|
|
- <trans> |
68 |
|
|
- <![CDATA[ |
69 |
|
|
- <p> |
70 |
|
|
- The account name should contain only lower-case |
71 |
|
|
- letters, numbers, hyphens, periods, underscores and should start with a |
72 |
|
|
- lower-case letter. For example "betty", |
73 |
|
|
- "hjohnson", and "mary-jane" are all valid account names, |
74 |
|
|
- but "3friends", "John Smith", and "henry_miller" are not. |
75 |
|
|
- </p> |
76 |
|
|
- <p> |
77 |
|
|
- Note that two special pseudonyms will be created for each |
78 |
|
|
- new account. These pseudonyms provide the ability to have |
79 |
|
|
- alternative mail accounts for that |
80 |
|
|
- user which include their first name and last name |
81 |
|
|
- separated with a period (.) and underscore (_). So, for |
82 |
|
|
- the account "betty" with first name "Betty" and |
83 |
|
|
- last name "Rubble" two pseudonyms are created as |
84 |
|
|
- betty.rubble and betty_rubble. |
85 |
|
|
- </p> |
86 |
|
|
- <p> |
87 |
|
|
- The directory information (department, company, etc.) |
88 |
|
|
- can be changed from the defaults shown below. The |
89 |
|
|
- changes will apply only to this user. |
90 |
|
|
- </p> |
91 |
|
|
- <p> |
92 |
|
|
- The Calendar Free/Busy URL needs to be in the following format:<br> |
93 |
|
|
- https://www.<b>domain.com</b>/horde/kronolith/fb.php?u=<b>user%40domain.com. Note:</b> |
94 |
|
|
- %40 translates to the @ character.<br> |
95 |
|
|
- </p> |
96 |
|
|
- ]]> |
97 |
|
|
- </trans> |
98 |
|
|
- </entry> |
99 |
|
|
- <entry> |
100 |
|
|
- <base>MODIFY_ADMIN_TITLE</base> |
101 |
|
|
- <trans>Modify the admin account</trans> |
102 |
|
|
- </entry> |
103 |
|
|
- <entry> |
104 |
|
|
- <base>MAX_USERS_EXCEEDED</base> |
105 |
|
|
- <trans>ERROR: Unable to add user account. You have reached the |
106 |
|
|
- maximum number of users for which you have licenses. You |
107 |
|
|
- need to either delete an existing user account or contact |
108 |
|
|
- your authorized reseller to purchase |
109 |
|
|
- additional user licenses. |
110 |
|
|
- </trans> |
111 |
|
|
- </entry> |
112 |
|
|
- <entry> |
113 |
|
|
- <base>USER_CREATED</base> |
114 |
|
|
- <trans>Successfully created user account. </trans> |
115 |
|
|
- </entry> |
116 |
|
|
- <entry> |
117 |
|
|
- <base>USER_MODIFIED</base> |
118 |
|
|
- <trans>Successfully modified user account. </trans> |
119 |
|
|
- </entry> |
120 |
|
|
- <entry> |
121 |
|
|
- <base>CANNOT_MODIFY_USER</base> |
122 |
|
|
- <trans>Error: an internal error occurred while attempting to modify |
123 |
|
|
- the user "{$acctName}". |
124 |
|
|
- </trans> |
125 |
|
|
- </entry> |
126 |
|
|
- <entry> |
127 |
|
|
- <base>CANNOT_MODIFY_USER_GROUPS</base> |
128 |
|
|
- <trans>Error: an internal error occurred while attempting to modify |
129 |
|
|
- the group "{$group}" for user "{$acctName}". |
130 |
|
|
- </trans> |
131 |
|
|
- </entry> |
132 |
|
|
- <entry> |
133 |
|
|
- <base>TAINTED_USER</base> |
134 |
|
|
- <trans>The account name "{$acctName}" contains invalid characters.</trans> |
135 |
|
|
- </entry> |
136 |
|
|
- <entry> |
137 |
|
|
- <base>ACCOUNT_NAME</base> |
138 |
|
|
- <trans>Account name</trans> |
139 |
|
|
- </entry> |
140 |
|
|
- <entry> |
141 |
|
|
- <base>ACTION</base> |
142 |
|
|
- <trans>Action</trans> |
143 |
|
|
- </entry> |
144 |
|
|
- <entry> |
145 |
|
|
- <base>FIRSTNAME</base> |
146 |
|
|
- <trans>First name</trans> |
147 |
|
|
- </entry> |
148 |
|
|
- <entry> |
149 |
|
|
- <base>LASTNAME</base> |
150 |
|
|
- <trans>Last name</trans> |
151 |
|
|
- </entry> |
152 |
|
|
- <entry> |
153 |
|
|
- <base>DEPARTMENT</base> |
154 |
|
|
- <trans>Department</trans> |
155 |
|
|
- </entry> |
156 |
|
|
- <entry> |
157 |
|
|
- <base>COMPANY</base> |
158 |
|
|
- <trans>Company</trans> |
159 |
|
|
- </entry> |
160 |
|
|
- <entry> |
161 |
|
|
- <base>STREET_ADDRESS</base> |
162 |
|
|
- <trans>Street address</trans> |
163 |
|
|
- </entry> |
164 |
|
|
- <entry> |
165 |
|
|
- <base>DEPARTMENT</base> |
166 |
|
|
- <trans>Department</trans> |
167 |
|
|
- </entry> |
168 |
|
|
- <entry> |
169 |
|
|
- <base>CITY</base> |
170 |
|
|
- <trans>City</trans> |
171 |
|
|
- </entry> |
172 |
|
|
- <entry> |
173 |
|
|
- <base>PHONE_NUMBER</base> |
174 |
|
|
- <trans>Phone number</trans> |
175 |
|
|
- </entry> |
176 |
|
|
- <entry> |
177 |
|
|
- <base>EMAIL_DELIVERY</base> |
178 |
|
|
- <trans>Email delivery</trans> |
179 |
|
|
- </entry> |
180 |
|
|
- <entry> |
181 |
|
|
- <base>DELIVER_EMAIL_LOCALLY</base> |
182 |
|
|
- <trans>Deliver email locally</trans> |
183 |
|
|
- </entry> |
184 |
|
|
- <entry> |
185 |
|
|
- <base>FORWARD_EMAIL</base> |
186 |
|
|
- <trans>Forward email to address below</trans> |
187 |
|
|
- </entry> |
188 |
|
|
- <entry> |
189 |
|
|
- <base>DELIVER_AND_FORWARD</base> |
190 |
|
|
- <trans>Both deliver locally and forward</trans> |
191 |
|
|
- </entry> |
192 |
|
|
- <entry> |
193 |
|
|
- <base>FORWARDING_ADDRESS</base> |
194 |
|
|
- <trans>Forwarding address</trans> |
195 |
|
|
- </entry> |
196 |
|
|
- <entry> |
197 |
|
|
- <base>FREEBUSY_URL</base> |
198 |
|
|
- <trans>Calendar Free/Busy URL</trans> |
199 |
|
|
- </entry> |
200 |
|
|
- <entry> |
201 |
|
|
- <base>GROUP_MEMBERSHIPS</base> |
202 |
|
|
- <trans>Group memberships</trans> |
203 |
|
|
- </entry> |
204 |
|
|
- <entry> |
205 |
|
|
- <base>ACCOUNT</base> |
206 |
|
|
- <trans>Account</trans> |
207 |
|
|
- </entry> |
208 |
|
|
- <entry> |
209 |
|
|
- <base>USER_NAME</base> |
210 |
|
|
- <trans>User name</trans> |
211 |
|
|
- </entry> |
212 |
|
|
- <entry> |
213 |
|
|
- <base>SAVE</base> |
214 |
|
|
- <trans>Save</trans> |
215 |
|
|
- </entry> |
216 |
|
|
- <entry> |
217 |
|
|
- <base>ADD</base> |
218 |
|
|
- <trans>Add</trans> |
219 |
|
|
- </entry> |
220 |
|
|
- |
221 |
|
|
- <entry> |
222 |
|
|
- <base>PASSWORD1</base> |
223 |
|
|
- <trans>New password</trans> |
224 |
|
|
- </entry> |
225 |
|
|
- <entry> |
226 |
|
|
- <base>PASSWORD2</base> |
227 |
|
|
- <trans>New password (verify)</trans> |
228 |
|
|
- </entry> |
229 |
|
|
- <entry> |
230 |
|
|
- <base>PASSWORD_VERIFY_ERROR</base> |
231 |
|
|
- <trans>The passwords you entered did not match.</trans> |
232 |
|
|
- </entry> |
233 |
|
|
- <entry> |
234 |
|
|
- <base>RESET_DESC</base> |
235 |
|
|
- <trans>You are about to change the password for the user account</trans> |
236 |
|
|
- </entry> |
237 |
|
|
- <entry> |
238 |
|
|
- <base>RESET_DESC2</base> |
239 |
|
|
- <trans>Enter the new password in the fields below</trans> |
240 |
|
|
- </entry> |
241 |
|
|
- <entry> |
242 |
|
|
- <base>RESET_PASSWORD_TITLE</base> |
243 |
|
|
- <trans>Reset user password</trans> |
244 |
|
|
- </entry> |
245 |
|
|
- <entry> |
246 |
|
|
- <base>ERR_OCCURRED_MODIFYING_PASSWORD</base> |
247 |
|
|
- <trans>An error occurred while updating the password</trans> |
248 |
|
|
- </entry> |
249 |
|
|
- <entry> |
250 |
|
|
- <base>PASSWORD_CHANGE_SUCCEEDED</base> |
251 |
|
|
- <trans>Successfully changed password for user "{$acctName}".</trans> |
252 |
|
|
- </entry> |
253 |
|
|
- <entry> |
254 |
|
|
- <base>LOCK_DESC</base> |
255 |
|
|
- <trans>You are about to lock the user account</trans> |
256 |
|
|
- </entry> |
257 |
|
|
- <entry> |
258 |
|
|
- <base>LOCKED_ACCOUNT</base> |
259 |
|
|
- <trans>Successfully locked account for user "{$acctName}".</trans> |
260 |
|
|
- </entry> |
261 |
|
|
- <entry> |
262 |
|
|
- <base>NO_SUCH_USER</base> |
263 |
|
|
- <trans>Error: the user account "{$acctName}" does not exist.</trans> |
264 |
|
|
- </entry> |
265 |
|
|
- <entry> |
266 |
|
|
- <base>PSEUDONYM_CLASH</base> |
267 |
|
|
- <trans>Error: the pseudonym "{$pseudonym}" is already taken by the |
268 |
|
|
- existing user account "{$clashName}". To differentiate, add |
269 |
|
|
- initials to this field."</trans> |
270 |
|
|
- </entry> |
271 |
|
|
- <entry> |
272 |
|
|
- <base>MODIFY</base> |
273 |
|
|
- <trans>Modify</trans> |
274 |
|
|
- </entry> |
275 |
|
|
- <entry> |
276 |
|
|
- <base>RESET_PASSWORD</base> |
277 |
|
|
- <trans>Reset password</trans> |
278 |
|
|
- </entry> |
279 |
|
|
- <entry> |
280 |
|
|
- <base>LOCK_ACCOUNT</base> |
281 |
|
|
- <trans>Lock account</trans> |
282 |
|
|
- </entry> |
283 |
|
|
- <entry> |
284 |
|
|
- <base>REMOVE</base> |
285 |
|
|
- <trans>Remove</trans> |
286 |
|
|
- </entry> |
287 |
|
|
- <entry> |
288 |
|
|
- <base>LOCK_ACCOUNT_TITLE</base> |
289 |
|
|
- <trans>Lock user account</trans> |
290 |
|
|
- </entry> |
291 |
|
|
- <entry> |
292 |
|
|
- <base>LOCK_DESC2</base> |
293 |
|
|
- <trans> |
294 |
|
|
- <![CDATA[ |
295 |
|
|
- This user account will be locked. This means that this user |
296 |
|
|
- will not be able to log in, and will not be able |
297 |
|
|
- to collect e-mail. Any e-mail arriving will still be stored |
298 |
|
|
- and/or forwarded to an external e-mail address, |
299 |
|
|
- as configured. The account may be activated in the future by |
300 |
|
|
- setting a new password. The current |
301 |
|
|
- password will not be retained. |
302 |
|
|
- </p> |
303 |
|
|
- <p> |
304 |
|
|
- <b>Are you sure you wish to lock this account?</b> |
305 |
|
|
- ]]> |
306 |
|
|
- </trans> |
307 |
|
|
- </entry> |
308 |
|
|
- <entry> |
309 |
|
|
- <base>REMOVE_ACCOUNT_TITLE</base> |
310 |
|
|
- <trans>Remove user account</trans> |
311 |
|
|
- </entry> |
312 |
|
|
- <entry> |
313 |
|
|
- <base>REMOVE_DESC</base> |
314 |
|
|
- <trans>You are about to remove the user account</trans> |
315 |
|
|
- </entry> |
316 |
|
|
- <entry> |
317 |
|
|
- <base>REMOVE_DESC2</base> |
318 |
|
|
- <trans> |
319 |
|
|
- <![CDATA[ |
320 |
|
|
- All files belonging to this user account will be deleted. |
321 |
|
|
- Also, any e-mail for this user account still |
322 |
|
|
- remaining on the server (i.e. that has not yet been |
323 |
|
|
- retrieved by the user) will be discarded. |
324 |
|
|
- </p> |
325 |
|
|
- <p> |
326 |
|
|
- <b>Are you sure you wish to remove this account?</b> |
327 |
|
|
- ]]> |
328 |
|
|
- </trans> |
329 |
|
|
- </entry> |
330 |
|
|
- <entry> |
331 |
|
|
- <base>LOCK</base> |
332 |
|
|
- <trans>Lock</trans> |
333 |
|
|
- </entry> |
334 |
|
|
- <entry> |
335 |
|
|
- <base>NO_USER_ACCOUNTS</base> |
336 |
|
|
- <trans>There are no user accounts on this system.</trans> |
337 |
|
|
- </entry> |
338 |
|
|
- <entry> |
339 |
|
|
- <base>ACCOUNT_IS_LOCKED</base> |
340 |
|
|
- <trans>Account is locked</trans> |
341 |
|
|
- </entry> |
342 |
|
|
- <entry> |
343 |
|
|
- <base>Collaboration</base> |
344 |
|
|
- <trans>Collaboration</trans> |
345 |
|
|
- </entry> |
346 |
|
|
- <entry> |
347 |
|
|
- <base>Users</base> |
348 |
|
|
- <trans>Users</trans> |
349 |
|
|
- </entry> |
350 |
|
|
- <entry> |
351 |
|
|
- <base>ACCT_NAME_HAS_INVALID_CHARS</base> |
352 |
|
|
- <trans>The account name "{$acctName}" contains invalid characters. |
353 |
|
|
- Account names must start with a lower case letter and contain |
354 |
|
|
- only lower case letters, numbers, hyphens, periods and underscores. |
355 |
|
|
- </trans> |
356 |
|
|
- </entry> |
357 |
|
|
- <entry> |
358 |
|
|
- <base>ACCOUNT_TOO_LONG</base> |
359 |
|
|
- <trans>Error: account name is too long. The maximum is {$maxLength} |
360 |
|
|
- characters. |
361 |
|
|
- </trans> |
362 |
|
|
- </entry> |
363 |
|
|
- <entry> |
364 |
|
|
- <base>ACCOUNT_CONFLICT</base> |
365 |
|
|
- <trans>Error: the account "{$account}" can't be created because |
366 |
|
|
- there is already a {$type} account of that name.</trans> |
367 |
|
|
- </entry> |
368 |
|
|
- <entry> |
369 |
|
|
- <base>ERR_OCCURRED_CREATING</base> |
370 |
|
|
- <trans>An error occurred creating the user.</trans> |
371 |
|
|
- </entry> |
372 |
|
|
- <entry> |
373 |
|
|
- <base>CANNOT_CONTAIN_WHITESPACE</base> |
374 |
|
|
- <trans>This field cannot contain white-space</trans> |
375 |
|
|
- </entry> |
376 |
|
|
- <entry> |
377 |
|
|
- <base>UNACCEPTABLE_CHARS</base> |
378 |
|
|
- <trans> |
379 |
|
|
- This field must contain only letters, numbers, dots, hypens and |
380 |
|
|
- underscores and start with a letter |
381 |
|
|
- </trans> |
382 |
|
|
- </entry> |
383 |
|
|
- <entry> |
384 |
|
|
- <base>MEMBER</base> |
385 |
|
|
- <trans>Member?</trans> |
386 |
|
|
- </entry> |
387 |
|
|
- <entry> |
388 |
|
|
- <base>GROUP</base> |
389 |
|
|
- <trans>Group</trans> |
390 |
|
|
- </entry> |
391 |
|
|
- <entry> |
392 |
|
|
- <base>DESCRIPTION</base> |
393 |
|
|
- <trans>Description</trans> |
394 |
|
|
- </entry> |
395 |
|
|
- <entry> |
396 |
|
|
- <base>VPN_CLIENT_ACCESS</base> |
397 |
|
|
- <trans>VPN Client Access</trans> |
398 |
|
|
- </entry> |
399 |
|
|
- <entry> |
400 |
|
|
- <base>YES</base> |
401 |
|
|
- <trans>Yes</trans> |
402 |
|
|
- </entry> |
403 |
|
|
- <entry> |
404 |
|
|
- <base>NO</base> |
405 |
|
|
- <trans>No</trans> |
406 |
|
|
- </entry> |
407 |
|
|
- |
408 |
|
|
- <entry> |
409 |
|
|
- <base>SYSTEM_PASSWORD_FORM_TITLE</base> |
410 |
|
|
- <trans>Change system password</trans> |
411 |
|
|
- </entry> |
412 |
|
|
- <entry> |
413 |
|
|
- <base>SYSTEM_PASSWORD_DESCRIPTION</base> |
414 |
|
|
- <trans> |
415 |
|
|
- <![CDATA[ |
416 |
|
|
- Certain services on this server installation require a |
417 |
|
|
- username and password (for example this web page for the server manager |
418 |
|
|
- application). The username is always admin. You can change the system |
419 |
|
|
- password using the fields below. |
420 |
|
|
- ]]> |
421 |
|
|
- </trans> |
422 |
|
|
- </entry> |
423 |
|
|
- <entry> |
424 |
|
|
- <base>SYSTEM_PASSWORD_UNPRINTABLES_IN_PASS</base> |
425 |
|
|
- <trans>Password must contain only printable characters</trans> |
426 |
|
|
- </entry> |
427 |
|
|
- <entry> |
428 |
|
|
- <base>SYSTEM_PASSWORD_VERIFY_ERROR</base> |
429 |
|
|
- <trans>The two passwords are not identical.</trans> |
430 |
|
|
- </entry> |
431 |
|
|
- <entry> |
432 |
|
|
- <base>SYSTEM_PASSWORD_AUTH_ERROR</base> |
433 |
|
|
- <trans>The current password is incorrect.</trans> |
434 |
|
|
- </entry> |
435 |
|
|
- <entry> |
436 |
|
|
- <base>SYSTEM_PASSWORD_CHANGED</base> |
437 |
|
|
- <trans> |
438 |
|
|
- <![CDATA[ |
439 |
|
|
- The system password has been changed. |
440 |
|
|
- Since this manager application is password protected, you will |
441 |
|
|
- <b>immediately</b> |
442 |
|
|
- be prompted for the new system password if you try to continue. |
443 |
|
|
- ]]> |
444 |
|
|
- </trans> |
445 |
|
|
- </entry> |
446 |
|
|
- <entry> |
447 |
|
|
- <base>SYSTEM_PASSWORD_CHANGE_SUCCEEDED</base> |
448 |
|
|
- <trans>Thse system password has been changed</trans> |
449 |
|
|
- </entry> |
450 |
|
|
- <entry> |
451 |
|
|
- <base>CURRENT_SYSTEM_PASSWORD</base> |
452 |
|
|
- <trans>Current system password</trans> |
453 |
|
|
- </entry> |
454 |
|
|
- <entry> |
455 |
|
|
- <base>NEW_SYSTEM_PASSWORD</base> |
456 |
|
|
- <trans>New system password</trans> |
457 |
|
|
- </entry> |
458 |
|
|
- <entry> |
459 |
|
|
- <base>NEW_SYSTEM_PASSWORD_VERIFY</base> |
460 |
|
|
- <trans>New system password (verify)</trans> |
461 |
|
|
- </entry> |
462 |
|
|
- <entry> |
463 |
|
|
- <base>LABEL_IPSECRW_DOWNLOAD</base> |
464 |
|
|
- <trans>Download digital certificate to IPSec client</trans> |
465 |
|
|
- </entry> |
466 |
|
|
- <entry> |
467 |
|
|
- <base>BUTTON_IPSECRW_DOWNLOAD</base> |
468 |
|
|
- <trans>Download</trans> |
469 |
|
|
- </entry> |
470 |
|
|
- <entry> |
471 |
|
|
- <base>ERR_OCCURRED_DELETING</base> |
472 |
|
|
- <trans> |
473 |
|
|
- An error occurred while trying to delete the user. |
474 |
|
|
- </trans> |
475 |
|
|
- </entry> |
476 |
|
|
-</lexicon> |
477 |
|
|
diff -Nur -x '*.orig' -x '*.rej' smeserver-kronolith-1.1.sme/root/etc/e-smith/web/functions/advuseraccounts smeserver-kronolith-1.1/root/etc/e-smith/web/functions/advuseraccounts |
478 |
|
|
--- smeserver-kronolith-1.1.sme/root/etc/e-smith/web/functions/advuseraccounts 2006-09-14 21:13:05.000000000 -0600 |
479 |
|
|
+++ smeserver-kronolith-1.1/root/etc/e-smith/web/functions/advuseraccounts 1969-12-31 17:00:00.000000000 -0700 |
480 |
|
|
@@ -1,284 +0,0 @@ |
481 |
|
|
-#!/usr/bin/perl -wT |
482 |
|
|
- |
483 |
|
|
-# vim: ft=xml ts=4 sw=4 et: |
484 |
|
|
-#---------------------------------------------------------------------- |
485 |
|
|
-# heading : Collaboration |
486 |
|
|
-# description : Advanced User Management |
487 |
|
|
-# navigation : 2000 2105 |
488 |
|
|
-#---------------------------------------------------------------------- |
489 |
|
|
-#---------------------------------------------------------------------- |
490 |
|
|
-# copyright (C) 2002 Mitel Networks Corporation |
491 |
|
|
-# |
492 |
|
|
-# This program is free software; you can redistribute it and/or modify |
493 |
|
|
-# it under the terms of the GNU General Public License as published by |
494 |
|
|
-# the Free Software Foundation; either version 2 of the License, or |
495 |
|
|
-# (at your option) any later version. |
496 |
|
|
-# |
497 |
|
|
-# This program is distributed in the hope that it will be useful, |
498 |
|
|
-# but WITHOUT ANY WARRANTY; without even the implied warranty of |
499 |
|
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
500 |
|
|
-# GNU General Public License for more details. |
501 |
|
|
-# |
502 |
|
|
-# You should have received a copy of the GNU General Public License |
503 |
|
|
-# along with this program; if not, write to the Free Software |
504 |
|
|
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
505 |
|
|
-# |
506 |
|
|
-# Technical support for this program is available from Mitel Networks |
507 |
|
|
-# Please visit our web site www.mitel.com/sme/ for details. |
508 |
|
|
-#---------------------------------------------------------------------- |
509 |
|
|
- |
510 |
|
|
-use strict; |
511 |
|
|
-use esmith::TestUtils; |
512 |
|
|
-use esmith::FormMagick::Panel::advuseraccounts; |
513 |
|
|
- |
514 |
|
|
-my $fm = esmith::FormMagick::Panel::advuseraccounts->new(); |
515 |
|
|
- |
516 |
|
|
-# XXX: need to print custom http headers, so bypass FormMagick |
517 |
|
|
-use CGI; |
518 |
|
|
-my $q = new CGI; |
519 |
|
|
-if ($q->param('action') && $q->param('action') eq 'getCert') |
520 |
|
|
-{ |
521 |
|
|
- $q->delete('action'); |
522 |
|
|
- $fm->get_ipsec_client_cert($q); |
523 |
|
|
-} |
524 |
|
|
-else |
525 |
|
|
-{ |
526 |
|
|
- $fm->display(); |
527 |
|
|
-} |
528 |
|
|
- |
529 |
|
|
-=pod |
530 |
|
|
- |
531 |
|
|
-=head1 NAME |
532 |
|
|
- |
533 |
|
|
-advuseraccounts -- create/modify/delete user accounts |
534 |
|
|
- |
535 |
|
|
-=head2 DESCRIPTION |
536 |
|
|
- |
537 |
|
|
-This screen allows the administrator to create, modify or delete user |
538 |
|
|
-accounts on the system. |
539 |
|
|
- |
540 |
|
|
-=begin testing |
541 |
|
|
- |
542 |
|
|
-use esmith::FormMagick::Tester; |
543 |
|
|
-use esmith::TestUtils; |
544 |
|
|
-use esmith::ConfigDB; |
545 |
|
|
-use esmith::AccountsDB; |
546 |
|
|
- |
547 |
|
|
-my $panel = $Original_File; |
548 |
|
|
-my $ua = esmith::FormMagick::Tester->new(); |
549 |
|
|
- |
550 |
|
|
-my $c = esmith::ConfigDB->open(); |
551 |
|
|
-my $a = esmith::AccountsDB->open(); |
552 |
|
|
- |
553 |
|
|
-is (mode($panel), '4755', "Check permissions on script"); |
554 |
|
|
-ok ($ua->get_panel($panel), "ABOUT TO RUN L10N TESTS"); |
555 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
556 |
|
|
-like($ua->{content}, qr/FORM_TITLE/, "Saw untranslated form title"); |
557 |
|
|
-ok ($ua->set_language("en-us"), "Set language to U.S. English"); |
558 |
|
|
-ok ($ua->get_panel($panel), "Get panel"); |
559 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
560 |
|
|
-like($ua->{content}, qr/User accounts/, "Saw translated form title"); |
561 |
|
|
- |
562 |
|
|
- |
563 |
|
|
-# |
564 |
|
|
-# Testing creating users |
565 |
|
|
-# |
566 |
|
|
- |
567 |
|
|
-ok ($ua->get_panel($panel), "ABOUT TO TEST CREATING USER"); |
568 |
|
|
-ok ($ua->follow("Click here"), "Follow 'create user' link"); |
569 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
570 |
|
|
-like($ua->{content}, qr/Account name/, "Saw form fields"); |
571 |
|
|
- |
572 |
|
|
-# |
573 |
|
|
-# Check that address details are picked up from LDAP |
574 |
|
|
-# |
575 |
|
|
- |
576 |
|
|
-my $ldap_record = $c->get('ldap'); |
577 |
|
|
-my $city = $ldap_record->prop('DefaultCity'); |
578 |
|
|
- |
579 |
|
|
-like($ua->{content}, qr/$city/, "Pick up address from LDAP"); |
580 |
|
|
- |
581 |
|
|
-# |
582 |
|
|
-# Creating a new user |
583 |
|
|
-# |
584 |
|
|
- |
585 |
|
|
-my $new_username = new_random_username(); |
586 |
|
|
- |
587 |
|
|
-can_ok($ua, "field"); |
588 |
|
|
-ok ($ua->{form}->find_input('acctName'), |
589 |
|
|
- "Find acctName field to fill in"); |
590 |
|
|
-$ua->field("acctName" => $new_username); |
591 |
|
|
-ok ($ua->click("Save"), "Click Save"); |
592 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
593 |
|
|
-like($ua->{content}, qr/must not be left blank/, "Saw validation messages"); |
594 |
|
|
- |
595 |
|
|
-$ua->field("FirstName" => "Fred"); |
596 |
|
|
-$ua->field("LastName" => "Foonly"); |
597 |
|
|
- |
598 |
|
|
-ok ($ua->click("Save"), "Click Save"); |
599 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
600 |
|
|
- |
601 |
|
|
-# |
602 |
|
|
-# Testing modify user |
603 |
|
|
-# |
604 |
|
|
- |
605 |
|
|
-ok ($ua->get_panel($panel), "ABOUT TO TEST MODIFYING A USER"); |
606 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
607 |
|
|
-ok ($ua->follow('Modify'), "Follow modify link"); |
608 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
609 |
|
|
-like($ua->{content}, qr/value="Save"/, "Saw 'Save' on the button"); |
610 |
|
|
- |
611 |
|
|
-# |
612 |
|
|
-# Testing removal of a user |
613 |
|
|
-# |
614 |
|
|
- |
615 |
|
|
-ok ($ua->get_panel($panel), "ABOUT TO TEST USER REMOVAL"); |
616 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
617 |
|
|
-ok ($ua->follow('Remove'), "Follow remove link"); |
618 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
619 |
|
|
-like($ua->{content}, qr/Remove/, "Saw 'Remove'"); |
620 |
|
|
-like($ua->{content}, qr/value="Remove"/, "Saw 'Remove' on the button"); |
621 |
|
|
- |
622 |
|
|
-# |
623 |
|
|
-# Testing password reset |
624 |
|
|
-# |
625 |
|
|
- |
626 |
|
|
-ok ($ua->get_panel($panel), "ABOUT TO TEST PASSWORD RESET"); |
627 |
|
|
-is ($ua->{status}, 200, "200 OK"); |
628 |
|
|
-ok ($ua->follow('Reset password'), "Follow reset password link"); |
629 |
|
|
-like($ua->{content}, qr/Reset password/,"Saw 'Reset password'"); |
630 |
|
|
- |
631 |
|
|
-SKIP: |
632 |
|
|
-{ |
633 |
|
|
- skip 3, "Unsafe!" unless destruction_ok(); |
634 |
|
|
- $ua->field(password1 => "test"); |
635 |
|
|
- $ua->field(password2 => "test"); |
636 |
|
|
- ok($ua->click('Save'), "Set password to 'test', click Save"); |
637 |
|
|
- is($ua->{status}, 200, "200 OK"); |
638 |
|
|
- like($ua->{content}, qr/Click here/, "Returned to first page"); |
639 |
|
|
-} |
640 |
|
|
- |
641 |
|
|
-=end testing |
642 |
|
|
- |
643 |
|
|
-=cut |
644 |
|
|
- |
645 |
|
|
- |
646 |
|
|
-__DATA__ |
647 |
|
|
-<form title="FORM_TITLE" header="/etc/e-smith/web/common/head.tmpl" footer="/etc/e-smith/web/common/foot.tmpl"> |
648 |
|
|
- <page name="First" pre-event="print_status_message()"> |
649 |
|
|
- <description>FIRSTPAGE_DESC</description> |
650 |
|
|
- <subroutine src="print_user_table()" /> |
651 |
|
|
- </page> |
652 |
|
|
- <page name="CheckMaxUsersAdd" post-event="checkMaxUsers('CreateModify')"> |
653 |
|
|
- </page> |
654 |
|
|
- <page name="CreateModify" pre-event="turn_off_buttons()" post-event="handle_user_accounts()"> |
655 |
|
|
- <title>P2_TITLE</title> |
656 |
|
|
- <description>CREATE_MODIFY_DESC</description> |
657 |
|
|
- <subroutine src="print_acctName_field()" /> |
658 |
|
|
- <field type="text" id="FirstName" validation="nonblank, pseudonym_clash"> |
659 |
|
|
- <label>FIRSTNAME</label> |
660 |
|
|
- </field> |
661 |
|
|
- <field type="text" id="LastName" validation="nonblank"> |
662 |
|
|
- <label>LASTNAME</label> |
663 |
|
|
- </field> |
664 |
|
|
- <field type="text" id="Dept" |
665 |
|
|
- value="get_ldap_value('Dept')"> |
666 |
|
|
- <label>DEPARTMENT</label> |
667 |
|
|
- </field> |
668 |
|
|
- <field type="text" id="Company" |
669 |
|
|
- value="get_ldap_value('Company')"> |
670 |
|
|
- <label>COMPANY</label> |
671 |
|
|
- </field> |
672 |
|
|
- <field type="text" id="Street" |
673 |
|
|
- value="get_ldap_value('Street')"> |
674 |
|
|
- <label>STREET_ADDRESS</label> |
675 |
|
|
- </field> |
676 |
|
|
- <field type="text" id="City" |
677 |
|
|
- value="get_ldap_value('City')"> |
678 |
|
|
- <label>CITY</label> |
679 |
|
|
- </field> |
680 |
|
|
- <field type="text" id="Phone" |
681 |
|
|
- value="get_ldap_value('Phone')"> |
682 |
|
|
- <label>PHONE_NUMBER</label> |
683 |
|
|
- </field> |
684 |
|
|
- <field type="select" id="EmailForward" options="'local' => |
685 |
|
|
- 'DELIVER_EMAIL_LOCALLY', 'forward' => 'FORWARD_EMAIL', |
686 |
|
|
- 'both' => 'DELIVER_AND_FORWARD'" validation="nonblank" value='local' |
687 |
|
|
- display="display_email_forwarding()" |
688 |
|
|
- > |
689 |
|
|
- <label>EMAIL_DELIVERY</label> |
690 |
|
|
- </field> |
691 |
|
|
- <field type="text" id="ForwardAddress" validation="emailforward()" |
692 |
|
|
- display="display_email_forwarding()" |
693 |
|
|
- > |
694 |
|
|
- <label>FORWARDING_ADDRESS</label> |
695 |
|
|
- </field> |
696 |
|
|
- <field type="text" id="FreeBusy" size="85"> |
697 |
|
|
- <label>FREEBUSY_URL</label> |
698 |
|
|
- </field> |
699 |
|
|
- <field type="select" id="VPNClientAccess" options="'yes' => 'YES', |
700 |
|
|
- 'no' => 'NO'" validation="nonblank" value="get_pptp_value()"> |
701 |
|
|
- <label>VPN_CLIENT_ACCESS</label> |
702 |
|
|
- </field> |
703 |
|
|
- <subroutine src="print_ipsec_client_section()" /> |
704 |
|
|
- <subroutine src="print_groupMemberships_field()" /> |
705 |
|
|
- <subroutine src="print_save_or_add_button()" /> |
706 |
|
|
- </page> |
707 |
|
|
- <page name="ModifyAdmin" pre-event="turn_off_buttons()" post-event="modify_admin()"> |
708 |
|
|
- <title>MODIFY_ADMIN_TITLE</title> |
709 |
|
|
- <subroutine src="print_acctName_field()" /> |
710 |
|
|
- <field type="text" id="FirstName" validation="nonblank, pseudonym_clash"> |
711 |
|
|
- <label>FIRSTNAME</label> |
712 |
|
|
- </field> |
713 |
|
|
- <field type="text" id="LastName" validation="nonblank"> |
714 |
|
|
- <label>LASTNAME</label> |
715 |
|
|
- </field> |
716 |
|
|
- <field type="select" id="VPNClientAccess" options="'yes' => 'YES', |
717 |
|
|
- 'no' => 'NO'" validation="nonblank" value="get_pptp_value()"> |
718 |
|
|
- <label>VPN_CLIENT_ACCESS</label> |
719 |
|
|
- </field> |
720 |
|
|
- <subroutine src="print_ipsec_client_section()" /> |
721 |
|
|
- <subroutine src="print_button('SAVE')" /> |
722 |
|
|
- </page> |
723 |
|
|
- <page name="CheckMaxUsersUnlock" post-event="checkMaxUsers('ResetPassword')"> |
724 |
|
|
- </page> |
725 |
|
|
- <page name="ResetPassword" pre-event="turn_off_buttons()" post-event="reset_password()"> |
726 |
|
|
- <title>RESET_PASSWORD_TITLE</title> |
727 |
|
|
- <subroutine src="print_page_description('reset')" /> |
728 |
|
|
- <field type="password" id="password1" validation="nonblank, check_password"> |
729 |
|
|
- <label>PASSWORD1</label> |
730 |
|
|
- </field> |
731 |
|
|
- <field type="password" id="password2" validation="verifyPasswords"> |
732 |
|
|
- <label>PASSWORD2</label> |
733 |
|
|
- </field> |
734 |
|
|
- <subroutine src="print_button('SAVE')" /> |
735 |
|
|
- </page> |
736 |
|
|
- <page name="LockAccount" pre-event="turn_off_buttons()" post-event="lock_account()"> |
737 |
|
|
- <title>LOCK_ACCOUNT_TITLE</title> |
738 |
|
|
- <subroutine src="print_page_description('lock')" /> |
739 |
|
|
- <subroutine src="print_button('LOCK')" /> |
740 |
|
|
- </page> |
741 |
|
|
- <page name="RemoveAccount" pre-event="turn_off_buttons()" post-event="remove_account()"> |
742 |
|
|
- <title>REMOVE_ACCOUNT_TITLE</title> |
743 |
|
|
- <subroutine src="print_page_description('remove')" /> |
744 |
|
|
- <subroutine src="print_button('REMOVE')" /> |
745 |
|
|
- </page> |
746 |
|
|
- |
747 |
|
|
- <page name="SystemPasswordDummy"> |
748 |
|
|
- </page> |
749 |
|
|
- <page name="SystemPassword" pre-event="turn_off_buttons()" |
750 |
|
|
- post-event="system_change_password" > |
751 |
|
|
- <description>SYSTEM_PASSWORD_DESCRIPTION</description> |
752 |
|
|
- |
753 |
|
|
- <field type="password" id="curpass" validation="nonblank, system_authenticate_password"> |
754 |
|
|
- <label>CURRENT_SYSTEM_PASSWORD</label> |
755 |
|
|
- </field> |
756 |
|
|
- <field type="password" id="pass" validation="nonblank, system_check_password"> |
757 |
|
|
- <label>NEW_SYSTEM_PASSWORD</label> |
758 |
|
|
- </field> |
759 |
|
|
- <field type="password" id="passVerify" validation="system_password_compare"> |
760 |
|
|
- <label>NEW_SYSTEM_PASSWORD_VERIFY</label> |
761 |
|
|
- </field> |
762 |
|
|
- <subroutine src="print_button('SAVE')" /> |
763 |
|
|
- </page> |
764 |
|
|
-</form> |
765 |
|
|
diff -Nur -x '*.orig' -x '*.rej' smeserver-kronolith-1.1.sme/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/advuseraccounts.pm smeserver-kronolith-1.1/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/advuseraccounts.pm |
766 |
|
|
--- smeserver-kronolith-1.1.sme/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/advuseraccounts.pm 2006-09-14 21:13:05.000000000 -0600 |
767 |
|
|
+++ smeserver-kronolith-1.1/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/advuseraccounts.pm 1969-12-31 17:00:00.000000000 -0700 |
768 |
|
|
@@ -1,1291 +0,0 @@ |
769 |
|
|
-#!/usr/bin/perl -w |
770 |
|
|
- |
771 |
|
|
-#---------------------------------------------------------------------- |
772 |
|
|
-# $Id: advuseraccounts.pm,v 1.108 2004/11/11 20:05:56 charlieb Exp $ |
773 |
|
|
-#---------------------------------------------------------------------- |
774 |
|
|
-# copyright (C) 1999-2006 Mitel Networks Corporation |
775 |
|
|
-# |
776 |
|
|
-# This program is free software; you can redistribute it and/or modify |
777 |
|
|
-# it under the terms of the GNU General Public License as published by |
778 |
|
|
-# the Free Software Foundation; either version 2 of the License, or |
779 |
|
|
-# (at your option) any later version. |
780 |
|
|
-# |
781 |
|
|
-# This program is distributed in the hope that it will be useful, |
782 |
|
|
-# but WITHOUT ANY WARRANTY; without even the implied warranty of |
783 |
|
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
784 |
|
|
-# GNU General Public License for more details. |
785 |
|
|
-# |
786 |
|
|
-# You should have received a copy of the GNU General Public License |
787 |
|
|
-# along with this program; if not, write to the Free Software |
788 |
|
|
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
789 |
|
|
-#---------------------------------------------------------------------- |
790 |
|
|
-package esmith::FormMagick::Panel::advuseraccounts; |
791 |
|
|
- |
792 |
|
|
-use strict; |
793 |
|
|
- |
794 |
|
|
-use esmith::FormMagick; |
795 |
|
|
-use esmith::AccountsDB; |
796 |
|
|
-use esmith::ConfigDB; |
797 |
|
|
-use esmith::cgi; |
798 |
|
|
-use esmith::util; |
799 |
|
|
-use File::Basename; |
800 |
|
|
-use Exporter; |
801 |
|
|
-use Carp qw(verbose); |
802 |
|
|
- |
803 |
|
|
-our @ISA = qw(esmith::FormMagick Exporter); |
804 |
|
|
- |
805 |
|
|
-our @EXPORT = qw( |
806 |
|
|
- print_user_table |
807 |
|
|
- print_acctName_field |
808 |
|
|
- print_groupMemberships_field |
809 |
|
|
- print_page_description |
810 |
|
|
- get_ldap_value |
811 |
|
|
- username_clash |
812 |
|
|
- pseudonym_clash |
813 |
|
|
- checkMaxUsers |
814 |
|
|
- handle_user_accounts |
815 |
|
|
- modify_admin |
816 |
|
|
- emailforward |
817 |
|
|
- verifyPasswords |
818 |
|
|
- lock_account |
819 |
|
|
- remove_account |
820 |
|
|
- reset_password |
821 |
|
|
- check_password |
822 |
|
|
- print_save_or_add_button |
823 |
|
|
- get_pptp_value |
824 |
|
|
- print_ipsec_client_section |
825 |
|
|
- |
826 |
|
|
- system_password_compare |
827 |
|
|
- system_valid_password |
828 |
|
|
- system_change_password |
829 |
|
|
- system_check_password |
830 |
|
|
- system_authenticate_password |
831 |
|
|
-); |
832 |
|
|
- |
833 |
|
|
-our $VERSION = sprintf '%d.%03d', q$Revision: 1.108 $ =~ /: (\d+).(\d+)/; |
834 |
|
|
- |
835 |
|
|
-our $accountdb = esmith::AccountsDB->open(); |
836 |
|
|
-our $configdb = esmith::ConfigDB->open(); |
837 |
|
|
- |
838 |
|
|
-=pod |
839 |
|
|
- |
840 |
|
|
-=head1 NAME |
841 |
|
|
- |
842 |
|
|
-esmith::FormMagick::Panels::advuseraccounts - useful panel functions |
843 |
|
|
- |
844 |
|
|
-=head1 SYNOPSIS |
845 |
|
|
- |
846 |
|
|
-use esmith::FormMagick::Panels::useraccount; |
847 |
|
|
- |
848 |
|
|
-my $panel = esmith::FormMagick::Panel::useraccount->new(); |
849 |
|
|
-$panel->display(); |
850 |
|
|
- |
851 |
|
|
-=head1 DESCRIPTION |
852 |
|
|
- |
853 |
|
|
- |
854 |
|
|
-=head2 new(); |
855 |
|
|
- |
856 |
|
|
-Exactly as for esmith::FormMagick |
857 |
|
|
- |
858 |
|
|
-=begin testing |
859 |
|
|
- |
860 |
|
|
-$ENV{ESMITH_ACCOUNT_DB} = "10e-smith-base/accounts.conf"; |
861 |
|
|
-$ENV{ESMITH_CONFIG_DB} = "10e-smith-base/configuration.conf"; |
862 |
|
|
- |
863 |
|
|
-open DATA, "echo '<form></form>'|"; |
864 |
|
|
-use_ok('esmith::FormMagick::Panel::advuseraccounts'); |
865 |
|
|
-use vars qw($panel); |
866 |
|
|
-ok($panel = esmith::FormMagick::Panel::advuseraccounts->new(), |
867 |
|
|
-"Create panel object"); |
868 |
|
|
-close DATA; |
869 |
|
|
-isa_ok($panel, 'esmith::FormMagick::Panel::advuseraccounts'); |
870 |
|
|
-$panel->{cgi} = CGI->new(); |
871 |
|
|
-$panel->parse_xml(); |
872 |
|
|
- |
873 |
|
|
-{ package esmith::FormMagick::Panel::advuseraccounts; |
874 |
|
|
-our $accountdb; |
875 |
|
|
-::isa_ok($accountdb, 'esmith::AccountsDB'); |
876 |
|
|
-} |
877 |
|
|
- |
878 |
|
|
-=end testing |
879 |
|
|
- |
880 |
|
|
-=cut |
881 |
|
|
- |
882 |
|
|
-sub new { |
883 |
|
|
- shift; |
884 |
|
|
- my $self = esmith::FormMagick->new(); |
885 |
|
|
- $self->{calling_package} = (caller)[0]; |
886 |
|
|
- bless $self; |
887 |
|
|
- return $self; |
888 |
|
|
-} |
889 |
|
|
- |
890 |
|
|
-=head1 HTML GENERATION ROUTINES |
891 |
|
|
- |
892 |
|
|
-Routines for generating chunks of HTML needed by the panel. |
893 |
|
|
- |
894 |
|
|
-=head2 print_user_table |
895 |
|
|
- |
896 |
|
|
-Prints out the user table on the front page. |
897 |
|
|
- |
898 |
|
|
-=for testing |
899 |
|
|
-$panel->print_user_table; |
900 |
|
|
-like($_STDOUT_, qr/bart/, "Found usernames in user table output"); |
901 |
|
|
-like($_STDOUT_, qr/ff0000/, "Found red 'reset password' output"); |
902 |
|
|
- |
903 |
|
|
-=cut |
904 |
|
|
- |
905 |
|
|
-sub print_user_table { |
906 |
|
|
- my $self = shift; |
907 |
|
|
- my $q = $self->{cgi}; |
908 |
|
|
- my $account = $self->localise('ACCOUNT'); |
909 |
|
|
- my $acctName = $self->localise('USER_NAME'); |
910 |
|
|
- |
911 |
|
|
- my $modify = $self->localise('MODIFY'); |
912 |
|
|
- my $resetpw = $self->localise('RESET_PASSWORD'); |
913 |
|
|
- my $lock = $self->localise('LOCK_ACCOUNT'); |
914 |
|
|
- my $account_locked = $self->localise('ACCOUNT_IS_LOCKED'); |
915 |
|
|
- my $remove = $self->localise('REMOVE'); |
916 |
|
|
- |
917 |
|
|
- my @users = $accountdb->get('admin'); |
918 |
|
|
- push @users, $accountdb->users(); |
919 |
|
|
- |
920 |
|
|
- unless ( scalar @users ) |
921 |
|
|
- { |
922 |
|
|
- print $q->Tr($q->td($self->localise('NO_USER_ACCOUNTS'))); |
923 |
|
|
- return ""; |
924 |
|
|
- } |
925 |
|
|
- print " <tr>\n <td colspan=\"2\">\n "; |
926 |
|
|
- print $q->start_table ({-CLASS => "sme-border"}),"\n "; |
927 |
|
|
- print $q->Tr( |
928 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise($account),"header"), |
929 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise($acctName),"header"), |
930 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise('VPN_CLIENT_ACCESS'), "header"), |
931 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise('ACTION'),"header",4)); |
932 |
|
|
- |
933 |
|
|
- my $scriptname = basename($0); |
934 |
|
|
- my $index=0; |
935 |
|
|
- |
936 |
|
|
- foreach my $u (@users) { |
937 |
|
|
- my $username = $u->key(); |
938 |
|
|
- my $first = $u->prop('FirstName'); |
939 |
|
|
- my $last = $u->prop('LastName'); |
940 |
|
|
- my $lockable = $u->prop('Lockable') || 'yes'; |
941 |
|
|
- my $removable = $u->prop('Removable') || 'yes'; |
942 |
|
|
- my $vpnaccess = $u->prop('VPNClientAccess') || 'no'; |
943 |
|
|
- $vpnaccess = $vpnaccess eq 'yes' ? $self->localise('YES') : |
944 |
|
|
- $self->localise('NO'); |
945 |
|
|
- |
946 |
|
|
- my $params = $self->build_user_cgi_params($username, $u->props()); |
947 |
|
|
- |
948 |
|
|
- my $password_set = $u->prop('PasswordSet'); |
949 |
|
|
- |
950 |
|
|
- my $pagenum = ($username eq "admin") ? $self->get_page_by_name('SystemPasswordDummy') |
951 |
|
|
- : $self->get_page_by_name('CheckMaxUsersUnlock'); |
952 |
|
|
- |
953 |
|
|
- # make normal links |
954 |
|
|
- my $lock_url = ($password_set eq 'yes') ? |
955 |
|
|
- qq(<a href="$scriptname?$params&Next=Next&wherenext=LockAccount">$lock</a>) : |
956 |
|
|
- qq($account_locked); |
957 |
|
|
- |
958 |
|
|
- $lock_url = "" unless ($lockable eq "yes"); |
959 |
|
|
- |
960 |
|
|
- my $where_next = ($username eq "admin") ? "ModifyAdmin" : "CreateModify"; |
961 |
|
|
- my $action1 = "<a href=\"$scriptname?page=0&page_stack=&acctName=$username&Next=Next&action=modify&wherenext=$where_next\">$modify</a>"; |
962 |
|
|
- |
963 |
|
|
- my $action2 = "<a href=\"$scriptname?page=$pagenum&page_stack=&Next=Next&acctName=$username\">$resetpw</a>"; |
964 |
|
|
- |
965 |
|
|
- unless ($password_set eq 'yes') |
966 |
|
|
- { |
967 |
|
|
- $action2 = "<span class='error-noborders'>" . $action2 . "</span>"; |
968 |
|
|
- } |
969 |
|
|
- |
970 |
|
|
- my $action3 = ($removable eq "yes") ? "<a href=\"$scriptname?$params&Next=Next&wherenext=RemoveAccount\">$remove</a>" : ''; |
971 |
|
|
- |
972 |
|
|
- print $q->Tr(esmith::cgi::genSmallCell($q, $username,"normal")," ", |
973 |
|
|
- esmith::cgi::genSmallCell($q, "$first $last","normal")," ", |
974 |
|
|
- esmith::cgi::genSmallCell($q, $vpnaccess), |
975 |
|
|
- esmith::cgi::genSmallCell($q, "$action1","normal")," ", |
976 |
|
|
- esmith::cgi::genSmallCell($q, "$action2","normal")," ", |
977 |
|
|
- esmith::cgi::genSmallCell($q, "$lock_url","normal")," ", |
978 |
|
|
- esmith::cgi::genSmallCell($q, "$action3","normal")); |
979 |
|
|
- |
980 |
|
|
- $index++; |
981 |
|
|
- } |
982 |
|
|
- |
983 |
|
|
- print qq(</table></td></tr>\n); |
984 |
|
|
- |
985 |
|
|
- return ""; |
986 |
|
|
-} |
987 |
|
|
- |
988 |
|
|
-=head2 print_acctName_field |
989 |
|
|
- |
990 |
|
|
-This subroutine is used to generate the Account name field on the form in |
991 |
|
|
-the case of "create user", or to make it a plain uneditable string in the case |
992 |
|
|
-of "modify user". |
993 |
|
|
- |
994 |
|
|
-=begin testing |
995 |
|
|
- |
996 |
|
|
-my $self = esmith::FormMagick::Panel::advuseraccounts->new(); |
997 |
|
|
-$self->{cgi} = CGI->new(""); |
998 |
|
|
-print_acctName_field($self); |
999 |
|
|
-like($_STDOUT_, qr/text.*acctName/, "print text field if acctName not set"); |
1000 |
|
|
-like($_STDOUT_, qr/create/, "action=create if acctName not set"); |
1001 |
|
|
-$self->{cgi}->param(-name => 'acctName', -value => 'foo'); |
1002 |
|
|
-$self->{cgi}->param(-name => 'action', -value => 'modify'); |
1003 |
|
|
-print_acctName_field($self); |
1004 |
|
|
-like($_STDOUT_, qr/hidden.*acctName/, "print hidden field if acctName is set"); |
1005 |
|
|
-like($_STDOUT_, qr/modify/, "action=modify if acctName already set"); |
1006 |
|
|
- |
1007 |
|
|
-=end testing |
1008 |
|
|
- |
1009 |
|
|
-=cut |
1010 |
|
|
- |
1011 |
|
|
-sub print_acctName_field { |
1012 |
|
|
- my $self = shift; |
1013 |
|
|
- my $cgi = $self->{cgi}; |
1014 |
|
|
- my $an = $cgi->param('acctName') || ''; |
1015 |
|
|
- print qq(<tr><td class=\"sme-noborders-label\">) . $self->localise('ACCOUNT_NAME') . qq(</td>\n); |
1016 |
|
|
- my $action = $cgi->param('action') || ''; |
1017 |
|
|
- if ( $action eq 'modify') { |
1018 |
|
|
- print qq( |
1019 |
|
|
- <td>$an |
1020 |
|
|
- <input type="hidden" name="acctName" value="$an"> |
1021 |
|
|
- <input type="hidden" name="action" value="modify"> |
1022 |
|
|
- </td> |
1023 |
|
|
- ); |
1024 |
|
|
- # if there's no CGI data, fill in the fields with the account db |
1025 |
|
|
- # data for this user |
1026 |
|
|
- my $rec = $accountdb->get($an); |
1027 |
|
|
- my $fn = $cgi->param('FirstName') ? |
1028 |
|
|
- $cgi->param('FirstName') : |
1029 |
|
|
- ($rec ? ($rec->prop('FirstName')) : ''); |
1030 |
|
|
- my $ln = $cgi->param('LastName') ? |
1031 |
|
|
- $cgi->param('LastName') : |
1032 |
|
|
- ($rec ? ($rec->prop('LastName')) : ''); |
1033 |
|
|
- my $dept = $cgi->param('Dept') ? |
1034 |
|
|
- $cgi->param('Dept') : |
1035 |
|
|
- ($rec ? ($rec->prop('Dept')) : ''); |
1036 |
|
|
- my $company = $cgi->param('Company') ? |
1037 |
|
|
- $cgi->param('Company') : |
1038 |
|
|
- ($rec ? ($rec->prop('Company')) : ''); |
1039 |
|
|
- my $street = $cgi->param('Street') ? |
1040 |
|
|
- $cgi->param('Street') : |
1041 |
|
|
- ($rec ? ($rec->prop('Street')) : ''); |
1042 |
|
|
- my $city = $cgi->param('City') ? |
1043 |
|
|
- $cgi->param('City') : |
1044 |
|
|
- ($rec ? ($rec->prop('City')) : ''); |
1045 |
|
|
- my $phone = $cgi->param('Phone') ? |
1046 |
|
|
- $cgi->param('Phone') : |
1047 |
|
|
- ($rec ? ($rec->prop('Phone')) : ''); |
1048 |
|
|
- my $emf = $cgi->param('EmailForward') ? |
1049 |
|
|
- $cgi->param('EmailForward') : |
1050 |
|
|
- ($rec ? ($rec->prop('EmailForward')) : 'local'); |
1051 |
|
|
- my $fwd = $cgi->param('ForwardAddress') ? |
1052 |
|
|
- $cgi->param('ForwardAddress') : |
1053 |
|
|
- ($rec ? ($rec->prop('ForwardAddress')) : ''); |
1054 |
|
|
- my $fb = $cgi->param('FreeBusy') ? |
1055 |
|
|
- $cgi->param('FreeBusy') : |
1056 |
|
|
- ($rec ? ($rec->prop('FreeBusy')) : ''); |
1057 |
|
|
- my $pptp = $cgi->param('VPNClientAccess') ? |
1058 |
|
|
- $cgi->param('VPNClientAccess') : |
1059 |
|
|
- ($rec ? ($rec->prop('VPNClientAccess')) : 'no'); |
1060 |
|
|
- # now that we're down with the 411, let's set the values |
1061 |
|
|
- $cgi->param(-name=>'FirstName', -value=>$fn); |
1062 |
|
|
- $cgi->param(-name=>'LastName', -value=>$ln); |
1063 |
|
|
- $cgi->param(-name=>'Dept', -value=>$dept); |
1064 |
|
|
- $cgi->param(-name=>'Company', -value=>$company); |
1065 |
|
|
- $cgi->param(-name=>'Street', -value=>$street); |
1066 |
|
|
- $cgi->param(-name=>'City', -value=>$city); |
1067 |
|
|
- $cgi->param(-name=>'Phone', -value=>$phone); |
1068 |
|
|
- $cgi->param(-name=>'EmailForward', -value=>$emf); |
1069 |
|
|
- $cgi->param(-name=>'ForwardAddress', -value=>$fwd); |
1070 |
|
|
- $cgi->param(-name=>'FreeBusy', -value=>$fb); |
1071 |
|
|
- $cgi->param(-name=>'VPNClientAccess', -value=>$pptp); |
1072 |
|
|
- } else { |
1073 |
|
|
- print qq( |
1074 |
|
|
- <td><input type="text" name="acctName" value="$an"> |
1075 |
|
|
- <input type="hidden" name="action" value="create"> |
1076 |
|
|
- </td> |
1077 |
|
|
- ); |
1078 |
|
|
- } |
1079 |
|
|
- |
1080 |
|
|
- print qq(</tr>\n); |
1081 |
|
|
- return undef; |
1082 |
|
|
- |
1083 |
|
|
-} |
1084 |
|
|
- |
1085 |
|
|
-=head2 print_groupMemberships_field() |
1086 |
|
|
- |
1087 |
|
|
-Builds a list of groups for the create/modify user screen. |
1088 |
|
|
- |
1089 |
|
|
-=begin testing |
1090 |
|
|
- |
1091 |
|
|
-my $self = esmith::FormMagick::Panel::advuseraccounts->new(); |
1092 |
|
|
-$self->{cgi} = CGI->new(""); |
1093 |
|
|
-$self->print_groupMemberships_field(); |
1094 |
|
|
-like($_STDOUT_, qr/simpsons/, "Found simpsons in group list"); |
1095 |
|
|
-like($_STDOUT_, qr/flanders/, "Found flanders in group list"); |
1096 |
|
|
-$self->{cgi}->param(-name => 'acctName', -value => 'rod'); |
1097 |
|
|
-$self->print_groupMemberships_field(); |
1098 |
|
|
-like($_STDOUT_, qr/checked value="flanders"/, "Checked flanders group for user rod"); |
1099 |
|
|
- |
1100 |
|
|
-=end testing |
1101 |
|
|
- |
1102 |
|
|
-=cut |
1103 |
|
|
- |
1104 |
|
|
-sub print_groupMemberships_field { |
1105 |
|
|
- my ($self) = @_; |
1106 |
|
|
- my $q = $self->{cgi}; |
1107 |
|
|
- my $user = $q->param('acctName'); |
1108 |
|
|
- |
1109 |
|
|
- if (my @groups = $accountdb->groups()) { |
1110 |
|
|
- |
1111 |
|
|
- print "<tr><td class=\"sme-noborders-label\">", |
1112 |
|
|
- $self->localise('GROUP_MEMBERSHIPS'), |
1113 |
|
|
- "</td><td>\n"; |
1114 |
|
|
- |
1115 |
|
|
- print $q->start_table({-class => "sme-border"}),"\n"; |
1116 |
|
|
- print $q->Tr( |
1117 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise('MEMBER'),"header"), |
1118 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise('GROUP'),"header"), |
1119 |
|
|
- esmith::cgi::genSmallCell($q, $self->localise('DESCRIPTION'),"header") |
1120 |
|
|
- ); |
1121 |
|
|
- |
1122 |
|
|
- foreach my $g (@groups) { |
1123 |
|
|
- my $groupname = $g->key(); |
1124 |
|
|
- my $checked; |
1125 |
|
|
- if ($user and $accountdb->is_user_in_group($user, $groupname)) { |
1126 |
|
|
- $checked = 'checked'; |
1127 |
|
|
- } else { |
1128 |
|
|
- $checked = ''; |
1129 |
|
|
- } |
1130 |
|
|
- |
1131 |
|
|
- print $q->Tr( |
1132 |
|
|
- $q->td( |
1133 |
|
|
- "<input type=\"checkbox\"" |
1134 |
|
|
- . " name=\"groupMemberships\"" |
1135 |
|
|
- . " $checked value=\"$groupname\">" |
1136 |
|
|
- ), |
1137 |
|
|
- esmith::cgi::genSmallCell($q, $groupname,"normal"), |
1138 |
|
|
- esmith::cgi::genSmallCell( $q, $accountdb->get($groupname)->prop("Description"),"normal") |
1139 |
|
|
- ); |
1140 |
|
|
- } |
1141 |
|
|
- |
1142 |
|
|
- print "</table></td></tr>\n"; |
1143 |
|
|
- |
1144 |
|
|
- } |
1145 |
|
|
- |
1146 |
|
|
- return undef; |
1147 |
|
|
- |
1148 |
|
|
-} |
1149 |
|
|
- |
1150 |
|
|
-=head2 print_page_description($self, "reset|lock|remove") |
1151 |
|
|
- |
1152 |
|
|
-Generates the page description for the the somewhat similar Reset |
1153 |
|
|
-Password, Lock Account and Remove Account pages. |
1154 |
|
|
- |
1155 |
|
|
-=begin testing |
1156 |
|
|
- |
1157 |
|
|
-my $self = esmith::FormMagick::Panel::advuseraccounts->new(); |
1158 |
|
|
-$self->{cgi} = CGI->new({ acctName => 'bart' }); |
1159 |
|
|
-print_page_description($self, "reset"); |
1160 |
|
|
-like($_STDOUT_, qr/bart/, "print_page_description prints username"); |
1161 |
|
|
-like($_STDOUT_, qr/Bart Simpson/, "print_page_description prints name"); |
1162 |
|
|
-like($_STDOUT_, qr/RESET_DESC/, "print_page_description prints description"); |
1163 |
|
|
- |
1164 |
|
|
-=end testing |
1165 |
|
|
- |
1166 |
|
|
-=cut |
1167 |
|
|
- |
1168 |
|
|
-sub print_page_description { |
1169 |
|
|
- my ($self, $pagename) = @_; |
1170 |
|
|
- unless (grep /^$pagename$/, qw(reset lock remove)) { |
1171 |
|
|
- warn "Can't generate page description for invalid pagename $pagename\n"; |
1172 |
|
|
- return; |
1173 |
|
|
- } |
1174 |
|
|
- |
1175 |
|
|
- $pagename = uc($pagename); |
1176 |
|
|
- |
1177 |
|
|
- my $desc = $self->localise("${pagename}_DESC"); |
1178 |
|
|
- my $desc2 = $self->localise("${pagename}_DESC2"); |
1179 |
|
|
- |
1180 |
|
|
- my $acctName = $self->{cgi}->param('acctName'); |
1181 |
|
|
- my $name = $accountdb->get($acctName)->prop('FirstName') . " " |
1182 |
|
|
- . $accountdb->get($acctName)->prop('LastName'); |
1183 |
|
|
- |
1184 |
|
|
- print qq{ |
1185 |
|
|
- <tr><td colspan="2"> |
1186 |
|
|
- <p>$desc "$acctName" ($name)</p> |
1187 |
|
|
- $desc2 |
1188 |
|
|
- <input type="hidden" name="acctName" value="$acctName"> |
1189 |
|
|
- </td></tr> |
1190 |
|
|
- }; |
1191 |
|
|
- |
1192 |
|
|
- return; |
1193 |
|
|
-} |
1194 |
|
|
- |
1195 |
|
|
-=head1 ROUTINES FOR FILLING IN FIELD DEFAULT VALUES |
1196 |
|
|
- |
1197 |
|
|
-=head2 get_ldap_value($field) |
1198 |
|
|
- |
1199 |
|
|
-This subroutine generates the default field value on the form using the |
1200 |
|
|
-parameter specified. |
1201 |
|
|
- |
1202 |
|
|
-In this case, the default field values come from LDAP/directory |
1203 |
|
|
-settings. |
1204 |
|
|
- |
1205 |
|
|
-If a CGI parameter has been passed that contains an account name, we |
1206 |
|
|
-assume that a value has already been set, as we're modifying a user, and |
1207 |
|
|
-use that value instead of a default. |
1208 |
|
|
- |
1209 |
|
|
-=for testing |
1210 |
|
|
-my $self = esmith::FormMagick::Panel::advuseraccounts->new(); |
1211 |
|
|
-$self->{cgi} = CGI->new(""); |
1212 |
|
|
-is(get_ldap_value($self, "Dept"), "Main", "Pick up default value from LDAP"); |
1213 |
|
|
-$self->{cgi} = CGI->new({ acctName => 'bart' }); |
1214 |
|
|
-is(get_ldap_value($self, "Dept"), undef, "Don't pick up LDAP data if username provided"); |
1215 |
|
|
- |
1216 |
|
|
-=cut |
1217 |
|
|
- |
1218 |
|
|
-sub get_ldap_value { |
1219 |
|
|
- my ($self, $field) = @_; |
1220 |
|
|
- |
1221 |
|
|
- # don't do the lookup if this is a modification of an existing user |
1222 |
|
|
- if ($self->{cgi}->param('acctName')) { |
1223 |
|
|
- return $self->{cgi}->param($field); |
1224 |
|
|
- } |
1225 |
|
|
- |
1226 |
|
|
- my %CGIParam2DBfield = ( |
1227 |
|
|
- Dept => 'defaultDepartment', |
1228 |
|
|
- Company => 'defaultCompany', |
1229 |
|
|
- Street => 'defaultStreet', |
1230 |
|
|
- City => 'defaultCity', |
1231 |
|
|
- Phone => 'defaultPhoneNumber' |
1232 |
|
|
- ); |
1233 |
|
|
- |
1234 |
|
|
- return $configdb->get('ldap')->prop($CGIParam2DBfield{$field}); |
1235 |
|
|
-} |
1236 |
|
|
- |
1237 |
|
|
-sub get_pptp_value |
1238 |
|
|
-{ |
1239 |
|
|
- return $configdb->get('pptpd')->prop('AccessDefault') || 'no'; |
1240 |
|
|
-} |
1241 |
|
|
- |
1242 |
|
|
- |
1243 |
|
|
- |
1244 |
|
|
-=head1 VALIDATION ROUTINES |
1245 |
|
|
- |
1246 |
|
|
-=head2 pseudonym_clash |
1247 |
|
|
- |
1248 |
|
|
-Validation routine to check whether a the first/last names clash with |
1249 |
|
|
-existing pseudonyms. |
1250 |
|
|
- |
1251 |
|
|
-Note that it won't be considered a "clash" if there is an existing |
1252 |
|
|
-pseudonym which belongs to the same user -- it's only a clash if the |
1253 |
|
|
-generated pseudonyms are the same but the usernames aren't. |
1254 |
|
|
- |
1255 |
|
|
-=begin testing |
1256 |
|
|
- |
1257 |
|
|
-my $self = esmith::FormMagick::Panel::advuseraccounts->new(); |
1258 |
|
|
- |
1259 |
|
|
-$self->{cgi} = CGI->new({ |
1260 |
|
|
- acctName => 'skud', |
1261 |
|
|
- FirstName => 'Kirrily', |
1262 |
|
|
- LastName => 'Robert' |
1263 |
|
|
-}); |
1264 |
|
|
- |
1265 |
|
|
-is (pseudonym_clash($self, 'Kirrily'), "OK", "New name doesn't clash pseudonyms"); |
1266 |
|
|
- |
1267 |
|
|
-$self->{cgi} = CGI->new({ |
1268 |
|
|
- acctName => 'bart2', |
1269 |
|
|
- FirstName => 'Bart', |
1270 |
|
|
- LastName => 'Simpson' |
1271 |
|
|
-}); |
1272 |
|
|
- |
1273 |
|
|
-isnt(pseudonym_clash($self, 'Bart'), "OK", "Existing pseudonym with non-matching username causes clash"); |
1274 |
|
|
- |
1275 |
|
|
-$self->{cgi} = CGI->new({ |
1276 |
|
|
- acctName => 'bart', |
1277 |
|
|
- FirstName => 'Bart', |
1278 |
|
|
- LastName => 'Simpson' |
1279 |
|
|
-}); |
1280 |
|
|
- |
1281 |
|
|
-is(pseudonym_clash($self, 'Bart'), "OK", "Existing pseudonym with matching username shouldn't clash"); |
1282 |
|
|
- |
1283 |
|
|
-=end testing |
1284 |
|
|
- |
1285 |
|
|
-=cut |
1286 |
|
|
- |
1287 |
|
|
-sub pseudonym_clash { |
1288 |
|
|
- my ($self, $first) = @_; |
1289 |
|
|
- $first ||= ""; |
1290 |
|
|
- my $last = $self->{cgi}->param('LastName') || ""; |
1291 |
|
|
- my $acctName = $self->{cgi}->param('acctName') || ""; |
1292 |
|
|
- |
1293 |
|
|
- my $up = "$first $last"; |
1294 |
|
|
- |
1295 |
|
|
- $up =~ s/^\s+//; |
1296 |
|
|
- $up =~ s/\s+$//; |
1297 |
|
|
- $up =~ s/\s+/ /g; |
1298 |
|
|
- $up =~ s/\s/_/g; |
1299 |
|
|
- |
1300 |
|
|
- my $dp = $up; |
1301 |
|
|
- $dp =~ s/_/./g; |
1302 |
|
|
- |
1303 |
|
|
- $dp = $accountdb->get($dp); |
1304 |
|
|
- $up = $accountdb->get($up); |
1305 |
|
|
- |
1306 |
|
|
- my $da = $dp->prop('Account') if $dp; |
1307 |
|
|
- my $ua = $up->prop('Account') if $up; |
1308 |
|
|
- if ($dp and $da and $da ne $acctName) |
1309 |
|
|
- { |
1310 |
|
|
- return $self->localise('PSEUDONYM_CLASH', |
1311 |
|
|
- { |
1312 |
|
|
- acctName => $acctName, |
1313 |
|
|
- clashName => $da, |
1314 |
|
|
- pseudonym => $dp->key |
1315 |
|
|
- }); |
1316 |
|
|
- } |
1317 |
|
|
- elsif ($up and $ua and $ua ne $acctName) |
1318 |
|
|
- { |
1319 |
|
|
- return $self->localise('PSEUDONYM_CLASH', |
1320 |
|
|
- { |
1321 |
|
|
- acctName => $acctName, |
1322 |
|
|
- clashName => $ua, |
1323 |
|
|
- pseudonym => $up->key |
1324 |
|
|
- }); |
1325 |
|
|
- } |
1326 |
|
|
- else |
1327 |
|
|
- { |
1328 |
|
|
- return "OK"; |
1329 |
|
|
- } |
1330 |
|
|
-} |
1331 |
|
|
- |
1332 |
|
|
-=head2 emailforward() |
1333 |
|
|
- |
1334 |
|
|
-Validation routine for email forwarding |
1335 |
|
|
- |
1336 |
|
|
-=cut |
1337 |
|
|
- |
1338 |
|
|
-sub emailforward { |
1339 |
|
|
- my ($self, $data) = @_; |
1340 |
|
|
- my $response = $self->email_simple($data); |
1341 |
|
|
- if ($response eq "OK") |
1342 |
|
|
- { |
1343 |
|
|
- return "OK"; |
1344 |
|
|
- } |
1345 |
|
|
- elsif ($data eq "") |
1346 |
|
|
- { |
1347 |
|
|
- # Blank is ok, only if we're not forwarding, which means that the |
1348 |
|
|
- # EmailForward param must be set to 'local'. |
1349 |
|
|
- my $email_forward = $self->{cgi}->param('EmailForward') || ''; |
1350 |
|
|
- $email_forward =~ s/^\s+|\s+$//g; |
1351 |
|
|
- return 'OK' if $email_forward eq 'local'; |
1352 |
|
|
- return $self->localise('CANNOT_CONTAIN_WHITESPACE'); |
1353 |
|
|
- } |
1354 |
|
|
- else |
1355 |
|
|
- { |
1356 |
|
|
- return $self->localise('CANNOT_CONTAIN_WHITESPACE') |
1357 |
|
|
- if ( $data =~ /\s+/ ); |
1358 |
|
|
- # Permit a local address. |
1359 |
|
|
- return "OK" if $data =~ /^[a-zA-Z][a-zA-Z0-9\._\-]*$/; |
1360 |
|
|
- return $self->localise('UNACCEPTABLE_CHARS'); |
1361 |
|
|
- } |
1362 |
|
|
-} |
1363 |
|
|
- |
1364 |
|
|
-=head2 verifyPasswords() |
1365 |
|
|
- |
1366 |
|
|
-Returns an error message if the two new passwords input don't match. |
1367 |
|
|
- |
1368 |
|
|
-=cut |
1369 |
|
|
- |
1370 |
|
|
-sub verifyPasswords { |
1371 |
|
|
- my $self = shift; |
1372 |
|
|
- my $pass2 = shift; |
1373 |
|
|
- |
1374 |
|
|
- my $pass1 = $self->{cgi}->param('password1'); |
1375 |
|
|
- unless ($pass1 eq $pass2) { |
1376 |
|
|
- $self->{cgi}->param( -name => 'wherenext', -value => 'Password' ); |
1377 |
|
|
- return "PASSWORD_VERIFY_ERROR"; |
1378 |
|
|
- } |
1379 |
|
|
- return "OK"; |
1380 |
|
|
-} |
1381 |
|
|
- |
1382 |
|
|
-=head1 CREATING AND MODIFYING USERS |
1383 |
|
|
- |
1384 |
|
|
-=head2 checkMaxUsers() |
1385 |
|
|
- |
1386 |
|
|
-Returns an error message if the current number of users is greater than or |
1387 |
|
|
-equal to the sysconfig|MaxUsers property. |
1388 |
|
|
- |
1389 |
|
|
-Takes the name of the next page to go to if the test succeeds as an argument. |
1390 |
|
|
- |
1391 |
|
|
-=cut |
1392 |
|
|
- |
1393 |
|
|
-sub checkMaxUsers |
1394 |
|
|
-{ |
1395 |
|
|
- my ($self, $next_page) = @_; |
1396 |
|
|
- |
1397 |
|
|
- # Get value of MaxUsers if it exists. |
1398 |
|
|
- my $sysconfig = $configdb->get('sysconfig'); |
1399 |
|
|
- my $maxUsers = (($sysconfig) ? $sysconfig->prop('MaxUsers') : '') || ''; |
1400 |
|
|
- my $activeUsers = scalar $accountdb->activeUsers() || 0; |
1401 |
|
|
- if ((defined $activeUsers and $maxUsers ne '') |
1402 |
|
|
- and ($activeUsers >= $maxUsers)) |
1403 |
|
|
- { |
1404 |
|
|
- $self->error('MAX_USERS_EXCEEDED'); |
1405 |
|
|
- } |
1406 |
|
|
- else |
1407 |
|
|
- { |
1408 |
|
|
- $self->{cgi}->param(-name => 'wherenext', -value => $next_page); |
1409 |
|
|
- } |
1410 |
|
|
-} |
1411 |
|
|
- |
1412 |
|
|
-=head2 handle_user_accounts() |
1413 |
|
|
- |
1414 |
|
|
-This is the routine called by the "Save" button on the create/modify page. |
1415 |
|
|
-It checks the "action" param and calls either create_user() or modify_user() |
1416 |
|
|
-as appropriate. |
1417 |
|
|
- |
1418 |
|
|
-=cut |
1419 |
|
|
- |
1420 |
|
|
-sub handle_user_accounts { |
1421 |
|
|
- my ($self) = @_; |
1422 |
|
|
- |
1423 |
|
|
- my $cgi = $self->{cgi}; |
1424 |
|
|
- |
1425 |
|
|
- if ($cgi->param("action") eq "create") { |
1426 |
|
|
- my $msg = create_user($self); |
1427 |
|
|
- if ($msg eq 'USER_CREATED') |
1428 |
|
|
- { |
1429 |
|
|
- $self->success($msg); |
1430 |
|
|
- } |
1431 |
|
|
- else |
1432 |
|
|
- { |
1433 |
|
|
- $self->error($msg); |
1434 |
|
|
- } |
1435 |
|
|
- } |
1436 |
|
|
- else { |
1437 |
|
|
- modify_user($self); |
1438 |
|
|
- $self->success('USER_MODIFIED'); |
1439 |
|
|
- } |
1440 |
|
|
-} |
1441 |
|
|
- |
1442 |
|
|
-=head2 print_save_or_add_button() |
1443 |
|
|
- |
1444 |
|
|
-=cut |
1445 |
|
|
- |
1446 |
|
|
-sub print_save_or_add_button { |
1447 |
|
|
- |
1448 |
|
|
- my ($self) = @_; |
1449 |
|
|
- |
1450 |
|
|
- my $cgi = $self->{cgi}; |
1451 |
|
|
- |
1452 |
|
|
- if (($cgi->param("action") || '') eq "modify") { |
1453 |
|
|
- $self->print_button("SAVE"); |
1454 |
|
|
- } else { |
1455 |
|
|
- $self->print_button("ADD"); |
1456 |
|
|
- } |
1457 |
|
|
- |
1458 |
|
|
-} |
1459 |
|
|
- |
1460 |
|
|
-=head2 modify_admin($self) |
1461 |
|
|
- |
1462 |
|
|
-=cut |
1463 |
|
|
- |
1464 |
|
|
-sub modify_admin |
1465 |
|
|
-{ |
1466 |
|
|
- my ($self) = @_; |
1467 |
|
|
- |
1468 |
|
|
- my $acct = $accountdb->get('admin'); |
1469 |
|
|
- |
1470 |
|
|
- my %newProperties = ( |
1471 |
|
|
- 'FirstName' => $self->{cgi}->param('FirstName'), |
1472 |
|
|
- 'LastName' => $self->{cgi}->param('LastName'), |
1473 |
|
|
- 'VPNClientAccess'=> $self->{cgi}->param('VPNClientAccess'), |
1474 |
|
|
- ); |
1475 |
|
|
- |
1476 |
|
|
- $acct->merge_props(%newProperties); |
1477 |
|
|
- |
1478 |
|
|
- undef $accountdb; |
1479 |
|
|
- |
1480 |
|
|
- my $status = |
1481 |
|
|
- system ("/sbin/e-smith/signal-event", "user-modify-admin", 'admin'); |
1482 |
|
|
- |
1483 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1484 |
|
|
- |
1485 |
|
|
- if ($status == 0) |
1486 |
|
|
- { |
1487 |
|
|
- $self->success('USER_MODIFIED', 'First'); |
1488 |
|
|
- } |
1489 |
|
|
- else |
1490 |
|
|
- { |
1491 |
|
|
- $self->error('CANNOT_MODIFY_USER', 'First'); |
1492 |
|
|
- } |
1493 |
|
|
- return; |
1494 |
|
|
-} |
1495 |
|
|
- |
1496 |
|
|
-=head2 modify_user($self) |
1497 |
|
|
- |
1498 |
|
|
-=cut |
1499 |
|
|
- |
1500 |
|
|
-sub modify_user { |
1501 |
|
|
- my ($self) = @_; |
1502 |
|
|
- my $acctName = $self->{cgi}->param('acctName'); |
1503 |
|
|
- |
1504 |
|
|
- unless (($acctName) = ($acctName =~ /^(\w[\-\w_\.]+)$/)) { |
1505 |
|
|
- return $self->error($self->localise('TAINTED_USER', |
1506 |
|
|
- { acctName => $acctName })); |
1507 |
|
|
- } |
1508 |
|
|
- # Untaint the username before use in system() |
1509 |
|
|
- $acctName = $1; |
1510 |
|
|
- |
1511 |
|
|
- my $acct = $accountdb->get($acctName); |
1512 |
|
|
- my $acctType = $acct->prop('type'); |
1513 |
|
|
- |
1514 |
|
|
- if ($acctType eq "user") |
1515 |
|
|
- { |
1516 |
|
|
- $accountdb->remove_user_auto_pseudonyms($acctName); |
1517 |
|
|
- my %newProperties = ( |
1518 |
|
|
- 'FirstName' => $self->{cgi}->param('FirstName'), |
1519 |
|
|
- 'LastName' => $self->{cgi}->param('LastName'), |
1520 |
|
|
- 'Phone' => $self->{cgi}->param('Phone'), |
1521 |
|
|
- 'Company' => $self->{cgi}->param('Company'), |
1522 |
|
|
- 'Dept' => $self->{cgi}->param('Dept'), |
1523 |
|
|
- 'City' => $self->{cgi}->param('City'), |
1524 |
|
|
- 'Street' => $self->{cgi}->param('Street'), |
1525 |
|
|
- 'EmailForward' => $self->{cgi}->param('EmailForward'), |
1526 |
|
|
- 'ForwardAddress' => $self->{cgi}->param('ForwardAddress'), |
1527 |
|
|
- 'FreeBusy' => $self->{cgi}->param('FreeBusy'), |
1528 |
|
|
- 'VPNClientAccess'=> $self->{cgi}->param('VPNClientAccess'), |
1529 |
|
|
- ); |
1530 |
|
|
- $acct->merge_props(%newProperties); |
1531 |
|
|
- |
1532 |
|
|
- $accountdb->create_user_auto_pseudonyms($acctName); |
1533 |
|
|
- |
1534 |
|
|
- my @old_groups = $accountdb->user_group_list($acctName); |
1535 |
|
|
- my @new_groups = $self->{cgi}->param("groupMemberships"); |
1536 |
|
|
- $accountdb->remove_user_from_groups($acctName, @old_groups); |
1537 |
|
|
- $accountdb->add_user_to_groups($acctName, @new_groups); |
1538 |
|
|
- |
1539 |
|
|
- undef $accountdb; |
1540 |
|
|
- |
1541 |
|
|
- unless (system ("/sbin/e-smith/signal-event", "user-modify", |
1542 |
|
|
- $acctName) == 0) { |
1543 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1544 |
|
|
- return $self->error('CANNOT_MODIFY_USER'); |
1545 |
|
|
- } |
1546 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1547 |
|
|
- } |
1548 |
|
|
- $self->success('USER_MODIFIED'); |
1549 |
|
|
-} |
1550 |
|
|
- |
1551 |
|
|
-=head2 create_user |
1552 |
|
|
- |
1553 |
|
|
-Adds a user to the accounts db. |
1554 |
|
|
- |
1555 |
|
|
-=cut |
1556 |
|
|
- |
1557 |
|
|
-sub create_user { |
1558 |
|
|
- my $self = shift; |
1559 |
|
|
- my $q = $self->{cgi}; |
1560 |
|
|
- |
1561 |
|
|
- my $acctName = $q->param('acctName'); |
1562 |
|
|
- |
1563 |
|
|
- my $msg = $self->validate_acctName($acctName); |
1564 |
|
|
- unless ($msg eq "OK") |
1565 |
|
|
- { |
1566 |
|
|
- return $msg; |
1567 |
|
|
- } |
1568 |
|
|
- |
1569 |
|
|
- $msg = $self->validate_acctName_length($acctName); |
1570 |
|
|
- unless ($msg eq "OK") |
1571 |
|
|
- { |
1572 |
|
|
- return $msg; |
1573 |
|
|
- } |
1574 |
|
|
- |
1575 |
|
|
- $msg = $self->validate_acctName_conflict($acctName); |
1576 |
|
|
- unless ($msg eq "OK") |
1577 |
|
|
- { |
1578 |
|
|
- return $msg; |
1579 |
|
|
- } |
1580 |
|
|
- |
1581 |
|
|
- my %userprops; |
1582 |
|
|
- foreach my $field ( qw( FirstName LastName Phone Company Dept |
1583 |
|
|
- City Street EmailForward ForwardAddress FreeBusy VPNClientAccess) ) |
1584 |
|
|
- { |
1585 |
|
|
- $userprops{$field} = $q->param($field); |
1586 |
|
|
- } |
1587 |
|
|
- $userprops{'PasswordSet'} = "no"; |
1588 |
|
|
- $userprops{'type'} = 'user'; |
1589 |
|
|
- |
1590 |
|
|
- my $acct = $accountdb->new_record($acctName) |
1591 |
|
|
- or warn "Can't create new account for $acctName (does it already exist?)\n"; |
1592 |
|
|
- $acct->reset_props(%userprops); |
1593 |
|
|
- $accountdb->create_user_auto_pseudonyms($acctName); |
1594 |
|
|
- my @groups = $self->{cgi}->param("groupMemberships"); |
1595 |
|
|
- $accountdb->add_user_to_groups($acctName, @groups); |
1596 |
|
|
- |
1597 |
|
|
- undef $accountdb; |
1598 |
|
|
- |
1599 |
|
|
- # Untaint the username before use in system() |
1600 |
|
|
- $acctName =~ /^(\w[\-\w_\.]+)$/; |
1601 |
|
|
- $acctName = $1; |
1602 |
|
|
- |
1603 |
|
|
- if (system ("/sbin/e-smith/signal-event", "user-create", $acctName)) |
1604 |
|
|
- { |
1605 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1606 |
|
|
- return $self->localise("ERR_OCCURRED_CREATING"); |
1607 |
|
|
- } |
1608 |
|
|
- |
1609 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1610 |
|
|
- |
1611 |
|
|
- $self->set_groups(); |
1612 |
|
|
- return 'USER_CREATED'; |
1613 |
|
|
-} |
1614 |
|
|
- |
1615 |
|
|
-=head2 set_groups |
1616 |
|
|
- |
1617 |
|
|
-Sets a user's groups in the accounts db. This is called as part of the |
1618 |
|
|
-create_user() routine. |
1619 |
|
|
- |
1620 |
|
|
-=cut |
1621 |
|
|
- |
1622 |
|
|
-sub set_groups |
1623 |
|
|
-{ |
1624 |
|
|
- my $self = shift; |
1625 |
|
|
- my $q = $self->{cgi}; |
1626 |
|
|
- my $acctName = $q->param('acctName'); |
1627 |
|
|
- |
1628 |
|
|
- my @groups = $q->param('groupMemberships'); |
1629 |
|
|
- $accountdb->set_user_groups($acctName, @groups); |
1630 |
|
|
- |
1631 |
|
|
-} |
1632 |
|
|
- |
1633 |
|
|
-=head1 REMOVING ACCOUNTS |
1634 |
|
|
- |
1635 |
|
|
-=head2 remove_account() |
1636 |
|
|
- |
1637 |
|
|
-=cut |
1638 |
|
|
- |
1639 |
|
|
-sub remove_account { |
1640 |
|
|
- my ($self) = @_; |
1641 |
|
|
- my $acctName = $self->{cgi}->param('acctName'); |
1642 |
|
|
- |
1643 |
|
|
- my $acct = $accountdb->get($acctName); |
1644 |
|
|
- if ($acct->prop('type') eq "user") { |
1645 |
|
|
- $acct->set_prop('type', "user-deleted"); |
1646 |
|
|
- |
1647 |
|
|
- undef $accountdb; |
1648 |
|
|
- |
1649 |
|
|
- # Untaint the username before use in system() |
1650 |
|
|
- $acctName =~ /^(\w[\-\w_\.]+)$/; |
1651 |
|
|
- $acctName = $1; |
1652 |
|
|
- if (system ("/sbin/e-smith/signal-event", "user-delete", $acctName)) |
1653 |
|
|
- { |
1654 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1655 |
|
|
- return $self->error("ERR_OCCURRED_DELETING"); |
1656 |
|
|
- } |
1657 |
|
|
- |
1658 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1659 |
|
|
- $accountdb->get($acctName)->delete; |
1660 |
|
|
- |
1661 |
|
|
- } else { |
1662 |
|
|
- # FIXME - this should be handled by input validation |
1663 |
|
|
- # XXX error message here |
1664 |
|
|
- } |
1665 |
|
|
- $self->{cgi}->param(-name => 'wherenext', -value => 'First'); |
1666 |
|
|
-} |
1667 |
|
|
- |
1668 |
|
|
-=head1 RESETTING THE PASSWORD |
1669 |
|
|
- |
1670 |
|
|
-=head2 reset_password() |
1671 |
|
|
- |
1672 |
|
|
-=cut |
1673 |
|
|
- |
1674 |
|
|
-sub reset_password { |
1675 |
|
|
- my ($self) = @_; |
1676 |
|
|
- my $acctName = $self->{cgi}->param('acctName'); |
1677 |
|
|
- |
1678 |
|
|
- unless (($acctName) = ($acctName =~ /^(\w[\-\w_\.]+)$/)) { |
1679 |
|
|
- return $self->error('TAINTED_USER'); |
1680 |
|
|
- } |
1681 |
|
|
- $acctName = $1; |
1682 |
|
|
- |
1683 |
|
|
- my $acct = $accountdb->get($acctName); |
1684 |
|
|
- |
1685 |
|
|
- if ( $acct->prop('type') eq "user") |
1686 |
|
|
- { |
1687 |
|
|
- esmith::util::setUserPassword ($acctName, |
1688 |
|
|
- $self->{cgi}->param('password1')); |
1689 |
|
|
- |
1690 |
|
|
- $acct->set_prop("PasswordSet", "yes"); |
1691 |
|
|
- undef $accountdb; |
1692 |
|
|
- |
1693 |
|
|
- if (system("/sbin/e-smith/signal-event", "password-modify", $acctName)) |
1694 |
|
|
- { |
1695 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1696 |
|
|
- $self->error("ERR_OCCURRED_MODIFYING_PASSWORD"); |
1697 |
|
|
- } |
1698 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1699 |
|
|
- |
1700 |
|
|
- $self->success($self->localise('PASSWORD_CHANGE_SUCCEEDED', |
1701 |
|
|
- { acctName => $acctName})); |
1702 |
|
|
- } |
1703 |
|
|
- else |
1704 |
|
|
- { |
1705 |
|
|
- $self->error($self->localise('NO_SUCH_USER', |
1706 |
|
|
- { acctName => $acctName})); |
1707 |
|
|
- } |
1708 |
|
|
-} |
1709 |
|
|
- |
1710 |
|
|
-=head1 LOCKING AN ACCOUNT |
1711 |
|
|
- |
1712 |
|
|
-=head2 lock_account() |
1713 |
|
|
- |
1714 |
|
|
-=cut |
1715 |
|
|
- |
1716 |
|
|
-sub lock_account { |
1717 |
|
|
- my ($self) = @_; |
1718 |
|
|
- my $acctName = $self->{cgi}->param('acctName'); |
1719 |
|
|
- my $acct = $accountdb->get($acctName); |
1720 |
|
|
- if ($acct->prop('type') eq "user") |
1721 |
|
|
- { |
1722 |
|
|
- undef $accountdb; |
1723 |
|
|
- |
1724 |
|
|
- # Untaint the username before use in system() |
1725 |
|
|
- $acctName =~ /^(\w[\-\w_\.]+)$/; |
1726 |
|
|
- $acctName = $1; |
1727 |
|
|
- if (system("/sbin/e-smith/signal-event", "user-lock", $acctName)) |
1728 |
|
|
- { |
1729 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1730 |
|
|
- return $self->error("ERR_OCCURRED_LOCKING"); |
1731 |
|
|
- } |
1732 |
|
|
- |
1733 |
|
|
- $accountdb = esmith::AccountsDB->open(); |
1734 |
|
|
- |
1735 |
|
|
- $self->success($self->localise('LOCKED_ACCOUNT', |
1736 |
|
|
- { acctName => $acctName})); |
1737 |
|
|
- } |
1738 |
|
|
- else |
1739 |
|
|
- { |
1740 |
|
|
- $self->error($self->localise('NO_SUCH_USER', |
1741 |
|
|
- { acctName => $acctName})); |
1742 |
|
|
- } |
1743 |
|
|
-} |
1744 |
|
|
- |
1745 |
|
|
- |
1746 |
|
|
-=head1 MISCELLANEOUS ROUTINES |
1747 |
|
|
- |
1748 |
|
|
-=head2 build_user_cgi_params() |
1749 |
|
|
- |
1750 |
|
|
-Builds a CGI query string based on user data, using various sensible |
1751 |
|
|
-defaults and esmith::FormMagick's props_to_query_string() method. |
1752 |
|
|
- |
1753 |
|
|
-=cut |
1754 |
|
|
- |
1755 |
|
|
-sub build_user_cgi_params { |
1756 |
|
|
- my ($self, $acctName, %oldprops) = @_; |
1757 |
|
|
- |
1758 |
|
|
- my %props = ( |
1759 |
|
|
- page => 0, |
1760 |
|
|
- page_stack => "", |
1761 |
|
|
- ".id" => $self->{cgi}->param('.id') || "", |
1762 |
|
|
- acctName => $acctName, |
1763 |
|
|
- #%oldprops |
1764 |
|
|
- ); |
1765 |
|
|
- |
1766 |
|
|
- return $self->props_to_query_string(\%props); |
1767 |
|
|
-} |
1768 |
|
|
- |
1769 |
|
|
-=pod |
1770 |
|
|
- |
1771 |
|
|
-=head2 validate_acctName |
1772 |
|
|
- |
1773 |
|
|
-Checks that the name supplied does not contain any unacceptable chars. |
1774 |
|
|
-Returns OK on success or a localised error message otherwise. |
1775 |
|
|
- |
1776 |
|
|
-=for testing |
1777 |
|
|
-is($panel->validate_acctName('foo'), 'OK', 'validate_acctName'); |
1778 |
|
|
-isnt($panel->validate_acctName('3amigos'), 'OK', ' .. cannot start with number'); |
1779 |
|
|
-isnt($panel->validate_acctName('betty ford'), 'OK', ' .. cannot contain space'); |
1780 |
|
|
- |
1781 |
|
|
-=cut |
1782 |
|
|
- |
1783 |
|
|
-sub validate_acctName |
1784 |
|
|
-{ |
1785 |
|
|
- my ($self, $acctName) = @_; |
1786 |
|
|
- |
1787 |
|
|
- unless ($accountdb->validate_account_name($acctName)) |
1788 |
|
|
- { |
1789 |
|
|
- return $self->localise('ACCT_NAME_HAS_INVALID_CHARS', |
1790 |
|
|
- {acctName => $acctName}); |
1791 |
|
|
- } |
1792 |
|
|
- return "OK"; |
1793 |
|
|
-} |
1794 |
|
|
- |
1795 |
|
|
-=head2 validate_account_length FM ACCOUNTNAME |
1796 |
|
|
- |
1797 |
|
|
-returns 'OK' if the account name is shorter than the maximum account name length |
1798 |
|
|
-returns 'ACCOUNT_TOO_LONG' otherwise |
1799 |
|
|
- |
1800 |
|
|
-=begin testing |
1801 |
|
|
- |
1802 |
|
|
-ok(($panel->validate_acctName_length('foo') eq 'OK'), "a short account name passes"); |
1803 |
|
|
-ok(($panel->validate_acctName_length('fooooooooooooooooo') eq 'ACCOUNT_TOO_LONG'), "a long account name fails"); |
1804 |
|
|
- |
1805 |
|
|
-=end testing |
1806 |
|
|
- |
1807 |
|
|
-=cut |
1808 |
|
|
- |
1809 |
|
|
-sub validate_acctName_length { |
1810 |
|
|
- my $self = shift; |
1811 |
|
|
- my $acctName = shift; |
1812 |
|
|
- |
1813 |
|
|
- |
1814 |
|
|
- my $maxAcctNameLength = ($configdb->get('maxAcctNameLength') |
1815 |
|
|
- ? $configdb->get('maxAcctNameLength')->prop('type') |
1816 |
|
|
- : "") || 12; |
1817 |
|
|
- |
1818 |
|
|
- if ( length $acctName > $maxAcctNameLength ) { |
1819 |
|
|
- |
1820 |
|
|
- return $self->localise('ACCOUNT_TOO_LONG', |
1821 |
|
|
- {maxLength => $maxAcctNameLength}); |
1822 |
|
|
- } |
1823 |
|
|
- else { |
1824 |
|
|
- return ('OK'); |
1825 |
|
|
- } |
1826 |
|
|
-} |
1827 |
|
|
- |
1828 |
|
|
-=head2 validate_acctName_conflict |
1829 |
|
|
- |
1830 |
|
|
-Returns 'OK' if the account name doesn't yet exist. Returns a localised error |
1831 |
|
|
-otherwise. |
1832 |
|
|
- |
1833 |
|
|
-=cut |
1834 |
|
|
- |
1835 |
|
|
-sub validate_acctName_conflict |
1836 |
|
|
-{ |
1837 |
|
|
- my $self = shift; |
1838 |
|
|
- my $acctName = shift; |
1839 |
|
|
- |
1840 |
|
|
- my $account = $accountdb->get($acctName); |
1841 |
|
|
- my $type; |
1842 |
|
|
- |
1843 |
|
|
- if (defined $account) |
1844 |
|
|
- { |
1845 |
|
|
- $type = $account->prop('type'); |
1846 |
|
|
- } |
1847 |
|
|
- elsif (defined getpwnam($acctName) || defined getgrnam($acctName)) |
1848 |
|
|
- { |
1849 |
|
|
- $type = "system"; |
1850 |
|
|
- } |
1851 |
|
|
- else |
1852 |
|
|
- { |
1853 |
|
|
- return('OK'); |
1854 |
|
|
- } |
1855 |
|
|
- return $self->localise('ACCOUNT_CONFLICT', |
1856 |
|
|
- { account => $acctName, |
1857 |
|
|
- type => $type, |
1858 |
|
|
-}); |
1859 |
|
|
-} |
1860 |
|
|
- |
1861 |
|
|
-=head2 check_password |
1862 |
|
|
- |
1863 |
|
|
-Validates the password using the desired strength |
1864 |
|
|
- |
1865 |
|
|
-=cut |
1866 |
|
|
- |
1867 |
|
|
-sub check_password { |
1868 |
|
|
- my $self = shift; |
1869 |
|
|
- my $pass1 = shift; |
1870 |
|
|
- |
1871 |
|
|
- my $check_type; |
1872 |
|
|
- my $rec = $configdb->get('passwordstrength'); |
1873 |
|
|
- $check_type = ($rec ? ($rec->prop('Users') || 'none') : 'none'); |
1874 |
|
|
- |
1875 |
|
|
- return $self->validate_password($check_type,$pass1); |
1876 |
|
|
-} |
1877 |
|
|
- |
1878 |
|
|
- |
1879 |
|
|
-=head1 System Password manipulation routines |
1880 |
|
|
- |
1881 |
|
|
-XXX FIXME - These should be merged with the useraccouts versions |
1882 |
|
|
- |
1883 |
|
|
-=head2 system_password_compare |
1884 |
|
|
- |
1885 |
|
|
-=cut |
1886 |
|
|
- |
1887 |
|
|
-sub system_password_compare |
1888 |
|
|
-{ |
1889 |
|
|
- my $self = shift; |
1890 |
|
|
- my $pass2 = shift; |
1891 |
|
|
- |
1892 |
|
|
- my $pass1 = $self->{cgi}->param('pass'); |
1893 |
|
|
- unless ($pass1 eq $pass2) { |
1894 |
|
|
- $self->{cgi}->param( -name => 'wherenext', -value => 'Password' ); |
1895 |
|
|
- return "SYSTEM_PASSWORD_VERIFY_ERROR"; |
1896 |
|
|
- } |
1897 |
|
|
- return "OK"; |
1898 |
|
|
-} |
1899 |
|
|
- |
1900 |
|
|
-=head2 system_valid_password |
1901 |
|
|
- |
1902 |
|
|
-Throw an error if the password doesn't consist solely of one or more printable characters. |
1903 |
|
|
- |
1904 |
|
|
-=cut |
1905 |
|
|
- |
1906 |
|
|
-sub system_valid_password |
1907 |
|
|
-{ |
1908 |
|
|
- my $self = shift; |
1909 |
|
|
- my $pass1 = shift; |
1910 |
|
|
- # If the password contains one or more printable character |
1911 |
|
|
- if ($pass1 =~ /^([ -~]+)$/) { |
1912 |
|
|
- return('OK'); |
1913 |
|
|
- } else { |
1914 |
|
|
- $self->{cgi}->param( -name => 'wherenext', -value => 'Password' ); |
1915 |
|
|
- return 'SYSTEM_PASSWORD_UNPRINTABLES_IN_PASS'; |
1916 |
|
|
- } |
1917 |
|
|
-} |
1918 |
|
|
- |
1919 |
|
|
-=head2 system_check_password |
1920 |
|
|
- |
1921 |
|
|
-Validates the password using the desired strength |
1922 |
|
|
- |
1923 |
|
|
-=cut |
1924 |
|
|
- |
1925 |
|
|
-sub system_check_password |
1926 |
|
|
-{ |
1927 |
|
|
- my $self = shift; |
1928 |
|
|
- my $pass1 = shift; |
1929 |
|
|
- |
1930 |
|
|
- use esmith::ConfigDB; |
1931 |
|
|
- my $conf = esmith::ConfigDB->open(); |
1932 |
|
|
- my $check_type; |
1933 |
|
|
- my $rec; |
1934 |
|
|
- if ($conf) |
1935 |
|
|
- { |
1936 |
|
|
- $rec = $conf->get('passwordstrength'); |
1937 |
|
|
- } |
1938 |
|
|
- $check_type = ($rec ? ($rec->prop('Admin') || 'strong') : 'strong'); |
1939 |
|
|
- |
1940 |
|
|
- return $self->validate_password($check_type,$pass1); |
1941 |
|
|
-} |
1942 |
|
|
- |
1943 |
|
|
-=head2 authenticate_password |
1944 |
|
|
- |
1945 |
|
|
-Compares the password with the current system password |
1946 |
|
|
- |
1947 |
|
|
-=cut |
1948 |
|
|
- |
1949 |
|
|
-sub system_authenticate_password |
1950 |
|
|
-{ |
1951 |
|
|
- my $self = shift; |
1952 |
|
|
- my $pass = shift; |
1953 |
|
|
- |
1954 |
|
|
- if (esmith::util::authenticateUnixPassword('root', $pass)) |
1955 |
|
|
- { |
1956 |
|
|
- return "OK"; |
1957 |
|
|
- } |
1958 |
|
|
- else |
1959 |
|
|
- { |
1960 |
|
|
- return "SYSTEM_PASSWORD_AUTH_ERROR"; |
1961 |
|
|
- } |
1962 |
|
|
-} |
1963 |
|
|
- |
1964 |
|
|
-=head2 system_change_password |
1965 |
|
|
- |
1966 |
|
|
-If everything has been validated, properly, go ahead and set the new password. |
1967 |
|
|
- |
1968 |
|
|
-=cut |
1969 |
|
|
- |
1970 |
|
|
-sub system_change_password |
1971 |
|
|
-{ |
1972 |
|
|
- my ($self) = @_; |
1973 |
|
|
- my $pass = $self->{cgi}->param('pass'); |
1974 |
|
|
- |
1975 |
|
|
- esmith::util::setUnixSystemPassword($pass); |
1976 |
|
|
- esmith::util::setServerSystemPassword($pass); |
1977 |
|
|
- |
1978 |
|
|
- my $result = system("/sbin/e-smith/signal-event password-modify admin"); |
1979 |
|
|
- |
1980 |
|
|
- if ($result == 0) |
1981 |
|
|
- { |
1982 |
|
|
- $self->success('SYSTEM_PASSWORD_CHANGED', 'First'); |
1983 |
|
|
- } |
1984 |
|
|
- else |
1985 |
|
|
- { |
1986 |
|
|
- $self->error("Error occurred while modifying password for admin.", 'First'); |
1987 |
|
|
- } |
1988 |
|
|
- |
1989 |
|
|
- return; |
1990 |
|
|
-} |
1991 |
|
|
- |
1992 |
|
|
-sub print_ipsec_client_section |
1993 |
|
|
-{ |
1994 |
|
|
- my $self = shift; |
1995 |
|
|
- my $q = $self->cgi; |
1996 |
|
|
- |
1997 |
|
|
- # Don't show ipsecrw setting unless the status property exists |
1998 |
|
|
- return '' unless ($configdb->get('ipsec') |
1999 |
|
|
- && $configdb->get('ipsec')->prop('RoadWarriorStatus')); |
2000 |
|
|
- # Don't show ipsecrw setting unless /sbin/e-smith/roadwarrior exists |
2001 |
|
|
- return '' unless -x '/sbin/e-smith/roadwarrior'; |
2002 |
|
|
- my $acct = $q->param('acctName'); |
2003 |
|
|
- my $rec = $accountdb->get($acct) if $acct; |
2004 |
|
|
- if ($acct and $rec) |
2005 |
|
|
- { |
2006 |
|
|
- my $pwset = $rec->prop('PasswordSet') || 'no'; |
2007 |
|
|
- my $VPNaccess = $rec->prop('VPNClientAccess') || 'no'; |
2008 |
|
|
- if ($pwset eq 'yes' and $VPNaccess eq 'yes') |
2009 |
|
|
- { |
2010 |
|
|
- print $q->Tr( |
2011 |
|
|
- $q->td({-class=>'sme-noborders-label'}, |
2012 |
|
|
- $self->localise('LABEL_IPSECRW_DOWNLOAD')), |
2013 |
|
|
- $q->td({-class=>'sme-noborders-content'}, |
2014 |
|
|
- $q->a({-class=>'button-like', |
2015 |
|
|
- -href=>"?action=getCert&user=$acct"}, |
2016 |
|
|
- $self->localise('BUTTON_IPSECRW_DOWNLOAD')))); |
2017 |
|
|
- } |
2018 |
|
|
- } |
2019 |
|
|
- return ''; |
2020 |
|
|
-} |
2021 |
|
|
- |
2022 |
|
|
-sub get_ipsec_client_cert |
2023 |
|
|
-{ |
2024 |
|
|
- my $self = shift; |
2025 |
|
|
- my $q = shift; |
2026 |
|
|
- my $user = $q->param('user'); |
2027 |
|
|
- ($user) = ($user =~ /^(.*)$/); |
2028 |
|
|
- |
2029 |
|
|
- die "Invalid user: $user\n" unless getpwnam($user); |
2030 |
|
|
- |
2031 |
|
|
- open (KID, "/sbin/e-smith/roadwarrior get_client_cert $user |") |
2032 |
|
|
- or die "Can't fork: $!"; |
2033 |
|
|
- my $certfile = <KID>; |
2034 |
|
|
- close KID; |
2035 |
|
|
- |
2036 |
|
|
- require File::Basename; |
2037 |
|
|
- my $certname = File::Basename::basename($certfile); |
2038 |
|
|
- |
2039 |
|
|
- print "Expires: 0\n"; |
2040 |
|
|
- print "Content-type: application/x-pkcs12\n"; |
2041 |
|
|
- print "Content-disposition: inline; filename=$certname\n"; |
2042 |
|
|
- print "\n"; |
2043 |
|
|
- |
2044 |
|
|
- open (CERT, "<$certfile"); |
2045 |
|
|
- while (<CERT>) |
2046 |
|
|
- { |
2047 |
|
|
- print; |
2048 |
|
|
- } |
2049 |
|
|
- close CERT; |
2050 |
|
|
- |
2051 |
|
|
- return ''; |
2052 |
|
|
-} |
2053 |
|
|
- |
2054 |
|
|
-sub display_email_forwarding |
2055 |
|
|
-{ |
2056 |
|
|
- return defined $configdb->get('smtpd'); |
2057 |
|
|
-} |
2058 |
|
|
- |
2059 |
|
|
-1; |