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

    
62
##|+PRIV
63
##|*IDENT=page-system-authservers
64
##|*NAME=System: Authentication Servers
65
##|*DESCR=Allow access to the 'System: Authentication Servers' page.
66
##|*MATCH=system_authservers.php*
67
##|-PRIV
68

    
69
require("guiconfig.inc");
70
require_once("auth.inc");
71

    
72
$pgtitle = array(gettext("System"), gettext("Authentication Servers"));
73
$shortcut_section = "authentication";
74

    
75
if (is_numericint($_GET['id'])) {
76
	$id = $_GET['id'];
77
}
78
if (isset($_POST['id']) && is_numericint($_POST['id'])) {
79
	$id = $_POST['id'];
80
}
81

    
82
if (!is_array($config['system']['authserver'])) {
83
	$config['system']['authserver'] = array();
84
}
85

    
86
$a_servers = auth_get_authserver_list();
87
foreach ($a_servers as $servers) {
88
	$a_server[] = $servers;
89
}
90

    
91
if (!is_array($config['ca'])) {
92
	$config['ca'] = array();
93
}
94
$a_ca =& $config['ca'];
95

    
96
$act = $_GET['act'];
97
if ($_POST['act']) {
98
	$act = $_POST['act'];
99
}
100

    
101
if ($act == "del") {
102

    
103
	if (!$a_server[$_GET['id']]) {
104
		pfSenseHeader("system_authservers.php");
105
		exit;
106
	}
107

    
108
	/* Remove server from main list. */
109
	$serverdeleted = $a_server[$_GET['id']]['name'];
110
	foreach ($config['system']['authserver'] as $k => $as) {
111
		if ($config['system']['authserver'][$k]['name'] == $serverdeleted) {
112
			unset($config['system']['authserver'][$k]);
113
		}
114
	}
115

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

    
119
	$savemsg = gettext("Authentication Server") . " " . htmlspecialchars($serverdeleted) . " " . gettext("deleted") . "<br />";
120
	write_config($savemsg);
121
}
122

    
123
if ($act == "edit") {
124
	if (isset($id) && $a_server[$id]) {
125

    
126
		$pconfig['type'] = $a_server[$id]['type'];
127
		$pconfig['name'] = $a_server[$id]['name'];
128

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

    
151
			if (!$pconfig['ldap_binddn'] || !$pconfig['ldap_bindpw']) {
152
				$pconfig['ldap_anon'] = true;
153
			}
154
		}
155

    
156
		if ($pconfig['type'] == "radius") {
157
			$pconfig['radius_host'] = $a_server[$id]['host'];
158
			$pconfig['radius_auth_port'] = $a_server[$id]['radius_auth_port'];
159
			$pconfig['radius_acct_port'] = $a_server[$id]['radius_acct_port'];
160
			$pconfig['radius_secret'] = $a_server[$id]['radius_secret'];
161
			$pconfig['radius_timeout'] = $a_server[$id]['radius_timeout'];
162

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

    
168
			if ($pconfig['radius_auth_port'] &&
169
				!$pconfig['radius_acct_port']) {
170
				$pconfig['radius_srvcs'] = "auth";
171
				$pconfig['radius_acct_port'] = 1813;
172
			}
173

    
174
			if (!$pconfig['radius_auth_port'] &&
175
				$pconfig['radius_acct_port']) {
176
				$pconfig['radius_srvcs'] = "acct";
177
				$pconfig['radius_auth_port'] = 1812;
178
			}
179

    
180
		}
181
	}
