Project

General

Profile

Download (12.2 KB) Statistics
| Branch: | Tag: | Revision:
1 5b237745 Scott Ullrich
<?php
2
/*
3
	guiconfig.inc
4 be81829f Scott Ullrich
	by Scott Ullrich, Copyright 2004, All rights reserved.
5
	originally based on of m0n0wall (http://m0n0.ch/wall)
6
7 5b237745 Scott Ullrich
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
8
	All rights reserved.
9 be81829f Scott Ullrich
10 5b237745 Scott Ullrich
	Redistribution and use in source and binary forms, with or without
11
	modification, are permitted provided that the following conditions are met:
12 be81829f Scott Ullrich
13 5b237745 Scott Ullrich
	1. Redistributions of source code must retain the above copyright notice,
14
	   this list of conditions and the following disclaimer.
15 be81829f Scott Ullrich
16 5b237745 Scott Ullrich
	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 be81829f Scott Ullrich
20 5b237745 Scott Ullrich
	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
/* make sure nothing is cached */
33
if (!$omit_nocacheheaders) {
34
	header("Expires: 0");
35
	header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
36
	header("Cache-Control: no-store, no-cache, must-revalidate");
37
	header("Cache-Control: post-check=0, pre-check=0", false);
38
	header("Pragma: no-cache");
39
}
40
41
/* parse the configuration and include all configuration functions */
42
require_once("config.inc");
43
require_once("functions.inc");
44
45
$d_natconfdirty_path = $g['varrun_path'] . "/nat.conf.dirty";
46
$d_filterconfdirty_path = $g['varrun_path'] . "/filter.conf.dirty";
47
$d_ipsecconfdirty_path = $g['varrun_path'] . "/ipsec.conf.dirty";
48
$d_shaperconfdirty_path = $g['varrun_path'] . "/shaper.conf.dirty";
49
$d_pptpuserdirty_path = $g['varrun_path'] . "/pptpd.user.dirty";
50
$d_hostsdirty_path = $g['varrun_path'] . "/hosts.dirty";
51
$d_staticmapsdirty_path = $g['varrun_path'] . "/staticmaps.dirty";
52
$d_staticroutesdirty_path = $g['varrun_path'] . "/staticroutes.dirty";
53
$d_aliasesdirty_path = $g['varrun_path'] . "/aliases.dirty";
54
$d_proxyarpdirty_path = $g['varrun_path'] . "/proxyarp.dirty";
55
$d_fwupenabled_path = $g['varrun_path'] . "/fwup.enabled";
56
$d_firmwarelock_path = $g['varrun_path'] . "/firmware.lock";
57
$d_sysrebootreqd_path = $g['varrun_path'] . "/sysreboot.reqd";
58
$d_passthrumacsdirty_path = $g['varrun_path'] . "/passthrumacs.dirty";
59
$d_allowedipsdirty_path = $g['varrun_path'] . "/allowedips.dirty";
60
$d_ovpnclidirty_path = $g['varrun_path'] . "/ovpnclient.dirty";
61
62
if (file_exists($d_firmwarelock_path)) {
63
	if (!$d_isfwfile) {
64
		header("Location: system_firmware.php");
65
		exit;
66
	} else {
67
		return;
68
	}
69
}
70
71
/* some well knows ports */
72 be81829f Scott Ullrich
$wkports = array(3389 => "MS RDP", 21 => "FTP", 22 => "SSH", 23 => "Telnet", 25 => "SMTP",
73
		53 => "DNS", 80 => "HTTP", 110 => "POP3", 143 => "IMAP", 443 => "HTTPS");
74 5b237745 Scott Ullrich
75
$iptos = array("lowdelay", "throughput", "reliability", "mincost", "congestion");
76
/* TCP flags */
77
$tcpflags = array("fin", "syn", "rst", "psh", "ack", "urg");
78
79
$specialnets = array("lan" => "LAN net", "pptp" => "PPTP clients");
80
81
for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
82
	$specialnets['opt' . $i] = $config['interfaces']['opt' . $i]['descr'] . " net";
83
}
84 be81829f Scott Ullrich
85 5b237745 Scott Ullrich
$medias = array("auto" => "autoselect", "100full" => "100BASE-TX full-duplex",
86
	"100half" => "100BASE-TX half-duplex", "10full" => "10BASE-T full-duplex",
87
	"10half" => "10BASE-T half-duplex");
88 be81829f Scott Ullrich
89 5b237745 Scott Ullrich
/* platforms that support firmware updating */
90
$fwupplatforms = array('net45xx', 'net48xx', 'generic-pc', 'wrap');
91
92
/* IPsec defines */
93
$my_identifier_list = array('myaddress' => 'My IP address',
94
							'address' => 'IP address',
95
							'fqdn' => 'Domain name',
96
							'user_fqdn' => 'User FQDN');
