Project

General

Profile

Download (35.6 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
    system_usermanager.php
5
    part of m0n0wall (http://m0n0.ch/wall)
6

    
7
    Copyright (C) 2008 Shrew Soft Inc.
8
    All rights reserved.
9

    
10
    Copyright (C) 2005 Paul Taylor <paultaylor@winn-dixie.com>.
11
    All rights reserved.
12

    
13
    Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
14
    All rights reserved.
15

    
16
    Redistribution and use in source and binary forms, with or without
17
    modification, are permitted provided that the following conditions are met:
18

    
19
    1. Redistributions of source code must retain the above copyright notice,
20
       this list of conditions and the following disclaimer.
21

    
22
    2. Redistributions in binary form must reproduce the above copyright
23
       notice, this list of conditions and the following disclaimer in the
24
       documentation and/or other materials provided with the distribution.
25

    
26
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
27
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
28
    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29
    AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
30
    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
    POSSIBILITY OF SUCH DAMAGE.
36
*/
37
/*
38
	pfSense_BUILDER_BINARIES:	
39
	pfSense_MODULE:	auth
40
*/
41

    
42
##|+PRIV
43
##|*IDENT=page-system-usermanager
44
##|*NAME=System: User Manager page
45
##|*DESCR=Allow access to the 'System: User Manager' page.
46
##|*MATCH=system_usermanager.php*
47
##|-PRIV
48

    
49
require("certs.inc");
50
require("guiconfig.inc");
51

    
52
if (isAllowedPage("system_usermanager")) {
53

    
54
	// start admin user code
55
	$pgtitle = array(gettext("System"),gettext("User Manager"));
56

    
57
	$id = $_GET['id'];
58
	if (isset($_POST['id']))
59
		$id = $_POST['id'];
60

    
61
	if (!is_array($config['system']['user'])) 
62
		$config['system']['user'] = array();
63

    
64
	$a_user = &$config['system']['user'];
65

    
66
	if ($_GET['act'] == "deluser") {
67

    
68
		if (!$a_user[$id]) {
69
			pfSenseHeader("system_usermanager.php");
70
			exit;
71
		}
72

    
73
		local_user_del($a_user[$id]);
74
		$userdeleted = $a_user[$id]['name'];
75
		unset($a_user[$id]);
76
		write_config();
77
		$savemsg = gettext("User")." {$userdeleted} ".
78
					gettext("successfully deleted")."<br/>";
79
	}
80

    
81
	if ($_GET['act'] == "delpriv") {
82

    
83
		if (!$a_user[$id]) {
84
			pfSenseHeader("system_usermanager.php");
85
			exit;
86
		}
87

    
88
		$privdeleted = $priv_list[$a_user[$id]['priv'][$_GET['privid']]]['name'];
89
		unset($a_user[$id]['priv'][$_GET['privid']]);
90
		write_config();
91
		$_GET['act'] = "edit";
92
		$savemsg = gettext("Privilege")." {$privdeleted} ".
93
					gettext("successfully deleted")."<br/>";
94
	}
95

    
96
	if ($_GET['act'] == "expcert") {
97

    
98
		if (!$a_user[$id]) {
99
			pfSenseHeader("system_usermanager.php");
100
			exit;
101
		}
102

    
103
		$cert =& lookup_cert($a_user[$id]['cert'][$_GET['certid']]);
104

    
105
		$exp_name = urlencode("{$a_user[$id]['name']}-{$cert['descr']}.crt");
106
		$exp_data = base64_decode($cert['crt']);
107
		$exp_size = strlen($exp_data);
108

    
109
		header("Content-Type: application/octet-stream");
110
		header("Content-Disposition: attachment; filename={$exp_name}");
111
		header("Content-Length: $exp_size");
112
		echo $exp_data;
113
		exit;
114
	}
115

    
116
	if ($_GET['act'] == "expckey") {
117

    
118
		if (!$a_user[$id]) {
119
			pfSenseHeader("system_usermanager.php");
120
			exit;
121
		}
122

    
123
		$cert =& lookup_cert($a_user[$id]['cert'][$_GET['certid']]);
124

    
125
		$exp_name = urlencode("{$a_user[$id]['name']}-{$cert['descr']}.key");
126
		$exp_data = base64_decode($cert['prv']);
127
		$exp_size = strlen($exp_data);
128

    
129
		header("Content-Type: application/octet-stream");
130
		header("Content-Disposition: attachment; filename={$exp_name}");
131
		header("Content-Length: $exp_size");
132
		echo $exp_data;
133
		exit;
134
	}
135

    
136
	if ($_GET['act'] == "delcert") {
137

    
138
		if (!$a_user[$id]) {
139
			pfSenseHeader("system_usermanager.php");
140
			exit;
141
		}
142

    
143
		$certdeleted = lookup_cert($a_user[$id]['cert'][$_GET['certid']]);
144
		$certdeleted = $certdeleted['descr'];
145
		unset($a_user[$id]['cert'][$_GET['certid']]);
146
		write_config();
147
		$_GET['act'] = "edit";
148
		$savemsg = gettext("Certificate")." {$certdeleted} ".
149
					gettext("association removed.")."<br/>";
150
	}
151

    
152
	if ($_GET['act'] == "edit") {
153
		if (isset($id) && $a_user[$id]) {
154
			$pconfig['usernamefld'] = $a_user[$id]['name'];
155
			$pconfig['descr'] = $a_user[$id]['descr'];
156
			$pconfig['expires'] = $a_user[$id]['expires'];
157
			$pconfig['groups'] = local_user_get_groups($a_user[$id]);
158
			$pconfig['utype'] = $a_user[$id]['scope'];
159
			$pconfig['uid'] = $a_user[$id]['uid'];
160
			$pconfig['authorizedkeys'] = base64_decode($a_user[$id]['authorizedkeys']);
161
			$pconfig['priv'] = $a_user[$id]['priv'];
162
			$pconfig['ipsecpsk'] = $a_user[$id]['ipsecpsk'];
163
			$pconfig['disabled'] = isset($a_user[$id]['disabled']);
164
		}
165
	}
166

    
167
	if ($_GET['act'] == "new") {
168
		/*
169
		 * set this value cause the text field is read only
170
		 * and the user should not be able to mess with this
171
		 * setting.
172
		 */
173
		$pconfig['utype'] = "user";
174
		$pconfig['lifetime'] = 3650;
175
	}
176

    
177
	if ($_POST) {
178
		unset($input_errors);
179
		$pconfig = $_POST;
180

    
181
		/* input validation */
182
		if (isset($id) && ($a_user[$id])) {
183
			$reqdfields = explode(" ", "usernamefld");
184
			$reqdfieldsn = array(gettext("Username"));
185
		} else {
186
			if (empty($_POST['name'])) {
187
				$reqdfields = explode(" ", "usernamefld passwordfld1");
188
				$reqdfieldsn = array(
189
					gettext("Username"),
190
					gettext("Password"));
191
			} else {
192
				$reqdfields = explode(" ", "usernamefld passwordfld1 name caref keylen lifetime");
193
				$reqdfieldsn = array(
194
					gettext("Username"),
195
					gettext("Password"),
196
					gettext("Descriptive name"),
197
					gettext("Certificate authority"),
198
					gettext("Key length"),
199
					gettext("Lifetime"));
200
			}
201
		}
202

    
203
		do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
204

    
205
		if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['usernamefld']))
206
			$input_errors[] = gettext("The username contains invalid characters.");
207

    
208
		if (($_POST['passwordfld1']) && ($_POST['passwordfld1'] != $_POST['passwordfld2']))
209
			$input_errors[] = gettext("The passwords do not match.");
210

    
211
		if (isset($id) && $a_user[$id])
212
			$oldusername = $a_user[$id]['name'];
213
		else
214
			$oldusername = "";
215
		/* make sure this user name is unique */
216
		if (!$input_errors) {
217
			foreach ($a_user as $userent) {
218
				if ($userent['name'] == $_POST['usernamefld'] && $oldusername != $_POST['usernamefld']) {
219
					$input_errors[] = gettext("Another entry with the same username already exists.");
220
					break;
221
				}
222
			}
223
		}
224
		/* also make sure it is not reserved */
225
		if (!$input_errors) {
226
			$system_users = explode("\n", file_get_contents("/etc/passwd"));
227
			foreach ($system_users as $s_user) {
228
				$ent = explode(":", $s_user);
229
				if ($ent[0] == $_POST['usernamefld'] && $oldusername != $_POST['usernamefld']) {
230
					$input_errors[] = gettext("That username is reserved by the system.");
231
					break;
232
				}
233
			}
234
		}
235

    
236
		/*
237
		 * Check for a valid expirationdate if one is set at all (valid means,
238
		 * strtotime() puts out a time stamp so any strtotime compatible time
239
		 * format may be used. to keep it simple for the enduser, we only
240
		 * claim to accept MM/DD/YYYY as inputs. Advanced users may use inputs
241
		 * like "+1 day", which will be converted to MM/DD/YYYY based on "now".
242
		 * Otherwhise such an entry would lead to an invalid expiration data.
243
		 */
244
		if ($_POST['expires']){
245
			if(strtotime($_POST['expires']) > 0){
246
				if (strtotime("-1 day") > strtotime(date("m/d/Y",strtotime($_POST['expires'])))) {
247
					// Allow items to lie in the past which ends up disabling.
248
				} else {
249
					//convert from any strtotime compatible date to MM/DD/YYYY
250
					$expdate = strtotime($_POST['expires']);
251
					$_POST['expires'] = date("m/d/Y",$expdate);
252
				}
253
			} else {
254
				$input_errors[] = gettext("Invalid expiration date format; use MM/DD/YYYY instead.");
255
			}
256
		}
257

    
258
		if (!empty($_POST['name'])) {
259
			$ca = lookup_ca($_POST['caref']);
260
        		if (!$ca)
261
                		$input_errors[] = gettext("Invalid internal Certificate Authority") . "\n";
262
		}
263

    
264
		/* if this is an AJAX caller then handle via JSON */
265
		if (isAjax() && is_array($input_errors)) {
266
			input_errors2Ajax($input_errors);
267
			exit;
268
		}
269

    
270
		if (!$input_errors) {
271
			conf_mount_rw();
272
			$userent = array();
273
			if (isset($id) && $a_user[$id])
274
				$userent = $a_user[$id];
275

    
276
			isset($_POST['utype']) ? $userent['scope'] = $_POST['utype'] : $userent['scope'] = "system";
277

    
278
			/* the user name was modified */
279
			if ($_POST['usernamefld'] <> $_POST['oldusername'])
280
				$_SERVER['REMOTE_USER'] = $_POST['usernamefld'];
281

    
282
			/* the user password was mofified */
283
			if ($_POST['passwordfld1'])
284
				local_user_set_password($userent, $_POST['passwordfld1']);
285

    
286
			$userent['name'] = $_POST['usernamefld'];
287
			$userent['descr'] = $_POST['descr'];
288
			$userent['expires'] = $_POST['expires'];
289
			$userent['authorizedkeys'] = base64_encode($_POST['authorizedkeys']);
290
			$userent['ipsecpsk'] = $_POST['ipsecpsk'];
291
			
292
			if($_POST['disabled'])
293
				$userent['disabled'] = true;
294
			else 
295
				unset($userent['disabled']);
296

    
297
			if (isset($id) && $a_user[$id])
298
				$a_user[$id] = $userent;
299
			else {
300
				if (!empty($_POST['name'])) {
301
					$cert = array();
302
					$cert['refid'] = uniqid();
303
                        		$userent['cert'] = array();
304

    
305
					$cert['descr'] = $_POST['name'];
306

    
307
                			$subject = cert_get_subject_array($ca['crt']);
308

    
309
                			$dn = array(
310
                        			'countryName' => $subject[0]['v'],
311
                        			'stateOrProvinceName' => $subject[1]['v'],
312
                        			'localityName' => $subject[2]['v'],
313
                        			'organizationName' => $subject[3]['v'],
314
                        			'emailAddress' => $subject[4]['v'],
315
                        			'commonName' => $userent['name']);
316

    
317
					cert_create($cert, $_POST['caref'], $_POST['keylen'],
318
						(int)$_POST['lifetime'], $dn);
319

    
320
					if (!is_array($config['cert']))
321
						$config['cert'] = array();
322
					$config['cert'][] = $cert;
323
					$userent['cert'][] = $cert['refid'];
324
				}
325
				$userent['uid'] = $config['system']['nextuid']++;
326
				/* Add the user to All Users group. */
327
				foreach ($config['system']['group'] as $gidx => $group) {
328
					if ($group['name'] == "all") {
329
						if (!is_array($config['system']['group'][$gidx]['member']))
330
							$config['system']['group'][$gidx]['member'] = array();
331
						$config['system']['group'][$gidx]['member'][] = $userent['uid'];
332
						break;
333
					}
334
				}
335

    
336
				$a_user[] = $userent;
337
			}
338

    
339
			local_user_set_groups($userent,$_POST['groups']);
340
			local_user_set($userent);
341
			write_config();
342

    
343
			if(is_dir("/etc/inc/privhooks"))
344
				run_plugins("/etc/inc/privhooks");
345

    
346
			conf_mount_ro();
347
			
348
			pfSenseHeader("system_usermanager.php");
349
		}
350
	}
351

    
352
	include("head.inc");
353
?>
354

    
355
<body link="#000000" vlink="#000000" alink="#000000" onload="<?= $jsevents["body"]["onload"] ?>">
356
<?php include("fbegin.inc"); ?>
357
<!--
358
//Date Time Picker script- by TengYong Ng of http://www.rainforestnet.com
359
//Script featured on JavaScript Kit (http://www.javascriptkit.com)
360
//For this script, visit http://www.javascriptkit.com
361
// -->
362
<script language="javascript" type="text/javascript" src="javascript/datetimepicker.js"></script>
363
<script language="JavaScript">
364
<!--
365

    
366
function setall_selected(id) {
367
	selbox = document.getElementById(id);
368
	count = selbox.options.length;
369
	for (index = 0; index<count; index++)
370
		selbox.options[index].selected = true;
371
}
372

    
373
function clear_selected(id) {
374
	selbox = document.getElementById(id);
375
	count = selbox.options.length;
376
	for (index = 0; index<count; index++)
377
		selbox.options[index].selected = false;
378
}
379

    
380
function remove_selected(id) {
381
	selbox = document.getElementById(id);
382
	index = selbox.options.length - 1;
383
	for (; index >= 0; index--)
384
		if (selbox.options[index].selected)
385
			selbox.remove(index);
386
}
387

    
388
function copy_selected(srcid, dstid) {
389
	src_selbox = document.getElementById(srcid);
390
	dst_selbox = document.getElementById(dstid);
391
	count = src_selbox.options.length;
392
	for (index = 0; index < count; index++) {
393
		if (src_selbox.options[index].selected) {
394
			option = document.createElement('option');
395
			option.text = src_selbox.options[index].text;
396
			option.value = src_selbox.options[index].value;
397
			dst_selbox.add(option, null);
398
		}
399
	}
400
}
401

    
402
function move_selected(srcid, dstid) {
403
	copy_selected(srcid, dstid);
404
	remove_selected(srcid);
405
}
406

    
407
function presubmit() {
408
	clear_selected('notgroups');
409
	setall_selected('groups');
410
}
411

    
412
function usercertClicked(obj) {
413
	if (obj.checked) {
414
		document.getElementById("usercertchck").style.display="none";
415
		document.getElementById("usercert").style.display="";
416
	} else {
417
		document.getElementById("usercert").style.display="none";
418
		document.getElementById("usercertchck").style.display="";
419
	}
420
}
421

    
422
function sshkeyClicked(obj) {
423
        if (obj.checked) {
424
                document.getElementById("sshkeychck").style.display="none";
425
                document.getElementById("sshkey").style.display="";
426
        } else {
427
                document.getElementById("sshkey").style.display="none";
428
                document.getElementById("sshkeychck").style.display="";
429
        }
430
}
431
//-->
432
</script>
433
<?php
434
	if ($input_errors)
435
		print_input_errors($input_errors);
436
	if ($savemsg)
437
		print_info_box($savemsg);
438
?>
439
<table width="100%" border="0" cellpadding="0" cellspacing="0">
440
	<tr>
441
		<td>
442
		<?php
443
			$tab_array = array();
444
			$tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
445
			$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
446
			$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
447
			$tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
448
			display_top_tabs($tab_array);
449
		?>
450
		</td>
451
	</tr>
452
	<tr>
453
		<td id="mainarea">
454
			<div class="tabcont">
455

    
456
				<?php if ($_GET['act'] == "new" || $_GET['act'] == "edit" || $input_errors): ?>
457

    
458
				<form action="system_usermanager.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
459
					<table width="100%" border="0" cellpadding="6" cellspacing="0">
460
						<?php
461
							$ro = "";
462
							if ($pconfig['utype'] == "system")
463
								$ro = "readonly = \"readonly\"";
464
						?>
465
	                    <tr>
466
	                        <td width="22%" valign="top" class="vncell"><?=gettext("Defined by");?></td>
467
	                        <td width="78%" class="vtable">
468
	                            <strong><?=strtoupper($pconfig['utype']);?></strong>
469
								<input name="utype" type="hidden" value="<?=htmlspecialchars($pconfig['utype'])?>"/>
470
	                        </td>
471
	                    </tr>
472
						<tr>
473
							<td width="22%" valign="top" class="vncell"><?=gettext("Disabled");?></td>
474
							<td width="78%" class="vtable">
475
								<input name="disabled" type="checkbox" id="disabled" <?php if($pconfig['disabled']) echo "CHECKED"; ?>>
476
							</td>
477
						</tr>
478
						<tr>
479
							<td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
480
							<td width="78%" class="vtable">
481
								<input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" <?=$ro;?>/>
482
								<input name="oldusername" type="hidden" id="oldusername" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
483
							</td>
484
						</tr>
485
						<tr>
486
							<td width="22%" valign="top" class="vncellreq" rowspan="2"><?=gettext("Password");?></td>
487
							<td width="78%" class="vtable">
488
								<input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" value="" />
489
							</td>
490
						</tr>
491
						<tr>
492
							<td width="78%" class="vtable">
493
								<input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" value="" />&nbsp;<?= gettext("(confirmation)"); ?>
494
							</td>
495
						</tr>
496
						<tr>
497
							<td width="22%" valign="top" class="vncell"><?=gettext("Full name");?></td>
498
							<td width="78%" class="vtable">
499
								<input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>" <?=$ro;?>/>
500
								<br/>
501
								<?=gettext("User's full name, for your own information only");?>
502
							</td>
503
						</tr>
504
						<tr>
505
							<td width="22%" valign="top" class="vncell"><?=gettext("Expiration date"); ?></td>
506
							<td width="78%" class="vtable">
507
								<input name="expires" type="text" class="formfld unknown" id="expires" size="10" value="<?=htmlspecialchars($pconfig['expires']);?>">
508
								<a href="javascript:NewCal('expires','mmddyyyy')">
509
									<img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_cal.gif" width="16" height="16" border="0" alt="<?=gettext("Pick a date");?>">
510
								</a>
511
								<br>
512
								<span class="vexpl"><?=gettext("Leave blank if the account shouldn't expire, otherwise enter the expiration date in the following format: mm/dd/yyyy"); ?></span></td>
513
						</tr>
514
						<tr>
515
							<td width="22%" valign="top" class="vncell"><?=gettext("Group Memberships");?></td>
516
							<td width="78%" class="vtable" align="center">
517
								<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
518
									<tr>
519
										<td align="center" width="50%">
520
											<strong><?=gettext("Not Member Of"); ?></strong><br/>
521
											<br/>
522
											<select size="10" style="width: 75%" name="notgroups[]" class="formselect" id="notgroups" onChange="clear_selected('groups')" multiple>
523
												<?php
524
													foreach ($config['system']['group'] as $group):
525
														if ($group['gid'] == 1998) /* all users group */
526
															continue;
527
														if (is_array($pconfig['groups']) && in_array($group['name'],$pconfig['groups']))
528
															continue;
529
												?>
530
												<option value="<?=$group['name'];?>" <?=$selected;?>>
531
													<?=htmlspecialchars($group['name']);?>
532
												</option>
533
												<?php endforeach; ?>
534
											</select>
535
											<br/>
536
										</td>
537
										<td>
538
											<br/>
539
											<a href="javascript:move_selected('notgroups','groups')">
540
												<img src="/themes/<?= $g['theme'];?>/images/icons/icon_right.gif" title="<?=gettext("Add Groups"); ?>" alt="<?=gettext("Add Groups"); ?>" width="17" height="17" border="0" />
541
											</a>
542
											<br/><br/>
543
											<a href="javascript:move_selected('groups','notgroups')">
544
												<img src="/themes/<?= $g['theme'];?>/images/icons/icon_left.gif" title="<?=gettext("Remove Groups"); ?>" alt="<?=gettext("Remove Groups"); ?>" width="17" height="17" border="0" />
545
											</a>
546
										</td>
547
										<td align="center" width="50%">
548
											<strong><?=gettext("Member Of"); ?></strong><br/>
549
											<br/>
550
											<select size="10" style="width: 75%" name="groups[]" class="formselect" id="groups" onChange="clear_selected('nogroups')" multiple>
551
												<?php
552
												if (is_array($pconfig['groups'])) {
553
													foreach ($config['system']['group'] as $group):
554
														if ($group['gid'] == 1998) /* all users group */
555
															continue;
556
														if (!in_array($group['name'],$pconfig['groups']))
557
															continue;
558
												?>
559
												<option value="<?=$group['name'];?>">
560
													<?=htmlspecialchars($group['name']);?>
561
												</option>
562
												<?php endforeach;
563
												} ?>
564
											</select>
565
											<br/>
566
										</td>
567
									</tr>
568
								</table>
569
								<?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
570
							</td>
571
						</tr>
572

    
573
						<?php if ($pconfig['uid']): ?>
574

    
575
						<tr>
576
							<td width="22%" valign="top" class="vncell"><?=gettext("Effective Privileges");?></td>
577
							<td width="78%" class="vtable">
578
								<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
579
									<tr>
580
										<td width="20%" class="listhdrr"><?=gettext("Inherited From");?></td>
581
										<td width="30%" class="listhdrr"><?=gettext("Name");?></td>
582
										<td width="40%" class="listhdrr"><?=gettext("Description");?></td>
583
										<td class="list"></td>
584
									</tr>
585
									<?php
586
											
587
										$privdesc = get_user_privdesc($a_user[$id]);
588
										if(is_array($privdesc)):
589
											$i = 0;
590
											foreach ($privdesc as $priv):
591
											$group = false;
592
											if ($priv['group'])
593
												$group = $priv['group'];
594
									?>
595
									<tr>
596
										<td class="listlr"><?=$group;?></td>
597
										<td class="listr">
598
											<?=htmlspecialchars($priv['name']);?>
599
										</td>
600
										<td class="listbg">
601
												<?=htmlspecialchars($priv['descr']);?>
602
										</td>
603
										<td valign="middle" nowrap class="list">
604
											<?php if (!$group): ?>
605
											<a href="system_usermanager.php?act=delpriv&id=<?=$id?>&privid=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this privilege?");?>')">
