Project

General

Profile

Download (24.4 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
	system_authservers.php
4
*/
5
/* ====================================================================
6
 *	Copyright (c)  2004-2015  Electric Sheep Fencing, LLC. All rights reserved.
7
 *	Copyright (c)  2008 Shrew Soft Inc.
8
 *
9
 *	Redistribution and use in source and binary forms, with or without modification,
10
 *	are permitted provided that the following conditions are met:
11
 *
12
 *	1. Redistributions of source code must retain the above copyright notice,
13
 *		this list of conditions and the following disclaimer.
14
 *
15
 *	2. Redistributions in binary form must reproduce the above copyright
16
 *		notice, this list of conditions and the following disclaimer in
17
 *		the documentation and/or other materials provided with the
18
 *		distribution.
19
 *
20
 *	3. All advertising materials mentioning features or use of this software
21
 *		must display the following acknowledgment:
22
 *		"This product includes software developed by the pfSense Project
23
 *		 for use in the pfSense software distribution. (http://www.pfsense.org/).
24
 *
25
 *	4. The names "pfSense" and "pfSense Project" must not be used to
26
 *		 endorse or promote products derived from this software without
27
 *		 prior written permission. For written permission, please contact
28
 *		 coreteam@pfsense.org.
29
 *
30
 *	5. Products derived from this software may not be called "pfSense"
31
 *		nor may "pfSense" appear in their names without prior written
32
 *		permission of the Electric Sheep Fencing, LLC.
33
 *
34
 *	6. Redistributions of any form whatsoever must retain the following
35
 *		acknowledgment:
36
 *
37
 *	"This product includes software developed by the pfSense Project
38
 *	for use in the pfSense software distribution (http://www.pfsense.org/).
39
 *
40
 *	THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
41
 *	EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
 *	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43
 *	PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
44
 *	ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45
 *	SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46
 *	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47
 *	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 *	HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49
 *	STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50
 *	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51
 *	OF THE POSSIBILITY OF SUCH DAMAGE.
52
 *
53
 *	====================================================================
54
 *
55
 */
56

    
57
##|+PRIV
58
##|*IDENT=page-system-authservers
59
##|*NAME=System: Authentication Servers
60
##|*DESCR=Allow access to the 'System: Authentication Servers' page.
61
##|*MATCH=system_authservers.php*
62
##|-PRIV
63

    
64
require("guiconfig.inc");
65
require_once("auth.inc");
66

    
67
$pgtitle = array(gettext("System"), gettext("User Manager"), gettext("Authentication Servers"));
68
$shortcut_section = "authentication";
69

    
70
if (is_numericint($_GET['id'])) {
71
	$id = $_GET['id'];
72
}
73
if (isset($_POST['id']) && is_numericint($_POST['id'])) {
74
	$id = $_POST['id'];
75
}
76

    
77
if (!is_array($config['system']['authserver'])) {
78
	$config['system']['authserver'] = array();
79
}
80

    
81
$a_servers = auth_get_authserver_list();
82
foreach ($a_servers as $servers) {
83
	$a_server[] = $servers;
84
}
85

    
86
if (!is_array($config['ca'])) {
87
	$config['ca'] = array();
88
}
89
$a_ca =& $config['ca'];
90

    
91
$act = $_GET['act'];
92
if ($_POST['act']) {
93
	$act = $_POST['act'];
94
}
95

    
96
if ($act == "del") {
97

    
98
	if (!$a_server[$_GET['id']]) {
99
		pfSenseHeader("system_authservers.php");
100
		exit;
101
	}
102

    
103
	/* Remove server from main list. */
104
	$serverdeleted = $a_server[$_GET['id']]['name'];
105
	foreach ($config['system']['authserver'] as $k => $as) {
106
		if ($config['system']['authserver'][$k]['name'] == $serverdeleted) {
107
			unset($config['system']['authserver'][$k]);
108
		}
109
	}
110

    
111
	/* Remove server from temp list used later on this page. */
112
	unset($a_server[$_GET['id']]);
113

    
114
	$savemsg = gettext("Authentication Server") . " " . htmlspecialchars($serverdeleted) . " " . gettext("deleted") . "<br />";
115
	write_config($savemsg);
116
}
117

    
118
if ($act == "edit") {
119
	if (isset($id) && $a_server[$id]) {
120

    
121
		$pconfig['type'] = $a_server[$id]['type'];
122
		$pconfig['name'] = $a_server[$id]['name'];
123

    
124
		if ($pconfig['type'] == "ldap") {
125
			$pconfig['ldap_caref'] = $a_server[$id]['ldap_caref'];
126
			$pconfig['ldap_host'] = $a_server[$id]['host'];
127
			$pconfig['ldap_port'] = $a_server[$id]['ldap_port'];
128
			$pconfig['ldap_timeout'] = $a_server[$id]['ldap_timeout'];
129
			$pconfig['ldap_urltype'] = $a_server[$id]['ldap_urltype'];
130
			$pconfig['ldap_protver'] = $a_server[$id]['ldap_protver'];
131
			$pconfig['ldap_scope'] = $a_server[$id]['ldap_scope'];
132
			$pconfig['ldap_basedn'] = $a_server[$id]['ldap_basedn'];
133
			$pconfig['ldap_authcn'] = $a_server[$id]['ldap_authcn'];
134
			$pconfig['ldap_extended_enabled'] = $a_server[$id]['ldap_extended_enabled'];
135
			$pconfig['ldap_extended_query'] = $a_server[$id]['ldap_extended_query'];
136
			$pconfig['ldap_binddn'] = $a_server[$id]['ldap_binddn'];
137
			$pconfig['ldap_bindpw'] = $a_server[$id]['ldap_bindpw'];
138
			$pconfig['ldap_attr_user'] = $a_server[$id]['ldap_attr_user'];
139
			$pconfig['ldap_attr_group'] = $a_server[$id]['ldap_attr_group'];
140
			$pconfig['ldap_attr_member'] = $a_server[$id]['ldap_attr_member'];
141
			$pconfig['ldap_attr_groupobj'] = $a_server[$id]['ldap_attr_groupobj'];
142
			$pconfig['ldap_utf8'] = isset($a_server[$id]['ldap_utf8']);
143
			$pconfig['ldap_nostrip_at'] = isset($a_server[$id]['ldap_nostrip_at']);
144
			$pconfig['ldap_rfc2307'] = isset($a_server[$id]['ldap_rfc2307']);
145

    
146
			if (!$pconfig['ldap_binddn'] || !$pconfig['ldap_bindpw']) {
147
				$pconfig['ldap_anon'] = true;
148
			}
149
		}
150

    
151
		if ($pconfig['type'] == "radius") {
152
			$pconfig['radius_host'] = $a_server[$id]['host'];
153
			$pconfig['radius_auth_port'] = $a_server[$id]['radius_auth_port'];
154
			$pconfig['radius_acct_port'] = $a_server[$id]['radius_acct_port'];
155
			$pconfig['radius_secret'] = $a_server[$id]['radius_secret'];
156
			$pconfig['radius_timeout'] = $a_server[$id]['radius_timeout'];
157

    
158
			if ($pconfig['radius_auth_port'] &&
159
				$pconfig['radius_acct_port']) {
160
				$pconfig['radius_srvcs'] = "both";
161
			}
162

    
163
			if ($pconfig['radius_auth_port'] &&
164
				!$pconfig['radius_acct_port']) {
165
				$pconfig['radius_srvcs'] = "auth";
166
				$pconfig['radius_acct_port'] = 1813;
167
			}
168

    
169
			if (!$pconfig['radius_auth_port'] &&
170
				$pconfig['radius_acct_port']) {
171
				$pconfig['radius_srvcs'] = "acct";
172
				$pconfig['radius_auth_port'] = 1812;
173
			}
174

    
175
		}
176
	}
177
}
178

    
179
if ($act == "new") {
180
	$pconfig['ldap_protver'] = 3;
181
	$pconfig['ldap_anon'] = true;
182
	$pconfig['radius_srvcs'] = "both";
183
	$pconfig['radius_auth_port'] = "1812";
184
	$pconfig['radius_acct_port'] = "1813";
185
}
186

    
187
if ($_POST) {
188
	unset($input_errors);
189
	$pconfig = $_POST;
190

    
191
	/* input validation */
192

    
193
	if ($pconfig['type'] == "ldap") {
194
		$reqdfields = explode(" ",
195
			"name type ldap_host ldap_port " .
196
			"ldap_urltype ldap_protver ldap_scope " .
197
			"ldap_attr_user ldap_attr_group ldap_attr_member ldapauthcontainers");
198

    
199
		$reqdfieldsn = array(
200
			gettext("Descriptive name"),
201
			gettext("Type"),
202
			gettext("Hostname or IP"),
203
			gettext("Port value"),
204
			gettext("Transport"),
205
			gettext("Protocol version"),
206
			gettext("Search level"),
207
			gettext("User naming Attribute"),
208
			gettext("Group naming Attribute"),
209
			gettext("Group member attribute"),
210
			gettext("Authentication container"));
211

    
212
		if (!$pconfig['ldap_anon']) {
213
			$reqdfields[] = "ldap_binddn";
214
			$reqdfields[] = "ldap_bindpw";
215
			$reqdfieldsn[] = gettext("Bind user DN");
216
			$reqdfieldsn[] = gettext("Bind Password");
217
		}
218
	}
219

    
220
	if ($pconfig['type'] == "radius") {
221
		$reqdfields = explode(" ", "name type radius_host radius_srvcs");
222
		$reqdfieldsn = array(
223
			gettext("Descriptive name"),
224
			gettext("Type"),
225
			gettext("Hostname or IP"),
226
			gettext("Services"));
227

    
228
		if ($pconfig['radisu_srvcs'] == "both" ||
229
			$pconfig['radisu_srvcs'] == "auth") {
230
			$reqdfields[] = "radius_auth_port";
231
			$reqdfieldsn[] = gettext("Authentication port");
232
		}
233

    
234
		if ($pconfig['radisu_srvcs'] == "both" ||
235
			$pconfig['radisu_srvcs'] == "acct") {
236
			$reqdfields[] = "radius_acct_port";
237
			$reqdfieldsn[] = gettext("Accounting port");
238
		}
239

    
240
		if (!isset($id)) {
241
			$reqdfields[] = "radius_secret";
242
			$reqdfieldsn[] = gettext("Shared Secret");
243
		}
244
	}
245

    
246
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
247

    
248
	if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['host'])) {
249
		$input_errors[] = gettext("The host name contains invalid characters.");
250
	}
