Project

General

Profile

Download (40.4 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
	firewall_rules.php
5
	part of pfSense (http://www.pfsense.com)
6
        Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
7

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

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

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

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

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

    
37
##|+PRIV
38
##|*IDENT=page-firewall-rules
39
##|*NAME=Firewall: Rules page
40
##|*DESCR=Allow access to the 'Firewall: Rules' page.
41
##|*MATCH=firewall_rules.php*
42
##|-PRIV
43

    
44
$statusurl = "status_filter_reload.php";
45
$logurl = "diag_logs_filter.php";
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("Rules"));
53

    
54
function delete_nat_association($id) {
55
	global $config;
56

    
57
	if (!$id || !is_array($config['nat']['rule']))
58
		return;
59

    
60
	$a_nat = &$config['nat']['rule'];
61

    
62
	foreach ($a_nat as &$natent)
63
		if ($natent['associated-rule-id'] == $id)
64
			$natent['associated-rule-id'] = '';
65
}
66

    
67
if (!is_array($config['filter']['rule'])) {
68
	$config['filter']['rule'] = array();
69
}
70
filter_rules_sort();
71
$a_filter = &$config['filter']['rule'];
72

    
73
$if = $_GET['if'];
74
if ($_POST['if'])
75
	$if = $_POST['if'];
76

    
77
$ifdescs = get_configured_interface_with_descr();
78

    
79
// Drag and drop reordering
80
if($_REQUEST['dragdroporder']) {
81
	// First create a new ruleset array and tmp arrays
82
	$a_filter_before = array();
83
	$a_filter_order = array();
84
	$a_filter_order_tmp = array();
85
	$a_filter_after = array();
86
	$found = false;
87
	$drag_order = $_REQUEST['dragtable'];
88
	// Next traverse through rules building a new order for interface
89
	for ($i = 0; isset($a_filter[$i]); $i++) {
90
		if(( $_REQUEST['if'] == "FloatingRules" && isset($a_filter[$i]['floating']) ) || ( $a_filter[$i]['interface'] == $_REQUEST['if'] && !isset($a_filter[$i]['floating']) )) {
91
			$a_filter_order_tmp[] = $a_filter[$i];
92
			$found = true;
93
		} else if (!$found)
94
			$a_filter_before[] = $a_filter[$i];
95
		else
96
			$a_filter_after[] = $a_filter[$i];
97
	}
98
	// Reorder rules with the posted order
99
	for ($i = 0; $i<count($drag_order); $i++)
100
		$a_filter_order[] = $a_filter_order_tmp[$drag_order[$i]];
101
	// In case $drag_order didn't account for some rules, make sure we don't lose them
102
	if(count($a_filter_order) < count($a_filter_order_tmp)) {
103
		for ($i = 0; $i<count($a_filter_order_tmp); $i++)
104
			if(!in_array($i, $drag_order))
105
				$a_filter_order[] = $a_filter_order_tmp[$i];
106
	}
107
	// Overwrite filter rules with newly created items
108
	$config['filter']['rule'] = array_merge($a_filter_before, $a_filter_order, $a_filter_after);
109
	// Write configuration
110
	$config = write_config("Drag and drop firewall rules ordering update.");
111
	// Redirect back to page
112
	mark_subsystem_dirty('filter');
113
	$undo = array();
114
	foreach($_REQUEST['dragtable'] as $dt) 
115
		$undo[] = "";
116
	$counter = 0;
117
	foreach($_REQUEST['dragtable'] as $dt) {
118
		$undo[$dt] = $counter;
119
		$counter++;
120
	}
121
	foreach($undo as $dt) 
122
		$undotxt .= "&dragtable[]={$dt}";
123
	Header("Location: firewall_rules.php?if=" . $_REQUEST['if'] . "&undodrag=true" . $undotxt);
124
	exit;
125
}
126

    
127
$icmptypes = array(
128
	"" => gettext("any"),
129
	"echoreq" => gettext("Echo request"),
130
	"echorep" => gettext("Echo reply"),
131
	"unreach" => gettext("Destination unreachable"),
132
	"squench" => gettext("Source quench"),
133
	"redir" => gettext("Redirect"),
134
	"althost" => gettext("Alternate Host"),
135
	"routeradv" => gettext("Router advertisement"),
136
	"routersol" => gettext("Router solicitation"),
137
	"timex" => gettext("Time exceeded"),
138
	"paramprob" => gettext("Invalid IP header"),
139
	"timereq" => gettext("Timestamp"),
140
	"timerep" => gettext("Timestamp reply"),
141
	"inforeq" => gettext("Information request"),
142
	"inforep" => gettext("Information reply"),
143
	"maskreq" => gettext("Address mask request"),
144
	"maskrep" => gettext("Address mask reply")
145
);
146

    
147
/* add group interfaces */
148
if (is_array($config['ifgroups']['ifgroupentry']))
149
	foreach($config['ifgroups']['ifgroupentry'] as $ifgen)
150
		if (have_ruleint_access($ifgen['ifname']))
151
			$iflist[$ifgen['ifname']] = $ifgen['ifname'];
152

    
153
foreach ($ifdescs as $ifent => $ifdesc)
154
	if(have_ruleint_access($ifent)) 
155
		$iflist[$ifent] = $ifdesc;
156

    
157
if ($config['l2tp']['mode'] == "server")
158
        if(have_ruleint_access("l2tp"))
159
                $iflist['l2tp'] = "L2TP VPN";
160

    
161
if ($config['pptpd']['mode'] == "server")
162
	if(have_ruleint_access("pptp")) 
163
		$iflist['pptp'] = "PPTP VPN";
164

    
165
if (is_array($config['pppoes']['pppoe'])) {
166
	foreach ($config['pppoes']['pppoe'] as $pppoes)
167
		if (($pppoes['mode'] == 'server') && have_ruleint_access("pppoe"))
168
			$iflist['pppoe'] = "PPPoE Server";
169
}
170

    
171
/* add ipsec interfaces */
172
if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable']))
173
	if(have_ruleint_access("enc0")) 
174
		$iflist["enc0"] = "IPsec";
175

    
176
/* add openvpn/tun interfaces */
177
if  ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
178
   	$iflist["openvpn"] = "OpenVPN";
179

    
180
pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/interfaces_override");
181

    
182
if (!$if || !isset($iflist[$if])) {
183
	if ("any" == $if)
184
                $if = "FloatingRules";
185
        else if ("FloatingRules" != $if)
186
                $if = "wan";
187
}
188

    
189
if ($_POST) {
190

    
191
	$pconfig = $_POST;
192

    
193
	if ($_POST['apply']) {
194
		$retval = 0;
195
		$retval = filter_configure();
196

    
197
		clear_subsystem_dirty('filter');
198

    
199
		pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/apply");
200

    
201
		$savemsg = sprintf(gettext("The settings have been applied. The firewall rules are now reloading in the background.<br/>You can also %s monitor %s the reload progress"),"<a href='status_filter_reload.php'>","</a>");
202
	}
203
}
204

    
205
if ($_GET['act'] == "del") {
206
	if ($a_filter[$_GET['id']]) {
207
		if (!empty($a_filter[$_GET['id']]['associated-rule-id'])) {
208
			delete_nat_association($a_filter[$_GET['id']]['associated-rule-id']);
209
		}
210
		unset($a_filter[$_GET['id']]);
211
		write_config();
212
		mark_subsystem_dirty('filter');
213
		header("Location: firewall_rules.php?if={$if}");
214
		exit;
215
	}
216
}
217

    
218
// Handle save msg if defined
219
if($_REQUEST['savemsg']) 
220
	$savemsg = htmlentities($_REQUEST['savemsg']);
221

    
222
if (isset($_POST['del_x'])) {
223
	/* delete selected rules */
224
	if (is_array($_POST['rule']) && count($_POST['rule'])) {
225
		foreach ($_POST['rule'] as $rulei) {
226
			delete_nat_association($a_filter[$rulei]['associated-rule-id']);
227
			unset($a_filter[$rulei]);
228
		}
229
		write_config();
230
		mark_subsystem_dirty('filter');
231
		header("Location: firewall_rules.php?if={$if}");
232
		exit;
233
	}
234
} else if ($_GET['act'] == "toggle") {
235
	if ($a_filter[$_GET['id']]) {
236
                if(isset($a_filter[$_GET['id']]['disabled']))
237
                        unset($a_filter[$_GET['id']]['disabled']);
238
                else
239
                        $a_filter[$_GET['id']]['disabled'] = true;
240
		write_config();
241
		mark_subsystem_dirty('filter');
242
		header("Location: firewall_rules.php?if={$if}");
243
		exit;
244
	}
245
} else {
246
	/* yuck - IE won't send value attributes for image buttons, while Mozilla does -
247
	   so we use .x/.y to fine move button clicks instead... */
248
	unset($movebtn);
249
	foreach ($_POST as $pn => $pd) {
250
		if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
251
			$movebtn = $matches[1];
252
			break;
253
		}
254
	}
255
	/* move selected rules before this rule */
256
	if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
257
		$a_filter_new = array();
258

    
259
		/* copy all rules < $movebtn and not selected */
260
		for ($i = 0; $i < $movebtn; $i++) {
261
			if (!in_array($i, $_POST['rule']))
262
				$a_filter_new[] = $a_filter[$i];
263
		}
264

    
265
		/* copy all selected rules */
266
		for ($i = 0; $i < count($a_filter); $i++) {
267
			if ($i == $movebtn)
268
				continue;
269
			if (in_array($i, $_POST['rule']))
270
				$a_filter_new[] = $a_filter[$i];
271
		}
272

    
273
		/* copy $movebtn rule */
274
		if ($movebtn < count($a_filter))
275
			$a_filter_new[] = $a_filter[$movebtn];
276

    
277
		/* copy all rules > $movebtn and not selected */
278
		for ($i = $movebtn+1; $i < count($a_filter); $i++) {
279
			if (!in_array($i, $_POST['rule']))
280
				$a_filter_new[] = $a_filter[$i];
281
		}
282

    
283
		$a_filter = $a_filter_new;
284
		write_config();
285
		mark_subsystem_dirty('filter');
286
		header("Location: firewall_rules.php?if={$if}");
287
		exit;
288
	}