606
												<img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="" />
607
											</a>
608
											<?php endif; ?>
609
										</td>
610
									</tr>
611
									<?php
612
											/* can only delete user priv indexes */
613
											if (!$group)
614
												$i++;
615
											endforeach;
616
										endif;
617
									?>
618
									<tr>
619
										<td class="list" colspan="3"></td>
620
										<td class="list">
621
											<a href="system_usermanager_addprivs.php?userid=<?=$id?>">
622
												<img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="" />
623
											</a>
624
										</td>
625
									</tr>
626
								</table>
627
							</td>
628
						</tr>
629
						<tr>
630
							<td width="22%" valign="top" class="vncell"><?=gettext("User Certificates");?></td>
631
							<td width="78%" class="vtable">
632
								<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
633
									<tr>
634
										<td width="45%" class="listhdrr"><?=gettext("Name");?></td>
635
										<td width="45%" class="listhdrr"><?=gettext("CA");?></td>
636
										<td class="list"></td>
637
									</tr>
638
									<?php
639
										
640
										$a_cert = $a_user[$id]['cert'];
641
										if(is_array($a_cert)):
642
											$i = 0;
643
											foreach ($a_cert as $certref):
644
												$cert = lookup_cert($certref);
645
												$ca = lookup_ca($cert['caref']);