251

    
252
	if (auth_get_authserver($pconfig['name']) && !isset($id)) {
253
		$input_errors[] = gettext("An authentication server with the same name already exists.");
254
	}
255

    
256
	if (($pconfig['type'] == "ldap") || ($pconfig['type'] == "radius")) {
257
		$to_field = "{$pconfig['type']}_timeout";
258
		if (isset($_POST[$to_field]) && !empty($_POST[$to_field]) && (!is_numeric($_POST[$to_field]) || (is_numeric($_POST[$to_field]) && ($_POST[$to_field] <= 0)))) {
259
			$input_errors[] = sprintf(gettext("%s Timeout value must be numeric and positive."), strtoupper($pconfig['type']));
260
		}
261
	}
262

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

    
269
	if (!$input_errors) {
270
		$server = array();
271
		$server['refid'] = uniqid();
272
		if (isset($id) && $a_server[$id]) {
273
			$server = $a_server[$id];
274
		}
275

    
276
		$server['type'] = $pconfig['type'];
277
		$server['name'] = $pconfig['name'];
278

    
279
		if ($server['type'] == "ldap") {
280

    
281
			if (!empty($pconfig['ldap_caref'])) {
282
				$server['ldap_caref'] = $pconfig['ldap_caref'];
283
			}
284
			$server['host'] = $pconfig['ldap_host'];
285
			$server['ldap_port'] = $pconfig['ldap_port'];
286
			$server['ldap_urltype'] = $pconfig['ldap_urltype'];
287
			$server['ldap_protver'] = $pconfig['ldap_protver'];
288
			$server['ldap_scope'] = $pconfig['ldap_scope'];
289
			$server['ldap_basedn'] = $pconfig['ldap_basedn'];
290
			$server['ldap_authcn'] = $pconfig['ldapauthcontainers'];
291
			$server['ldap_extended_enabled'] = $pconfig['ldap_extended_enabled'];
292
			$server['ldap_extended_query'] = $pconfig['ldap_extended_query'];
293
			$server['ldap_attr_user'] = $pconfig['ldap_attr_user'];
294
			$server['ldap_attr_group'] = $pconfig['ldap_attr_group'];
295
			$server['ldap_attr_member'] = $pconfig['ldap_attr_member'];
296

    
297
			$server['ldap_attr_groupobj'] = empty($pconfig['ldap_attr_groupobj']) ? "posixGroup" : $pconfig['ldap_attr_groupobj'];
298

    
299
			if ($pconfig['ldap_utf8'] == "yes") {
300
				$server['ldap_utf8'] = true;
301
			} else {
302
				unset($server['ldap_utf8']);
303
			}
304
			if ($pconfig['ldap_nostrip_at'] == "yes") {
305
				$server['ldap_nostrip_at'] = true;
306
			} else {
307
				unset($server['ldap_nostrip_at']);
308
			}
309
			if ($pconfig['ldap_rfc2307'] == "yes") {
310
				$server['ldap_rfc2307'] = true;
311
			} else {
312
				unset($server['ldap_rfc2307']);
313
			}
314

    
315

    
316
			if (!$pconfig['ldap_anon']) {
317
				$server['ldap_binddn'] = $pconfig['ldap_binddn'];
318
				$server['ldap_bindpw'] = $pconfig['ldap_bindpw'];
319
			} else {
320
				unset($server['ldap_binddn']);
321
				unset($server['ldap_bindpw']);
322
			}
323

    
324
			if ($pconfig['ldap_timeout']) {
325
				$server['ldap_timeout'] = $pconfig['ldap_timeout'];
326
			} else {
327
				$server['ldap_timeout'] = 25;
328
			}
329
		}
330

    
331
		if ($server['type'] == "radius") {
332

    
333
			$server['host'] = $pconfig['radius_host'];
334

    
335
			if ($pconfig['radius_secret']) {
336
				$server['radius_secret'] = $pconfig['radius_secret'];
337
			}
338

    
339
			if ($pconfig['radius_timeout']) {
340
				$server['radius_timeout'] = $pconfig['radius_timeout'];
341
			} else {
342
				$server['radius_timeout'] = 5;
343
			}
344

    
345
			if ($pconfig['radius_srvcs'] == "both") {
346
				$server['radius_auth_port'] = $pconfig['radius_auth_port'];
347
				$server['radius_acct_port'] = $pconfig['radius_acct_port'];
348
			}
349

    
350
			if ($pconfig['radius_srvcs'] == "auth") {
351
				$server['radius_auth_port'] = $pconfig['radius_auth_port'];
352
				unset($server['radius_acct_port']);
353
			}
354

    
355
			if ($pconfig['radius_srvcs'] == "acct") {
356
				$server['radius_acct_port'] = $pconfig['radius_acct_port'];
357
				unset($server['radius_auth_port']);
358
			}
359
		}
360

    
361
		if (isset($id) && $config['system']['authserver'][$id]) {
362
			$config['system']['authserver'][$id] = $server;
363
		} else {
364
			$config['system']['authserver'][] = $server;
365
		}
366

    
367
		write_config();
368

    
369
		pfSenseHeader("system_authservers.php");
370
	}
