Project

General

Profile

Download (28.8 KB) Statistics
| Branch: | Tag: | Revision:
1 88e545b4 jim-p
<?php
2 d799787e Matthew Grooms
/*
3
	vpn_openvpn_client.php
4
5
	Copyright (C) 2008 Shrew Soft Inc.
6 ce77a9c4 Phil Davis
	Copyright (C) 2013-2015 Electric Sheep Fencing, LP
7 88e545b4 jim-p
	All rights reserved.
8 d799787e Matthew Grooms
9
	Redistribution and use in source and binary forms, with or without
10
	modification, are permitted provided that the following conditions are met:
11 88e545b4 jim-p
12 d799787e Matthew Grooms
	1. Redistributions of source code must retain the above copyright notice,
13
	   this list of conditions and the following disclaimer.
14 88e545b4 jim-p
15 d799787e Matthew Grooms
	2. Redistributions in binary form must reproduce the above copyright
16
	   notice, this list of conditions and the following disclaimer in the
17
	   documentation and/or other materials provided with the distribution.
18 88e545b4 jim-p
19 d799787e Matthew Grooms
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
20
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
21
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
23
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
	POSSIBILITY OF SUCH DAMAGE.
29
*/
30
31
##|+PRIV
32
##|*IDENT=page-openvpn-client
33
##|*NAME=OpenVPN: Client page
34
##|*DESCR=Allow access to the 'OpenVPN: Client' page.
35
##|*MATCH=vpn_openvpn_client.php*
36
##|-PRIV
37
38
require("guiconfig.inc");
39 d84bd468 Ermal Lu?i
require_once("openvpn.inc");
40 d799787e Matthew Grooms
41 2fa7a468 Carlos Eduardo Ramos
$pgtitle = array(gettext("OpenVPN"), gettext("Client"));
42 b32dd0a6 jim-p
$shortcut_section = "openvpn";
43 d799787e Matthew Grooms
44
if (!is_array($config['openvpn']['openvpn-client']))
45
	$config['openvpn']['openvpn-client'] = array();
46
47
$a_client = &$config['openvpn']['openvpn-client'];
48
49 428e66b6 jim-p
if (!is_array($config['ca']))
50
	$config['ca'] = array();
51
52
$a_ca =& $config['ca'];
53
54
if (!is_array($config['cert']))
55
	$config['cert'] = array();
56
57
$a_cert =& $config['cert'];
58
59
if (!is_array($config['crl']))
60
	$config['crl'] = array();
61
62
$a_crl =& $config['crl'];
63
64 e41ec584 Renato Botelho
if (is_numericint($_GET['id']))
65
	$id = $_GET['id'];
66
if (isset($_POST['id']) && is_numericint($_POST['id']))
67 d799787e Matthew Grooms
	$id = $_POST['id'];
68
69
$act = $_GET['act'];
70
if (isset($_POST['act']))
71
	$act = $_POST['act'];
72
73 6d9b1074 jim-p
if (isset($id) && $a_client[$id])
74
	$vpnid = $a_client[$id]['vpnid'];
75
else
76
	$vpnid = 0;