646
									?>
647
									<tr>
648
										<td class="listlr">
649
											<?=htmlspecialchars($cert['descr']);?>
650
											<?php if (is_cert_revoked($cert)): ?>
651
											(<b>Revoked</b>)
652
											<?php endif; ?>
653
										</td>
654
										<td class="listr">
655
											<?=htmlspecialchars($ca['descr']);?>
656
										</td>
657
										<td valign="middle" nowrap class="list">
658
											<a href="system_usermanager.php?act=expckey&id=<?=$id;?>&certid=<?=$i;?>">
659
												<img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export private key"); ?>" alt="<?=gettext("export private key"); ?>" width="17" height="17" border="0" />
660
											</a>
661
											<a href="system_usermanager.php?act=expcert&id=<?=$id;?>&certid=<?=$i;?>">
662
												<img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export cert"); ?>" alt="<?=gettext("export cert"); ?>" width="17" height="17" border="0" />
663
											</a>
664
											<a href="system_usermanager.php?act=delcert&id=<?=$id?>&certid=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to remove this certificate association?") .'\n'. gettext("(Certificate will not be deleted)");?>')">
665
												<img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="<?=gettext("delete cert");?>" />
666
											</a>
667
										</td>
668
									</tr>
669
									<?php
670
												$i++;