371
}
372

    
373
// On error, restore the form contents so the user doesn't have to re-enter too much
374
if($_POST && $input_errors) {
375
	$pconfig = $_POST;
376
	$pconfig['ldap_authcn'] = $_POST['ldapauthcontainers'];
377
	$pconfig['ldap_template'] = $_POST['ldap_tmpltype'];
378
}
379

    
380
include("head.inc");
381

    
382
if ($input_errors)
383
	print_input_errors($input_errors);
384

    
385
if ($savemsg)
386
	print_info_box($savemsg, 'success');
387

    
388
$tab_array = array();
389
$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
390
$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
391
$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
392
$tab_array[] = array(gettext("Servers"), true, "system_authservers.php");
393
display_top_tabs($tab_array);
394

    
395
if (!($act == "new" || $act == "edit" || $input_errors))
396
{
397
	?>
398
	<div class="table-responsive">
399
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap" data-sortable>
400
			<thead>
401
				<tr>
402
					<th><?=gettext("Server Name")?></th>
403
					<th><?=gettext("Type")?></th>
404
					<th><?=gettext("Host Name")?></th>
405
					<th><?=gettext("Actions")?></th>
406
				</tr>
407
			</thead>
408
			<tbody>
409
		<?php foreach($a_server as $i => $server): ?>
410
				<tr>
411
					<td><?=htmlspecialchars($server['name'])?></td>
412
					<td><?=htmlspecialchars($auth_server_types[$server['type']])?></td>
413
					<td><?=htmlspecialchars($server['host'])?></td>
414
					<td>
415
					<?php if ($i < (count($a_server) - 1)): ?>
416
						<a class="fa fa-pencil" title="<?=gettext("Edit server"); ?>" href="system_authservers.php?act=edit&amp;id=<?=$i?>"></a>
417
						<a class="fa fa-trash"  title="<?=gettext("Delete server")?>" href="system_authservers.php?act=del&amp;id=<?=$i?>"></a>
418
					<?php endif?>
419
					</td>
420
				</tr>
421
		<?php endforeach; ?>
422
			</tbody>
423
		</table>
424
	</div>
425

    
426
	<nav class="action-buttons">
427
		<a href="?act=new" class="btn btn-success btn-sm">
428
			<i class="fa fa-plus icon-embed-btn"></i>
429
			<?=gettext("Add")?>
430
		</a>
431
	</nav>
432
<?php
433
	include("foot.inc");
434
	exit;
435
}
436

    
437
$form = new Form;
438
$form->setAction('system_authservers.php?act=edit');
439

    
440
$form->addGlobal(new Form_Input(
441
	'userid',
442
	null,
443
	'hidden',
444
	$id
445
));
446

    
447
$section = new Form_Section('Server settings');
448

    
449
$section->addInput($input = new Form_Input(
450
	'name',
451
	'Descriptive name',
452
	'text',
453
	$pconfig['name']
454
));
455

    
456
$section->addInput($input = new Form_Select(
457
	'type',
458
	'Type',
459
	$pconfig['type'],
460
	$auth_server_types
461
))->toggles();
462

    
463
$form->add($section);
464

    
465
// ==== LDAP settings =========================================================
466
$section = new Form_Section('LDAP Server Settings');
467
$section->addClass('toggle-ldap collapse');
468

    
469
if (!isset($pconfig['type']) || $pconfig['type'] == 'ldap')
470
	$section->addClass('in');