77
78 d799787e Matthew Grooms
if ($_GET['act'] == "del") {
79
80 767cf960 jim-p
	if (!isset($a_client[$id])) {
81 d799787e Matthew Grooms
		pfSenseHeader("vpn_openvpn_client.php");
82
		exit;
83
	}
84 767cf960 jim-p
	if (!empty($a_client[$id]))
85
		openvpn_delete('client', $a_client[$id]);
86 d799787e Matthew Grooms
	unset($a_client[$id]);
87
	write_config();
88 8cd558b6 ayvis
	$savemsg = gettext("Client successfully deleted")."<br />";
89 d799787e Matthew Grooms
}
90
91 f432e364 Matthew Grooms
if($_GET['act']=="new"){
92 3c11bd3c Matthew Grooms
	$pconfig['autokey_enable'] = "yes";
93
	$pconfig['tlsauth_enable'] = "yes";
94
	$pconfig['autotls_enable'] = "yes";
95 f432e364 Matthew Grooms
	$pconfig['interface'] = "wan";
96
	$pconfig['server_port'] = 1194;
97 b9e9903d Dmitriy K.
	$pconfig['verbosity_level'] = 1; // Default verbosity is 1
98 97d5b59b jim-p
	// OpenVPN Defaults to SHA1
99
	$pconfig['digest'] = "SHA1";
100 f432e364 Matthew Grooms
}
101
102 5f242576 PiBa-NL
global $simplefields;
103
$simplefields = array('auth_user','auth_pass');
104
105 d799787e Matthew Grooms
if($_GET['act']=="edit"){
106
107
	if (isset($id) && $a_client[$id]) {
108 5f242576 PiBa-NL
		foreach($simplefields as $stat)
109
			$pconfig[$stat] = $a_client[$id][$stat];
110 88e545b4 jim-p
111 8319ee63 jim-p
		$pconfig['disable'] = isset($a_client[$id]['disable']);
112 3c11bd3c Matthew Grooms
		$pconfig['mode'] = $a_client[$id]['mode'];
113 d799787e Matthew Grooms
		$pconfig['protocol'] = $a_client[$id]['protocol'];
114
		$pconfig['interface'] = $a_client[$id]['interface'];
115 67b0902f pierrepomes
		if (!empty($a_client[$id]['ipaddr'])) {
116
			$pconfig['interface'] = $pconfig['interface'] . '|' . $a_client[$id]['ipaddr'];
117
		}
118 d799787e Matthew Grooms
		$pconfig['local_port'] = $a_client[$id]['local_port'];
119
		$pconfig['server_addr'] = $a_client[$id]['server_addr'];
120
		$pconfig['server_port'] = $a_client[$id]['server_port'];
121
		$pconfig['resolve_retry'] = $a_client[$id]['resolve_retry'];
122
		$pconfig['proxy_addr'] = $a_client[$id]['proxy_addr'];
123
		$pconfig['proxy_port'] = $a_client[$id]['proxy_port'];
124 762a24a3 Ermal Lu?i
		$pconfig['proxy_user'] = $a_client[$id]['proxy_user'];
125
		$pconfig['proxy_passwd'] = $a_client[$id]['proxy_passwd'];
126
		$pconfig['proxy_authtype'] = $a_client[$id]['proxy_authtype'];
127 d799787e Matthew Grooms
		$pconfig['description'] = $a_client[$id]['description'];
128 c7323d81 sullrich
		$pconfig['custom_options'] = $a_client[$id]['custom_options'];
129 691fbf14 Ermal Lu?i
		$pconfig['ns_cert_type'] = $a_client[$id]['ns_cert_type'];
130 4936ff53 jim-p
		$pconfig['dev_mode'] = $a_client[$id]['dev_mode'];
131 88e545b4 jim-p
132 3c11bd3c Matthew Grooms
		if ($pconfig['mode'] != "p2p_shared_key") {
133 d799787e Matthew Grooms
			$pconfig['caref'] = $a_client[$id]['caref'];
134
			$pconfig['certref'] = $a_client[$id]['certref'];
135 3c11bd3c Matthew Grooms
			if ($a_client[$id]['tls']) {
136
				$pconfig['tlsauth_enable'] = "yes";
137
				$pconfig['tls'] = base64_decode($a_client[$id]['tls']);
138
			}
139
		} else
140
			$pconfig['shared_key'] = base64_decode($a_client[$id]['shared_key']);
141 d799787e Matthew Grooms
		$pconfig['crypto'] = $a_client[$id]['crypto'];
142 97d5b59b jim-p
		// OpenVPN Defaults to SHA1 if unset
143
		$pconfig['digest'] = !empty($a_client[$id]['digest']) ? $a_client[$id]['digest'] : "SHA1";
144 f5c704b6 jim-p
		$pconfig['engine'] = $a_client[$id]['engine'];
145 d799787e Matthew Grooms
146
		$pconfig['tunnel_network'] = $a_client[$id]['tunnel_network'];
147 4856df9b jim-p
		$pconfig['tunnel_networkv6'] = $a_client[$id]['tunnel_networkv6'];
148 d799787e Matthew Grooms
		$pconfig['remote_network'] = $a_client[$id]['remote_network'];
149 4856df9b jim-p
		$pconfig['remote_networkv6'] = $a_client[$id]['remote_networkv6'];
150 b422360c jim-p
		$pconfig['use_shaper'] = $a_client[$id]['use_shaper'];
151 d799787e Matthew Grooms
		$pconfig['compression'] = $a_client[$id]['compression'];
152 1cb0b40a Matthew Grooms
		$pconfig['passtos'] = $a_client[$id]['passtos'];
153 3c11bd3c Matthew Grooms
154
		// just in case the modes switch
155
		$pconfig['autokey_enable'] = "yes";
156
		$pconfig['autotls_enable'] = "yes";
157 bea9e9d6 sbeaver
158 b9e9903d Dmitriy K.
		$pconfig['no_tun_ipv6'] = $a_client[$id]['no_tun_ipv6'];
159
		$pconfig['route_no_pull'] = $a_client[$id]['route_no_pull'];
160
		$pconfig['route_no_exec'] = $a_client[$id]['route_no_exec'];
161 c7264382 Dmitriy K.
		if (isset($a_client[$id]['verbosity_level']))
162
			$pconfig['verbosity_level'] = $a_client[$id]['verbosity_level'];
163
		else
164
			$pconfig['verbosity_level'] = 1; // Default verbosity is 1
165 d799787e Matthew Grooms
	}
166
}
167
168
if ($_POST) {
169
170
	unset($input_errors);
171
	$pconfig = $_POST;
172
173 dc408939 Matthew Grooms
	if (isset($id) && $a_client[$id])
174
		$vpnid = $a_client[$id]['vpnid'];
175 f432e364 Matthew Grooms
	else
176
		$vpnid = 0;
177
178 198bb449 jim-p
	list($iv_iface, $iv_ip) = explode ("|",$pconfig['interface']);
179
	if (is_ipaddrv4($iv_ip) && (stristr($pconfig['protocol'], "6") !== false)) {
180
		$input_errors[] = gettext("Protocol and IP address families do not match. You cannot select an IPv6 protocol and an IPv4 IP address.");
181
	} elseif (is_ipaddrv6($iv_ip) && (stristr($pconfig['protocol'], "6") === false)) {
182
		$input_errors[] = gettext("Protocol and IP address families do not match. You cannot select an IPv4 protocol and an IPv6 IP address.");
183 489f484c jim-p
	} elseif ((stristr($pconfig['protocol'], "6") === false) && !get_interface_ip($iv_iface) && ($pconfig['interface'] != "any")) {
184 198bb449 jim-p
		$input_errors[] = gettext("An IPv4 protocol was selected, but the selected interface has no IPv4 address.");
185 489f484c jim-p
	} elseif ((stristr($pconfig['protocol'], "6") !== false) && !get_interface_ipv6($iv_iface) && ($pconfig['interface'] != "any")) {
186 198bb449 jim-p
		$input_errors[] = gettext("An IPv6 protocol was selected, but the selected interface has no IPv6 address.");
187
	}
188
189 98c0c87a jim-p
	if ($pconfig['mode'] != "p2p_shared_key")
190 3c11bd3c Matthew Grooms
		$tls_mode = true;
191
	else
192
		$tls_mode = false;
193
194 d799787e Matthew Grooms
	/* input validation */
195 f432e364 Matthew Grooms
	if ($pconfig['local_port']) {
196
197
		if ($result = openvpn_validate_port($pconfig['local_port'], 'Local port'))
198
			$input_errors[] = $result;
199
200 49b76122 Renato Botelho
		$portused = openvpn_port_used($pconfig['protocol'], $pconfig['interface'], $pconfig['local_port'], $vpnid);
201 5accf130 jim-p
		if (($portused != $vpnid) && ($portused != 0))
202 2fa7a468 Carlos Eduardo Ramos
			$input_errors[] = gettext("The specified 'Local port' is in use. Please select another value");
203 f432e364 Matthew Grooms
	}
204
205 d799787e Matthew Grooms
	if ($result = openvpn_validate_host($pconfig['server_addr'], 'Server host or address'))
206
		$input_errors[] = $result;
207
208
	if ($result = openvpn_validate_port($pconfig['server_port'], 'Server port'))
209
		$input_errors[] = $result;
210
211
	if ($pconfig['proxy_addr']) {
212
213
		if ($result = openvpn_validate_host($pconfig['proxy_addr'], 'Proxy host or address'))
214
			$input_errors[] = $result;
215
216
		if ($result = openvpn_validate_port($pconfig['proxy_port'], 'Proxy port'))
217
			$input_errors[] = $result;
218 762a24a3 Ermal Lu?i
219
		if ($pconfig['proxy_authtype'] != "none") {
220
			if (empty($pconfig['proxy_user']) || empty($pconfig['proxy_passwd']))
221 2fa7a468 Carlos Eduardo Ramos
				$input_errors[] = gettext("User name and password are required for proxy with authentication.");
222 762a24a3 Ermal Lu?i
		}
223 d799787e Matthew Grooms
	}
224
225 c13b87a0 sullrich
	if($pconfig['tunnel_network'])
226 a28d40cb jim-p
		if ($result = openvpn_validate_cidr($pconfig['tunnel_network'], 'IPv4 Tunnel Network', false, "ipv4"))
227 c13b87a0 sullrich
			$input_errors[] = $result;
228 d799787e Matthew Grooms
229 a28d40cb jim-p
	if($pconfig['tunnel_networkv6'])
230
		if ($result = openvpn_validate_cidr($pconfig['tunnel_networkv6'], 'IPv6 Tunnel Network', false, "ipv6"))
231
			$input_errors[] = $result;
232
233
	if ($result = openvpn_validate_cidr($pconfig['remote_network'], 'IPv4 Remote Network', true, "ipv4"))
234
		$input_errors[] = $result;
235
236
	if ($result = openvpn_validate_cidr($pconfig['remote_networkv6'], 'IPv6 Remote Network', true, "ipv6"))
237 d799787e Matthew Grooms
		$input_errors[] = $result;
238
239 b422360c jim-p
	if (!empty($pconfig['use_shaper']) && (!is_numeric($pconfig['use_shaper']) || ($pconfig['use_shaper'] <= 0)))
240
		$input_errors[] = gettext("The bandwidth limit must be a positive numeric value.");
241
242 88e545b4 jim-p
	if ($pconfig['autokey_enable'])
243
		$pconfig['shared_key'] = openvpn_create_key();
244 89e6e210 jim-p
245 3c11bd3c Matthew Grooms
	if (!$tls_mode && !$pconfig['autokey_enable'])
246 d799787e Matthew Grooms
		if (!strstr($pconfig['shared_key'], "-----BEGIN OpenVPN Static key V1-----") ||
247
			!strstr($pconfig['shared_key'], "-----END OpenVPN Static key V1-----"))
248 2fa7a468 Carlos Eduardo Ramos
			$input_errors[] = gettext("The field 'Shared Key' does not appear to be valid");
249 3c11bd3c Matthew Grooms
250
	if ($tls_mode && $pconfig['tlsauth_enable'] && !$pconfig['autotls_enable'])
251
		if (!strstr($pconfig['tls'], "-----BEGIN OpenVPN Static key V1-----") ||
252
			!strstr($pconfig['tls'], "-----END OpenVPN Static key V1-----"))
253 2fa7a468 Carlos Eduardo Ramos
			$input_errors[] = gettext("The field 'TLS Authentication Key' does not appear to be valid");
254 d799787e Matthew Grooms
255 6180c3ae jim-p
	/* If we are not in shared key mode, then we need the CA/Cert. */
256
	if ($pconfig['mode'] != "p2p_shared_key") {
257 2da48592 jim-p
		$reqdfields = explode(" ", "caref");
258
		$reqdfieldsn = array(gettext("Certificate Authority"));
259 6180c3ae jim-p
	} elseif (!$pconfig['autokey_enable']) {
260
		/* We only need the shared key filled in if we are in shared key mode and autokey is not selected. */
261
		$reqdfields = array('shared_key');
262 2fa7a468 Carlos Eduardo Ramos
		$reqdfieldsn = array(gettext('Shared key'));
263 d799787e Matthew Grooms
	}
264
265 1e9b4611 Renato Botelho
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
266 2da48592 jim-p
267
	if (($pconfig['mode'] != "p2p_shared_key") && empty($pconfig['certref']) && empty($pconfig['auth_user']) && empty($pconfig['auth_pass'])) {
268
		$input_errors[] = gettext("If no Client Certificate is selected, a username and password must be entered.");
269
	}
270
271 d799787e Matthew Grooms
	if (!$input_errors) {
272
273
		$client = array();
274 88e545b4 jim-p
275 5f242576 PiBa-NL
		foreach($simplefields as $stat)
276
			update_if_changed($stat, $client[$stat], $_POST[$stat]);
277 88e545b4 jim-p
278 f432e364 Matthew Grooms
		if ($vpnid)
279
			$client['vpnid'] = $vpnid;
280 d799787e Matthew Grooms
		else
281
			$client['vpnid'] = openvpn_vpnid_next();
282
283 8319ee63 jim-p
		if ($_POST['disable'] == "yes")
284 b65f56f6 jim-p
			$client['disable'] = true;
285 d799787e Matthew Grooms
		$client['protocol'] = $pconfig['protocol'];
286 4936ff53 jim-p
		$client['dev_mode'] = $pconfig['dev_mode'];
287 67b0902f pierrepomes
		list($client['interface'], $client['ipaddr']) = explode ("|",$pconfig['interface']);
288 d799787e Matthew Grooms
		$client['local_port'] = $pconfig['local_port'];
289
		$client['server_addr'] = $pconfig['server_addr'];
290
		$client['server_port'] = $pconfig['server_port'];
291
		$client['resolve_retry'] = $pconfig['resolve_retry'];
292
		$client['proxy_addr'] = $pconfig['proxy_addr'];
293
		$client['proxy_port'] = $pconfig['proxy_port'];
294 762a24a3 Ermal Lu?i
		$client['proxy_authtype'] = $pconfig['proxy_authtype'];
295
		$client['proxy_user'] = $pconfig['proxy_user'];
296
		$client['proxy_passwd'] = $pconfig['proxy_passwd'];
297 d799787e Matthew Grooms
		$client['description'] = $pconfig['description'];
298 50a9d5b9 jim-p
		$client['mode'] = $pconfig['mode'];
299 e3bbd29a Ermal
		$client['custom_options'] = str_replace("\r\n", "\n", $pconfig['custom_options']);
300 d799787e Matthew Grooms
301 88e545b4 jim-p
		if ($tls_mode) {
302
			$client['caref'] = $pconfig['caref'];
303
			$client['certref'] = $pconfig['certref'];
304
			if ($pconfig['tlsauth_enable']) {
305
				if ($pconfig['autotls_enable'])
306
					$pconfig['tls'] = openvpn_create_key();
307
				$client['tls'] = base64_encode($pconfig['tls']);
308
			}
309
		} else {
310
			$client['shared_key'] = base64_encode($pconfig['shared_key']);
311
		}
312 d799787e Matthew Grooms
		$client['crypto'] = $pconfig['crypto'];
313 97d5b59b jim-p
		$client['digest'] = $pconfig['digest'];
314 582c58ae jim-p
		$client['engine'] = $pconfig['engine'];
315 d799787e Matthew Grooms
316
		$client['tunnel_network'] = $pconfig['tunnel_network'];
317 4856df9b jim-p
		$client['tunnel_networkv6'] = $pconfig['tunnel_networkv6'];
318 d799787e Matthew Grooms
		$client['remote_network'] = $pconfig['remote_network'];
319 4856df9b jim-p
		$client['remote_networkv6'] = $pconfig['remote_networkv6'];
320 b422360c jim-p
		$client['use_shaper'] = $pconfig['use_shaper'];
321 d799787e Matthew Grooms
		$client['compression'] = $pconfig['compression'];
322 e067306d pierrepomes
		$client['passtos'] = $pconfig['passtos'];
323 d799787e Matthew Grooms
324 b9e9903d Dmitriy K.
		$client['no_tun_ipv6'] = $pconfig['no_tun_ipv6'];
325
		$client['route_no_pull'] = $pconfig['route_no_pull'];
326
		$client['route_no_exec'] = $pconfig['route_no_exec'];
327
		$client['verbosity_level'] = $pconfig['verbosity_level'];
328
329 d799787e Matthew Grooms
		if (isset($id) && $a_client[$id])
330
			$a_client[$id] = $client;
331
		else
332
			$a_client[] = $client;
333
334 dc408939 Matthew Grooms
		openvpn_resync('client', $client);
335 d799787e Matthew Grooms
		write_config();
336 88e545b4 jim-p
337 d799787e Matthew Grooms
		header("Location: vpn_openvpn_client.php");
338
		exit;
339
	}
340
}
341
342
include("head.inc");
343
344 bea9e9d6 sbeaver
function build_if_list() {
345
	$list = array();
346 d799787e Matthew Grooms
347 bea9e9d6 sbeaver
	$interfaces = get_configured_interface_with_descr();
348
	$carplist = get_configured_carp_interface_list();
349 d799787e Matthew Grooms
350 bea9e9d6 sbeaver
	foreach ($carplist as $cif => $carpip)
351
		$interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
352 d799787e Matthew Grooms
353 bea9e9d6 sbeaver
	$aliaslist = get_configured_ip_aliases_list();
354 b9e9903d Dmitriy K.
355 bea9e9d6 sbeaver
	foreach ($aliaslist as $aliasip => $aliasif)
356
		$interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
357
358
	$grouplist = return_gateway_groups_array();
359 3c11bd3c Matthew Grooms
360 bea9e9d6 sbeaver
	foreach ($grouplist as $name => $group) {
361
		if($group['ipprotocol'] != inet)
362
			continue;
363 762a24a3 Ermal Lu?i
364 bea9e9d6 sbeaver
		if($group[0]['vip'] != "")
365
			$vipif = $group[0]['vip'];
366
		else
367
			$vipif = $group[0]['int'];
368
369
		$interfaces[$name] = "GW Group {$name}";
370 88e545b4 jim-p
	}
371 762a24a3 Ermal Lu?i
372 bea9e9d6 sbeaver
	$interfaces['lo0'] = "Localhost";
373
	$interfaces['any'] = "any";
374 3c11bd3c Matthew Grooms
375 bea9e9d6 sbeaver
	foreach ($interfaces as $iface => $ifacename)
376
	   $list[$iface] = $ifacename;
377 3c11bd3c Matthew Grooms
378 bea9e9d6 sbeaver
	return($list);
379 3c11bd3c Matthew Grooms
}
380
381 bea9e9d6 sbeaver
function build_cert_list() {
382
	global $a_cert;
383 3c11bd3c Matthew Grooms
384 bea9e9d6 sbeaver
	$list = array();
385 3c11bd3c Matthew Grooms
386 bea9e9d6 sbeaver
	foreach ($a_cert as $cert) {
387
		$caname = "";
388
		$inuse = "";
389
		$revoked = "";
390
		$ca = lookup_ca($cert['caref']);
391
392
		if ($ca)
393
			$caname = " (CA: {$ca['descr']})";
394
395
		if ($pconfig['certref'] == $cert['refid'])
396
			$selected = "selected=\"selected\"";
397
398
		if (cert_in_use($cert['refid']))
399
			$inuse = " *In Use";
400
401
		if (is_cert_revoked($cert))
402
		   $revoked = " *Revoked";
403
404
		$list[$cert['refid']] = $cert['descr'] . $caname . $inuse . $revoked;
405
	}
406
407
	return($list);
408 3c11bd3c Matthew Grooms
}
409
410 428e66b6 jim-p
if (!$savemsg)
411
	$savemsg = "";
