Projet

Général

Profil

Télécharger (32,8 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / usr / local / www / firewall_aliases_edit.php @ eab05c00

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
require("guiconfig.inc");
48
require_once("functions.inc");
49
require_once("filter.inc");
50
require_once("shaper.inc");
51

    
52
$pgtitle = array(gettext("Firewall"),gettext("Aliases"),gettext("Edit"));
53

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

    
57
// Add all Load balance names to reserved_keywords
58
if (is_array($config['load_balancer']['lbpool']))
59
	foreach ($config['load_balancer']['lbpool'] as $lbpool)
60
		$reserved_keywords[] = $lbpool['name'];
61

    
62
$reserved_ifs = get_configured_interface_list(false, true);
63
$reserved_keywords = array_merge($reserved_keywords, $reserved_ifs, $reserved_table_names);
64

    
65
if (!is_array($config['aliases']['alias']))
66
	$config['aliases']['alias'] = array();
67
$a_aliases = &$config['aliases']['alias'];
68

    
69
$tab = $_REQUEST['tab'];
70

    
71
if($_POST)
72
	$origname = $_POST['origname'];
73

    
74
// Debugging
75
if($debug)
76
	unlink_if_exists("{$g['tmp_path']}/alias_rename_log.txt");
77

    
78
function alias_same_type($name, $type) {
79
	global $config;
80

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

    
95
if (is_numericint($_GET['id']))
96
	$id = $_GET['id'];
97
if (isset($_POST['id']) && is_numericint($_POST['id']))
98
	$id = $_POST['id'];
99

    
100
if (isset($id) && $a_aliases[$id]) {
101
	$original_alias_name = $a_aliases[$id]['name'];
102
	$pconfig['name'] = $a_aliases[$id]['name'];
103
	$pconfig['detail'] = $a_aliases[$id]['detail'];
104
	$pconfig['address'] = $a_aliases[$id]['address'];
105
	$pconfig['type'] = $a_aliases[$id]['type'];
106
	$pconfig['descr'] = html_entity_decode($a_aliases[$id]['descr']);
107

    
108
	/* interface list */
109
	$iflist = get_configured_interface_with_descr(false, true);
110
	foreach ($iflist as $if => $ifdesc)
111
		if($ifdesc == $pconfig['descr'])
112
			$input_errors[] = sprintf(gettext("Sorry, an interface is already named %s."), $pconfig['descr']);
113

    
114
	if(preg_match("/urltable/i", $a_aliases[$id]['type'])) {
115
		$pconfig['address'] = $a_aliases[$id]['url'];
116
		$pconfig['updatefreq'] = $a_aliases[$id]['updatefreq'];
117
	}
118
	if($a_aliases[$id]['aliasurl'] <> "") {
119
		if(is_array($a_aliases[$id]['aliasurl']))
120
			$pconfig['address'] = implode(" ", $a_aliases[$id]['aliasurl']);
121
		else
122
			$pconfig['address'] = $a_aliases[$id]['aliasurl'];
123
	}
124
}
125

    
126
if ($_POST) {
127
	unset($input_errors);
128
	$vertical_bar_err_text = gettext("Vertical bars (|) at start or end, or double in the middle of descriptions not allowed. Descriptions have been cleaned. Check and save again.");
129

    
130
	/* input validation */
131

    
132
	$reqdfields = explode(" ", "name");
133
	$reqdfieldsn = array(gettext("Name"));
134

    
135
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
136

    
137
	$x = is_validaliasname($_POST['name']);
138
	if (!isset($x)) {
139
		$input_errors[] = gettext("Reserved word used for alias name.");
140
	} else if ($_POST['type'] == "port" && (getservbyname($_POST['name'], "tcp") || getservbyname($_POST['name'], "udp"))) {
141
		$input_errors[] = gettext("Reserved word used for alias name.");
142
	} else {
143
		if (is_validaliasname($_POST['name']) == false)
144
			$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, _.";
145
	}
146
	/* check for name conflicts */
147
	if (empty($a_aliases[$id])) {
148
		foreach ($a_aliases as $alias) {
149
			if ($alias['name'] == $_POST['name']) {
150
				$input_errors[] = gettext("An alias with this name already exists.");
151
				break;
152
			}
153
		}
154
	}
155

    
156
	/* Check for reserved keyword names */
157
	foreach($reserved_keywords as $rk)
158
		if($rk == $_POST['name'])
159
			$input_errors[] = sprintf(gettext("Cannot use a reserved keyword as alias name %s"), $rk);
160

    
161
	/* check for name interface description conflicts */
162
	foreach($config['interfaces'] as $interface) {
163
		if($interface['descr'] == $_POST['name']) {
164
			$input_errors[] = gettext("An interface description with this name already exists.");
165
			break;
166
		}
167
	}
168

    
169
	$alias = array();
170
	$address = array();
171
	$final_address_details = array();
172
	$alias['name'] = $_POST['name'];
173

    
174
	if (preg_match("/urltable/i", $_POST['type'])) {
175
		$address = "";
176
		$isfirst = 0;
177

    
178
		/* item is a url table type */
179
		if ($_POST['address0']) {
180
			/* fetch down and add in */
181
			$_POST['address0'] = trim($_POST['address0']);
182
			$isfirst = 0;
183
			$address[] = $_POST['address0'];
184
			$alias['url'] = $_POST['address0'];
185
			$alias['updatefreq'] = $_POST['address_subnet0'] ? $_POST['address_subnet0'] : 7;
186
			if (!is_URL($alias['url']) || empty($alias['url'])) {
187
				$input_errors[] = gettext("You must provide a valid URL.");
188
			} elseif (! process_alias_urltable($alias['name'], $alias['url'], 0, true)) {
189
				$input_errors[] = gettext("Unable to fetch usable data.");
190
			}
191
			if ($_POST["detail0"] <> "") {
192
				if ((strpos($_POST["detail0"], "||") === false) && (substr($_POST["detail0"], 0, 1) != "|") && (substr($_POST["detail0"], -1, 1) != "|")) {
193
					$final_address_details[] = $_POST["detail0"];
194
				} else {
195
					/* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
196
					/* and put in the output array so the text is at least redisplayed for the user. */
197
					$final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail0"], "|"));
198
					$input_errors[] = $vertical_bar_err_text;
199
				}
200
			} else
201
				$final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
202
		}
203
	} else if ($_POST['type'] == "url" || $_POST['type'] == "url_ports") {
204
		$isfirst = 0;
205
		$address_count = 2;
206
		$desc_fmt_err_found = false;
207

    
208
		/* item is a url type */
209
		for($x=0; $x<4999; $x++) {
210
			$_POST['address' . $x] = trim($_POST['address' . $x]);
211
			if($_POST['address' . $x]) {
212
				/* fetch down and add in */
213
				$isfirst = 0;
214
				$temp_filename = tempnam("{$g['tmp_path']}/", "alias_import");
215
				unlink_if_exists($temp_filename);
216
				$verify_ssl = isset($config['system']['checkaliasesurlcert']);
217
				mkdir($temp_filename);
218
				download_file($_POST['address' . $x], $temp_filename . "/aliases", $verify_ssl);
219

    
220
				/* if the item is tar gzipped then extract */
221
				if(stristr($_POST['address' . $x], ".tgz"))
222
					process_alias_tgz($temp_filename);
223
				else if(stristr($_POST['address' . $x], ".zip"))
224
					process_alias_unzip($temp_filename);
225

    
226
				if (!isset($alias['aliasurl']))
227
					$alias['aliasurl'] = array();
228

    
229
				$alias['aliasurl'][] = $_POST['address' . $x];
230
				if ($_POST["detail{$x}"] <> "") {
231
					if ((strpos($_POST["detail{$x}"], "||") === false) && (substr($_POST["detail{$x}"], 0, 1) != "|") && (substr($_POST["detail{$x}"], -1, 1) != "|")) {
232
						$final_address_details[] = $_POST["detail{$x}"];
233
					} else {
234
						/* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
235
						/* and put in the output array so the text is at least redisplayed for the user. */
236
						$final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail{$x}"], "|"));
237
						if (!$desc_fmt_err_found) {
238
							$input_errors[] = $vertical_bar_err_text;
239
							$desc_fmt_err_found = true;
240
						}
241
					}
242
				} else
243
					$final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
244

    
245
				if(file_exists("{$temp_filename}/aliases")) {
246
					$file_contents = file_get_contents("{$temp_filename}/aliases");
247
					$file_contents = str_replace("#", "\n#", $file_contents);
248
					$file_contents_split = explode("\n", $file_contents);
249
					foreach($file_contents_split as $fc) {
250
						// Stop at 3000 items, aliases larger than that tend to break both pf and the WebGUI.
251
						if ($address_count >= 3000)
252
							break;
253
						$tmp = trim($fc);
254
						if(stristr($fc, "#")) {
255
							$tmp_split = explode("#", $tmp);
256
							$tmp = trim($tmp_split[0]);
257
						}
258
						$tmp = trim($tmp);
259
						if ($_POST['type'] == "url")
260
							$is_valid = (is_ipaddr($tmp) || is_subnet($tmp));
261
						else
262
							$is_valid = (is_port($tmp) || is_portrange($tmp));
263

    
264
						if (!empty($tmp) && $is_valid) {
265
							$address[] = $tmp;
266
							$isfirst = 1;
267
							$address_count++;
268
						}
269
					}
270
					if($isfirst == 0) {
271
						/* nothing was found */
272
						$input_errors[] = sprintf(gettext("You must provide a valid URL. Could not fetch usable data from '%s'."), $_POST['address' . $x]);
273
					}
274
					mwexec("/bin/rm -rf " . escapeshellarg($temp_filename));
275
				} else {
276
					$input_errors[] = sprintf(gettext("URL '%s' is not valid."), $_POST['address' . $x]);
277
				}
278
			}
279
		}
280
		unset($desc_fmt_err_found);
281
		if ($_POST['type'] == "url_ports")
282
			$address = group_ports($address);
283
	} else {
284
		/* item is a normal alias type */
285
		$wrongaliases = "";
286
		$desc_fmt_err_found = false;
287
		for($x=0; $x<4999; $x++) {
288
			if($_POST["address{$x}"] <> "") {
289
				$_POST["address{$x}"] = trim($_POST["address{$x}"]);
290
				if (is_alias($_POST["address{$x}"])) {
291
					if (!alias_same_type($_POST["address{$x}"], $_POST['type']))
292
						// But alias type network can include alias type urltable. Feature#1603.
293
						if (!($_POST['type'] == 'network' &&
294
						      preg_match("/urltable/i", alias_get_type($_POST["address{$x}"]))))
295
							$wrongaliases .= " " . $_POST["address{$x}"];
296
				} else if ($_POST['type'] == "port") {
297
					if (!is_port($_POST["address{$x}"]))
298
						$input_errors[] = $_POST["address{$x}"] . " " . gettext("is not a valid port or alias.");
299
				} else if ($_POST['type'] == "host" || $_POST['type'] == "network") {
300
					if (is_subnet($_POST["address{$x}"]) || (!is_ipaddr($_POST["address{$x}"])
301
					 && !is_hostname($_POST["address{$x}"])
302
					 && !is_iprange($_POST["address{$x}"])))
303
						$input_errors[] = sprintf(gettext('%1$s is not a valid %2$s alias.'), $_POST["address{$x}"], $_POST['type']);
304
				}
305
				if (is_iprange($_POST["address{$x}"])) {
306
					list($startip, $endip) = explode('-', $_POST["address{$x}"]);
307
					$rangesubnets = ip_range_to_subnet_array($startip, $endip);
308
					$address = array_merge($address, $rangesubnets);
309
				} else {
310
					$tmpaddress = $_POST["address{$x}"];
311
					if($_POST['type'] != "host" && is_ipaddr($_POST["address{$x}"]) && $_POST["address_subnet{$x}"] <> "") {
312
						if (!is_subnet($_POST["address{$x}"] . "/" . $_POST["address_subnet{$x}"]))
313
							$input_errors[] = sprintf(gettext('%s/%s is not a valid subnet.'), $_POST["address{$x}"], $_POST["address_subnet{$x}"]);
314
						else
315
							$tmpaddress .= "/" . $_POST["address_subnet{$x}"];
316
					}
317
					$address[] = $tmpaddress;
318
				}
319
				if ($_POST["detail{$x}"] <> "") {
320
					if ((strpos($_POST["detail{$x}"], "||") === false) && (substr($_POST["detail{$x}"], 0, 1) != "|") && (substr($_POST["detail{$x}"], -1, 1) != "|")) {
321
						$final_address_details[] = $_POST["detail{$x}"];
322
					} else {
323
						/* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
324
						/* and put in the output array so the text is at least redisplayed for the user. */
325
						$final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail{$x}"], "|"));
326
						if (!$desc_fmt_err_found) {
327
							$input_errors[] = $vertical_bar_err_text;
328
							$desc_fmt_err_found = true;
329
						}
330
					}
331
				} else
332
					$final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
333
			}
334
		}
335
		unset($desc_fmt_err_found);
336
		if ($wrongaliases <> "")
337
			$input_errors[] = sprintf(gettext('The alias(es): %s cannot be nested because they are not of the same type.'), $wrongaliases);
338
	}
339

    
340
	unset($vertical_bar_err_text);
341

    
342
	// Allow extending of the firewall edit page and include custom input validation
343
	pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/input_validation");
344

    
345
	if (!$input_errors) {
346
		$alias['address'] = is_array($address) ? implode(" ", $address) : $address;
347
		$alias['descr'] = $_POST['descr'];
348
		$alias['type'] = $_POST['type'];
349
		$alias['detail'] = implode("||", $final_address_details);
350

    
351
		/*   Check to see if alias name needs to be
352
		 *   renamed on referenced rules and such
353
		 */
354
		if ($_POST['name'] <> $_POST['origname']) {
355
			// Firewall rules
356
			update_alias_names_upon_change(array('filter', 'rule'), array('source', 'address'), $_POST['name'], $origname);
357
			update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
358
			update_alias_names_upon_change(array('filter', 'rule'), array('source', 'port'), $_POST['name'], $origname);
359
			update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'port'), $_POST['name'], $origname);
360
			// NAT Rules
361
			update_alias_names_upon_change(array('nat', 'rule'), array('source', 'address'), $_POST['name'], $origname);
362
			update_alias_names_upon_change(array('nat', 'rule'), array('source', 'port'), $_POST['name'], $origname);
363
			update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
364
			update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'port'), $_POST['name'], $origname);
365
			update_alias_names_upon_change(array('nat', 'rule'), array('target'), $_POST['name'], $origname);
366
			update_alias_names_upon_change(array('nat', 'rule'), array('local-port'), $_POST['name'], $origname);
367
			// NAT 1:1 Rules
368
			//update_alias_names_upon_change(array('nat', 'onetoone'), array('external'), $_POST['name'], $origname);
369
			//update_alias_names_upon_change(array('nat', 'onetoone'), array('source', 'address'), $_POST['name'], $origname);
370
			update_alias_names_upon_change(array('nat', 'onetoone'), array('destination', 'address'), $_POST['name'], $origname);
371
			// NAT Outbound Rules
372
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('source', 'network'), $_POST['name'], $origname);
373
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('sourceport'), $_POST['name'], $origname);
374
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
375
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('dstport'), $_POST['name'], $origname);
376
			update_alias_names_upon_change(array('nat', 'advancedoutbound', 'rule'), array('target'), $_POST['name'], $origname);