471

    
472
$section->addInput(new Form_Input(
473
	'ldap_host',
474
	'Hostname or IP address',
475
	'text',
476
	$pconfig['ldap_host']
477
))->setHelp('NOTE: When using SSL, this hostname MUST match the Common Name '.
478
	'(CN) of the LDAP server\'s SSL Certificate.');
479

    
480
$section->addInput(new Form_Input(
481
	'ldap_port',
482
	'Port value',
483
	'number',
484
	$pconfig['ldap_port']
485
));
486

    
487
$section->addInput(new Form_Select(
488
	'ldap_urltype',
489
	'Transport',
490
	$pconfig['ldap_urltype'],
491
	array_combine(array_keys($ldap_urltypes), array_keys($ldap_urltypes))
492
));
493

    
494
if (empty($a_ca))
495
{
496
	$section->addInput(new Form_StaticText(
497
		'Peer Certificate Authority',
498
		'No Certificate Authorities defined.<br/>Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.'
499
	));
500
}
501
else
502
{
503
	$ldapCaRef = [];
504
	foreach ($a_ca as $ca)
505
		$ldapCaRef[ $ca['refid'] ] = $ca['descr'];
506

    
507
	$section->addInput(new Form_Select(
508
		'ldap_caref',
509
		'Peer Certificate Authority',
510
		$pconfig['ldap_caref'],
511
		$ldapCaRef
512
	))->setHelp('This option is used if \'SSL Encrypted\' option is choosen. '.
513
		'It must match with the CA in the AD otherwise problems will arise.');
514
}
515

    
516
$section->addInput(new Form_Select(
517
	'ldap_protver',
518
	'Protocol version',
519
	$pconfig['ldap_protver'],
520
	array_combine($ldap_protvers, $ldap_protvers)
521
));
522

    
523
$section->addInput(new Form_Input(
524
	'ldap_timeout',
525
	'Server Timeout',
526
	'number',
527
	$pconfig['ldap_timeout'],
528
	['placeholder' => 25]
529
))->setHelp('Timeout for LDAP operations (seconds)');
530

    
531
$group = new Form_Group('Search scope');
532

    
533
$SSF = new Form_Select(
534
	'ldap_scope',
535
	'Level',
536
	$pconfig['ldap_scope'],
537
	$ldap_scopes
538
);
539

    
540
$SSB = new Form_Input(
541
	'ldap_basedn',
542
	'Base DN',
543
	'text',
544
	$pconfig['ldap_basedn']
545
);
546

    
547

    
548
$section->addInput(new Form_StaticText(
549
	'Search scope',
550
	'Level ' . $SSF . '<br />' . 'Base DN' . $SSB
551
));
552

    
553
$group = new Form_Group('Authentication containers');
554
$group->add(new Form_Input(
555
	'ldapauthcontainers',
556
	'Containers',
557
	'text',
558
	$pconfig['ldap_authcn']
559
))->setHelp('Note: Semi-Colon separated. This will be prepended to the search '.
560
	'base dn above or you can specify full container path containing a dc= '.
561
	'component.<br/>Example: CN=Users;DC=example,DC=com or OU=Staff;OU=Freelancers');