412
413
if ($input_errors)
414
	print_input_errors($input_errors);
415 bea9e9d6 sbeaver
416 428e66b6 jim-p
if ($savemsg)
417 bea9e9d6 sbeaver
	print_info_box($savemsg, 'success');
418
419
$tab_array = array();
420
$tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
421
$tab_array[] = array(gettext("Client"), true, "vpn_openvpn_client.php");
422
$tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
423
$tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
424
add_package_tabs("OpenVPN", $tab_array);
425
display_top_tabs($tab_array);
426
427
if($act=="new" || $act=="edit") :
428
	require('classes/Form.class.php');
429
430
	$form = new Form();
431
432
	$section = new Form_Section('General Information');
433
434
	$section->addInput(new Form_checkbox(
435
		'disable',
436
		'Disabled',
437
		'Disable this server',
438
		$pconfig['disable']
439
	))->setHelp('Set this option to disable this client without removing it from the list');
440
441
	$section->addInput(new Form_Select(
442
		'mode',
443
		'Server mode',
444
		$pconfig['mode'],
445
		$openvpn_client_modes
446
		));
447
448
	$section->addInput(new Form_Select(
449
		'protocol',
450
		'Protocol',
451
		$pconfig['protocol'],
452
		$openvpn_prots
453
		));