377
			// Alias in an alias
378
			update_alias_names_upon_change(array('aliases', 'alias'), array('address'), $_POST['name'], $origname);
379
		}
380

    
381
		pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_write_config");
382

    
383
		if (isset($id) && $a_aliases[$id]) {
384
			if ($a_aliases[$id]['name'] <> $alias['name']) {
385
				foreach ($a_aliases as $aliasid => $aliasd) {
386
					if ($aliasd['address'] <> "") {
387
						$tmpdirty = false;
388
						$tmpaddr = explode(" ", $aliasd['address']);
389
						foreach ($tmpaddr as $tmpidx => $tmpalias) {
390
							if ($tmpalias == $a_aliases[$id]['name']) {
391
								$tmpaddr[$tmpidx] = $alias['name'];
392
								$tmpdirty = true;
393
							}
394
						}
395
						if ($tmpdirty == true)
396
							$a_aliases[$aliasid]['address'] = implode(" ", $tmpaddr);
397
					}
398
				}
399
			}
400
			$a_aliases[$id] = $alias;
401
		} else
402
			$a_aliases[] = $alias;
403

    
404
		// Sort list
405
		$a_aliases = msort($a_aliases, "name");
406

    
407
		if (write_config())
408
			mark_subsystem_dirty('aliases');