182
}
183

    
184
if ($act == "new") {
185
	$pconfig['ldap_protver'] = 3;
186
	$pconfig['ldap_anon'] = true;
187
	$pconfig['radius_srvcs'] = "both";
188
	$pconfig['radius_auth_port'] = "1812";
189
	$pconfig['radius_acct_port'] = "1813";
190
}
191

    
192
if ($_POST) {
193
	unset($input_errors);
194
	$pconfig = $_POST;
195

    
196
	/* input validation */
197

    
198
	if ($pconfig['type'] == "ldap") {
199
		$reqdfields = explode(" ",
200
			"name type ldap_host ldap_port " .
201
			"ldap_urltype ldap_protver ldap_scope " .
202
			"ldap_attr_user ldap_attr_group ldap_attr_member ldapauthcontainers");
203

    
204
		$reqdfieldsn = array(
205
			gettext("Descriptive name"),
206
			gettext("Type"),
207
			gettext("Hostname or IP"),
208
			gettext("Port value"),
209
			gettext("Transport"),
210
			gettext("Protocol version"),
211
			gettext("Search level"),
212
			gettext("User naming Attribute"),
213
			gettext("Group naming Attribute"),
214
			gettext("Group member attribute"),
215
			gettext("Authentication container"));
216

    
217
		if (!$pconfig['ldap_anon']) {
218
			$reqdfields[] = "ldap_binddn";
219
			$reqdfields[] = "ldap_bindpw";
220
			$reqdfieldsn[] = gettext("Bind user DN");
221
			$reqdfieldsn[] = gettext("Bind Password");
222
		}
223
	}
224

    
225
	if ($pconfig['type'] == "radius") {
226
		$reqdfields = explode(" ", "name type radius_host radius_srvcs");
227
		$reqdfieldsn = array(
228
			gettext("Descriptive name"),
229
			gettext("Type"),
230
			gettext("Hostname or IP"),
231
			gettext("Services"));
232

    
233
		if ($pconfig['radisu_srvcs'] == "both" ||
234
			$pconfig['radisu_srvcs'] == "auth") {
235
			$reqdfields[] = "radius_auth_port";
236
			$reqdfieldsn[] = gettext("Authentication port");
237
		}
238

    
239
		if ($pconfig['radisu_srvcs'] == "both" ||
240
			$pconfig['radisu_srvcs'] == "acct") {
241
			$reqdfields[] = "radius_acct_port";
242
			$reqdfieldsn[] = gettext("Accounting port");
243
		}
244

    
245
		if (!isset($id)) {
246
			$reqdfields[] = "radius_secret";
247
			$reqdfieldsn[] = gettext("Shared Secret");
248
		}
249
	}
250

    
251
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
252

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

    
257
	if (auth_get_authserver($pconfig['name']) && !isset($id)) {
258
		$input_errors[] = gettext("An authentication server with the same name already exists.");
259
	}
260

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

    
268
	/* if this is an AJAX caller then handle via JSON */
269
	if (isAjax() && is_array($input_errors)) {
270
		input_errors2Ajax($input_errors);
271
		exit;
272
	}
273

    
274
	if (!$input_errors) {
275
		$server = array();
276
		$server['refid'] = uniqid();
277
		if (isset($id) && $a_server[$id]) {
278
			$server = $a_server[$id];
279
		}
280

    
281
		$server['type'] = $pconfig['type'];
282
		$server['name'] = $pconfig['name'];
283

    
284
		if ($server['type'] == "ldap") {
285

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

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

    
304
			if ($pconfig['ldap_utf8'] == "yes") {
305
				$server['ldap_utf8'] = true;
306
			} else {
307
				unset($server['ldap_utf8']);
308
			}
309
			if ($pconfig['ldap_nostrip_at'] == "yes") {
310
				$server['ldap_nostrip_at'] = true;
311
			} else {
312
				unset($server['ldap_nostrip_at']);
313
			}
314
			if ($pconfig['ldap_rfc2307'] == "yes") {
315
				$server['ldap_rfc2307'] = true;
316
			} else {
317
				unset($server['ldap_rfc2307']);
318
			}
319

    
320

    
321
			if (!$pconfig['ldap_anon']) {
322
				$server['ldap_binddn'] = $pconfig['ldap_binddn'];
323
				$server['ldap_bindpw'] = $pconfig['ldap_bindpw'];
324
			} else {
325
				unset($server['ldap_binddn']);
326
				unset($server['ldap_bindpw']);
327
			}
328

    
329
			if ($pconfig['ldap_timeout']) {
330
				$server['ldap_timeout'] = $pconfig['ldap_timeout'];
331
			} else {
332
				$server['ldap_timeout'] = 25;
333
			}
334
		}
335

    
336
		if ($server['type'] == "radius") {
337

    
338
			$server['host'] = $pconfig['radius_host'];
339

    
340
			if ($pconfig['radius_secret']) {
341
				$server['radius_secret'] = $pconfig['radius_secret'];
342
			}
343

    
344
			if ($pconfig['radius_timeout']) {
345
				$server['radius_timeout'] = $pconfig['radius_timeout'];
346
			} else {
347
				$server['radius_timeout'] = 5;
348
			}
349

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

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

    
360
			if ($pconfig['radius_srvcs'] == "acct") {
361
				$server['radius_acct_port'] = $pconfig['radius_acct_port'];
362
				unset($server['radius_auth_port']);
363
			}
364
		}
365

    
366
		if (isset($id) && $config['system']['authserver'][$id]) {
367
			$config['system']['authserver'][$id] = $server;
368
		} else {
369
			$config['system']['authserver'][] = $server;
370
		}
371

    
372
		write_config();
373

    
374
		pfSenseHeader("system_authservers.php");
375
	}
376
}
377

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

    
385
include("head.inc");
386

    
387
if ($input_errors)
388
	print_input_errors($input_errors);