454
455
	$section->addInput(new Form_Select(
456
		'dev_mode',
457
		'Device mode',
458
		empty($pconfig['dev_mode']) ? 'tun':$pconfig['dev_mode'],
459
		array_combine($openvpn_dev_mode, $openvpn_dev_mode)
460
		));
461
462
	$section->addInput(new Form_Select(
463
		'interface',
464
		'Interface',
465
		$pconfig['interface'],
466
		build_if_list()
467
		));
468
469
	$section->addInput(new Form_Input(
470
		'local_port',
471
		'Local port',
472
		'number',
473
		$pconfig['local_port']
474
	))->setHelp('Set this option if you would like to bind to a specific port. Leave this blank or enter 0 for a random dynamic port.');
475
476
	$section->addInput(new Form_Input(
477
		'sever_addr',
478
		'Server host or address',
479
		'text',
480
		$pconfig['sever_addr']
481
	));
482
483
	$section->addInput(new Form_Input(
484
		'server_port',
485
		'Server port',
486
		'number',
487
		$pconfig['server_port']
488
	));
489
490
	$section->addInput(new Form_Input(
491
		'proxy_addr',
492
		'Proxy host or address',
493
		'text',
494
		$pconfig['proxy_addr']
495
	));
496
497
	$section->addInput(new Form_Select(
498
		'proxy_authtype',
499
		'Proxy Auth. - Extra options',
500
		$pconfig['proxy_authtype'],
501
		array('none' => 'none', 'basic' => 'basic', 'ntlm' => 'ntlm')
502
		));
