Project

General

Profile

Download (29.2 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
	firewall_aliases_edit.php
5
	Copyright (C) 2004 Scott Ullrich
6
	Copyright (C) 2009 Ermal Lu?i
7
	Copyright (C) 2010 Jim Pingle
8
	All rights reserved.
9

    
10
	originially part of m0n0wall (http://m0n0.ch/wall)
11
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
12
	All rights reserved.
13

    
14
	Redistribution and use in source and binary forms, with or without
15
	modification, are permitted provided that the following conditions are met:
16

    
17
	1. Redistributions of source code must retain the above copyright notice,
18
	   this list of conditions and the following disclaimer.
19

    
20
	2. Redistributions in binary form must reproduce the above copyright
21
	   notice, this list of conditions and the following disclaimer in the
22
	   documentation and/or other materials provided with the distribution.
23

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

    
40
##|+PRIV
41
##|*IDENT=page-firewall-alias-edit
42
##|*NAME=Firewall: Alias: Edit page
43
##|*DESCR=Allow access to the 'Firewall: Alias: Edit' page.
44
##|*MATCH=firewall_aliases_edit.php*
45
##|-PRIV
46

    
47

    
48
// Keywords not allowed in names
49
$reserved_keywords = array("all", "pass", "block", "out", "queue", "max", "min", "pptp", "pppoe", "L2TP", "OpenVPN", "IPsec");
50

    
51
require("guiconfig.inc");
52
require_once("functions.inc");
53
require_once("filter.inc");
54
require_once("shaper.inc");
55

    
56
$pgtitle = array(gettext("Firewall"),gettext("Aliases"),gettext("Edit"));
57

    
58
$reserved_ifs = get_configured_interface_list(false, true);
59
$reserved_keywords = array_merge($reserved_keywords, $reserved_ifs);
60

    
61
if (!is_array($config['aliases']['alias']))
62
	$config['aliases']['alias'] = array();
63
$a_aliases = &$config['aliases']['alias'];
64

    
65
$tab = $_REQUEST['tab'];
66

    
67
if($_POST)
68
	$origname = $_POST['origname'];
69

    
70
// Debugging
71
if($debug)
72
	exec("rm -f {$g['tmp_path']}/alias_rename_log.txt");
73

    
74
function alias_same_type($name, $type) {
75
	global $config;
76

    
77
	foreach ($config['aliases']['alias'] as $alias) {
78
		if ($name == $alias['name']) {
79
			if (in_array($type, array("host", "network")) &&
80
				in_array($alias['type'], array("host", "network")))
81
				return true;
82
			if ($type  == $alias['type'])
83
				return true;
84
			else
85
				return false;
86
		}
87
	}
88
	return true;
89
}
90

    
91
$id = $_GET['id'];
92
if (isset($_POST['id']))
93
	$id = $_POST['id'];
94

    
95
if (isset($id) && $a_aliases[$id]) {
96
	$original_alias_name = $a_aliases[$id]['name'];
97
	$pconfig['name'] = $a_aliases[$id]['name'];
98
	$pconfig['detail'] = $a_aliases[$id]['detail'];
99
	$pconfig['address'] = $a_aliases[$id]['address'];
100
	$pconfig['type'] = $a_aliases[$id]['type'];
101
	$pconfig['descr'] = html_entity_decode($a_aliases[$id]['descr']);
102

    
103
	/* interface list */
104
	$iflist = get_configured_interface_with_descr(false, true);
105
	foreach ($iflist as $if => $ifdesc)
106
		if($ifdesc == $pconfig['descr'])
107
			$input_errors[] = sprintf(gettext("Sorry, an interface is already named %s."), $pconfig['descr']);
108

    
109
	if($a_aliases[$id]['type'] == "urltable") {
110
		$pconfig['address'] = $a_aliases[$id]['url'];
111
		$pconfig['updatefreq'] = $a_aliases[$id]['updatefreq'];
112
	}
113
	if($a_aliases[$id]['aliasurl'] <> "") {
114
		$pconfig['type'] = "url";
115
		if(is_array($a_aliases[$id]['aliasurl']))
116
			$pconfig['address'] = implode(" ", $a_aliases[$id]['aliasurl']);
117
		else
118
			$pconfig['address'] = $a_aliases[$id]['aliasurl'];
119
	}
120
}
121

    
122
if ($_POST) {
123
	unset($input_errors);
124

    
125
	/* input validation */
126

    
127
	$reqdfields = explode(" ", "name");
128
	$reqdfieldsn = array(gettext("Name"));
129

    
130
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
131

    
132
	$x = is_validaliasname($_POST['name']);
133
	if (!isset($x)) {
134
		$input_errors[] = gettext("Reserved word used for alias name.");
135
	} else if ($_POST['type'] == "port" && (getservbyname($_POST['name'], "tcp") || getservbyname($_POST['name'], "udp"))) {
136
		$input_errors[] = gettext("Reserved word used for alias name.");
137
	} else {
138
		if (is_validaliasname($_POST['name']) == false)
139
			$input_errors[] = gettext("The alias name must be less than 32 characters long and may only consist of the characters") . " a-z, A-Z, 0-9, _.";
140
	}
141
	/* check for name conflicts */
142
	if (empty($a_aliases[$id])) {
143
		foreach ($a_aliases as $alias) {
144
			if ($alias['name'] == $_POST['name']) {
145
				$input_errors[] = gettext("An alias with this name already exists.");
146
				break;
147
			}
148
		}
149
	}
150

    
151
	/* Check for reserved keyword names */
152
	foreach($reserved_keywords as $rk)
153
		if($rk == $_POST['name'])
154
			$input_errors[] = sprintf(gettext("Cannot use a reserved keyword as alias name %s"), $rk);
155

    
156
	/* check for name interface description conflicts */
157
	foreach($config['interfaces'] as $interface) {
158
		if($interface['descr'] == $_POST['name']) {
159
			$input_errors[] = gettext("An interface description with this name already exists.");
160
			break;
161
		}
162
	}
163

    
164
	$alias = array();
165
	$address = array();
166
	$final_address_details = array();
167
	$alias['name'] = $_POST['name'];
168

    
169
	if ($_POST['type'] == "urltable") {
170
		$address = "";
171
		$isfirst = 0;
172

    
173
		/* item is a url type */
174
		if ($_POST['address0']) {
175
			/* fetch down and add in */
176
			$_POST['address0'] = trim($_POST['address0']);
177
			$isfirst = 0;
178
			$address[] = $_POST['address0'];
179
			$alias['url'] = $_POST['address0'];
180
			$alias['updatefreq'] = $_POST['address_subnet0'] ? $_POST['address_subnet0'] : 7;
181
			if (!is_URL($alias['url']) || empty($alias['url'])) {
182
				$input_errors[] = gettext("You must provide a valid URL.");
183
				$dont_update = true;
184
			} elseif (! process_alias_urltable($alias['name'], $alias['url'], 0, true)) {
185
				$input_errors[] = gettext("Unable to fetch usable data.");
186
				$dont_update = true;
187
			}
188
			if ($_POST["detail0"] <> "")
189
				$final_address_details[] = $_POST["detail0"];
190
			else
191
				$final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
192
		}
193
	} elseif($_POST['type'] == "url") {
194
		$isfirst = 0;
195
		$address_count = 2;
196

    
197
		/* item is a url type */
198
		for($x=0; $x<4999; $x++) {
199
			$_POST['address' . $x] = trim($_POST['address' . $x]);
200
			if($_POST['address' . $x]) {
201
				/* fetch down and add in */
202
				$isfirst = 0;
203
				$temp_filename = tempnam("{$g['tmp_path']}/", "alias_import");
204
				unlink($temp_filename);
205
				mwexec("/bin/mkdir -p {$temp_filename}");
206
				mwexec("/usr/bin/fetch -q -o \"{$temp_filename}/aliases\" \"" . $_POST['address' . $x] . "\"");
207
				/* if the item is tar gzipped then extract */
208
				if(stristr($_POST['address' . $x], ".tgz"))
209
					process_alias_tgz($temp_filename);
210
				else if(stristr($_POST['address' . $x], ".zip"))
211
					process_alias_unzip($temp_filename);
212

    
213
				if (!isset($alias['aliasurl']))
214
					$alias['aliasurl'] = array();
215

    
216
				$alias['aliasurl'][] = $_POST['address' . $x];
217
				if ($_POST["detail{$x}"] <> "")
218
					$final_address_details[] = $_POST["detail{$x}"];
219
				else
220
					$final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
221

    
222
				if(file_exists("{$temp_filename}/aliases")) {
223
					$file_contents = file_get_contents("{$temp_filename}/aliases");
224
					$file_contents = str_replace("#", "\n#", $file_contents);
225
					$file_contents_split = explode("\n", $file_contents);
226
					foreach($file_contents_split as $fc) {
227
						// Stop at 3000 items, aliases larger than that tend to break both pf and the WebGUI.
228
						if ($address_count >= 3000)
229
							break;
230
						$tmp = trim($fc);
231
						if(stristr($fc, "#")) {
232
							$tmp_split = explode("#", $tmp);
233
							$tmp = trim($tmp_split[0]);
234
						}
235
						$tmp = trim($tmp);
236
						if(!empty($tmp) && (is_ipaddr($tmp) || is_subnet($tmp))) {
237
							$address[] = $tmp;
238
							$isfirst = 1;
239
							$address_count++;
240
						}
241
					}
242
					if($isfirst == 0) {
243
						/* nothing was found */
244
						$input_errors[] = sprintf(gettext("You must provide a valid URL. Could not fetch usable data from '%s'."), $_POST['address' . $x]);
245
						$dont_update = true;
246
					}
247
					mwexec("/bin/rm -rf {$temp_filename}");
248
				} else {
249
					$input_errors[] = sprintf(gettext("URL '%s' is not valid."), $_POST['address' . $x]);
250
					$dont_update = true;
251
				}
252
			}
253
		}
254
	} else {
255
		/* item is a normal alias type */
256
		$used_for_routes = 0;
257
		if (isset($config['staticroutes']['route']) && is_array($config['staticroutes']['route'])) {
258
			foreach($config['staticroutes']['route'] as $route) {
259
				if ($route['network'] == $_POST['origname']) {
260
					$used_for_routes = 1;
261
					break;
262
				}
263
			}
264
		}
265
		$wrongaliases = "";
266
		for($x=0; $x<4999; $x++) {
267
			if($_POST["address{$x}"] <> "") {
268
				$_POST["address{$x}"] = trim($_POST["address{$x}"]);
269
				if (is_alias($_POST["address{$x}"])) {
270
					if (!alias_same_type($_POST["address{$x}"], $_POST['type']))
271
						// But alias type network can include alias type urltable. Feature#1603.
272
						if (!($_POST['type'] == 'network' &&
273
						      alias_get_type($_POST["address{$x}"]) == 'urltable'))
274
							$wrongaliases .= " " . $_POST["address{$x}"];
275
				} else if ($_POST['type'] == "port") {
276
					if (!is_port($_POST["address{$x}"]))
277
						$input_errors[] = $_POST["address{$x}"] . " " . gettext("is not a valid port or alias.");
278
				} else if ($_POST['type'] == "host" || $_POST['type'] == "network") {
279
					if (!is_ipaddr($_POST["address{$x}"])
280
					 && !is_hostname($_POST["address{$x}"])
281
					 && !is_iprange($_POST["address{$x}"]))
282
						$input_errors[] = sprintf(gettext('%1$s is not a valid %2$s alias.'), $_POST["address{$x}"], $_POST['type']);
283
					if (($used_for_routes === 1)
284
					 && !is_ipaddr($_POST["address{$x}"])
285
					 && !is_iprange($_POST["address{$x}"])
286
					 && is_hostname($_POST["address{$x}"]))
287
						$input_errors[] = gettext('This alias is used on a static route and cannot contain FQDNs.');
288
				}
289
				if (is_iprange($_POST["address{$x}"])) {
290
					list($startip, $endip) = explode('-', $_POST["address{$x}"]);
291
					$rangesubnets = ip_range_to_subnet_array($startip, $endip);
292
					$address = array_merge($address, $rangesubnets);
293
				} else {
294
					$tmpaddress = $_POST["address{$x}"];
295
					if(is_ipaddr($_POST["address{$x}"]) && $_POST["address_subnet{$x}"] <> "")
296
						$tmpaddress .= "/" . $_POST["address_subnet{$x}"];
297
					$address[] = $tmpaddress;
298
				}
299
				if ($_POST["detail{$x}"] <> "")
300
					$final_address_details[] = $_POST["detail{$x}"];
301
				else
302
					$final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
303
			}
304
		}
305
		if ($wrongaliases <> "")
306
			$input_errors[] = sprintf(gettext('The alias(es): %s cannot be nested because they are not of the same type.'), $wrongaliases);
307
	}
308

    
309
	// Allow extending of the firewall edit page and include custom input validation
310
	pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/input_validation");
311

    
312
	if (!$input_errors) {
313
		$alias['address'] = is_array($address) ? implode(" ", $address) : $address;
314
		$alias['descr'] = $_POST['descr'];
315
		$alias['type'] = $_POST['type'];
316
		$alias['detail'] = implode("||", $final_address_details);
317

    
318
		/*   Check to see if alias name needs to be
319
		 *   renamed on referenced rules and such
320
		 */
321
		if ($_POST['name'] <> $_POST['origname']) {
322
			// Firewall rules
323
			update_alias_names_upon_change(array('filter', 'rule'), array('source', 'address'), $_POST['name'], $origname);
324
			update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
325
			update_alias_names_upon_change(array('filter', 'rule'), array('source', 'port'), $_POST['name'], $origname);
326
			update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'port'), $_POST['name'], $origname);
327
			// NAT Rules
328
			update_alias_names_upon_change(array('nat', 'rule'), array('source', 'address'), $_POST['name'], $origname);
329
			update_alias_names_upon_change(array('nat', 'rule'), array('source', 'port'), $_POST['name'], $origname);
330
			update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
331
			update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'port'), $_POST['name'], $origname);
332
			update_alias_names_upon_change(array('nat', 'rule'), array('target'), $_POST['name'], $origname);
333
			update_alias_names_upon_change(array('nat', 'rule'), array('local-port'), $_POST['name'], $origname);
334
			// NAT 1:1 Rules
335
			//update_alias_names_upon_change(array('nat', 'onetoone'), array('external'), $_POST['name'], $origname);
336
			//update_alias_names_upon_change(array('nat', 'onetoone'), array('source', 'address'), $_POST['name'], $origname);
337
			update_alias_names_upon_change(array('nat', 'onetoone'), array('destination', 'address'), $_POST['name'], $origname);
338
			// NAT Outbound Rules
339
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('source', 'network'), $_POST['name'], $origname);
340
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('sourceport'), $_POST['name'], $origname);
341
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
342
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('dstport'), $_POST['name'], $origname);
343
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('target'), $_POST['name'], $origname);
344
			// Alias in an alias