671
											endforeach;
672
										endif;
673
									?>
674
									<tr>
675
										<td class="list" colspan="2"></td>
676
										<td class="list">
677
											<a href="system_certmanager.php?act=new&userid=<?=$id?>">
678
												<img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="" />
679
											</a>
680
										</td>
681
									</tr>
682
								</table>
683
							</td>
684
						</tr>
685

    
686
						<?php else : ?>
687
						<?php 	if (is_array($config['ca']) && count($config['ca']) > 0): ?>
688
						<?php		$i = 0; foreach( $config['ca'] as $ca) {
689
                                                                        	if (!$ca['prv'])
690
                                                                                	continue;
691
										$i++;
692
									}
693
						?>
694

    
695
						<tr id="usercertchck" name="usercertchck" >
696
							<td width="22%" valign="top" class="vncell"><?=gettext("Certificate");?></td>
697
                                                	<td width="78%" class="vtable">
698
							<input type="checkbox" onClick="javascript:usercertClicked(this)"> <?=gettext("Click to create a user certificate."); ?>
699
							</td>
700
						</tr>
701

    
702
						<?php		if ($i > 0): ?>
703

    
704
						<tr id="usercert" name="usercert" style="display:none">
705
							<td width="22%" valign="top" class="vncell"><?=gettext("Certificate");?></td>
