Project

General

Profile

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

    
6
	Copyright (C) 2008 Shrew Soft Inc
7
	Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
8
	All rights reserved.
9

    
10
	Redistribution and use in source and binary forms, with or without
11
	modification, are permitted provided that the following conditions are met:
12

    
13
	1. Redistributions of source code must retain the above copyright notice,
14
	   this list of conditions and the following disclaimer.
15

    
16
	2. Redistributions in binary form must reproduce the above copyright
17
	   notice, this list of conditions and the following disclaimer in the
18
	   documentation and/or other materials provided with the distribution.
19

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

    
32
##|+PRIV
33
##|*IDENT=page-vpn-ipsec-editphase2
34
##|*NAME=VPN: IPsec: Edit Phase 2 page
35
##|*DESCR=Allow access to the 'VPN: IPsec: Edit Phase 2' page.
36
##|*MATCH=vpn_ipsec_phase2.php*
37
##|-PRIV
38

    
39
require("functions.inc");
40
require("guiconfig.inc");
41
require_once("ipsec.inc");
42
require_once("vpn.inc");
43

    
44
if (!is_array($config['ipsec']['client']))
45
	$config['ipsec']['client'] = array();
46

    
47
$a_client = &$config['ipsec']['client'];
48

    
49
if (!is_array($config['ipsec']['phase2']))
50
	$config['ipsec']['phase2'] = array();
51

    
52
$a_phase2 = &$config['ipsec']['phase2'];
53

    
54
$p2index = $_GET['p2index'];
55
if (isset($_POST['p2index']))
56
	$p2index = $_POST['p2index'];
57

    
58
if (isset($_GET['dup']))
59
	$p2index = $_GET['dup'];
60

    
61
if (isset($p2index) && $a_phase2[$p2index])
62
{
63
	$pconfig['ikeid'] = $a_phase2[$p2index]['ikeid'];
64
	$pconfig['disabled'] = isset($a_phase2[$p2index]['disabled']);
65
	$pconfig['mode'] = $a_phase2[$p2index]['mode'];
66
	$pconfig['descr'] = $a_phase2[$p2index]['descr'];
67
	$old_ph2ent = $a_phase2[$p2index];
68

    
69
	idinfo_to_pconfig("local",$a_phase2[$p2index]['localid'],$pconfig);
70
	idinfo_to_pconfig("remote",$a_phase2[$p2index]['remoteid'],$pconfig);
71

    
72
	$pconfig['proto'] = $a_phase2[$p2index]['protocol'];
73
	ealgos_to_pconfig($a_phase2[$p2index]['encryption-algorithm-option'],$pconfig);
74
	$pconfig['halgos'] = $a_phase2[$p2index]['hash-algorithm-option'];
75
	$pconfig['pfsgroup'] = $a_phase2[$p2index]['pfsgroup'];
76
	$pconfig['lifetime'] = $a_phase2[$p2index]['lifetime'];
77
	$pconfig['pinghost'] = $a_phase2[$p2index]['pinghost'];
78

    
79
	if (isset($a_phase2[$p2index]['mobile']))
80
		$pconfig['mobile'] = true;
81
}
82
else
83
{
84
	$pconfig['ikeid'] = $_GET['ikeid'];
85

    
86
	/* defaults */
87
	$pconfig['localid_type'] = "lan";
88
	$pconfig['remoteid_type'] = "network";
89
	$pconfig['proto'] = "esp";
90
	$pconfig['ealgos'] = explode(",", "3des,blowfish,cast128,aes");
91
	$pconfig['halgos'] = explode(",", "hmac_sha1,hmac_md5");
92
	$pconfig['pfsgroup'] = "0";
93
	$pconfig['lifetime'] = "3600";
94

    
95
    /* mobile client */
96
    if($_GET['mobile'])
97
        $pconfig['mobile']=true;
98
}
99

    
100
if (isset($_GET['dup']))
101
	unset($p2index);