345
			update_alias_names_upon_change(array('aliases', 'alias'), array('address'), $_POST['name'], $origname);
346
		}
347

    
348
		pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_write_config");
349

    
350
		if (isset($id) && $a_aliases[$id]) {
351
			if ($a_aliases[$id]['name'] <> $alias['name']) {
352
				foreach ($a_aliases as $aliasid => $aliasd) {
353
					if ($aliasd['address'] <> "") {
354
						$tmpdirty = false;
355
						$tmpaddr = explode(" ", $aliasd['address']);
356
						foreach ($tmpaddr as $tmpidx => $tmpalias) {
357
							if ($tmpalias == $a_aliases[$id]['name']) {
358
								$tmpaddr[$tmpidx] = $alias['name'];
359
								$tmpdirty = true;
360
							}
361
						}
362
						if ($tmpdirty == true)
363
							$a_aliases[$aliasid]['address'] = implode(" ", $tmpaddr);
364
					}
365
				}
366
			}
367
			$a_aliases[$id] = $alias;
368
		} else
369
			$a_aliases[] = $alias;
370

    
371
		// Sort list
372
		$a_aliases = msort($a_aliases, "name");
373

    
374
		if (write_config())
375
			mark_subsystem_dirty('aliases');
376

    
377
		if(!empty($tab))