503
504
	$section->addInput(new Form_Input(
505
		'proxy_user',
506
		'Username',
507
		'text',
508
		$pconfig['proxy_user']
509
	));
510
511
	$section->addInput(new Form_Input(
512
		'proxy_passwd',
513
		'Password',
514
		'password',
515
		$pconfig['proxy_passwd']
516
	));
517
518
	$section->addInput(new Form_checkbox(
519
		'resolve_retry',
520
		'Server hostname resolution',
521
		'Infinitely resolve server ',
522
		$pconfig['resolve_retry']
523
	))->setHelp('Continuously attempt to resolve the server host name. ' .
524
				'Useful when communicating with a server that is not permanently connected to the Internet.');
525
526
	$section->addInput(new Form_Input(
527
		'description',
528
		'Description',
529
		'text',
530
		$pconfig['description']
531
	))->setHelp('You may enter a description here for your reference (not parsed).');
532
533
	$form->add($section);
534
	$section = new Form_Section('User Authentication settings');
535
	$section->addClass('authentication');
536
537
	$section->addInput(new Form_Input(
538
		'auth_user',
539
		'Username',
540
		'text',
541
		$pconfig['auth_user']
542
	))->setHelp('Leave empty when no user name is needed');
543
544
	$section->addInput(new Form_Input(
545
		'auth_passwd',
546
		'Password',
547
		'password',
548
		$pconfig['auth_passwd']
549
	))->setHelp('Leave empty when no password is needed');