706
                                                	<td width="78%" class="vtable">
707
							<table width="100%" border="0" cellpadding="6" cellspacing="0">
708
							<tr>
709
                                                        	<td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
710
                                                        	<td width="78%" class="vtable">
711
									<input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>"/>
712
                                                        	</td>
713
                                                	</tr>
714
                                                	<tr>
715
                                                        	<td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate authority");?></td>
716
                                                        	<td width="78%" class="vtable">
717
                                                                	<select name='caref' id='caref' class="formselect" onChange='internalca_change()'>
718
                                                                <?php
719
                                                                        foreach( $config['ca'] as $ca):
720
                                                                        if (!$ca['prv'])
721
                                                                                continue;
722
                                                                ?>
723
                                                                        <option value="<?=$ca['refid'];?>"><?=$ca['descr'];?></option>
724
                                                                <?php endforeach; ?>
725
                                                                	</select>
726
                                                        	</td>
727
                                                	</tr>
728
                                                	<tr>
729
                                                        	<td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
730
                                                        	<td width="78%" class="vtable">
731
                                                                	<select name='keylen' class="formselect">
732
                                                                <?php
733
									$cert_keylens = array( "2048", "512", "1024", "4096");
734
                                                                        foreach( $cert_keylens as $len):
735
                                                                ?>