409

    
410
		if(!empty($tab))
411
			header("Location: firewall_aliases.php?tab=" . htmlspecialchars ($tab));
412
		else
413
			header("Location: firewall_aliases.php");
414
		exit;
415
	}
416
	//we received input errors, copy data to prevent retype
417
	else
418
	{
419
		$pconfig['name'] = $_POST['name'];
420
		$pconfig['descr'] = $_POST['descr'];
421
		if (($_POST['type'] == 'url') || ($_POST['type'] == 'url_ports'))
422
			$pconfig['address'] = implode(" ", $alias['aliasurl']);
423
		else
424
			$pconfig['address'] = implode(" ", $address);
425
		$pconfig['type'] = $_POST['type'];
426
		$pconfig['detail'] = implode("||", $final_address_details);
427
	}
428
}
429

    
430
include("head.inc");
431

    
432
$jscriptstr = <<<EOD
433

    
434
<script type="text/javascript">
435
//<![CDATA[
436
var objAlias = new Array(4999);
437
function typesel_change() {
438
	var field_disabled = 0;
439
	var field_value = "";
440
	var set_value = false;
441
	switch (document.iform.type.selectedIndex) {
442
		case 0:	/* host */
443
			field_disabled = 1;
444
			field_value = "";
445
			set_value = true;
446
			break;
447
		case 1:	/* network */
448
			field_disabled = 0;
449
			break;
450
		case 2:	/* port */
451
			field_disabled = 1;
452
			field_value = "128";
453
			set_value = true;
454
			break;
455
		case 3:	/* url */
456
			field_disabled = 1;
457
			break;
458
		case 4:	/* url_ports */
459
			field_disabled = 1;
460
			break;
461
		case 5:	/* urltable */
462
			field_disabled = 0;
463
			break;
464
		case 6:	/* urltable_ports */
465
			field_disabled = 0;
466
			break;
467
	}
468

    
469
	jQuery("select[id^='address_subnet']").prop("disabled", field_disabled);
470
	if (set_value == true)
471
		jQuery("select[id^='address_subnet']").prop("value", field_value);
472
}
473

    
474
function add_alias_control() {
475
	var name = "address" + (totalrows - 1);
476
	obj = document.getElementById(name);
477
	obj.setAttribute('class', 'formfldalias');
478
	obj.setAttribute('autocomplete', 'off');
479
	objAlias[totalrows - 1] = new AutoSuggestControl(obj, new StateSuggestions(addressarray));
480
}
481
EOD;
482

    
483
$network_str = gettext("Network");
484
$networks_str = gettext("Network(s)");
485
$cidr_str = gettext("CIDR");
486
$description_str = gettext("Description");
487
$hosts_str = gettext("Host(s)");
488
$ip_str = gettext("IP");
489
$ports_str = gettext("Port(s)");
490
$port_str = gettext("Port");
491
$url_str = gettext("URL (IPs)");
492
$url_ports_str = gettext("URL (Ports)");
493
$urltable_str = gettext("URL Table (IPs)");
494
$urltable_ports_str = gettext("URL Table (Ports)");
495
$update_freq_str = gettext("Update Freq. (days)");
496

    
497
$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.");
498
$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.");
499
$ports_help = gettext("Enter as many ports as you wish.  Port ranges can be expressed by separating with a colon.");
500
$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']);
501
$url_ports_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 Ports (less than 3000)."), $g['product_name']);
502
$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']);
503
$urltable_ports_help = sprintf(gettext("Enter a single URL containing a list of Port numbers and/or Port ranges. After saving %s will download the URL."), $g['product_name']);
504

    
505
$openvpn_str = gettext("Username");
506
$openvpn_user_str = gettext("OpenVPN Users");
507
$openvpn_help = gettext("Enter as many usernames as you wish.");
508
$openvpn_freq = "";
509

    
510
$jscriptstr .= <<<EOD
511

    
512
function update_box_type() {
513
	var indexNum = document.forms[0].type.selectedIndex;
514
	var selected = document.forms[0].type.options[indexNum].text;
515
	if(selected == '{$networks_str}') {
516
		document.getElementById ("addressnetworkport").firstChild.data = "{$networks_str}";
517
		document.getElementById ("onecolumn").firstChild.data = "{$network_str}";
518
		document.getElementById ("twocolumn").firstChild.data = "{$cidr_str}";
519
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
520
		document.getElementById ("itemhelp").firstChild.data = "{$networks_help}";
521
		document.getElementById ("addrowbutton").style.display = 'block';
522
	} else if(selected == '{$hosts_str}') {
523
		document.getElementById ("addressnetworkport").firstChild.data = "{$hosts_str}";
524
		document.getElementById ("onecolumn").firstChild.data = "{$ip_str}";
525
		document.getElementById ("twocolumn").firstChild.data = "";
526
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
527
		document.getElementById ("itemhelp").firstChild.data = "{$hosts_help}";
528
		document.getElementById ("addrowbutton").style.display = 'block';
529
	} else if(selected == '{$ports_str}') {
530
		document.getElementById ("addressnetworkport").firstChild.data = "{$ports_str}";
531
		document.getElementById ("onecolumn").firstChild.data = "{$port_str}";
532
		document.getElementById ("twocolumn").firstChild.data = "";
533
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
534
		document.getElementById ("itemhelp").firstChild.data = "{$ports_help}";
535
		document.getElementById ("addrowbutton").style.display = 'block';
536
	} else if(selected == '{$url_str}') {
537
		document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
538
		document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
539
		document.getElementById ("twocolumn").firstChild.data = "";
540
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
541
		document.getElementById ("itemhelp").firstChild.data = "{$url_help}";
542
		document.getElementById ("addrowbutton").style.display = 'block';
543
	} else if(selected == '{$url_ports_str}') {
544
		document.getElementById ("addressnetworkport").firstChild.data = "{$url_ports_str}";
545
		document.getElementById ("onecolumn").firstChild.data = "{$url_ports_str}";
546
		document.getElementById ("twocolumn").firstChild.data = "";
547
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
548
		document.getElementById ("itemhelp").firstChild.data = "{$url_ports_help}";
549
		document.getElementById ("addrowbutton").style.display = 'block';
550
	} else if(selected == '{$openvpn_user_str}') {
551
		document.getElementById ("addressnetworkport").firstChild.data = "{$openvpn_user_str}";
552
		document.getElementById ("onecolumn").firstChild.data = "{$openvpn_str}";
553
		document.getElementById ("twocolumn").firstChild.data = "{$openvpn_freq}";
554
		document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
555
		document.getElementById ("itemhelp").firstChild.data = "{$openvpn_help}";
556
		document.getElementById ("addrowbutton").style.display = 'block';
557
	} else if(selected == '{$urltable_str}') {
558
		if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
559
			addRowTo('maintable', 'formfldalias');
560
			typesel_change();
561
			add_alias_control(this);
562
		}
563
		document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
564
		document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
565
		document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
566
		document.getElementById ("threecolumn").firstChild.data = "";
567
		document.getElementById ("threecolumn").style.display = 'none';
568
		document.getElementById ("itemhelp").firstChild.data = "{$urltable_help}";
569
		document.getElementById ("addrowbutton").style.display = 'none';
570
	} else if(selected == '{$urltable_ports_str}') {
571
		if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
572
			addRowTo('maintable', 'formfldalias');
573
			typesel_change();
574
			add_alias_control(this);
575
		}