550
551
	$form->add($section);
552
553
	$section = new Form_Section('Cryptographic settings');
554
555
	$section->addInput(new Form_checkbox(
556
		'tlsauth_enable',
557
		'TLS authentication',
558
		'Enable authentication of TLS packets.',
559
		$pconfig['tlsauth_enable']
560
	));
561
562
	if (!$pconfig['tls']) {
563
		$section->addInput(new Form_checkbox(
564
			'autotls_enable',
565
			null,
566
			'Automatically generate a shared TLS authentication key.',
567
			$pconfig['autotls_enable']
568
		));
569
	}
570
571
	$section->addInput(new Form_TextArea(
572
		'tls',
573
		'Key',
574
		$pconfig['tls']
575
	))->setHelp('Paste your shared key here');
576
577
	$section->addInput(new Form_Select(
578
		'caref',
579
		'Peer Certifiacte Authority',
580
		$pconfig['caref'],
581
		count($a_ca) ? array_combine($a_ca, $a_ca) : ['' => 'None']
582
		))->setHelp(count($a_ca) ? '':sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
583
584
	$section->addInput(new Form_Select(
585
		'certref',
586
		'Peer Certifiacte Authority',
587
		$pconfig['certref'],
588
		build_cert_list()
589
		))->setHelp(count($a_cert) ? '':sprintf('No Certificates defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
590
591
	if (!$pconfig['shared_key']) {
592
		$section->addInput(new Form_checkbox(
593
			'autokey_enable',
594
			'Auto generate',
595
			'Automatically generate a shared key',
596
			$pconfig['autokey_enable']
597
		));
598
	}
599
600
	$section->addInput(new Form_TextArea(
601
		'shared_key',
602
		'Shared Key',
603
		$pconfig['shared_key']
604
	))->setHelp('Paste your shared key here');
605
606
	$section->addInput(new Form_Select(
607
		'crypto',
608
		'Encryption Algorithm',
609
		$pconfig['crypto'],
610
		openvpn_get_cipherlist()
611
		));
612
613
	$section->addInput(new Form_Select(
614
		'digest',
615
		'Auth digest algorithm',
616
		$pconfig['digest'],
617
		openvpn_get_digestlist()
618
		))->setHelp('Leave this set to SHA1 unless all clients are set to match. SHA1 is the default for OpenVPN. ');
619
620
	$section->addInput(new Form_Select(
621
		'engine',
622
		'Hardware Crypto',
623
		$pconfig['engine'],
624
		openvpn_get_engines()
625
		));
626
627
	$form->add($section);
628
629
	$section = new Form_Section('Tunnel settings');
630
631
	$section->addInput(new Form_Input(
632
		'tunnel_network',
633
		'IPv4 Tunnel Network',
634
		'text',
635
		$pconfig['tunnel_network']
636
	))->setHelp('This is the IPv4 virtual network used for private communications between this client and the sercer ' .
637
				'expressed using CIDR (eg. 10.0.8.0/24). The first network address will be assigned to ' .
638
				'the client virtual interface.');
639
640
	$section->addInput(new Form_Input(
641
		'tunnel_networkv6',
642
		'IPv6 Tunnel Network',
643
		'text',
644
		$pconfig['tunnel_networkv6']
645
	))->setHelp('This is the IPv6 virtual network used for private ' .
646
				'communications between this client and the server	expressed using CIDR (eg. fe80::/64). ' .
647
				'The first network address will be assigned to the server virtual interface.');
648
649
	$section->addInput(new Form_Input(
650
		'remote_network',
651
		'IPv4 Remote network(s)',
652
		'text',
653
		$pconfig['remote_network']
654
	))->setHelp('IPv4 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually ' .
655
				'changing the routing tables. Expressed as a comma-separated list of one or more CIDR ranges. ' .
656
				'If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don\'t want a site-to-site VPN.');
657
658
	$section->addInput(new Form_Input(
659
		'remote_networkv6',
660
		'IPv6 Remote network(s)',
661
		'text',
662
		$pconfig['remote_networkv6']
663
	))->setHelp('These are the IPv6 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually ' .
664
				'changing the routing tables. Expressed as a comma-separated list of one or more IP/PREFIX. ' .
665
				'If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don\'t want a site-to-site VPN.');
666
667
$section->addInput(new Form_Input(
668
		'use_shaper',
669
		'Limit outgoing bandwidth',
670
		'number',
671
		$pconfig['use_shaper'],
672
		['min' => 100, 'max' => 100000000, 'placeholder' => 'Between 100 and 100,000,000 bytes/sec']
673
	))->setHelp('Maximum outgoing bandwidth for this tunnel. Leave empty for no limit. The input value has to be something between 100 bytes/sec and 100 Mbytes/sec (entered as bytes per second).');
674
675
	$section->addInput(new Form_Select(
676
		'compression',
677
		'Compression',
678
		$pconfig['compression'],
679
		$openvpn_compression_modes
680
		))->setHelp('Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently.');
681
682
	$section->addInput(new Form_checkbox(
683
		'passtos',
684
		'Type-of-Service',
685
		'Set the TOS IP header value of tunnel packets to match the encapsulated packet value.',
686
		$pconfig['passtos']
687
	));
688
689
	$section->addInput(new Form_checkbox(
690
		'no_tun_ipv6',
691
		'Disable IPv6',
692
		'Don\'t forward IPv6 traffic. ',
693
		$pconfig['no_tun_ipv6']
694
	));
695
696
	$section->addInput(new Form_checkbox(
697
		'route_no_pull',
698
		'Don\'t pull routes',
699
		'Bars the server from adding routes to the client\'s routing table',
700
		$pconfig['route_no_pull']
701
	))->setHelp('This option still allows the server to set the TCP/IP properties of the client\'s TUN/TAP interface. ');
702
703
	$section->addInput(new Form_checkbox(
704
		'route_no_exec',
705
		'Don\'t add/remove routes',
706
		'Don\'t add or remove routes automatically',
707
		$pconfig['route_no_exec']
708
	))->setHelp('Pass routes to --route-upscript using environmental variables');
709
710
	$form->add($section);
711
712
	$section = new Form_Section('Advanced Configuration');
713
	$section->addClass('advanced');
714
715
	$section->addInput(new Form_TextArea(
716
		'custom_options',
717
		'Custom options',
718
		$pconfig['custom_options']
719
	))->setHelp('Enter any additional options you would like to add to the OpenVPN server configuration here, separated by semicolon' . '<br />' .
720
				'EXAMPLE: push "route 10.0.0.0 255.255.255.0"');
721
722
	$section->addInput(new Form_Select(
723
		'verbosity_level',
724
		'Verbosity level',
725
		$pconfig['verbosity_level'],
726
		$openvpn_verbosity_level
727
		))->setHelp('Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what\'s happening without being swamped by output' . '<br /><br />' .
728
					'None: Only fatal errors' . '<br />' .
729
					'Default: Normal usage range' . '<br />' .
730
					'5: Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets' .'<br />' .
731
					'6: Debug info range');
732
733
	$section->addInput(new Form_Input(
734
		'act',
735
		null,
736
		'hidden',
737
		$act
738
	));
739
740
	if (isset($id) && $a_server[$id]) {
741
		$section->addInput(new Form_Input(
742
			'id',
743
			null,
744
			'hidden',
745
			$id
746
		));
747
	}
748
749
	$form->add($section);
750
	print($form);
751
else:
752 d799787e Matthew Grooms
?>
753 bea9e9d6 sbeaver
<div class="panel panel-default">
754 f17594c7 Sjon Hortensius
	<div class="panel-heading"><h2 class="panel-title"><?=gettext('OpenVPN Servers')?></h2></div>
755 bea9e9d6 sbeaver
		<div class="panel-body table-responsive">
756
		<table class="table table-striped table-hover table-condensed">
757
			<thead>
758 770f29c4 Colin Fleming
				<tr>
759 bea9e9d6 sbeaver
					<th><?=gettext("Protocol")?></th>
760
					<th><?=gettext("Server")?></th>
761
					<th><?=gettext("Description")?></th>
762
					<th><!-- Buttons --></th>
763 770f29c4 Colin Fleming
				</tr>
764 bea9e9d6 sbeaver
			</thead>
765
766
			<tbody>
767
<?php
768
	$i = 0;
769
	foreach($a_client as $client):
770
		$server = "{$client['server_addr']}:{$client['server_port']}";
771
?>
772
				<tr <?=isset($server['disable']) ? 'class="disabled"':''?>>
773
					<td>
774
						<?=htmlspecialchars($client['protocol'])?>
775 d799787e Matthew Grooms
					</td>
776 bea9e9d6 sbeaver
					<td>
777
						<?=htmlspecialchars($server)?>
778 d799787e Matthew Grooms
					</td>
779 bea9e9d6 sbeaver
					<td>
780
						<?=htmlspecialchars($client['description'])?>
781 d799787e Matthew Grooms
					</td>
782 bea9e9d6 sbeaver
					<td>
783
						<a href="vpn_openvpn_client.php?act=edit&amp;id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit")?></a>
784
						<a href="vpn_openvpn_client.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
785 d799787e Matthew Grooms
					</td>
786
				</tr>
787 bea9e9d6 sbeaver
<?php
788
		$i++;
789
	endforeach;
790
?>
791
			</tbody>
792
		</table>
793
	</div>
794
</div>
795
796
<nav class="action-buttons">
797
	<a href="vpn_openvpn_client.php?act=new" class="btn btn-sm btn-success">
798
		<?=gettext("Add server")?>
799
	</a>
800
</nav>
801
802
<?php
803
endif;
804
805
// Note:
806
// The following *_change() functions were converted from Javascript/DOM to JQuery but otherwise
807
// mostly left unchanged. The logic on this form is complex andthis works!
808
?>
809
810 91f026b0 ayvis
<script type="text/javascript">
811 770f29c4 Colin Fleming
//<![CDATA[
812 bea9e9d6 sbeaver
events.push(function(){
813
814
	function mode_change() {
815
		value = $('#mode').val();
816
817
		switch(value) {
818
			case "p2p_tls":
819
				hideInput('tls', false);
820
				hideCheckbox('tlsauth_enable', false);
821
				hideCheckbox('autotls_enable', false);
822
				hideInput('caref', false);
823
				hideInput('certreft', false);
824
				hideClass('authentication', false);
825
				hideCheckbox('autokey_enable', true);
826
				hideInput('shared_key', true);
827
				break;
828
			case "p2p_shared_key":
829
				hideInput('tls', true);
830
				hideCheckbox('tlsauth_enable', true);
831
				hideCheckbox('autotls_enable', true);
832
				hideInput('caref', true);
833
				hideInput('certreft', true);
834
				hideClass('authentication', true);
835
				hideCheckbox('autokey_enable', false);
836
				hideInput('shared_key', false);
837
				break;
838
		}
839
	}
840 d799787e Matthew Grooms
841 bea9e9d6 sbeaver
	function dev_mode_change() {
842
		hideCheckbox('no_tun_ipv6', ($('#dev_mode').val() == 'tap'));
843
	}
844
845
	function autokey_change() {
846
		hideInput('shared_key', $('#autokey_enable').prop('checked'));
847
	}
848
849
	function useproxy_changed() {
850
		hideInput('proxy_user', ($('#proxy_authtype').val() == 'none'));
851
		hideInput('proxy_passwd', ($('#proxy_authtype').val() == 'none'));
852
	}
853
854
	function tlsauth_change() {
855
		var hide  = ! $('#tlsauth_enable').prop('checked')
856
857
	<?php if (!$pconfig['tls']): ?>
858
		hideCheckbox('autotls_enable', hide);
859
	<?php endif; ?>
860 d799787e Matthew Grooms
861 bea9e9d6 sbeaver
		autotls_change();
862
	}
863
864
	function autotls_change() {
865
866
	<?php if (!$pconfig['tls']): ?>
867
		autocheck = $('#autotls_enable').prop('checked');
868
	<?php else: ?>
869
		autocheck = false;
870
	<?php endif; ?>
871 d799787e Matthew Grooms
872 bea9e9d6 sbeaver
	if ($('#tlsauth_enable').prop('checked')  && !autocheck)
873
	   hideInput('tls', false);
874 88e545b4 jim-p
	else
875 bea9e9d6 sbeaver
	   hideInput('tls', true);
876
	}
877 d799787e Matthew Grooms
878 bea9e9d6 sbeaver
	// ---------- Library of show/hide functions ----------------------------------------------------------------------
879
880
	// Hides the <div> in which the specified input element lives so that the input,
881
	// its label and help text are hidden
882
	function hideInput(id, hide) {
883
		if(hide)
884
			$('#' + id).parent().parent('div').addClass('hidden');
885
		else
886
			$('#' + id).parent().parent('div').removeClass('hidden');
887
	}
888
889
	// Hides the <div> in which the specified checkbox lives so that the checkbox,
890
	// its label and help text are hidden
891
	function hideCheckbox(id, hide) {
892
		if(hide)
893
			$('#' + id).parent().parent().parent('div').addClass('hidden');
894
		else
895
			$('#' + id).parent().parent().parent('div').removeClass('hidden');
896
	}
897
898
	// Disables the specified input element
899
	function disableInput(id, disable) {
900
		$('#' + id).prop("disabled", disable);
901
	}
902
903
	// Hides all elements of the specified class. This will usually be a section or group
904
	function hideClass(s_class, hide) {
905
		if(hide)
906
			$('.' + s_class).hide();
907
		else
908
			$('.' + s_class).show();
909
	}
910
911
	// ---------- Monitor elements for change and call the appropriate display functions ------------------------------
912
913
	 // TLS Authorization
914
	$('#tlsauth_enable').click(function () {
915
		tlsauth_change();
916
	});
917
918
	 // Auto key
919
	$('#autokey_enable').click(function () {
920
		autokey_change();
921
	});
922
923
	 // Mode
924
	$('#mode').click(function () {
925
		mode_change();
926
	});
927
928
	 // Use proxy
929
	$('#proxy_authtype').click(function () {
930
		useproxy_changed();
931
	});
932
933
	 // Tun/tap
934
	$('#dev_mode').click(function () {
935
		dev_mode_change();
936
	});
937
938
	// ---------- Set initial page display state ----------------------------------------------------------------------
939
	mode_change();
940
	autokey_change();
941
	tlsauth_change();
942
	useproxy_changed();
943
	dev_mode_change();
944
});
945
//]]>
946
</script>
947
948
<?php include("foot.inc");