289
}
290
$closehead = false;
291

    
292
include("head.inc");
293

    
294
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/domLib.js\"></script>";
295
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/domTT.js\"></script>";
296
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/behaviour.js\"></script>";
297
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/fadomatic.js\"></script>";
298
?>
299
<link rel="stylesheet" href="/javascript/chosen/chosen.css" />
300
</head>
301

    
302
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
303
<script src="/javascript/chosen/chosen.proto.js" type="text/javascript"></script>
304
<?php include("fbegin.inc"); ?>
305
<form action="firewall_rules.php" method="post">
306

    
307
<script type="text/javascript" language="javascript" src="/javascript/row_toggle.js">
308
</script>
309
<?php if ($savemsg) print_info_box($savemsg); ?>
310
<?php if (is_subsystem_dirty('filter')): ?><p>
311
<?php
312
if($_REQUEST['undodrag']) {
313
	foreach($_REQUEST['dragtable'] as $dt) 
314
		$dragtable .= "&dragtable[]={$dt}";
315
	print_info_box_np_undo(gettext("The firewall rule configuration has been changed.<br>You must apply the changes in order for them to take effect."), "apply" , gettext("Apply changes") , "firewall_rules.php?if={$_REQUEST['if']}&dragdroporder=true&{$dragtable}");
316
} else {
317
	print_info_box_np(gettext("The firewall rule configuration has been changed.<br>You must apply the changes in order for them to take effect."));
318
}
319
?>
320
<br>
321
<?php endif; ?>
322
<div id="loading" style="visibity:hidden">
323
	<img src="/themes/<?=$g['theme']?>/images/misc/loader.gif"> Loading, please wait...