576
		document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
577
		document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
578
		document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
579
		document.getElementById ("threecolumn").firstChild.data = "";
580
		document.getElementById ("threecolumn").style.display = 'none';
581
		document.getElementById ("itemhelp").firstChild.data = "{$urltable_ports_help}";
582
		document.getElementById ("addrowbutton").style.display = 'none';
583
	}
584
}
585
//]]>
586
</script>
587

    
588
EOD;
589

    
590
?>
591

    
592
<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
593
<?php
594
	include("fbegin.inc");
595
	echo $jscriptstr;
596
?>
597

    
598
<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
599
<script type="text/javascript" src="/javascript/row_helper.js"></script>
600
<script type="text/javascript" src="/javascript/autosuggest.js"></script>
601
<script type="text/javascript" src="/javascript/suggestions.js"></script>
602

    
603
<input type='hidden' name='address_type' value='textbox' />
604
<input type='hidden' name='address_subnet_type' value='select' />
605

    
606
<script type="text/javascript">
607
//<![CDATA[
608
	rowname[0] = "address";
609
	rowtype[0] = "textbox,ipv4v6";
610
	rowsize[0] = "30";
611

    
612
	rowname[1] = "address_subnet";
613
	rowtype[1] = "select,ipv4v6";
614
	rowsize[1] = "1";