97
98 be81829f Scott Ullrich
$p1_ealgos = array('des' => 'DES', '3des' => '3DES', 'blowfish' => 'Blowfish',
99 5b237745 Scott Ullrich
					'cast128' => 'CAST128');
100
$p2_ealgos = array('des' => 'DES', '3des' => '3DES', 'blowfish' => 'Blowfish',
101
					'cast128' => 'CAST128', 'rijndael' => 'Rijndael (AES)');
102
$p1_halgos = array('sha1' => 'SHA1', 'md5' => 'MD5');
103
$p2_halgos = array('hmac_sha1' => 'SHA1', 'hmac_md5' => 'MD5');
104
$p2_protos = array('esp' => 'ESP', 'ah' => 'AH');
105
$p2_pfskeygroups = array('0' => 'off', '1' => '1', '2' => '2', '5' => '5');
106
107
function do_input_validation($postdata, $reqdfields, $reqdfieldsn, $input_errors) {
108 be81829f Scott Ullrich
109
	/* check for bad control characters */
110 5b237745 Scott Ullrich
	foreach ($postdata as $pn => $pd) {
111
		if (is_string($pd) && preg_match("/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/", $pd)) {
112
			$input_errors[] = "The field '" . $pn . "' contains invalid characters.";
113
		}
114
	}
115 be81829f Scott Ullrich
116 5b237745 Scott Ullrich
	for ($i = 0; $i < count($reqdfields); $i++) {
117
		if (!$_POST[$reqdfields[$i]]) {
118
			$input_errors[] = "The field '" . $reqdfieldsn[$i] . "' is required.";
119
		}
120 be81829f Scott Ullrich
	}
121 5b237745 Scott Ullrich
}
122
123
function print_input_errors($input_errors) {
124
	echo "<p><table border=\"0\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\">\n";
125
	echo "<tr><td bgcolor=\"#A12A2A\" width=\"36\" align=\"center\" valign=\"top\"><img src=\"/err.gif\" width=\"28\" height=\"32\"></td>\n";
126
	echo "<td bgcolor=\"#FFD9D1\" style=\"padding-left: 8px; padding-top: 6px\">";
127 be81829f Scott Ullrich
128 5b237745 Scott Ullrich
	echo "<span class=\"errmsg\"><p>The following input errors were detected:<ul>\n";
129
	foreach ($input_errors as $ierr) {
130
		echo "<li>" . htmlspecialchars($ierr) . "</li>\n";
131
	}
132
	echo "</ul></span>";
133 be81829f Scott Ullrich
134 5b237745 Scott Ullrich
	echo "</td></tr></table></p>";
135
}
136
137
function exec_rc_script($scriptname) {
138 be81829f Scott Ullrich
139 5b237745 Scott Ullrich
	global $d_sysrebootreqd_path;
140 be81829f Scott Ullrich
141 5b237745 Scott Ullrich
	if (file_exists($d_sysrebootreqd_path))
142
		return 0;
143 be81829f Scott Ullrich
144 5b237745 Scott Ullrich
	exec($scriptname . " >/dev/null 2>&1", $execoutput, $retval);
145 be81829f Scott Ullrich
	return $retval;
146 5b237745 Scott Ullrich
}
147
148
function exec_rc_script_async($scriptname) {
149 be81829f Scott Ullrich
150 5b237745 Scott Ullrich
	global $d_sysrebootreqd_path;
151 be81829f Scott Ullrich
152 5b237745 Scott Ullrich
	if (file_exists($d_sysrebootreqd_path))
153
		return 0;
154 be81829f Scott Ullrich
155 5b237745 Scott Ullrich
	exec("nohup " . $scriptname . " >/dev/null 2>&1 &", $execoutput, $retval);
156 be81829f Scott Ullrich
	return $retval;
157 5b237745 Scott Ullrich
}
158
159
function verify_gzip_file($fname) {
160
161
	$returnvar = mwexec("/usr/bin/gunzip -S \"\" -t " . escapeshellarg($fname));
162
	if ($returnvar != 0)
163
		return 0;
164
	else
165
		return 1;
166
}
167
168
function print_info_box_np($msg) {
169
	echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\">\n";
170 698ba01f Scott Ullrich
	echo "<tr><td bgcolor=\"#990000\" align=\"center\" valign=\"top\" width=\"36\"><img src=\"/exclam.gif\" width=\"28\" height=\"32\"></td>\n";
171 7f5b4824 Scott Ullrich
	echo "<td bgcolor=\"#00000\" style=\"padding-left: 8px\"><font color=\"#ffffff\">";
172 5b237745 Scott Ullrich
	echo $msg;
173 7f5b4824 Scott Ullrich
	echo "</td></tr></table><br>";
174 5b237745 Scott Ullrich
}
175
176
function print_info_box($msg) {
177
	echo "<p>";
178
	print_info_box_np($msg);
179
	echo "</p>";
180
}
181
182
function format_bytes($bytes) {
183
	if ($bytes >= 1073741824) {
184
		return sprintf("%.2f GB", $bytes/1073741824);
185
	} else if ($bytes >= 1048576) {
186
		return sprintf("%.2f MB", $bytes/1048576);
187
	} else if ($bytes >= 1024) {
188
		return sprintf("%.0f KB", $bytes/1024);
189
	} else {
190
		return sprintf("%d bytes", $bytes);
191
	}
192
}
193
194
function get_std_save_message($ok) {
195
	global $d_sysrebootreqd_path;
196
197
	if ($ok == 0) {
198
		if (file_exists($d_sysrebootreqd_path))
199 7f5b4824 Scott Ullrich
			return "The changes have been saved. You must <a class=\"navlnk\" href=\"/reboot.php\">reboot</a> your firewall for changes to take effect.";
200 5b237745 Scott Ullrich
		else
201
			return "The changes have been applied successfully.";
202
	} else {
203
		return "ERROR: the changes could not be applied (error code $ok).";
204
	}
205
}
206
207
function pprint_address($adr) {
208
	global $specialnets;
209
210
	if (isset($adr['any'])) {
211
		$padr = "*";
212
	} else if ($adr['network']) {
213
		$padr = $specialnets[$adr['network']];
214
	} else {
215
		$padr = $adr['address'];
216
	}
217 be81829f Scott Ullrich
218 5b237745 Scott Ullrich
	if (isset($adr['not']))
219
		$padr = "! " . $padr;
220 be81829f Scott Ullrich
221 5b237745 Scott Ullrich
	return $padr;
222
}
223
224
function pprint_port($port) {
225
	global $wkports;
226
227
	$pport = "";
228 be81829f Scott Ullrich
229 5b237745 Scott Ullrich
	if (!$port)
230
		echo "*";
231
	else {
232
		$srcport = explode("-", $port);
233
		if ((!$srcport[1]) || ($srcport[0] == $srcport[1])) {
234
			$pport = $srcport[0];
235
			if ($wkports[$srcport[0]]) {
236
				$pport .= " (" . $wkports[$srcport[0]] . ")";
237
			}
238
		} else
239
			$pport .= $srcport[0] . " - " . $srcport[1];
240
	}
241 be81829f Scott Ullrich
242 5b237745 Scott Ullrich
	return $pport;
243
}
244
245
/* sort by interface only, retain the original order of rules that apply to
246
   the same interface */