324
	<p/>&nbsp;
325
</div>
326
<?php
327
	pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/before_table");
328
?>
329
<table width="100%" border="0" cellpadding="0" cellspacing="0">
330
  <tr><td class="tabnavtbl">
331
  <?php
332
	/* active tabs */
333
	$tab_array = array();
334
       if ("FloatingRules" == $if)
335
                        $active = true;
336
                else
337
                        $active = false;
338
        $tab_array[] = array(gettext("Floating"), $active, "firewall_rules.php?if=FloatingRules");
339
	$tabscounter = 0; $i = 0; foreach ($iflist as $ifent => $ifname) {
340
		if ($ifent == $if)
341
			$active = true;
342
		else
343
			$active = false;
344
		$tab_array[] = array($ifname, $active, "firewall_rules.php?if={$ifent}");
345
	}
346
	display_top_tabs($tab_array);
347
  ?>
348
  </td></tr>
349
  <tr>
350
    <td>
351
	<div id="mainarea">
352
		<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
353
<?php
354
		pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/before_first_tr");
355
?>
356
			<tr id="frheader">
357
			<td width="3%" class="list">&nbsp;</td>
358
			<td width="5%" class="list">&nbsp;</td>
359
			<td width="3%" class="listhdrr"><?=gettext("ID");?></td>
360
<?php
361
				pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tablehead");
362
?>
363
			<td width="6%" class="listhdrr"><?=gettext("Proto");?></td>
364
			<td width="12%" class="listhdrr"><?=gettext("Source");?></td>
365
			<td width="6%" class="listhdrr"><?=gettext("Port");?></td>
366
			<td width="12%" class="listhdrr"><?=gettext("Destination");?></td>
367
			<td width="6%" class="listhdrr"><?=gettext("Port");?></td>
368
			<td width="5%" class="listhdrr"><?=gettext("Gateway");?></td>
369
			<td width="8%" class="listhdrr"><?=gettext("Queue");?></td>
370
			<td width="5%" class="listhdrr"><?=gettext("Schedule");?></td>
371
<?php
372
				pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_desc_tablehead");
373
?>
374
			<td width="19%" class="listhdr"><?=gettext("Description");?></td>
375
			<td width="10%" class="list">
376
			<table border="0" cellspacing="0" cellpadding="1">
377
			   <tr>
378
				<?php
379
					$nrules = 0;
380
					for ($i = 0; isset($a_filter[$i]); $i++) {
381
						$filterent = $a_filter[$i];
382
						if ($filterent['interface'] != $if && !isset($filterent['floating']))
383
							continue;
384
						if (isset($filterent['floating']) && "FloatingRules" != $if)
385
							continue;
386
						$nrules++;
387
					}
388
				?>
389
				<td>
390
				<?php if ($nrules == 0): ?>
391
				<img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?gettext("delete selected rules"); ?>" border="0"><?php else: ?>
392
				<input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" onclick="return confirm('<?=gettext('Do you really want to delete the selected rules?');?>')"><?php endif; ?>