378
			header("Location: firewall_aliases.php?tab=" . htmlspecialchars ($tab));
379
		else
380
			header("Location: firewall_aliases.php");
381
		exit;
382
	}
383
	//we received input errors, copy data to prevent retype
384
	else
385
	{
386
		$pconfig['name'] = $_POST['name'];
387
		$pconfig['descr'] = $_POST['descr'];
388
		if ($_POST['type'] == 'url')
389
			$pconfig['address'] = implode(" ", $alias['aliasurl']);
390
		else
391
			$pconfig['address'] = implode(" ", $address);
392
		$pconfig['type'] = $_POST['type'];
393
		$pconfig['detail'] = implode("||", $final_address_details);
394
	}
395
}
396

    
397
include("head.inc");
398

    
399
$jscriptstr = <<<EOD
400

    
401
<script type="text/javascript">
402
//<![CDATA[
403
var objAlias = new Array(4999);
404
function typesel_change() {
405
	switch (document.iform.type.selectedIndex) {
406
		case 0:	/* host */
407
			var cmd;
408

    
409
			newrows = totalrows;
410
			for(i=0; i<newrows; i++) {
411
				comd = 'document.iform.address_subnet' + i + '.disabled = 1;';
412
				eval(comd);
413
				comd = 'document.iform.address_subnet' + i + '.value = "";';
414
				eval(comd);
415
			}
416
			break;
417
		case 1:	/* network */
418
			var cmd;
419

    
420
			newrows = totalrows;
421
			for(i=0; i<newrows; i++) {
422
				comd = 'document.iform.address_subnet' + i + '.disabled = 0;';
423
				eval(comd);
424
			}
425
			break;
426
		case 2:	/* port */
427
			var cmd;
428

    
429
			newrows = totalrows;
430
			for(i=0; i<newrows; i++) {
431
				comd = 'document.iform.address_subnet' + i + '.disabled = 1;';
432
				eval(comd);
433
				comd = 'document.iform.address_subnet' + i + '.value = "128";';
434
				eval(comd);
435
			}
436
			break;
437
/*		case 3:	// OpenVPN Users
438
			var cmd;
439

    
440
			newrows = totalrows;
441
			for(i=0; i<newrows; i++) {
442
				comd = 'document.iform.address_subnet' + i + '.disabled = 1;';
443
				eval(comd);
444
				comd = 'document.iform.address_subnet' + i + '.value = "";';
445
				eval(comd);
446
			}
447
			break;
448
*/
449
		case 3:	/* url */
450
			var cmd;
451
			newrows = totalrows;
452
			for(i=0; i<newrows; i++) {
453
				comd = 'document.iform.address_subnet' + i + '.disabled = 1;';
454
				eval(comd);
455
			}
456
			break;
457

    
458
		case 4:	/* urltable */
459
			var cmd;
460
			newrows = totalrows;
461
			for(i=0; i<newrows; i++) {
462
				comd = 'document.iform.address_subnet' + i + '.disabled = 0;';
463
				eval(comd);
464
			}
465
			break;
466
	}
467
}
468

    
469
function add_alias_control() {
470
	var name = "address" + (totalrows - 1);
471
	obj = document.getElementById(name);
472
	obj.setAttribute('class', 'formfldalias');
473
	obj.setAttribute('autocomplete', 'off');
474
	objAlias[totalrows - 1] = new AutoSuggestControl(obj, new StateSuggestions(addressarray));
475
}
476
EOD;
477

    
478
$network_str = gettext("Network");
479
$networks_str = gettext("Network(s)");
480
$cidr_str = gettext("CIDR");
481
$description_str = gettext("Description");
482
$hosts_str = gettext("Host(s)");
483
$ip_str = gettext("IP");
484
$ports_str = gettext("Port(s)");
485
$port_str = gettext("Port");
486
$url_str = gettext("URL");
487
$urltable_str = gettext("URL Table");
488
$update_freq_str = gettext("Update Freq.");
489

    
490
$networks_help = gettext("Networks are specified in CIDR format.  Select the CIDR mask that pertains to each entry. /32 specifies a single IPv4 host, /128 specifies a single IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 or /128 for IPv6. You may also enter an IP range such as 192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to fill the range.");
491
$hosts_help = gettext("Enter as many hosts as you would like.  Hosts must be specified by their IP address or fully qualified domain name (FQDN). FQDN hostnames are periodically re-resolved and updated. If multiple IPs are returned by a DNS query, all are used.");
492
$ports_help = gettext("Enter as many ports as you wish.  Port ranges can be expressed by seperating with a colon.");
493
$url_help = sprintf(gettext("Enter as many URLs as you wish. After saving %s will download the URL and import the items into the alias. Use only with small sets of IP addresses (less than 3000)."), $g['product_name']);
494
$urltable_help = sprintf(gettext("Enter a single URL containing a large number of IPs and/or Subnets. After saving %s will download the URL and create a table file containing these addresses. This will work with large numbers of addresses (30,000+) or small numbers."), $g['product_name']);
495

    
496
$openvpn_str = gettext("Username");
497
$openvpn_user_str = gettext("OpenVPN Users");
498
$openvpn_help = gettext("Enter as many usernames as you wish.");
499
$openvpn_freq = "";
500

    
501
$jscriptstr .= <<<EOD
502

    
503
function update_box_type() {
504
	var indexNum = document.forms[0].type.selectedIndex;
505
	var selected = document.forms[0].type.options[indexNum].text;
506
	if(selected == '{$networks_str}') {
507
		document.getElementById ("addressnetworkport").firstChild.data = "{$networks_str}";
508
		document.getElementById ("onecolumn").firstChild.data = "{$network_str}";
509
		document.getElementById ("twocolumn").firstChild.data = "{$cidr_str}";
510
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
511
		document.getElementById ("itemhelp").firstChild.data = "{$networks_help}";
512
		document.getElementById ("addrowbutton").style.display = 'block';
513
	} else if(selected == '{$hosts_str}') {
514
		document.getElementById ("addressnetworkport").firstChild.data = "{$hosts_str}";
515
		document.getElementById ("onecolumn").firstChild.data = "{$ip_str}";
516
		document.getElementById ("twocolumn").firstChild.data = "";
517
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
518
		document.getElementById ("itemhelp").firstChild.data = "{$hosts_help}";
519
		document.getElementById ("addrowbutton").style.display = 'block';
520
	} else if(selected == '{$ports_str}') {
521
		document.getElementById ("addressnetworkport").firstChild.data = "{$ports_str}";
522
		document.getElementById ("onecolumn").firstChild.data = "{$port_str}";
523
		document.getElementById ("twocolumn").firstChild.data = "";
524
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
525
		document.getElementById ("itemhelp").firstChild.data = "{$ports_help}";
526
		document.getElementById ("addrowbutton").style.display = 'block';
527
	} else if(selected == '{$url_str}') {
528
		document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
529
		document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
530
		document.getElementById ("twocolumn").firstChild.data = "";
531
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
532
		document.getElementById ("itemhelp").firstChild.data = "{$url_help}";
533
		document.getElementById ("addrowbutton").style.display = 'block';
534
	} else if(selected == '{$openvpn_user_str}') {
535
		document.getElementById ("addressnetworkport").firstChild.data = "{$openvpn_user_str}";
536
		document.getElementById ("onecolumn").firstChild.data = "{$openvpn_str}";
537
		document.getElementById ("twocolumn").firstChild.data = "{$openvpn_freq}";
538
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
539
		document.getElementById ("itemhelp").firstChild.data = "{$openvpn_help}";
540
		document.getElementById ("addrowbutton").style.display = 'block';
541
	} else if(selected == '{$urltable_str}') {
542
		if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
543
			addRowTo('maintable', 'formfldalias');
544
			typesel_change();
545
			add_alias_control(this);
546
		}
547
		document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
548
		document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
549
		document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
550
		document.getElementById ("threecolumn").firstChild.data = "";
551
		document.getElementById ("threecolumn").style.display = 'none';
552
		document.getElementById ("itemhelp").firstChild.data = "{$urltable_help}";
553
		document.getElementById ("addrowbutton").style.display = 'none';
554
	}