102

    
103
if ($_POST) {
104

    
105
	unset($input_errors);
106
	$pconfig = $_POST;
107

    
108
	if (!isset( $_POST['ikeid']))
109
		$input_errors[] = gettext("A valid ikeid must be specified.");
110

    
111
	/* input validation */
112
	$reqdfields = explode(" ", "localid_type halgos");
113
	$reqdfieldsn = array(gettext("Local network type"),gettext("P2 Hash Algorithms"));
114
	if (!isset($pconfig['mobile'])){
115
		$reqdfields[] = "remoteid_type";
116
		$reqdfieldsn[] = gettext("Remote network type");
117
	}
118

    
119
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
120

    
121
	if(($pconfig['mode'] == "tunnel") || ($pconfig['mode'] == "tunnel6")) 
122
	{
123
		switch ($pconfig['localid_type']) {
124
			case "network":
125
				if (($pconfig['localid_netbits'] != 0 && !$pconfig['localid_netbits']) || !is_numeric($pconfig['localid_netbits']))
126
					$input_errors[] = gettext("A valid local network bit count must be specified.");
127
			case "address":
128
				if (!$pconfig['localid_address'] || !is_ipaddr($pconfig['localid_address']))
129
					$input_errors[] = gettext("A valid local network IP address must be specified.");
130
				break;
131
		}
132

    
133
		/* Check if the localid_type is an interface, to confirm if it has a valid subnet. */
134
		if (is_array($config['interfaces'][$pconfig['localid_type']])) {
135
			// Don't let an empty subnet into racoon.conf, it can cause parse errors. Ticket #2201.
136
			$address = get_interface_ip($pconfig['localid_type']);
137
			$netbits = get_interface_subnet($pconfig['localid_type']);
138

    
139
			if (empty($address) || empty($netbits))
140
				$input_errors[] = gettext("Invalid Local Network.") . " " . convert_friendly_interface_to_friendly_descr($pconfig['localid_type']) . " " . gettext("has no subnet.");
141
		}
142

    
143
		switch ($pconfig['remoteid_type']) {
144
			case "network":
145
				if (($pconfig['remoteid_netbits'] != 0 && !$pconfig['remoteid_netbits']) || !is_numeric($pconfig['remoteid_netbits']))
146
					$input_errors[] = gettext("A valid remote network bit count must be specified.");
147
			case "address":
148
				if (!$pconfig['remoteid_address'] || !is_ipaddr($pconfig['remoteid_address']))
149
					$input_errors[] = gettext("A valid remote network IP address must be specified.");
150
				break;
151
		}
152
	}
153
	/* Validate enabled phase2's are not duplicates */
154
	if (isset($pconfig['mobile'])){
155
		/* User is adding phase 2 for mobile phase1 */
156
		foreach($a_phase2 as $key => $name){
157
			if (isset($name['mobile'])){
158
				/* check duplicate localids only for mobile clents */
159
				$localid_data = ipsec_idinfo_to_cidr($name['localid']);
160
				$entered = array();
161
				$entered['type'] = $pconfig['localid_type'];
162
				if (isset($pconfig['localid_address'])) $entered['address'] = $pconfig['localid_address'];
163
				if (isset($pconfig['localid_netbits'])) $entered['netbits'] = $pconfig['localid_netbits'];
164
				$entered_localid_data = ipsec_idinfo_to_cidr($entered);
165
				if ($localid_data == $entered_localid_data){
166
					if (!isset($pconfig['p2index'])){
167
						/* adding new p2 entry */
168
						$input_errors[] = gettext("Phase2 with this Local Network is already defined for mobile clients.");
169
						break;
170
					}else if ($pconfig['p2index'] != $key){
171
						/* editing p2 and entered p2 networks match with different p2 for given p1 */
172
						$input_errors[] = gettext("Phase2 with this Local Network is already defined for mobile clients.");
173
						break;
174
					}
175
				}
176
			}
177
		}
178
	}else{
179
		/* User is adding phase 2 for site-to-site phase1 */
180
		$input_error = 0;
181
		foreach($a_phase2 as $key => $name){
182
			if (!isset($name['mobile']) && $pconfig['ikeid'] == $name['ikeid']){
183
				/* check duplicate subnets only for given phase1 */
184
				$localid_data = ipsec_idinfo_to_cidr($name['localid']);
185
				$remoteid_data = ipsec_idinfo_to_cidr($name['remoteid']);
186
				$entered_local = array();
187
				$entered_local['type'] = $pconfig['localid_type'];
188
				if (isset($pconfig['localid_address'])) $entered_local['address'] = $pconfig['localid_address'];
189
				if (isset($pconfig['localid_netbits'])) $entered_local['netbits'] = $pconfig['localid_netbits'];
190
				$entered_localid_data = ipsec_idinfo_to_cidr($entered_local);
191
				$entered_remote = array();
192
				$entered_remote['type'] = $pconfig['remoteid_type'];
193
				if (isset($pconfig['remoteid_address'])) $entered_remote['address'] = $pconfig['remoteid_address'];
194
				if (isset($pconfig['remoteid_netbits'])) $entered_remote['netbits'] = $pconfig['remoteid_netbits'];
195
				$entered_remoteid_data = ipsec_idinfo_to_cidr($entered_remote);
196
				if ($localid_data == $entered_localid_data && $remoteid_data == $entered_remoteid_data) { 
197
					if (!isset($pconfig['p2index'])){
198
						/* adding new p2 entry */
199
						$input_errors[] = gettext("Phase2 with this Local/Remote networks combination is already defined for this Phase1.");
200
						break;
201
					}else if ($pconfig['p2index'] != $key){
202
						/* editing p2 and entered p2 networks match with different p2 for given p1 */
203
						$input_errors[] = gettext("Phase2 with this Local/Remote networks combination is already defined for this Phase1.");
204
						break;
205
					}
206
				}
207
			}
208
		}
209
        }
210
	
211
	$ealgos = pconfig_to_ealgos($pconfig);
212

    
213
	if (!count($ealgos)) {
214
		$input_errors[] = gettext("At least one encryption algorithm must be selected.");
215
	}
216
	if (($_POST['lifetime'] && !is_numeric($_POST['lifetime']))) {
217
		$input_errors[] = gettext("The P2 lifetime must be an integer.");
218
	}
219

    
220
	if (!$input_errors) {
221

    
222
		$ph2ent['ikeid'] = $pconfig['ikeid'];
223
		$ph2ent['mode'] = $pconfig['mode'];
224
		$ph2ent['disabled'] = $pconfig['disabled'] ? true : false;
225

    
226
		if(($ph2ent['mode'] == "tunnel") || ($ph2ent['mode'] == "tunnel6")){
227
			$ph2ent['localid'] = pconfig_to_idinfo("local",$pconfig);
228
			$ph2ent['remoteid'] = pconfig_to_idinfo("remote",$pconfig);
229
		}
230

    
231
		$ph2ent['protocol'] = $pconfig['proto'];
232
		$ph2ent['encryption-algorithm-option'] = $ealgos;
233
		$ph2ent['hash-algorithm-option'] = $pconfig['halgos'];
234
		$ph2ent['pfsgroup'] = $pconfig['pfsgroup'];
235
		$ph2ent['lifetime'] = $pconfig['lifetime'];
236
		$ph2ent['pinghost'] = $pconfig['pinghost'];
237
		$ph2ent['descr'] = $pconfig['descr'];
238

    
239
		if (isset($pconfig['mobile']))
240
			$ph2ent['mobile'] = true;
241

    
242
		if (isset($p2index) && $a_phase2[$p2index])
243
			$a_phase2[$p2index] = $ph2ent;
244
		else
245
			$a_phase2[] = $ph2ent;
246

    
247

    
248
		/* now we need to find all phase2 entries for this host */
249
		if(is_array($ph2ent)) {
250
			ipsec_lookup_phase1($ph2ent, $ph1ent);
251
			$old_ph1ent = $ph1ent;
252
			$old_ph1ent['remote-gateway'] = resolve_retry($old_ph1ent['remote-gateway']);
253
			reload_tunnel_spd_policy ($ph1ent, $ph2ent, $old_ph1ent, $old_ph2ent);
254
		}
255

    
256
		write_config();
257
		mark_subsystem_dirty('ipsec');
258

    
259
		header("Location: vpn_ipsec.php");
260
		exit;
261
	}
262
}
263

    
264
if ($pconfig['mobile'])
265
    $pgtitle = array(gettext("VPN"),gettext("IPsec"),gettext("Edit Phase 2"), gettext("Mobile Client"));