736
                                                                        <option value="<?=$len;?>"><?=$len;?></option>
737
                                                                <?php endforeach; ?>
738
                                                                	</select>
739
                                                                	bits
740
                                                        	</td>
741
                                                	</tr>
742
							<tr>
743
                                                        	<td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
744
                                                        	<td width="78%" class="vtable">
745
                                                                	<input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>days
746
                                                        	</td>
747
                                                	</tr>
748
						</table>
749
							</td>
750
						</tr>
751

    
752
						<?php 	endif; endif; ?>
753
						<?php endif; ?>
754

    
755
						<tr id="sshkeychck" name="sshkeychck" >
756
                                                        <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
757
                                                        <td width="78%" class="vtable">
758
                                                        <input type="checkbox" onClick="javascript:sshkeyClicked(this)"> <?=gettext("Click to paste an authorized key."); ?>
759
                                                        </td>
760
                                                </tr>
761
						<tr id="sshkey" name="sshkey" style="display:none">
762
							<td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
763
							<td width="78%" class="vtable">
764
								<textarea name="authorizedkeys" cols="65" rows="7" id="authorizedkeys" class="formfld_cert" wrap="off"><?=htmlspecialchars($pconfig['authorizedkeys']);?></textarea>
765
								<br/>
766
								<?=gettext("Paste an authorized keys file here.");?>