555
}
556
//]]>
557
</script>
558

    
559
EOD;
560

    
561
?>
562

    
563
<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
564
<?php
565
	include("fbegin.inc");
566
	echo $jscriptstr;
567
?>
568

    
569
<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
570
<script type="text/javascript" src="/javascript/row_helper.js"></script>
571
<script type="text/javascript" src="/javascript/autosuggest.js"></script>
572
<script type="text/javascript" src="/javascript/suggestions.js"></script>
573

    
574
<input type='hidden' name='address_type' value='textbox' />
575
<input type='hidden' name='address_subnet_type' value='select' />
576

    
577
<script type="text/javascript">
578
//<![CDATA[
579
	rowname[0] = "address";
580
	rowtype[0] = "textbox,ipv4v6";
581
	rowsize[0] = "30";
582

    
583
	rowname[1] = "address_subnet";
584
	rowtype[1] = "select,ipv4v6";
585
	rowsize[1] = "1";
586

    
587
	rowname[2] = "detail";
588
	rowtype[2] = "textbox";
589
	rowsize[2] = "50";
590
//]]>
591
</script>
592

    
593
<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_input_errors"); ?>
594
<?php if ($input_errors) print_input_errors($input_errors); ?>
595
<div id="inputerrors"></div>
596

    
597
<form action="firewall_aliases_edit.php" method="post" name="iform" id="iform">
598
<?php
599
if (empty($tab)) {
600
	if ($pconfig['type'] == 'urltable')
601
		$tab = 'url';
602
	else if ($pconfig['type'] == 'host')
603
		$tab = 'ip';
604
	else
605
		$tab = $pconfig['type'];
606
}
607
?>
608
<input name="tab" type="hidden" id="tab" value="<?=htmlspecialchars($tab);?>" />
609
<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall aliases edit">
610
	<tr>
