Project

General

Profile

Download (26.4 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
	/* For ESP protocol, handle encryption algorithms */
212
	if ( $pconfig['proto'] == "esp") {
213
		$ealgos = pconfig_to_ealgos($pconfig);
214

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

    
223
	if (!$input_errors) {
224

    
225
		$ph2ent['ikeid'] = $pconfig['ikeid'];
226
		$ph2ent['mode'] = $pconfig['mode'];
227
		$ph2ent['disabled'] = $pconfig['disabled'] ? true : false;
228

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

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

    
242
		if (isset($pconfig['mobile']))
243
			$ph2ent['mobile'] = true;
244

    
245
		if (isset($p2index) && $a_phase2[$p2index])
246
			$a_phase2[$p2index] = $ph2ent;
247
		else
248
			$a_phase2[] = $ph2ent;
249

    
250

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

    
259
		write_config();
260
		mark_subsystem_dirty('ipsec');
261

    
262
		header("Location: vpn_ipsec.php");
263
		exit;
264
	}
265
}
266

    
267
if ($pconfig['mobile'])
268
    $pgtitle = array(gettext("VPN"),gettext("IPsec"),gettext("Edit Phase 2"), gettext("Mobile Client"));
269
else
270
    $pgtitle = array(gettext("VPN"),gettext("IPsec"),gettext("Edit Phase 2"));
271
$shortcut_section = "ipsec";
272

    
273

    
274
include("head.inc");
275

    
276
?>
277

    
278
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
279
<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
280
<?php include("fbegin.inc"); ?>
281
<script language="JavaScript">
282
<!--
283

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

    
300
function typesel_change_local(bits) {
301
	var value = document.iform.mode.options[index].value;
302
	if (typeof(bits) === "undefined") {
303
		if (value === "tunnel") {
304
			bits = 24;
305
		}
306
		else if (value === "tunnel6") {
307
			bits = 64;
308
		}
309
	}
310
	var address_is_blank = !/\S/.test(document.iform.localid_address.value);
311
	switch (document.iform.localid_type.selectedIndex) {
312
		case 0:	/* single */
313
			document.iform.localid_address.disabled = 0;
314
			if (address_is_blank) {
315
				document.iform.localid_netbits.value = 0;
316
			}
317
			document.iform.localid_netbits.disabled = 1;
318
			break;
319
		case 1:	/* network */
320
			document.iform.localid_address.disabled = 0;
321
			if (address_is_blank) {
322
				document.iform.localid_netbits.value = bits;
323
			}
324
			document.iform.localid_netbits.disabled = 0;
325
			break;
326
		case 3:	/* none */
327
			document.iform.localid_address.disabled = 1;
328
			document.iform.localid_netbits.disabled = 1;
329
			break;
330
		default:
331
			document.iform.localid_address.value = "";
332
			document.iform.localid_address.disabled = 1;
333
			if (address_is_blank) {
334
				document.iform.localid_netbits.value = 0;
335
			}
336
			document.iform.localid_netbits.disabled = 1;
337
			break;
338
	}
339
}
340

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

    
343
function typesel_change_remote(bits) {
344
	var value = document.iform.mode.options[index].value;
345
	if (typeof(bits) === "undefined") {
346
		if (value === "tunnel") {
347
			bits = 24;
348
		}
349
		else if (value === "tunnel6") {
350
			bits = 64;
351
		}
352
	}
353
	var address_is_blank = !/\S/.test(document.iform.remoteid_address.value);
354
	switch (document.iform.remoteid_type.selectedIndex) {
355
		case 0:	/* single */
356
			document.iform.remoteid_address.disabled = 0;
357
			if (address_is_blank) {
358
				document.iform.remoteid_netbits.value = 0;
359
			}
360
			document.iform.remoteid_netbits.disabled = 1;
361
			break;
362
		case 1:	/* network */
363
			document.iform.remoteid_address.disabled = 0;
364
			if (address_is_blank) {
365
				document.iform.remoteid_netbits.value = bits;
366
			}
367
			document.iform.remoteid_netbits.disabled = 0;
368
			break;
369
		default:
370
			document.iform.remoteid_address.value = "";
371
			document.iform.remoteid_address.disabled = 1;
372
			if (address_is_blank) {
373
				document.iform.remoteid_netbits.value = 0;
374
			}
375
			document.iform.remoteid_netbits.disabled = 1;
376
			break;
377
	}
378
}
379

    
380
<?php endif; ?>
381

    
382
function change_protocol() {
383
	index = document.iform.proto.selectedIndex;
384
	value = document.iform.proto.options[index].value;
385
	if (value == 'esp')
386
		document.getElementById('opt_enc').style.display = '';
387
	else
388
		document.getElementById('opt_enc').style.display = 'none';
389
}
390

    
391
//-->
392
</script>
393

    
394
<form action="vpn_ipsec_phase2.php" method="post" name="iform" id="iform">
395

    
396
<?php
397
	if ($input_errors)
398
		print_input_errors($input_errors);
399
?>
400

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

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

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

    
691
<?php
692

    
693
/* local utility functions */
694

    
695
function pconfig_to_ealgos(& $pconfig) {
696

    
697
	global $p2_ealgos;
698

    
699
	$ealgos = array();
700
	if (is_array($pconfig['ealgos'])) {
701
		foreach ($p2_ealgos as $algo_name => $algo_data) {
702
			if (in_array($algo_name,$pconfig['ealgos'])) {
703
				$ealg = array();
704
				$ealg['name'] = $algo_name;
705
				if (is_array($algo_data['keysel']))
706
					$ealg['keylen'] = $_POST["keylen_".$algo_name];
707
				$ealgos[] = $ealg;
708
			}
709
		}
710
	}
711

    
712
	return $ealgos;
713
}
714

    
715
function ealgos_to_pconfig(& $ealgos,& $pconfig) {
716

    
717
	$pconfig['ealgos'] = array();
718
	foreach ($ealgos as $algo_data) {
719
		$pconfig['ealgos'][] = $algo_data['name'];
720
		if (isset($algo_data['keylen']))
721
			$pconfig["keylen_".$algo_data['name']] = $algo_data['keylen'];
722
	}
723

    
724
	return $ealgos;
725
}
726

    
727
function pconfig_to_idinfo($prefix,& $pconfig) {
728

    
729
	$type = $pconfig[$prefix."id_type"];
730
	$address = $pconfig[$prefix."id_address"];
731
	$netbits = $pconfig[$prefix."id_netbits"];
732

    
733
	switch( $type )
734
	{
735
		case "address":
736
			return array('type' => $type, 'address' => $address);
737
		case "network":
738
			return array('type' => $type, 'address' => $address, 'netbits' => $netbits);
739
		default:
740
			return array('type' => $type );
741
	}
742
}
743

    
744
function idinfo_to_pconfig($prefix,& $idinfo,& $pconfig) {
745

    
746
	switch( $idinfo['type'] )
747
	{
748
		case "address":
749
			$pconfig[$prefix."id_type"] = $idinfo['type'];
750
			$pconfig[$prefix."id_address"] = $idinfo['address'];
751
			break;
752
		case "network":
753
			$pconfig[$prefix."id_type"] = $idinfo['type'];
754
			$pconfig[$prefix."id_address"] = $idinfo['address'];
755
			$pconfig[$prefix."id_netbits"] = $idinfo['netbits'];
756
			break;
757
		default:
758
			$pconfig[$prefix."id_type"] = $idinfo['type'];
759
			break;
760
	}
761
}
762

    
763
?>
764

    
(238-238/251)