266
else
267
    $pgtitle = array(gettext("VPN"),gettext("IPsec"),gettext("Edit Phase 2"));
268
$statusurl = "diag_ipsec.php";
269
$logurl = "diag_logs_ipsec.php";
270

    
271

    
272
include("head.inc");
273

    
274
?>
275

    
276
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
277
<?php include("fbegin.inc"); ?>
278
<script language="JavaScript">
279
<!--
280

    
281
function change_mode() {
282
	index = document.iform.mode.selectedIndex;
283
	value = document.iform.mode.options[index].value;
284
	if ((value == 'tunnel') || (value == 'tunnel6')) {
285
		document.getElementById('opt_localid').style.display = '';
286
<?php if (!isset($pconfig['mobile'])): ?>
287
		document.getElementById('opt_remoteid').style.display = '';
288
<?php endif; ?>
289
	} else {
290
		document.getElementById('opt_localid').style.display = 'none';
291
<?php if (!isset($pconfig['mobile'])): ?>
292
		document.getElementById('opt_remoteid').style.display = 'none';
293
<?php endif; ?>
294
	}
295
}
296

    
297
function typesel_change_local(bits) {
298

    
299
	if (typeof(bits)=="undefined") {
300
		if (value == 'tunnel') {
301
			bits = 24;
302
		}
303
		if (value == 'tunnel6') {
304
			bits = 64;
305
		}
306
	}
307

    
308
	switch (document.iform.localid_type.selectedIndex) {
309
		case 0:	/* single */
310
			document.iform.localid_address.disabled = 0;
311
			document.iform.localid_netbits.value = 0;
312
			document.iform.localid_netbits.disabled = 1;
313
			break;
314
		case 1:	/* network */
315
			document.iform.localid_address.disabled = 0;
316
			document.iform.localid_netbits.value = bits;
317
			document.iform.localid_netbits.disabled = 0;
318
			break;
319
		case 3:	/* none */
320
			document.iform.localid_address.disabled = 1;
321
			document.iform.localid_netbits.disabled = 1;
322
			break;
323
		default:
324
			document.iform.localid_address.value = "";
325
			document.iform.localid_address.disabled = 1;
326
			document.iform.localid_netbits.value = 0;
327
			document.iform.localid_netbits.disabled = 1;
328
			break;
329
	}
330
}
331

    
332
<?php if (!isset($pconfig['mobile'])): ?>
333

    
334
function typesel_change_remote(bits) {
335

    
336
	if (typeof(bits)=="undefined") {
337
		if (value == 'tunnel') {
338
			bits = 24;
339
		}
340
		if (value == 'tunnel6') {
341
			bits = 64;
342
		}
343
	}
344

    
345
	switch (document.iform.remoteid_type.selectedIndex) {
346
		case 0:	/* single */
347
			document.iform.remoteid_address.disabled = 0;
348
			document.iform.remoteid_netbits.value = 0;
349
			document.iform.remoteid_netbits.disabled = 1;
350
			break;
351
		case 1:	/* network */
352
			document.iform.remoteid_address.disabled = 0;
353
			document.iform.remoteid_netbits.value = bits;
354
			document.iform.remoteid_netbits.disabled = 0;
355
			break;
356
		default:
357
			document.iform.remoteid_address.value = "";
358
			document.iform.remoteid_address.disabled = 1;
359
			document.iform.remoteid_netbits.value = 0;
360
			document.iform.remoteid_netbits.disabled = 1;
361
			break;
362
	}
363
}
364

    
365
<?php endif; ?>
366

    
367
function change_protocol() {
368
	index = document.iform.proto.selectedIndex;
369
	value = document.iform.proto.options[index].value;
370
	if (value == 'esp')
371
		document.getElementById('opt_enc').style.display = '';
372
	else
373
		document.getElementById('opt_enc').style.display = 'none';
374
}
375

    
376
//-->
377
</script>
378

    
379
<form action="vpn_ipsec_phase2.php" method="post" name="iform" id="iform">
380

    
381
<?php
382
	if ($input_errors)