611
		<td colspan="2" valign="top" class="listtopic"><?=gettext("Alias Edit"); ?></td>
612
	</tr>
613
	<tr>
614
		<td valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
615
		<td class="vtable">
616
			<input name="origname" type="hidden" id="origname" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
617
			<input name="name" type="text" id="name" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
618
			<?php if (isset($id) && $a_aliases[$id]): ?>
619
				<input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
620
			<?php endif; ?>
621
			<br />
622
			<span class="vexpl">
623
				<?=gettext("The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and _\"."); ?>
624
			</span>
625
		</td>
626
	</tr>
627
	<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/after_first_tr"); ?>
628
	<tr>
629
		<td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
630
		<td width="78%" class="vtable">
631
			<input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
632
			<br />
633
			<span class="vexpl">
634
				<?=gettext("You may enter a description here for your reference (not parsed)."); ?>
635
			</span>
636
		</td>
637
	</tr>
638
	<tr>
639
		<td valign="top" class="vncellreq"><?=gettext("Type"); ?></td>
640
		<td class="vtable">
641
			<select name="type" class="formselect" id="type" onchange="update_box_type(); typesel_change();">
642
				<option value="host" <?php if ($pconfig['type'] == "host") echo "selected=\"selected\""; ?>><?=gettext("Host(s)"); ?></option>