562

    
563
$group->add(new Form_Button(
564
	'Select',
565
	'Select a container'
566
))->removeClass('btn-primary')->addClass('btn-default');
567

    
568
$section->add($group);
569

    
570
$section->addInput(new Form_Checkbox(
571
	'ldap_extended_enabled',
572
	'Extended query',
573
	'Enable extended query',
574
	$pconfig['ldap_extended_enabled']
575
));
576

    
577
$group = new Form_Group('Query');
578
$group->addClass('extended');
579

    
580
$group->add(new Form_Input(
581
	'ldap_extended_query',
582
	'Query',
583
	'text',
584
	$pconfig['ldap_extended_query']
585
))->setHelp('Example: &amp;(objectClass=inetOrgPerson)(mail=*@example.com)');
586

    
587
$section->add($group);
588

    
589
$section->addInput(new Form_Checkbox(
590
	'ldap_anon',
591
	'Bind anonymous',
592
	'Use anonymous binds to resolve distinguished names',
593
	$pconfig['ldap_anon']
594
));
595

    
596
$group = new Form_Group('Bind credentials');
597
$group->addClass('ldapanon');
598

    
599
$group->add(new Form_Input(
600
	'ldap_binddn',
601
	'User DN:',
602
	'text',
603
	$pconfig['ldap_binddn']
604
));
605

    
606
$group->add(new Form_Input(
607
	'ldap_bindpw',
608
	'Password',
609
	'text',
610
	$pconfig['ldap_bindpw']
611
));
612
$section->add($group);
613

    
614
if (!isset($id)) {
615
	$template_list = array();
616

    
617
	foreach($ldap_templates as $option => $template) {
618
		$template_list[$option] = $template['desc'];
619
	}
620

    
621
	$section->addInput(new Form_Select(
622
		'ldap_tmpltype',
623
		'Initial Template',
624
		$pconfig['ldap_template'],
625
		$template_list
626
	));
627
}
628

    
629
$section->addInput(new Form_Input(
630
	'ldap_attr_user',
631
	'User naming attribute',
632
	'text',
633
	$pconfig['ldap_attr_user']
634
));
635

    
636
$section->addInput(new Form_Input(
637
	'ldap_attr_group',
638
	'Group naming attribute',
639
	'text',
640
	$pconfig['ldap_attr_group']
641
));
642

    
643
$section->addInput(new Form_Input(
644
	'ldap_attr_member',
645
	'Group member attribute',
646
	'text',
647
	$pconfig['ldap_attr_member']
648
));
649

    
650
$section->addInput(new Form_Checkbox(
651
	'ldap_rfc2307',
652
	'RFC 2307 Groups',
653
	'LDAP Server uses RFC 2307 style group membership',
654
	$pconfig['ldap_rfc2307']
655
))->setHelp('RFC 2307 style group membership has members listed on the group '.
656
	'object rather than using groups listed on user object. Leave unchecked '.
657
	'for Active Directory style group membership (RFC 2307bis).');