383
		print_input_errors($input_errors);
384
?>
385

    
386
<table width="100%" border="0" cellpadding="0" cellspacing="0">
387
	<tr class="tabnavtbl">
388
		<td id="tabnav">
389
			<?php
390
				$tab_array = array();
391
				$tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
392
				$tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
393
				$tab_array[2] = array(gettext("Pre-shared keys"), false, "vpn_ipsec_keys.php");
394
				display_top_tabs($tab_array);
395
			?>
396
		</td>
397
	</tr>
398
	<tr>
399
		<td id="mainarea">
400
			<div class="tabcont">
401
				<table width="100%" border="0" cellpadding="6" cellspacing="0">
402
					<tr>
403
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
404
						<td width="78%" class="vtable">
405
							<input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked"; ?>>
406
							<strong><?=gettext("Disable this phase2 entry"); ?></strong>
407
							<br>
408
							<span class="vexpl"><?=gettext("Set this option to disable this phase2 entry without " .
409
							  "removing it from the list"); ?>.
410
							</span>
411
						</td>
412
					</tr>
413
					<tr>
414
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
415
						<td width="78%" class="vtable">
416
							<select name="mode" class="formselect" onChange="change_mode()">
417
								<?php
418
									foreach($p2_modes as $name => $value):
419
										$selected = "";