393
				</td>
394
				<td align="center" valign="middle"><a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>&after=-1"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" width="17" height="17" border="0"></a></td>
395
			   </tr>
396
			</table>
397
		  </td>
398
		</tr>
399
<?php   // Show the anti-lockout rule if it's enabled, and we are on LAN with an if count > 1, or WAN with an if count of 1.
400
	if (!isset($config['system']['webgui']['noantilockout']) &&
401
		(((count($config['interfaces']) > 1) && ($if == 'lan'))
402
		|| ((count($config['interfaces']) == 1) && ($if == 'wan')))):
403

    
404
		$guiport = "80";
405
		if (isset($config['system']['webgui']['port']) && $config['system']['webgui']['port'] <> "")
406
			$guiport = "{$config['system']['webgui']['port']}";
407
		if ($config['system']['webgui']['protocol'] == "https")
408
			$guiport .= "<br/>443";
409

    
410
		$sshport = "";
411
		if (isset($config['system']['enablesshd'])) {
412
			$sshport = ($config['system']['ssh']['port']) ? $config['system']['ssh']['port'] : 22;
413
		}
414
		$sshport = "{$sshport}<br/>";
415
?>
416
		<tr valign="top" id="antilockout">
417
			<td class="list">&nbsp;</td>
418
			<td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" border="0"></td>
419
			<td class="listlr" style="background-color: #E0E0E0"></td>
420
<?php
421
				pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr_antilockout");
422
?>
423
			<td class="listr" style="background-color: #E0E0E0">*</td>
424
			<td class="listr" style="background-color: #E0E0E0">*</td>
425
			<td class="listr" style="background-color: #E0E0E0">*</td>
426
			<td class="listr" style="background-color: #E0E0E0"><?=$iflist[$if];?> Address</td>
427
			<td class="listr" style="background-color: #E0E0E0"><?= $sshport . $guiport ?></td>
428
			<td class="listr" style="background-color: #E0E0E0">*</td>
429
			<td class="listr" style="background-color: #E0E0E0">*</td>
430
			<td class="listr" style="background-color: #E0E0E0"></td>
431
			<td class="listbg"><?=gettext("Anti-Lockout Rule");?></td>
432
			<td valign="middle" nowrap class="list">
433
			<table border="0" cellspacing="0" cellpadding="1">
434
				<tr>
435
					<td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>"></td>
436
					<td><a href="system_advanced_admin.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0"></a></td>
437
				</tr>
438
				<tr>
439
					<td align="center" valign="middle"></td>
440
					<td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0"></td>
441
				</tr>
442
				</table>
443
			</td>
444
			</tr>
445
<?php endif; ?>
446

    
447
<?php if (isset($config['interfaces'][$if]['blockpriv'])): ?>
448
                <tr valign="top" id="frrfc1918">
449
                  <td class="list">&nbsp;</td>
450
                  <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0"></td>
451
                  <td class="listlr" style="background-color: #E0E0E0"></td>
452
                  <td class="listr" style="background-color: #E0E0E0">*</td>
453
                  <td class="listr" style="background-color: #E0E0E0"><?=gettext("RFC 1918 networks");?></td>
454
                  <td class="listr" style="background-color: #E0E0E0">*</td>
455
                  <td class="listr" style="background-color: #E0E0E0">*</td>
456
                  <td class="listr" style="background-color: #E0E0E0">*</td>
457
                  <td class="listr" style="background-color: #E0E0E0">*</td>
458
		<td class="listr" style="background-color: #E0E0E0">*</td>
459
	 		 <td class="listr" style="background-color: #E0E0E0"></td>
460
                  <td class="listbg"><?=gettext("Block private networks");?></td>
461
                  <td valign="middle" nowrap class="list">
462
				    <table border="0" cellspacing="0" cellpadding="1">
463
					<tr>
464
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>"></td>
465
					  <td><a href="interfaces.php?if=<?=htmlspecialchars($if)?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0"></a></td>
466
					</tr>
467
					<tr>
468
					  <td align="center" valign="middle"></td>
469
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0"></td>
470
					</tr>
471
					</table>
472
				  </td>
473
				</tr>
474
<?php endif; ?>
475
<?php if (isset($config['interfaces'][$if]['blockbogons'])): ?>
476
                <tr valign="top" id="frrfc1918">
477
                  <td class="list">&nbsp;</td>
478
                  <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0"></td>
479
                  <td class="listlr" style="background-color: #E0E0E0"></td>
480
                  <td class="listr" style="background-color: #E0E0E0">*</td>
481
                  <td class="listr" style="background-color: #E0E0E0"><?=gettext("Reserved/not assigned by IANA");?></td>
482
                  <td class="listr" style="background-color: #E0E0E0">*</td>
483
                  <td class="listr" style="background-color: #E0E0E0">*</td>
484
                  <td class="listr" style="background-color: #E0E0E0">*</td>
485
				  <td class="listr" style="background-color: #E0E0E0">*</td>
486
				   <td class="listr" style="background-color: #E0E0E0">*</td>