658

    
659
$section->addInput(new Form_Input(
660
	'ldap_attr_groupobj',
661
	'Group Object Class',
662
	'text',
663
	$pconfig['ldap_attr_groupobj'],
664
	['placeholder' => 'posixGroup']
665
))->setHelp('Object class used for groups in RFC2307 mode. '.
666
	'Typically "posixGroup" or "group".');
667

    
668
$section->addInput(new Form_Checkbox(
669
	'ldap_utf8',
670
	'UTF8 Encode',
671
	'UTF8 encode LDAP parameters before sending them to the server.',
672
	$pconfig['ldap_utf8']
673
))->setHelp('Required to support international characters, but may not be '.
674
	'supported by every LDAP server.');
675

    
676
$section->addInput(new Form_Checkbox(
677
	'ldap_nostrip_at',
678
	'Username Alterations',
679
	'Do not strip away parts of the username after the @ symbol',
680
	$pconfig['ldap_nostrip_at']
681
))->setHelp('e.g. user@host becomes user when unchecked.');
682

    
683
$form->add($section);
684

    
685
// ==== RADIUS section ========================================================
686
$section = new Form_Section('Radius Server Settings');
687
$section->addClass('toggle-radius collapse');
688

    
689
$section->addInput(new Form_Input(
690
	'radius_host',
691
	'Hostname or IP address',
692
	'text',
693
	$pconfig['radius_host']
694
));
695

    
696
$section->addInput(new Form_Input(
697
	'radius_secret',
698
	'Shared Secret',
699
	'text',
700
	$pconfig['radius_secret']
701
));
702

    
703
$section->addInput(new Form_Select(
704
	'radius_srvcs',
705
	'Services offered',
706
	$pconfig['radius_srvcs'],
707
	$radius_srvcs
708
));
709

    
710
$section->addInput(new Form_Input(
711
	'radius_auth_port',
712
	'Authentication port',
713
	'number',
714
	$pconfig['radius_auth_port']
715
));
716

    
717
$section->addInput(new Form_Input(
718
	'radius_acct_port',
719
	'Accounting port',
720
	'number',
721
	$pconfig['radius_acct_port']
722
));
723

    
724
$section->addInput(new Form_Input(
725
	'radius_timeout',
726
	'Authentication Timeout',
727
	'number',
728
	$pconfig['radius_timeout']
729
))->setHelp('This value controls how long, in seconds, that the RADIUS '.
730
	'server may take to respond to an authentication request. If left blank, the '.
731
	'default value is 5 seconds. NOTE: If you are using an interactive two-factor '.
732
	'authentication system, increase this timeout to account for how long it will '.
733
	'take the user to receive and enter a token.');