615

    
616
	rowname[2] = "detail";
617
	rowtype[2] = "textbox";
618
	rowsize[2] = "50";
619
//]]>
620
</script>
621

    
622
<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_input_errors"); ?>
623
<?php if ($input_errors) print_input_errors($input_errors); ?>
624
<div id="inputerrors"></div>
625

    
626
<form action="firewall_aliases_edit.php" method="post" name="iform" id="iform">
627
<?php
628
if (empty($tab)) {
629
	if (preg_match("/url/i", $pconfig['type']))
630
		$tab = 'url';
631
	else if ($pconfig['type'] == 'host')
632
		$tab = 'ip';
633
	else
634
		$tab = $pconfig['type'];
635
}
636
?>
637
<input name="tab" type="hidden" id="tab" value="<?=htmlspecialchars($tab);?>" />
638
<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall aliases edit">
639
	<tr>
640
		<td colspan="2" valign="top" class="listtopic"><?=gettext("Alias Edit"); ?></td>
641
	</tr>
642
	<tr>
643
		<td valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
644
		<td class="vtable">
645
			<input name="origname" type="hidden" id="origname" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
646
			<input name="name" type="text" id="name" class="formfld unknown" size="40" maxlength="31" value="<?=htmlspecialchars($pconfig['name']);?>" />