487
		  <td class="listr" style="background-color: #E0E0E0">*</td>
488
                  <td class="listbg"><?=gettext("Block bogon networks");?></td>
489
                  <td valign="middle" nowrap class="list">
490
				    <table border="0" cellspacing="0" cellpadding="1">
491
					<tr>
492
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>"></td>
493
					  <td><a href="interfaces.php?if=<?=htmlspecialchars($if)?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0"></a></td>
494
					</tr>
495
					<tr>
496
					  <td align="center" valign="middle"></td>
497
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0"></td>
498
					</tr>
499
					</table>
500
				  </td>
501
				</tr>
502
<?php endif; ?>
503
				<tbody id="dragtable" width="100%">
504
				<?php $nrules = 0; for ($i = 0; isset($a_filter[$i]); $i++):
505
					pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/row_start");
506
					$filterent = $a_filter[$i];
507
					if ($filterent['interface'] != $if && !isset($filterent['floating']))
508
						continue;
509
					if (isset($filterent['floating']) && "FloatingRules" != $if)
510
						continue;
511
					$isadvset = firewall_check_for_advanced_options($filterent);
512
					if($isadvset)
513
						$advanced_set = "<img src=\"./themes/{$g['theme']}/images/icons/icon_advanced.gif\" title=\"" . gettext("advanced settings set") . ": {$isadvset}\" border=\"0\">";
514
					else 
515
						$advanced_set = "";
516
				?>
517
                <tr valign="top" id="fr<?=$nrules;?>">
518
                  <td class="listt">
519
					<input type="checkbox" id="frc<?=$nrules;?>" name="rule[]" value="<?=$i;?>" onClick="fr_bgcolor('<?=$nrules;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;">
520
					<?php echo $advanced_set; ?>
521
				  </td>
522
                  <td class="listt" align="center">
523
				  <?php if ($filterent['type'] == "block")
524
				  			$iconfn = "block";
525
						else if ($filterent['type'] == "reject") {
526
							$iconfn = "reject";
527
						} else
528
							$iconfn = "pass";
529
						if (isset($filterent['disabled'])) {
530
							$textss = "<span class=\"gray\">";
531
							$textse = "</span>";
532
							$iconfn .= "_d";
533
						} else {
534
							$textss = $textse = "";
535
						}
536
				  ?>
537
				  <a href="?if=<?=htmlspecialchars($if);?>&act=toggle&id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0" title="<?=gettext("click to toggle enabled/disabled status");?>"></a>
538
				  <?php if (isset($filterent['log'])):
539
							$iconfnlog = "log_s";
540
						if (isset($filterent['disabled']))
541
							$iconfnlog .= "_d";
542
				  	?>
543
				  <br><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfnlog;?>.gif" width="11" height="15" border="0">
544
				  <?php endif; ?>
545
				  </td>
546
				<?php
547
				
548
				//build Alias popup box
549
				$span_end = "";
550
				$alias_src_span_begin = "";
551
				$alias_src_port_span_begin = "";
552
				$alias_dst_span_begin = "";
553
				$alias_dst_port_span_begin = "";
554
				
555
				$alias_popup = rule_popup($filterent['source']['address'],pprint_port($filterent['source']['port']),$filterent['destination']['address'],pprint_port($filterent['destination']['port']));
556
				$span_end = "</U></span>";
557
					
558
				$alias_src_span_begin = $alias_popup["src"];
559
				 									
560
				$alias_src_port_span_begin = $alias_popup["srcport"];
561
													
562
				$alias_dst_span_begin = $alias_popup["dst"];
563
														
564
				$alias_dst_port_span_begin = $alias_popup["dstport"];
565
					
566
				//build Schedule popup box
567
				$a_schedules = &$config['schedules']['schedule'];
568
				$schedule_span_begin = "";
569
				$schedule_span_end = "";
570
				$sched_caption_escaped = "";
571
				$sched_content = "";
572
				$schedstatus = false;
573
				$dayArray = array (gettext('Mon'),gettext('Tues'),gettext('Wed'),gettext('Thur'),gettext('Fri'),gettext('Sat'),gettext('Sun'));
574
				$monthArray = array (gettext('January'),gettext('February'),gettext('March'),gettext('April'),gettext('May'),gettext('June'),gettext('July'),gettext('August'),gettext('September'),gettext('October'),gettext('November'),gettext('December'));