767
							</td>
768
						</tr>
769
						<tr id="ipsecpskrow" name="ipsecpskrow">
770
							<td width="22%" valign="top" class="vncell"><?=gettext("IPsec Pre-Shared Key");?></td>
771
							<td width="78%" class="vtable">
772
								<input name="ipsecpsk" type="text" class="formfld unknown" id="ipsecpsk" size="65" value="<?=htmlspecialchars($pconfig['ipsecpsk']);?>">
773
							</td>
774
						</tr>
775
						<tr>
776
							<td width="22%" valign="top">&nbsp;</td>
777
							<td width="78%">
778
								<input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
779
								<?php if (isset($id) && $a_user[$id]): ?>
780
								<input name="id" type="hidden" value="<?=$id;?>" />
781
								<?php endif;?>
782
							</td>
783
						</tr>
784
					</table>
785
				</form>
786

    
787
				<?php else: ?>
788

    
789
				<table width="100%" border="0" cellpadding="0" cellspacing="0">
790
					<tr>
791
						<td width="25%" class="listhdrr"><?=gettext("Username"); ?></td>
792
						<td width="25%" class="listhdrr"><?=gettext("Full name"); ?></td>
793
						<td width="5%" class="listhdrr"><?=gettext("Disabled"); ?></td>
794
						<td width="25%" class="listhdrr"><?=gettext("Groups"); ?></td>
795
						<td width="10%" class="list"></td>
796
					</tr>
797
					<?php
798
						$i = 0;
799
						foreach($a_user as $userent):
800
					?>
801
					<tr ondblclick="document.location='system_usermanager.php?act=edit&id=<?=$i;?>'">
802
						<td class="listlr">
803
							<table border="0" cellpadding="0" cellspacing="0">
804
								<tr>
805
									<td align="left" valign="center">
806
										<?php
807
											if($userent['scope'] != "user")
808
												$usrimg = "/themes/{$g['theme']}/images/icons/icon_system-user-grey.png";
809
											else
810
												$usrimg = "/themes/{$g['theme']}/images/icons/icon_system-user.png";
811
										?>
812
										<img src="<?=$usrimg;?>" alt="<?=gettext("User"); ?>" title="<?=gettext("User"); ?>" border="0" height="16" width="16" />
813
									</td>
814
									<td align="left" valign="middle">
815
										<?=htmlspecialchars($userent['name']);?>
816
									</td>
817
								</tr>
818
							</table>
819
						</td>
820
						<td class="listr"><?=htmlspecialchars($userent['descr']);?>&nbsp;</td>
821
						<td class="listr"><?php if(isset($userent['disabled'])) echo "*"; ?></td>
822
						<td class="listbg">
823
								<?=implode(",",local_user_get_groups($userent));?>
824
							&nbsp;
825
						</td>