734

    
735
if (isset($id) && $a_server[$id])
736
{
737
	$section->addInput(new Form_Input(
738
		'id',
739
		null,
740
		'hidden',
741
		$id
742
	));
743
}
744

    
745
$form->add($section);
746
print $form;
747
?>
748
<script type="text/javascript">
749
//<![CDATA[
750
events.push(function(){
751
	function select_clicked() {
752
		if (document.getElementById("ldap_port").value == '' ||
753
			document.getElementById("ldap_host").value == '' ||
754
			document.getElementById("ldap_scope").value == '' ||
755
			document.getElementById("ldap_basedn").value == '' ||
756
			document.getElementById("ldapauthcontainers").value == '') {
757
			alert("<?=gettext("Please fill the required values.");?>");
758
			return;
759
		}
760

    
761
		if (!document.getElementById("ldap_anon").checked) {
762
			if (document.getElementById("ldap_binddn").value == '' ||
763
				document.getElementById("ldap_bindpw").value == '') {
764
				alert("<?=gettext("Please fill the bind username/password.");?>");
765
				return;
766
			}
767
		}
768
		var url = 'system_usermanager_settings_ldapacpicker.php?';
769
		url += 'port=' + document.getElementById("ldap_port").value;
770
		url += '&host=' + document.getElementById("ldap_host").value;
771
		url += '&scope=' + document.getElementById("ldap_scope").value;
772
		url += '&basedn=' + document.getElementById("ldap_basedn").value;
773
		url += '&binddn=' + document.getElementById("ldap_binddn").value;
774
		url += '&bindpw=' + document.getElementById("ldap_bindpw").value;
775
		url += '&urltype=' + document.getElementById("ldap_urltype").value;
776
		url += '&proto=' + document.getElementById("ldap_protver").value;
777
		url += '&authcn=' + document.getElementById("ldapauthcontainers").value;
778
		<?php if (count($a_ca) > 0): ?>
779
			url += '&cert=' + document.getElementById("ldap_caref").value;
780
		<?php else: ?>
781
			url += '&cert=';
782
		<?php endif; ?>
783

    
784
		var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
785
		if (oWin == null || typeof(oWin) == "undefined") {
786
			alert("<?=gettext('Popup blocker detected.	Action aborted.');?>");
787
		}
788
	}
789

    
790
	function set_ldap_port() {
791
		if($('#ldap_urltype').find(":selected").index() == 0)
792
			$('#ldap_port').val('389');
793
		else
794
			$('#ldap_port').val('636');
795
	}
796

    
797
	// Hides all elements of the specified class. This will usually be a section
798
	function hideClass(s_class, hide) {
799
		if(hide)
800
			$('.' + s_class).hide();
801
		else
802
			$('.' + s_class).show();
803
	}
804

    
805
	function ldap_tmplchange() {
806
		switch ($('#ldap_tmpltype').find(":selected").index()) {
807
<?php
808
		$index = 0;
809
		foreach ($ldap_templates as $tmpldata):
810
?>
811
			case <?=$index;?>:
812
				$('#ldap_attr_user').val("<?=$tmpldata['attr_user'];?>");
813
				$('#ldap_attr_group').val("<?=$tmpldata['attr_group'];?>");
814
				$('#ldap_attr_member').val("<?=$tmpldata['attr_member'];?>");
815
				break;
816
<?php
817
			$index++;
818
		endforeach;
819
?>
820
		}
821
	}
822

    
823
	// ---------- On initial page load ------------------------------------------------------------
824

    
825
<?php if ($act != 'edit') : ?>
826
	ldap_tmplchange();
827
<?php endif; ?>
828

    
829
	hideClass('ldapanon', $('#ldap_anon').prop('checked'));
830
	$("#Select").prop('type','button');
831
	hideClass('extended', !$('#ldap_extended_enabled').prop('checked'));
832

    
833
	if($('#ldap_port').val() == "")
834
		set_ldap_port();
835

    
836
<?php
837
	if($act == 'edit') {
838
?>
839
		$('#type option:not(:selected)').each(function(){
840
			$(this).attr('disabled', 'disabled');
841
		});
842

    
843
<?php
844
		if(!$input_errors) {
845
?>
846
		$('#name').prop("readonly", true);
847
<?php
848
		}
849
	}
850
?>
851
	// ---------- Click checkbox handlers ---------------------------------------------------------
852

    
853
	$('#ldap_tmpltype').on('change', function() {
854
		ldap_tmplchange();
855
	});
856

    
857
	$('#ldap_anon').click(function () {
858
		hideClass('ldapanon', this.checked);
859
	});
860

    
861
	$('#ldap_urltype').on('change', function() {
862
		set_ldap_port();
863
	});
864

    
865
	$('#Select').click(function () {
866
		select_clicked();
867
	});
868

    
869
	$('#ldap_extended_enabled').click(function () {
870
		hideClass('extended', !this.checked);
871
	});
872

    
873
});
874
//]]>
875
</script>
876
<?php
877
include("foot.inc");
(194-194/229)