575
				if($config['schedules']['schedule'] <> "" and is_array($config['schedules']['schedule'])) {
576
					foreach ($a_schedules as $schedule)
577
					{
578
						if ($schedule['name'] == $filterent['sched'] ){
579
							$schedstatus = filter_get_time_based_rule_status($schedule);
580
							
581
							foreach($schedule['timerange'] as $timerange) {
582
								$tempFriendlyTime = "";
583
								$tempID = "";
584
								$firstprint = false;
585
								if ($timerange){
586
									$dayFriendly = "";
587
									$tempFriendlyTime = "";							
588
										
589
									//get hours
590
									$temptimerange = $timerange['hour'];
591
									$temptimeseparator = strrpos($temptimerange, "-");
592
									
593
									$starttime = substr ($temptimerange, 0, $temptimeseparator); 
594
									$stoptime = substr ($temptimerange, $temptimeseparator+1); 
595
										
596
									if ($timerange['month']){
597
										$tempmontharray = explode(",", $timerange['month']);
598
										$tempdayarray = explode(",",$timerange['day']);
599
										$arraycounter = 0;
600
										$firstDayFound = false;
601
										$firstPrint = false;
602
										foreach ($tempmontharray as $monthtmp){
603
											$month = $tempmontharray[$arraycounter];
604
											$day = $tempdayarray[$arraycounter];
605
											
606
											if (!$firstDayFound)
607
											{
608
												$firstDay = $day;
609
												$firstmonth = $month;
610
												$firstDayFound = true;
611
											}
612
												
613
											$currentDay = $day;
614
											$nextDay = $tempdayarray[$arraycounter+1];
615
											$currentDay++;
616
											if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])){
617
												if ($firstPrint)
618
													$dayFriendly .= ", ";
619
												$currentDay--;
620
												if ($currentDay != $firstDay)
621
													$dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
622
												else
623
													$dayFriendly .=  $monthArray[$month-1] . " " . $day;
624
												$firstDayFound = false;	
625
												$firstPrint = true;
626
											}													
627
											$arraycounter++;	
628
										}
629
									}
630
									else
631
									{
632
										$tempdayFriendly = $timerange['position'];
633
										$firstDayFound = false;
634
										$tempFriendlyDayArray = explode(",", $tempdayFriendly);								
635
										$currentDay = "";
636
										$firstDay = "";
637
										$nextDay = "";
638
										$counter = 0;													
639
										foreach ($tempFriendlyDayArray as $day){
640
											if ($day != ""){
641
												if (!$firstDayFound)
642
												{
643
													$firstDay = $tempFriendlyDayArray[$counter];
644
													$firstDayFound = true;
645
												}
646
												$currentDay =$tempFriendlyDayArray[$counter];
647
												//get next day
648
												$nextDay = $tempFriendlyDayArray[$counter+1];
649
												$currentDay++;					
650
												if ($currentDay != $nextDay){
651
													if ($firstprint)
652
														$dayFriendly .= ", ";
653
													$currentDay--;
654
													if ($currentDay != $firstDay)
655
														$dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
656
													else
657
														$dayFriendly .= $dayArray[$firstDay-1];
658
													$firstDayFound = false;	
659
													$firstprint = true;			
660
												}
661
												$counter++;
662
											}
663
										}
664
									}		
665
									$timeFriendly = $starttime . " - " . $stoptime;
666
									$description = $timerange['rangedescr'];
667
									$sched_content .= $dayFriendly . "; " . $timeFriendly . "<br>";
668
								}
669
							}
670
							$sched_caption_escaped = str_replace("'", "\'", $schedule['descr']);
671
							$schedule_span_begin = "<span style=\"cursor: help;\" onmouseover=\"domTT_activate(this, event, 'content', '<h1>{$sched_caption_escaped}</h1><p>{$sched_content}</p>', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><U>";
672
							$schedule_span_end = "</U></span>";
673
						}
674
					}
675
				}
676
				$printicon = false;
677
				$alttext = "";
678
				$image = "";
679
				if (!isset($filterent['disabled'])){
680
					 if ($schedstatus) 
681
					 { 
682
					 	if ($iconfn == "block" || $iconfn == "reject")
683
					 	{
684
					 		$image = "icon_block";
685
					 		$alttext = gettext("Traffic matching this rule is currently being denied");
686
					 	}
687
					 	else
688
					 	{
689
					 		$image = "icon_pass";
690
					 		$alttext = gettext("Traffic matching this rule is currently being allowed");
691
					 	}
692
					 	$printicon = true;
693
					  }
694
					  else if ($filterent['sched'])
695
					  { 
696
					 	if ($iconfn == "block" || $iconfn == "reject")
697
					 		$image = "icon_block_d";
698
					 	else
699
					 		$image = "icon_block";
700
					 	$alttext = gettext("This rule is not currently active because its period has expired");
701
					 	$printicon = true;				  	
702
					  }
703
				}
704
				?>
705
                  <td class="listlr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
706
                    <?=$textss;?><?php if (isset($filterent['id'])) echo $filterent['id']; else echo ""; ?><?=$textse;?>
707
                  </td>
708
<?php
709
				pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr");
710
?>
711
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
712
                    <?=$textss;?><?php
713
			if (isset($filterent['ipprotocol'])) {
714
				switch($filterent['ipprotocol']) {
715
					case "inet":
716
						echo "IPv4 ";
717
						break;
718
					case "inet6":
719
						echo "IPv6 ";
720
						break;
721
				}
722
			} else {
723
				echo "IPv4 ";
724
			}