389

    
390
if ($savemsg)
391
	print_info_box($savemsg, 'success');
392

    
393
$tab_array = array();
394
$tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
395
$tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
396
$tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
397
$tab_array[] = array(gettext("Servers"), true, "system_authservers.php");
398
display_top_tabs($tab_array);
399

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

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

    
442
require_once('classes/Form.class.php');
443
$form = new Form;
444
$form->setAction('system_authservers.php?act=edit');
445

    
446
$form->addGlobal(new Form_Input(
447
	'userid',
448
	null,
449
	'hidden',
450
	$id
451
));
452

    
453
$section = new Form_Section('Server settings');
454

    
455
$section->addInput($input = new Form_Input(
456
	'name',
457
	'Descriptive name',
458
	'text',
459
	$pconfig['name']
460
));
461

    
462
$section->addInput($input = new Form_Select(
463
	'type',
464
	'Type',
465
	$pconfig['type'],
466
	$auth_server_types
467
))->toggles();
468

    
469
$form->add($section);
470

    
471
// ==== LDAP settings =========================================================
472
$section = new Form_Section('LDAP Server Settings');
473
$section->addClass('toggle-ldap collapse');
474

    
475
if (!isset($pconfig['type']) || $pconfig['type'] == 'ldap')
476
	$section->addClass('in');
477

    
478
$section->addInput(new Form_Input(
479
	'ldap_host',
480
	'Hostname or IP address',
481
	'text',
482
	$pconfig['ldap_host']
483
))->setHelp('NOTE: When using SSL, this hostname MUST match the Common Name '.
484
	'(CN) of the LDAP server\'s SSL Certificate.');
485

    
486
$section->addInput(new Form_Input(
487
	'ldap_port',
488
	'Port value',
489
	'number',
490
	$pconfig['ldap_port']
491
));
492

    
493
$section->addInput(new Form_Select(
494
	'ldap_urltype',
495
	'Transport',
496
	$pconfig['ldap_urltype'],
497
	array_combine(array_keys($ldap_urltypes), array_keys($ldap_urltypes))
498
));
499

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

    
513
	$section->addInput(new Form_Select(
514
		'ldap_caref',
515
		'Peer Certificate Authority',
516
		$pconfig['ldap_caref'],
517
		$ldapCaRef
518
	))->setHelp('This option is used if \'SSL Encrypted\' option is choosen. '.
519
		'It must match with the CA in the AD otherwise problems will arise.');