420
										if ($name == $pconfig['mode'])
421
											$selected = "selected";
422
								?>
423
								<option value="<?=$name;?>" <?=$selected;?>><?=$value;?></option>
424
								<?php endforeach; ?>
425
							</select>
426
						</td>
427
					</tr>
428
					<tr id="opt_localid">
429
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Local Network"); ?></td>
430
						<td width="78%" class="vtable">
431
							<table border="0" cellspacing="0" cellpadding="0">
432
								<tr>
433
									<td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
434
									<td></td>
435
									<td>
436
										<select name="localid_type" class="formselect" onChange="typesel_change_local()">
437
											<option value="address" <?php if ($pconfig['localid_type'] == "address") echo "selected";?>><?=gettext("Address"); ?></option>
438
											<option value="network" <?php if ($pconfig['localid_type'] == "network") echo "selected";?>><?=gettext("Network"); ?></option>
439
											<?php
440
												$iflist = get_configured_interface_with_descr();
441
												foreach ($iflist as $ifname => $ifdescr):
442
											?>
443
											<option value="<?=$ifname; ?>" <?php if ($pconfig['localid_type'] == $ifname ) echo "selected";?>><?=sprintf(gettext("%s subnet"), $ifdescr); ?></option>
444
											<?php endforeach; ?>
445
											<option value="none" <?php if ($pconfig['localid_type'] == "none" ) echo "selected";?>><?=gettext("None"); ?></option>
446
										</select>
447
									</td>
448
								</tr>
449
								<tr>
450
									<td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
451
									<td><?=$mandfldhtmlspc;?></td>
452
									<td>
453
										<input name="localid_address" type="text" class="formfld unknown" id="localid_address" size="28" value="<?=htmlspecialchars($pconfig['localid_address']);?>">
454
										/
455
										<select name="localid_netbits" class="formselect" id="localid_netbits">
456
										<?php for ($i = 128; $i >= 0; $i--): ?>
457
											<option value="<?=$i;?>" <?php if ($i == $pconfig['localid_netbits']) echo "selected"; ?>>
458
												<?=$i;?>