725
			if (isset($filterent['protocol'])) {
726
				echo strtoupper($filterent['protocol']);
727
				if (strtoupper($filterent['protocol']) == "ICMP" && !empty($filterent['icmptype'])) {
728
					echo ' <span style="cursor: help;" title="ICMP type: ' . $icmptypes[$filterent['icmptype']] . '"><u>';
729
					echo $filterent['icmptype'];
730
					echo '</u></span>';
731
				}
732
			} else echo "*";
733
                    ?><?=$textse;?>
734
                  </td>
735
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
736
				    <?=$textss;?><?php echo $alias_src_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['source']));?><?php echo $alias_src_span_end;?><?=$textse;?>
737
                  </td>
738
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
739
                    <?=$textss;?><?php echo $alias_src_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['source']['port'])); ?><?php echo $alias_src_port_span_end;?><?=$textse;?>
740
                  </td>
741
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
742
				    <?=$textss;?><?php echo $alias_dst_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['destination'])); ?><?php echo $alias_dst_span_end;?><?=$textse;?>
743
                  </td>
744
	              <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
745
                    <?=$textss;?><?php echo $alias_dst_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['destination']['port'])); ?><?php echo $alias_dst_port_span_end;?><?=$textse;?>
746
                  </td>
747
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
748
                    <?=$textss;?><?php if (isset($config['interfaces'][$filterent['gateway']]['descr'])) echo htmlspecialchars($config['interfaces'][$filterent['gateway']]['descr']); else  echo htmlspecialchars(pprint_port($filterent['gateway'])); ?><?=$textse;?>
749
                  </td>
750
				  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';"><?=$textss;?>
751
                          <?php
752
							if (isset($filterent['ackqueue']) && isset($filterent['defaultqueue'])) {
753
								$desc = $filterent['ackqueue'] ;
754
							    echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['ackqueue']}&action=show\">{$desc}</a>";
755
								$desc = $filterent['defaultqueue'];
756
							    echo "/<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&action=show\">{$desc}</a>";
757
							} else if (isset($filterent['defaultqueue'])) {
758
								$desc = $filterent['defaultqueue'];
759
							    echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&action=show\">{$desc}</a>"; }
760
							else echo gettext("none");
761
						  ?><?=$textse;?>
762
                        </td>
763
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';"><font color="black">
764
                    <?php if ($printicon) { ?><img src="./themes/<?= $g['theme']; ?>/images/icons/<?php echo $image; ?>.gif" title="<?php echo $alttext;?>" border="0"><?php } ?>&nbsp;<?=$textss;?><?php echo $schedule_span_begin;?><?=htmlspecialchars($filterent['sched']);?><?php echo $schedule_span_end; ?><?=$textse;?>
765
                  </td>
766
<?php
767
				pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_descr_tr");
768
?>
769
                  <td class="listbg" onClick="fr_toggle(<?=$nrules;?>)" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';" class="descr">
770
                    <?=$textss;?><?=htmlspecialchars($filterent['descr']);?>&nbsp;<?=$textse;?>
771
                  </td>
772
                  <td valign="middle" nowrap class="list">
773
				    <table border="0" cellspacing="0" cellpadding="1">
774
					<tr>
775
					  <td><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule"); ?>" onMouseOver="fr_insline(<?=$nrules;?>, true)" onMouseOut="fr_insline(<?=$nrules;?>, false)"></td>
776
					  <td><a href="firewall_rules_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule"); ?>" width="17" height="17" border="0"></a></td>
777
					</tr>
778
					<tr>
779
					  <td align="center" valign="middle"><a href="firewall_rules.php?act=del&if=<?=htmlspecialchars($if);?>&id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule"); ?>" onclick="return confirm('Do you really want to delete this rule?')"></a></td>
780
					  <td><a href="firewall_rules_edit.php?dup=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new rule based on this one"); ?>" width="17" height="17" border="0"></a></td>
781
					</tr>
782
					</table>
783
				  </td>
784
				</tr>
785
			  <?php $nrules++; endfor; ?>
786
			  </tbody>
787
			  <?php if ($nrules == 0): ?>
788
              <td class="listt"></td>
789
			  <td class="listt"></td>
790
			  <td class="listlr" colspan="10" align="center" valign="middle">
791
			  <span class="gray">
792
			  <?=gettext("No rules are currently defined for this interface"); ?><br>
793
			  <?=gettext("All incoming connections on this interface will be blocked until you add pass rules."); ?><br><br>
794
			  <?=gettext("Click the"); ?> <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" border="0" width="17" height="17" align="absmiddle"></a><?=gettext(" button to add a new rule.");?></span>
795
			  </td>
796
			  <?php endif; ?>
797
                <tr id="fr<?=$nrules;?>">
798
                  <td class="list"></td>
799
                  <td class="list"></td>
800
<?php
801
				pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr_belowtable");
802
?>
803
                  <td class="list">&nbsp;</td>
804
                  <td class="list">&nbsp;</td>
805
                  <td class="list">&nbsp;</td>
806
                  <td class="list">&nbsp;</td>
807
		  <td class="list">&nbsp;</td>