826
						<td valign="middle" nowrap class="list">
827
							<a href="system_usermanager.php?act=edit&id=<?=$i;?>">
828
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit user"); ?>" alt="<?=gettext("edit user"); ?>" width="17" height="17" border="0" />
829
							</a>
830
							<?php if($userent['scope'] != "system"): ?>
831
							&nbsp;
832
							<a href="system_usermanager.php?act=deluser&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this User?");?>')">
833
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete user"); ?>" alt="<?=gettext("delete user"); ?>" width="17" height="17" border="0" />
834
							</a>
835
							<?php endif; ?>
836
						</td>
837
					</tr>
838
					<?php
839
							$i++;
840
						endforeach;
841
					?>
842
					<tr>
843
						<td class="list" colspan="4"></td>
844
						<td class="list">
845
							<a href="system_usermanager.php?act=new">
846
								<img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add user"); ?>" alt="<?=gettext("add user"); ?>" width="17" height="17" border="0" />
847
							</a>
848
						</td>
849
					</tr>
850
					<tr>
851
						<td colspan="4">
852
							<p>
853
								<?=gettext("Additional webConfigurator users can be added here.
854
								User permissions can be assigned directly or inherited from group memberships.
855
								An icon that appears grey indicates that it is a system defined object. 
856
								Some system object properties can be modified but they cannot be deleted."); ?>
857
							</p>
858
						</td>
859
					</tr>
860
				</table>
861

    
862
				<?php endif; ?>
863

    
864
			</div>
865
		</td>
866
	</tr>
867
</table>
868
<?php include("fend.inc");?>
869
</body>
870

    
871
<?php
872

    
873
	// end admin user code
874

    
875
} else {
876

    
877
	// start normal user code
878

    
879
	$pgtitle = array(gettext("System"),gettext("User Password"));
880

    
881
	if (isset($_POST['save'])) {
882
		unset($input_errors);
883

    
884
		/* input validation */
885
		$reqdfields = explode(" ", "passwordfld1");
886
		$reqdfieldsn = array(gettext("Password"));
887

    
888
		do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
889

    
890
		if ($_POST['passwordfld1'] != $_POST['passwordfld2'])
891
			$input_errors[] = gettext("The passwords do not match.");
892

    
893
		if (!$input_errors) {
894
			// all values are okay --> saving changes
895
			$config['system']['user'][$userindex[$HTTP_SERVER_VARS['AUTH_USER']]]['password'] = crypt(trim($_POST['passwordfld1']));
896

    
897
			write_config();
898
			$savemsg = gettext("Password successfully changed") . "<br />";
899
		}
900
	}
901

    
902
	/* determine if user is not local to system */
903
	$islocal = false;
904
	foreach($config['system']['user'] as $user) 
905
		if($user['name'] == $_SESSION['Username'])
906
			$islocal = true;
907
?>
908

    
909
<body link="#000000" vlink="#000000" alink="#000000" onload="<?= $jsevents["body"]["onload"] ?>">
910
<?php
911
    include("head.inc");
912
	include("fbegin.inc");
913
	if ($input_errors)
914
		print_input_errors($input_errors);
915
	if ($savemsg)
916
		print_info_box($savemsg);
917

    
918
	if($islocal == false) {
919
		echo gettext("Sorry, you cannot change the password for a LDAP user.");
920
		include("fend.inc");
921
		exit;
922
	}
923
?>
924
<div id="mainarea">
925
	<div class="tabcont">
926
		<form action="system_usermanager.php" method="post" name="iform" id="iform">
927
			<table width="100%" border="0" cellpadding="6" cellspacing="0">
928
				<tr>
929
					<td colspan="2" valign="top" class="listtopic"><?=$HTTP_SERVER_VARS['AUTH_USER']?>'s <?=gettext("Password"); ?></td>
930
				</tr>
931
				<tr>
932
					<td width="22%" valign="top" class="vncell" rowspan="2"><?=gettext("Password"); ?></td>
933
					<td width="78%" class="vtable">
934
						<input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" />
935
					</td>
936
				</tr>
937
				<tr>
938
					<td width="78%" class="vtable">
939
						<input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
940
						&nbsp;<?=gettext("(confirmation)");?>
941
						<br/>
942
						<span class="vexpl">
943
							<?=gettext("Select a new password");?>
944
						</span>
945
					</td>
946
				</tr>
947
				<tr>
948
					<td width="22%" valign="top">&nbsp;</td>
949
					<td width="78%">
950
						<input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
951
					</td>
952
				</tr>
953
			</table>
954
		</form>
955
	</div>
956
</div>
957
<?php include("fend.inc");?>
958
</body>
959

    
960
<?php
961

    
962
} // end of normal user code
963

    
964
?>
(198-198/224)