643
				<option value="network" <?php if ($pconfig['type'] == "network") echo "selected=\"selected\""; ?>><?=gettext("Network(s)"); ?></option>
644
				<option value="port" <?php if ($pconfig['type'] == "port") echo "selected=\"selected\""; ?>><?=gettext("Port(s)"); ?></option>
645
				<!--<option value="openvpn" <?php if ($pconfig['type'] == "openvpn") echo "selected=\"selected\""; ?>><?=gettext("OpenVPN Users"); ?></option> -->
646
				<option value="url" <?php if ($pconfig['type'] == "url") echo "selected=\"selected\""; ?>><?=gettext("URL");?></option>
647
				<option value="urltable" <?php if ($pconfig['type'] == "urltable") echo "selected=\"selected\""; ?>><?=gettext("URL Table"); ?></option>
648
			</select>
649
		</td>
650
	</tr>
651
	<tr>
652
		<td width="22%" valign="top" class="vncellreq"><div id="addressnetworkport"><?=gettext("Host(s)"); ?></div></td>
653
		<td width="78%" class="vtable">
654
			<table id="maintable" summary="maintable">
655
				<tbody>
656
					<tr>
657
						<td colspan="4">
658
							<div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp"><?=gettext("Item information"); ?></div>
659
						</td>