808
		  <td class="list">&nbsp;</td>
809
                  <td class="list">&nbsp;</td>
810
                  <td class="list">&nbsp;</td>
811
                  <td class="list">&nbsp;</td>
812
                  <td class="list">&nbsp;</td>
813
                  <td class="list">
814
				    <table border="0" cellspacing="0" cellpadding="1">
815
					<tr>
816
				      <td>
817
					  <?php if ($nrules == 0): ?><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules to end");?>" border="0"><?php else: ?><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" width="17" height="17" title="<?=gettext("move selected rules to end");?>" onMouseOver="fr_insline(<?=$nrules;?>, true)" onMouseOut="fr_insline(<?=$nrules;?>, false)"><?php endif; ?></td>
818
					  <td></td>
819
				    </tr>
820
					<tr>
821
					  <td>
822
					  <?php if ($nrules == 0): ?>
823
					  <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0"><?php else: ?>
824
					  <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" onclick="return confirm('<?=gettext('Do you really want to delete the selected rules?');?>')"><?php endif; ?>
825
					  </td>
826
			                  <td><a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" width="17" height="17" border="0"></a></td>
827
					</tr>
828
				    </table>
829
				  </td>
830
				</tr>
831
              </table>
832
	      <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
833
                <tr>
834
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11"></td>
835
                  <td><?=gettext("pass");?></td>
836
                  <td width="14"></td>
837
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11"></td>
838
                  <td><?=gettext("block");?></td>
839
                  <td width="14"></td>
840
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject.gif" width="11" height="11"></td>
841
                  <td><?=gettext("reject");?></td>
842
                  <td width="14"></td>
843
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" width="11" height="11"></td>
844
                  <td><?=gettext("log");?></td>
845
                </tr>
846
                <tr>
847
                  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass_d.gif" width="11" height="11"></td>
848
                  <td nowrap><?=gettext("pass (disabled)");?></td>
849
                  <td>&nbsp;</td>
850
                  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block_d.gif" width="11" height="11"></td>
851
                  <td nowrap><?=gettext("block (disabled)");?></td>
852
                  <td>&nbsp;</td>
853
                  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject_d.gif" width="11" height="11"></td>
854
                  <td nowrap><?=gettext("reject (disabled)");?></td>
855
                  <td>&nbsp;</td>
856
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log_d.gif" width="11" height="11"></td>
857
                  <td nowrap><?=gettext("log (disabled)");?></td>
858
                </tr>
859
		<tr>
860
		  <td colspan="10">
861
  &nbsp;<p/>
862
  <strong>
863
	<span class="red"><?=gettext("Hint:");?></span>
864
  </strong><br>
865
	<ul>
866
<? if ("FloatingRules" != $if): ?>
867
	<li><?=gettext("Rules are evaluated on a first-match basis (i.e. " .
868
	"the action of the first rule to match a packet will be executed). " .
869
	"This means that if you use block rules, you'll have to pay attention " .
870
	"to the rule order. Everything that isn't explicitly passed is blocked " .
871
	"by default. ");?>
872
	</li>
873
<? else: ?>
874
	<li><?=gettext("Floating rules are evaluated on a first-match basis (i.e. " .
875
	"the action of the first rule to match a packet will be executed) only " .
876
	"if the 'quick' option is checked on a rule. Otherwise they will only apply if no " .
877
	"other rules match. Pay close attention to the rule order and options " .
878
	"chosen. If no rule here matches, the per-interface or default rules are used. ");?>
879
	</li>
880
<? endif; ?>
881
</ul>
882
		 </td>
883
	        </tr>
884
              </table>
885
	</div>
886
    </td>
887
  </tr>
888
</table>
889
  <input type="hidden" name="if" value="<?=htmlspecialchars($if);?>">
890
  <script type="text/javascript">
891
	var number_of_rules = <?=$nrules?>;
892
<?php $nrules = 0; for ($i = 0; isset($a_filter[$i]); $i++): ?>
893
/*
894
	Sortable.create("dragtable", { 
895
		tag:"tr", 
896
		format:"fr([0-9999999])",
897
		containment:["dragtable"], 
898
		onChange:function(affected) {
899
			document.body.style.cursor = 'move';
900
		},
901
		onUpdate:function(container) { 
902
			document.body.style.cursor = 'move';
903
			updateOrder(Sortable.serialize('dragtable', 'tr'));
904
		} 
905
	});
906
*/
907
<?php endfor; ?>
908
	function updateOrder(order) {
909
		if(document.getElementById("redboxtable"))
910
			$('redboxtable').hide();
911
		$('loading').show();
912
		document.body.style.cursor = 'wait';
913
		document.location = 'firewall_rules.php?if=<?=htmlspecialchars($if);?>&dragdroporder=true&' + Sortable.serialize('dragtable', 'tr');
914
		return;
915
	}
916
	$('loading').hide();
917
  </script>
918
</form>
919
<?php include("fend.inc"); ?>
920
</body>
921
</html>
(64-64/237)