459
											</option>
460
										<?php endfor; ?>
461
										</select>
462
									</td>
463
								</tr>
464
							</table>
465
						</td>
466
					</tr>
467

    
468
					<?php if (!isset($pconfig['mobile'])): ?>
469
					
470
					<tr id="opt_remoteid">
471
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Remote Network"); ?></td>
472
						<td width="78%" class="vtable">
473
							<table border="0" cellspacing="0" cellpadding="0">
474
								<tr>
475
									<td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
476
									<td></td>
477
									<td>
478
										<select name="remoteid_type" class="formselect" onChange="typesel_change_remote()">
479
											<option value="address" <?php if ($pconfig['remoteid_type'] == "address") echo "selected"; ?>><?=gettext("Address"); ?></option>
480
											<option value="network" <?php if ($pconfig['remoteid_type'] == "network") echo "selected"; ?>><?=gettext("Network"); ?></option>
481
										</select>
482
									</td>
483
								</tr>
484
								<tr>
485
									<td><?=gettext("Address"); ?>:&nbsp;&nbsp;</td>
486
									<td><?=$mandfldhtmlspc;?></td>
487
									<td>
488
										<input name="remoteid_address" type="text" class="formfld unknown" id="remoteid_address" size="28" value="<?=htmlspecialchars($pconfig['remoteid_address']);?>">
489
										/
490
										<select name="remoteid_netbits" class="formselect" id="remoteid_netbits">
491
										<?php for ($i = 128; $i >= 0; $i--) { 
492
											
493
											echo "<option value=\"{$i}\"";
494
											if ($i == $pconfig['remoteid_netbits']) echo " selected";
495
											echo ">{$i}</option>\n";
496
											} ?>
497
										</select>
498
									</td>
499
								</tr>
500
							</table>
501
						</td>
502
					</tr>
503
					
504
					<?php endif; ?>
505
					
506
					<tr>
507
						<td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
508
						<td width="78%" class="vtable">
509
							<input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>">
510
							<br>
511
							<span class="vexpl">
512
								<?=gettext("You may enter a description here " .
513
								"for your reference (not parsed)"); ?>.
514
							</span>
515
						</td>
516
					</tr>
517
					<tr>
518
						<td colspan="2" class="list" height="12"></td>
519
					</tr>
520
					<tr>
521
						<td colspan="2" valign="top" class="listtopic">
522
							<?=gettext("Phase 2 proposal (SA/Key Exchange)"); ?>
523
						</td>
524
					</tr>
525
					<tr>
526
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol"); ?></td>
527
						<td width="78%" class="vtable">
528
							<select name="proto" class="formselect" onChange="change_protocol()">
529
							<?php foreach ($p2_protos as $proto => $protoname): ?>
530
								<option value="<?=$proto;?>" <?php if ($proto == $pconfig['proto']) echo "selected"; ?>>
531
									<?=htmlspecialchars($protoname);?>
532
								</option>
533
							<?php endforeach; ?>
534
							</select>
535
							<br>
536
							<span class="vexpl">
537
								<?=gettext("ESP is encryption, AH is authentication only"); ?>
538
							</span>
539
						</td>
540
					</tr>
541
					<tr id="opt_enc">
542
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithms"); ?></td>
543
						<td width="78%" class="vtable">
544
							<table border="0" cellspacing="0" cellpadding="0">
545
							<?php
546
								foreach ($p2_ealgos as $algo => $algodata):
547
									$checked = '';
548
									if (in_array($algo,$pconfig['ealgos']))
549
										$checked = " checked";
550
								?>
551
								<tr>
552
									<td>
553
										<input type="checkbox" name="ealgos[]" value="<?=$algo;?>"<?=$checked?>>
554
									</td>
555
									<td>
556
										<?=htmlspecialchars($algodata['name']);?>
557
									</td>
558
									<td>
559
										<?php if(is_array($algodata['keysel'])): ?>
560
										&nbsp;&nbsp;
561
										<select name="keylen_<?=$algo;?>" class="formselect">