660
					</tr>
661
					<tr>
662
						<td><div id="onecolumn"><?=gettext("Network"); ?></div></td>
663
						<td><div id="twocolumn">CIDR</div></td>
664
						<td><div id="threecolumn"><?=gettext("Description"); ?></div></td>
665
					</tr>
666

    
667
					<?php
668
					$counter = 0;
669
					$address = $pconfig['address'];
670
					if ($address <> "") {
671
						$item = explode(" ", $address);
672
						$item3 = explode("||", $pconfig['detail']);
673
						foreach($item as $ww) {
674
							$address = $item[$counter];
675
							$address_subnet = "";
676
							$item2 = explode("/", $address);
677
							foreach($item2 as $current) {
678
								if($item2[1] <> "") {
679
									$address = $item2[0];
680
									$address_subnet = $item2[1];
681
								}
682

    
683
							}
684
							$item4 = $item3[$counter];
685
							$tracker = $counter;
686
					?>
687
					<tr>
688
						<td>
689
							<input autocomplete="off" name="address<?php echo $tracker; ?>" type="text" class="formfldalias ipv4v6" id="address<?php echo $tracker; ?>" size="30" value="<?=htmlspecialchars($address);?>" />
690
						</td>
691
						<td>
692
							<select name="address_subnet<?php echo $tracker; ?>" class="formselect ipv4v6" id="address_subnet<?php echo $tracker; ?>">
693
								<option></option>
694
								<?php for ($i = 128; $i >= 1; $i--): ?>
695
									<option value="<?=$i;?>" <?php if (($i == $address_subnet) || ($i == $pconfig['updatefreq'])) echo "selected=\"selected\""; ?>><?=$i;?></option>
696
								<?php endfor; ?>
697
							</select>
698
						</td>
699
						<td>
700
							<input name="detail<?php echo $tracker; ?>" type="text" class="formfld unknown" id="detail<?php echo $tracker; ?>" size="50" value="<?=$item4;?>" />
701
						</td>
702
						<td>
703
							<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
704
						</td>
705
					</tr>
706
					<?php
707
						$counter++;
708

    
709
						} // end foreach
710
					} // end if