520
}
521

    
522
$section->addInput(new Form_Select(
523
	'ldap_protver',
524
	'Protocol version',
525
	$pconfig['ldap_protver'],
526
	array_combine($ldap_protvers, $ldap_protvers)
527
));
528

    
529
$section->addInput(new Form_Input(
530
	'ldap_timeout',
531
	'Server Timeout',
532
	'number',
533
	$pconfig['ldap_timeout'],
534
	['placeholder' => 25]
535
))->setHelp('Timeout for LDAP operations (seconds)');
536

    
537
$group = new Form_Group('Search scope');
538

    
539
$SSF = new Form_Select(
540
	'ldap_scope',
541
	'Level',
542
	$pconfig['ldap_scope'],
543
	$ldap_scopes
544
);
545

    
546
$SSB = new Form_Input(
547
	'ldap_basedn',
548
	'Base DN',
549
	'text',
550
	$pconfig['ldap_basedn']
551
);
552

    
553

    
554
$section->addInput(new Form_StaticText(
555
	'Search scope',
556
	'Level ' . $SSF . '<br />' . 'Base DN' . $SSB
557
));
558

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

    
569
$group->add(new Form_Button(
570
	'Select',
571
	'Select a container'
572
))->removeClass('btn-primary')->addClass('btn-default');
573

    
574
$section->add($group);
575

    
576
$section->addInput(new Form_Checkbox(
577
	'ldap_extended_enabled',
578
	'Extended query',
579
	'Enable extended query',
580
	$pconfig['ldap_extended_enabled']
581
));
582

    
583
$group = new Form_Group('Query');
584
$group->addClass('extended');
585

    
586
$group->add(new Form_Input(
587
	'ldap_extended_query',
588
	'Query',
589
	'text',
590
	$pconfig['ldap_extended_query']
591
))->setHelp('Example: &amp;(objectClass=inetOrgPerson)(mail=*@example.com)');
592

    
593
$section->add($group);
594

    
595
$section->addInput(new Form_Checkbox(
596
	'ldap_anon',
597
	'Bind anonymous',
598
	'Use anonymous binds to resolve distinguished names',
599
	$pconfig['ldap_anon']
600
));
601

    
602
$group = new Form_Group('Bind credentials');
603
$group->addClass('ldapanon');
604

    
605
$group->add(new Form_Input(
606
	'ldap_binddn',
607
	'User DN:',
608
	'text',
609
	$pconfig['ldap_binddn']
610
));
611

    
612
$group->add(new Form_Input(
613
	'ldap_bindpw',
614
	'Password',
615
	'text',
616
	$pconfig['ldap_bindpw']
617
));
618
$section->add($group);
619

    
620
if (!isset($id)) {
621
	$template_list = array();
622

    
623
	foreach($ldap_templates as $option => $template) {
624
		$template_list[$option] = $template['desc'];
625
	}
626

    
627
	$section->addInput(new Form_Select(
628
		'ldap_tmpltype',
629
		'Initial Template',
630
		$pconfig['ldap_template'],
631
		$template_list
632
	));
633
}
634

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

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

    
649
$section->addInput(new Form_Input(
650
	'ldap_attr_member',
651
	'Group member attribute',
652
	'text',
653
	$pconfig['ldap_attr_member']
654
));
655

    
656
$section->addInput(new Form_Checkbox(
657
	'ldap_rfc2307',
658
	'RFC 2307 Groups',
659
	'LDAP Server uses RFC 2307 style group membership',
660
	$pconfig['ldap_rfc2307']
661
))->setHelp('RFC 2307 style group membership has members listed on the group '.
662
	'object rather than using groups listed on user object. Leave unchecked '.
663
	'for Active Directory style group membership (RFC 2307bis).');
664

    
665
$section->addInput(new Form_Input(
666
	'ldap_attr_groupobj',
667
	'Group Object Class',
668
	'text',
669
	$pconfig['ldap_attr_groupobj'],
670
	['placeholder' => 'posixGroup']
671
))->setHelp('Object class used for groups in RFC2307 mode. '.
672
	'Typically "posixGroup" or "group".');
673

    
674
$section->addInput(new Form_Checkbox(
675
	'ldap_utf8',
676
	'UTF8 Encode',
677
	'UTF8 encode LDAP parameters before sending them to the server.',
678
	$pconfig['ldap_utf8']
679
))->setHelp('Required to support international characters, but may not be '.
680
	'supported by every LDAP server.');