562
											<option value="auto"><?=gettext("auto"); ?></option>
563
											<?php
564
												$key_hi = $algodata['keysel']['hi'];
565
												$key_lo = $algodata['keysel']['lo'];
566
												$key_step = $algodata['keysel']['step'];
567
												for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step):
568
													$selected = '';
569
				//									if ($checked && in_array("keylen_".$algo,$pconfig))
570
													if ($keylen == $pconfig["keylen_".$algo])
571
														$selected = " selected";
572
											?>
573
											<option value="<?=$keylen;?>"<?=$selected;?>><?=$keylen;?> <?=gettext("bits"); ?></option>
574
											<?php endfor; ?>
575
										</select>
576
										<?php endif; ?>
577
									</td>
578
								</tr>
579
								
580
								<?php endforeach; ?>
581
								
582
							</table>
583
							<br>
584
							<?=gettext("Hint: use 3DES for best compatibility or if you have a hardware " . 
585
							"crypto accelerator card. Blowfish is usually the fastest in " .
586
							"software encryption"); ?>.
587
						</td>
588
					</tr>
589
					<tr>
590
						<td width="22%" valign="top" class="vncellreq"><?=gettext("Hash algorithms"); ?></td>
591
						<td width="78%" class="vtable">
592
						<?php foreach ($p2_halgos as $algo => $algoname): ?>
593
							<input type="checkbox" name="halgos[]" value="<?=$algo;?>" <?php if (in_array($algo, $pconfig['halgos'])) echo "checked"; ?>>
594
							<?=htmlspecialchars($algoname);?>
595
							<br>
596
						<?php endforeach; ?>
597
						</td>
598
					</tr>
599
					<tr>
600
						<td width="22%" valign="top" class="vncellreq"><?=gettext("PFS key group"); ?></td>
601
						<td width="78%" class="vtable">
602
						<?php if (!isset($pconfig['mobile']) || !isset($a_client['pfs_group'])): ?>
603
							<select name="pfsgroup" class="formselect">
604
							<?php foreach ($p2_pfskeygroups as $keygroup => $keygroupname): ?>
605
								<option value="<?=$keygroup;?>" <?php if ($keygroup == $pconfig['pfsgroup']) echo "selected"; ?>>
606
									<?=htmlspecialchars($keygroupname);?>
607
								</option>
608
							<?php endforeach; ?>
609
							</select>
610
							<br>
611
							<span class="vexpl">
612
								<em>
613
									<?=gettext("1 = 768 bit, 2 = 1024 bit, 5 = 1536 bit"); ?>
614
								</em>
615
							</span>
616
							
617
							<?php else: ?>
618

    
619
							<select class="formselect" disabled>
620
								<option selected><?=$p2_pfskeygroups[$a_client['pfs_group']];?></option>
621
							</select>
622
							<input name="pfsgroup" type="hidden" value="<?=htmlspecialchars($pconfig['pfsgroup']);?>">
623
							<br>
624
							<span class="vexpl"><em><?=gettext("Set globally in mobile client options"); ?></em></span>
625
						<?php endif; ?>
626
						</td>
627
					</tr>
628
					<tr>
629
						<td width="22%" valign="top" class="vncell"><?=gettext("Lifetime"); ?></td>
630
						<td width="78%" class="vtable">
631
							<input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="20" value="<?=htmlspecialchars($pconfig['lifetime']);?>">
632
							<?=gettext("seconds"); ?>
633
						</td>
634
					</tr>
635
					<tr>
636
						<td colspan="2" class="list" height="12"></td>
637
					</tr>
638
					<tr>
639
						<td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Options"); ?></td>
640
					</tr>
641
					<tr>
642
						<td width="22%" valign="top" class="vncell"><?=gettext("Automatically ping host"); ?></td>
643
						<td width="78%" class="vtable">
644
							<input name="pinghost" type="text" class="formfld unknown" id="pinghost" size="28" value="<?=htmlspecialchars($pconfig['pinghost']);?>">
645
							<?=gettext("IP address"); ?>