647
			<?php if (isset($id) && $a_aliases[$id]): ?>
648
				<input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
649
			<?php endif; ?>
650
			<br />
651
			<span class="vexpl">
652
				<?=gettext("The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and _\"."); ?>
653
			</span>
654
		</td>
655
	</tr>
656
	<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/after_first_tr"); ?>
657
	<tr>
658
		<td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
659
		<td width="78%" class="vtable">
660
			<input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
661
			<br />
662
			<span class="vexpl">
663
				<?=gettext("You may enter a description here for your reference (not parsed)."); ?>
664
			</span>
665
		</td>
666
	</tr>
667
	<tr>
668
		<td valign="top" class="vncellreq"><?=gettext("Type"); ?></td>
669
		<td class="vtable">
670
			<select name="type" class="formselect" id="type" onchange="update_box_type(); typesel_change();">
671
				<option value="host" <?php if ($pconfig['type'] == "host") echo "selected=\"selected\""; ?>><?=gettext("Host(s)"); ?></option>
672
				<option value="network" <?php if ($pconfig['type'] == "network") echo "selected=\"selected\""; ?>><?=gettext("Network(s)"); ?></option>
673
				<option value="port" <?php if (($pconfig['type'] == "port") || (empty($pconfig['type']) && ($tab == "port"))) echo "selected=\"selected\""; ?>><?=gettext("Port(s)"); ?></option>