681

    
682
$section->addInput(new Form_Checkbox(
683
	'ldap_nostrip_at',
684
	'Username Alterations',
685
	'Do not strip away parts of the username after the @ symbol',
686
	$pconfig['ldap_nostrip_at']
687
))->setHelp('e.g. user@host becomes user when unchecked.');
688

    
689
$form->add($section);
690

    
691
// ==== RADIUS section ========================================================
692
$section = new Form_Section('Radius Server Settings');
693
$section->addClass('toggle-radius collapse');
694

    
695
$section->addInput(new Form_Input(
696
	'radius_host',
697
	'Hostname or IP address',
698
	'text',
699
	$pconfig['radius_host']
700
));
701

    
702
$section->addInput(new Form_Input(
703
	'radius_secret',
704
	'Shared Secret',
705
	'text',
706
	$pconfig['radius_secret']
707
));
708

    
709
$section->addInput(new Form_Select(
710
	'radius_srvcs',
711
	'Services offered',
712
	$pconfig['radius_srvcs'],
713
	$radius_srvcs
714
));
715

    
716
$section->addInput(new Form_Input(
717
	'radius_auth_port',
718
	'Authentication port',
719
	'number',
720
	$pconfig['radius_auth_port']
721
));
722

    
723
$section->addInput(new Form_Input(
724
	'radius_acct_port',
725
	'Accounting port',
726
	'number',
727
	$pconfig['radius_acct_port']
728
));
729

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

    
741
if (isset($id) && $a_server[$id])
742
{
743
	$section->addInput(new Form_Input(
744
		'id',
745
		null,
746
		'hidden',
747
		$id
748
	));
749
}
750

    
751
$form->add($section);
752
print $form;
753
?>
754
<script>
755
//<![CDATA[
756
events.push(function(){
757
	function select_clicked() {
758
		if (document.getElementById("ldap_port").value == '' ||
759
			document.getElementById("ldap_host").value == '' ||
760
			document.getElementById("ldap_scope").value == '' ||
761
			document.getElementById("ldap_basedn").value == '' ||
762
			document.getElementById("ldapauthcontainers").value == '') {
763
			alert("<?=gettext("Please fill the required values.");?>");
764
			return;
765
		}
766

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

    
790
		var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
791
		if (oWin == null || typeof(oWin) == "undefined") {
792
			alert("<?=gettext('Popup blocker detected.	Action aborted.');?>");
793
		}
794
	}
795

    
796
	function set_ldap_port() {
797
		if($('#ldap_urltype').find(":selected").index() == 0)
798
			$('#ldap_port').val('389');
799
		else
800
			$('#ldap_port').val('636');
801
	}
802

    
803
	// Hides all elements of the specified class. This will usually be a section
804
	function hideClass(s_class, hide) {
805
		if(hide)
806
			$('.' + s_class).hide();
807
		else
808
			$('.' + s_class).show();
809
	}
810

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

    
829
	// ---------- On initial page load ------------------------------------------------------------
830

    
831
<?php if ($act != 'edit') : ?>
832
	ldap_tmplchange();
833
<?php endif; ?>
834

    
835
	hideClass('ldapanon', $('#ldap_anon').prop('checked'));
836
	$("#Select").prop('type','button');
837
	hideClass('extended', !$('#ldap_extended_enabled').prop('checked'));
838

    
839
	if($('#ldap_port').val() == "")
840
		set_ldap_port();
841

    
842
<?php
843
	if($act == 'edit') {
844
?>
845
		$('#type option:not(:selected)').each(function(){
846
			$(this).attr('disabled', 'disabled');
847
		});
848

    
849
<?php
850
		if(!$input_errors) {
851
?>
852
		$('#name').prop("readonly", true);
853
<?php
854
		}
855
	}
856
?>
857
	// ---------- Click checkbox handlers ---------------------------------------------------------
858

    
859
	$('#ldap_tmpltype').on('change', function() {
860
		ldap_tmplchange();
861
	});
862

    
863
	$('#ldap_anon').click(function () {
864
		hideClass('ldapanon', this.checked);
865
	});
866

    
867
	$('#ldap_urltype').on('change', function() {
868
		set_ldap_port();
869
	});
870

    
871
	$('#Select').click(function () {
872
		select_clicked();
873
	});
874

    
875
	$('#ldap_extended_enabled').click(function () {
876
		hideClass('extended', !this.checked);
877
	});
878

    
879
});
880
//]]>
881
</script>
882
<?php
883
include("foot.inc");
(193-193/234)