646
						</td>
647
					</tr>
648
					<tr>
649
						<td width="22%" valign="top">&nbsp;</td>
650
						<td width="78%">
651
						<?php if (isset($p2index) && $a_phase2[$p2index]): ?>
652
							<input name="p2index" type="hidden" value="<?=$p2index;?>">
653
						<?php endif; ?>
654
						<?php if ($pconfig['mobile']): ?>
655
							<input name="mobile" type="hidden" value="true">
656
							<input name="remoteid_type" type="hidden" value="mobile">
657
						<?php endif; ?>
658
							<input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>">
659
							<input name="ikeid" type="hidden" value="<?=htmlspecialchars($pconfig['ikeid']);?>">
660
						</td>
661
					</tr>
662
				</table>
663
			</div>
664
		</td>
665
	</tr>
666
</table>
667
</form>
668
<script lannguage="JavaScript">
669
<!--
670
change_mode('<?=htmlspecialchars($pconfig['mode'])?>');
671
change_protocol('<?=htmlspecialchars($pconfig['proto'])?>');
672
typesel_change_local(<?=htmlspecialchars($pconfig['localid_netbits'])?>);
673
<?php if (!isset($pconfig['mobile'])): ?>
674
typesel_change_remote(<?=htmlspecialchars($pconfig['remoteid_netbits'])?>);
675
<?php endif; ?>
676
//-->
677
</script>
678
<?php include("fend.inc"); ?>
679
</body>
680
</html>
681

    
682
<?php
683

    
684
/* local utility functions */
685

    
686
function pconfig_to_ealgos(& $pconfig) {
687

    
688
	global $p2_ealgos;
689

    
690
	$ealgos = array();
691
	foreach ($p2_ealgos as $algo_name => $algo_data) {
692
		if (in_array($algo_name,$pconfig['ealgos'])) {
693
			$ealg = array();
694
			$ealg['name'] = $algo_name;
695
			if (is_array($algo_data['keysel']))
696
				$ealg['keylen'] = $_POST["keylen_".$algo_name];
697
			$ealgos[] = $ealg;
698
		}
699
	}
700

    
701
	return $ealgos;
702
}
703

    
704
function ealgos_to_pconfig(& $ealgos,& $pconfig) {
705

    
706
	$pconfig['ealgos'] = array();
707
	foreach ($ealgos as $algo_data) {
708
		$pconfig['ealgos'][] = $algo_data['name'];
709
		if (isset($algo_data['keylen']))
710
			$pconfig["keylen_".$algo_data['name']] = $algo_data['keylen'];
711
	}
712

    
713
	return $ealgos;
714
}
715

    
716
function pconfig_to_idinfo($prefix,& $pconfig) {
717

    
718
	$type = $pconfig[$prefix."id_type"];
719
	$address = $pconfig[$prefix."id_address"];
720
	$netbits = $pconfig[$prefix."id_netbits"];
721

    
722
	switch( $type )
723
	{
724
		case "address":
725
			return array('type' => $type, 'address' => $address);
726
		case "network":
727
			return array('type' => $type, 'address' => $address, 'netbits' => $netbits);
728
		default:
729
			return array('type' => $type );
730
	}
731
}
732

    
733
function idinfo_to_pconfig($prefix,& $idinfo,& $pconfig) {
734

    
735
	switch( $idinfo['type'] )
736
	{
737
		case "address":
738
			$pconfig[$prefix."id_type"] = $idinfo['type'];
739
			$pconfig[$prefix."id_address"] = $idinfo['address'];
740
			break;
741
		case "network":
742
			$pconfig[$prefix."id_type"] = $idinfo['type'];
743
			$pconfig[$prefix."id_address"] = $idinfo['address'];
744
			$pconfig[$prefix."id_netbits"] = $idinfo['netbits'];
745
			break;
746
		default:
747
			$pconfig[$prefix."id_type"] = $idinfo['type'];
748
			break;
749
	}
750
}
751

    
752
?>
753

    
(229-229/242)