674
				<!--<option value="openvpn" <?php if ($pconfig['type'] == "openvpn") echo "selected=\"selected\""; ?>><?=gettext("OpenVPN Users"); ?></option> -->
675
				<option value="url" <?php if (($pconfig['type'] == "url") || (empty($pconfig['type']) && ($tab == "url"))) echo "selected=\"selected\""; ?>><?=gettext("URL (IPs)");?></option>
676
				<option value="url_ports" <?php if ($pconfig['type'] == "url_ports") echo "selected=\"selected\""; ?>><?=gettext("URL (Ports)");?></option>
677
				<option value="urltable" <?php if ($pconfig['type'] == "urltable") echo "selected=\"selected\""; ?>><?=gettext("URL Table (IPs)"); ?></option>
678
				<option value="urltable_ports" <?php if ($pconfig['type'] == "urltable_ports") echo "selected=\"selected\""; ?>><?=gettext("URL Table (Ports)"); ?></option>
679
			</select>
680
		</td>
681
	</tr>
682
	<tr>
683
		<td width="22%" valign="top" class="vncellreq"><div id="addressnetworkport"><?=gettext("Host(s)"); ?></div></td>
684
		<td width="78%" class="vtable">
685
			<table id="maintable" summary="maintable">
686
				<tbody>