247
function filter_rules_sort() {
248
	global $g, $config;
249 be81829f Scott Ullrich
250 5b237745 Scott Ullrich
	/* mark each rule with the sequence number (to retain the order while sorting) */
251
	for ($i = 0; isset($config['filter']['rule'][$i]); $i++)
252
		$config['filter']['rule'][$i]['seq'] = $i;
253 be81829f Scott Ullrich
254 5b237745 Scott Ullrich
	function filtercmp($a, $b) {
255
		if ($a['interface'] == $b['interface'])
256
			return $a['seq'] - $b['seq'];
257
		else
258
			return -strcmp($a['interface'], $b['interface']);
259
	}
260 be81829f Scott Ullrich
261 5b237745 Scott Ullrich
	usort($config['filter']['rule'], "filtercmp");
262 be81829f Scott Ullrich
263 5b237745 Scott Ullrich
	/* strip the sequence numbers again */
264
	for ($i = 0; isset($config['filter']['rule'][$i]); $i++)
265
		unset($config['filter']['rule'][$i]['seq']);
266
}
267
268
function nat_rules_sort() {
269
	global $g, $config;
270 be81829f Scott Ullrich
271 5b237745 Scott Ullrich
	function natcmp($a, $b) {
272
		if ($a['external-address'] == $b['external-address']) {
273
			if ($a['protocol'] == $b['protocol']) {
274
				if ($a['external-port'] == $b['external-port']) {
275
					return 0;
276
				} else {
277
					return ($a['external-port'] - $b['external-port']);
278
				}
279
			} else {
280
				return strcmp($a['protocol'], $b['protocol']);
281
			}
282
		} else if (!$a['external-address'])
283
			return 1;
284
		else if (!$b['external-address'])
285
			return -1;
286
		else
287
			return ipcmp($a['external-address'], $b['external-address']);
288
	}
289 be81829f Scott Ullrich
290 5b237745 Scott Ullrich
	usort($config['nat']['rule'], "natcmp");
291
}
292
293
function nat_1to1_rules_sort() {
294
	global $g, $config;
295 be81829f Scott Ullrich
296 5b237745 Scott Ullrich
	function nat1to1cmp($a, $b) {
297
		return ipcmp($a['external'], $b['external']);
298
	}
299 be81829f Scott Ullrich
300 5b237745 Scott Ullrich
	usort($config['nat']['onetoone'], "nat1to1cmp");
301
}
302
303
function nat_server_rules_sort() {
304
	global $g, $config;
305 be81829f Scott Ullrich
306 5b237745 Scott Ullrich
	function natservercmp($a, $b) {
307
		return ipcmp($a['ipaddr'], $b['ipaddr']);
308
	}
309 be81829f Scott Ullrich
310 5b237745 Scott Ullrich
	usort($config['nat']['servernat'], "natservercmp");
311
}
312
313
function nat_out_rules_sort() {
314
	global $g, $config;
315 be81829f Scott Ullrich
316 5b237745 Scott Ullrich
	function natoutcmp($a, $b) {
317
		return strcmp($a['source']['network'], $b['source']['network']);
318
	}
319 be81829f Scott Ullrich
320 5b237745 Scott Ullrich
	usort($config['nat']['advancedoutbound']['rule'], "natoutcmp");
321
}
322
323
function pptpd_users_sort() {
324
	global $g, $config;
325 be81829f Scott Ullrich
326 5b237745 Scott Ullrich
	function usercmp($a, $b) {
327
		return strcasecmp($a['name'], $b['name']);
328
	}
329 be81829f Scott Ullrich
330 5b237745 Scott Ullrich
	usort($config['pptpd']['user'], "usercmp");
331
}
332
333
function staticroutes_sort() {
334
	global $g, $config;
335
336
	function staticroutecmp($a, $b) {
337
		return strcmp($a['network'], $b['network']);
338
	}
339
340
	usort($config['staticroutes']['route'], "staticroutecmp");
341
}
342
343
function hosts_sort() {
344
	global $g, $config;
345
346
	function hostcmp($a, $b) {
347
		return strcasecmp($a['host'], $b['host']);
348
	}
349
350
	usort($config['dnsmasq']['hosts'], "hostcmp");
351
}
352
353
function staticmaps_sort($if) {
354
	global $g, $config;
355
356
	function staticmapcmp($a, $b) {
357
		return ipcmp($a['ipaddr'], $b['ipaddr']);
358
	}
359
360
	usort($config['dhcpd'][$if]['staticmap'], "staticmapcmp");
361
}
362
363
function aliases_sort() {
364
	global $g, $config;
365
366
	function aliascmp($a, $b) {
367
		return strcmp($a['name'], $b['name']);
368
	}
369
370
	usort($config['aliases']['alias'], "aliascmp");
371
}
372
373
function ipsec_mobilekey_sort() {
374
	global $g, $config;
375
376
	function mobilekeycmp($a, $b) {
377
		return strcmp($a['ident'][0], $b['ident'][0]);
378
	}
379
380
	usort($config['ipsec']['mobilekey'], "mobilekeycmp");
381
}
382
383
function proxyarp_sort() {
384
	global $g, $config;
385
386
	function proxyarpcmp($a, $b) {
387
		if (isset($a['network']))
388
			list($ast,$asn) = explode("/", $a['network']);
389
		else if (isset($a['range'])) {
390
			$ast = $a['range']['from'];
391
			$asn = 32;
392
		}
393
		if (isset($b['network']))
394
			list($bst,$bsn) = explode("/", $b['network']);
395
		else if (isset($b['range'])) {
396
			$bst = $b['range']['from'];
397
			$bsn = 32;
398
		}
399
		if (ipcmp($ast, $bst) == 0)
400
			return ($asn - $bsn);
401
		else
402
			return ipcmp($ast, $bst);
403
	}
404
405
	usort($config['proxyarp']['proxyarpnet'], "proxyarpcmp");
406
}
407
408
function passthrumacs_sort() {
409
	global $g, $config;
410
411
	function passthrumacscmp($a, $b) {
412
		return strcmp($a['mac'], $b['mac']);
413
	}
414 be81829f Scott Ullrich
415 5b237745 Scott Ullrich
	usort($config['captiveportal']['passthrumac'],"passthrumacscmp");
416
}
417
418
function allowedips_sort() {
419
	global $g, $config;
420
421
	function allowedipscmp($a, $b) {
422
		return strcmp($a['ip'], $b['ip']);
423
	}
424 be81829f Scott Ullrich
425 5b237745 Scott Ullrich
	usort($config['captiveportal']['allowedip'],"allowedipscmp");
426
}
427
428
function wol_sort() {
429
	global $g, $config;
430
431
	function wolcmp($a, $b) {
432
		return strcmp($a['descr'], $b['descr']);
433
	}
434 be81829f Scott Ullrich
435 5b237745 Scott Ullrich
	usort($config['wol']['wolentry'], "wolcmp");
436
}
437
438
function gentitle($pgname) {
439
	global $config;
440
	return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
441
}
442
443
?>