711
					?>
712
				</tbody>
713
			</table>
714
			<div id="addrowbutton">
715
				<a onclick="javascript:addRowTo('maintable', 'formfldalias'); typesel_change(); add_alias_control(this); return false;" href="#">
716
					<img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry"); ?>" />
717
				</a>
718
			</div>
719
		</td>
720
	</tr>
721
	<tr>
722
		<td width="22%" valign="top">&nbsp;</td>
723
		<td width="78%">
724
			<input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
725
			<a href="firewall_aliases.php?tab=<?=$tab;?>"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" /></a>
726
		</td>
727
	</tr>
728
</table>
729
</form>
730

    
731
<script type="text/javascript">
732
//<![CDATA[
733
	field_counter_js = 3;
734
	rows = 1;
735
	totalrows = <?php echo $counter; ?>;
736
	loaded = <?php echo $counter; ?>;
737
	typesel_change();
738
	update_box_type();
739

    
740
	var addressarray = <?= json_encode(array_exclude($pconfig['name'], get_alias_list($pconfig['type']))) ?>;
741

    
742
	function createAutoSuggest() {
743
		<?php
744
		for ($jv = 0; $jv < $counter; $jv++)
745
			echo "objAlias[{$jv}] = new AutoSuggestControl(document.getElementById(\"address{$jv}\"), new StateSuggestions(addressarray));\n";
746
		?>
747
	}
748

    
749
	setTimeout("createAutoSuggest();", 500);
750
//]]>
751
</script>
752

    
753
<?php include("fend.inc"); ?>
754
</body>
755
</html>
(59-59/246)