687
					<tr>
688
						<td colspan="4">
689
							<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>
690
						</td>
691
					</tr>
692
					<tr>
693
						<td><div id="onecolumn"><?=gettext("Network"); ?></div></td>
694
						<td><div id="twocolumn">CIDR</div></td>
695
						<td><div id="threecolumn"><?=gettext("Description"); ?></div></td>
696
					</tr>
697

    
698
					<?php
699
					$counter = 0;
700
					if ($pconfig['address'] <> ""):
701
						$addresses = explode(" ", $pconfig['address']);
702
						$details = explode("||", $pconfig['detail']);
703
						while ($counter < count($addresses)):
704
							if (is_subnet($addresses[$counter])) {
705
								list($address, $address_subnet) = explode("/", $addresses[$counter]);
706
							} else {
707
								$address = $addresses[$counter];
708
								$address_subnet = "";
709
							}
710
					?>
711
					<tr>
712
						<td>
713
							<input autocomplete="off" name="address<?php echo $counter; ?>" type="text" class="formfldalias ipv4v6" id="address<?php echo $counter; ?>" size="30" value="<?=htmlspecialchars($address);?>" />
714
						</td>
715
						<td>
716
							<select name="address_subnet<?php echo $counter; ?>" class="formselect ipv4v6" id="address_subnet<?php echo $counter; ?>">
717
								<option></option>
718
								<?php for ($i = 128; $i >= 1; $i--): ?>
719
									<option value="<?=$i;?>" <?php if (($i == $address_subnet) || ($i == $pconfig['updatefreq'])) echo "selected=\"selected\""; ?>><?=$i;?></option>
720
								<?php endfor; ?>
721
							</select>
722
						</td>
723
						<td>
724
							<input name="detail<?php echo $counter; ?>" type="text" class="formfld unknown" id="detail<?php echo $counter; ?>" size="50" value="<?=htmlspecialchars($details[$counter]);?>" />
725
						</td>
726
						<td>
727
							<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>
728
						</td>
729
					</tr>
730
					<?php
731
						$counter++;
732

    
733
						endwhile;
734
					endif;
735
					?>
736
				</tbody>
737
			</table>
738
			<div id="addrowbutton">
739
				<a onclick="javascript:addRowTo('maintable', 'formfldalias'); typesel_change(); add_alias_control(this); return false;" href="#">
740
					<img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry"); ?>" />
741
				</a>
742
			</div>
743
		</td>
744
	</tr>
745
	<tr>
746
		<td width="22%" valign="top">&nbsp;</td>
747
		<td width="78%">
748
			<input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
749
			<input type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" onclick="history.back()" />
750
		</td>
751
	</tr>
752
</table>
753
</form>
754

    
755
<script type="text/javascript">
756
//<![CDATA[
757
	field_counter_js = 3;
758
	rows = 1;
759
	totalrows = <?php echo $counter; ?>;
760
	loaded = <?php echo $counter; ?>;
761
	typesel_change();
762
	update_box_type();
763

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

    
766
	function createAutoSuggest() {
767
		<?php
768
		for ($jv = 0; $jv < $counter; $jv++)
769
			echo "objAlias[{$jv}] = new AutoSuggestControl(document.getElementById(\"address{$jv}\"), new StateSuggestions(addressarray));\n";
770
		?>
771
	}
772

    
773
	setTimeout("createAutoSuggest();", 500);
774
//]]>
775
</script>
776

    
777
<?php include("fend.inc"); ?>
778
</body>
779
</html>
(60-60/255)