Project

General

Profile

Download (31.6 KB) Statistics
| Branch: | Tag: | Revision:
1 b2ffe419 Scott Ullrich
<?php
2 b46bfcf5 Bill Marquette
/* $Id$ */
3 5b237745 Scott Ullrich
/*
4 37e2071c Scott Ullrich
	firewall_rules.php
5 e4cabb75 Scott Ullrich
	part of pfSense (http://www.pfsense.com)
6
        Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
7 b2ffe419 Scott Ullrich
8 e4cabb75 Scott Ullrich
	originally part of m0n0wall (http://m0n0.ch/wall)
9
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
10 37e2071c Scott Ullrich
	All rights reserved.
11 b2ffe419 Scott Ullrich
12 37e2071c Scott Ullrich
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14 b2ffe419 Scott Ullrich
15 37e2071c Scott Ullrich
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17 b2ffe419 Scott Ullrich
18 37e2071c Scott Ullrich
	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 b2ffe419 Scott Ullrich
22 37e2071c Scott Ullrich
	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 5b237745 Scott Ullrich
*/
33 7ac5a4cb Scott Ullrich
/*
34
	pfSense_MODULE:	filter
35
*/
36 5b237745 Scott Ullrich
37 6b07c15a Matthew Grooms
##|+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 37e2071c Scott Ullrich
$pgtitle = array("Firewall", "Rules");
45 5b237745 Scott Ullrich
require("guiconfig.inc");
46 7a927e67 Scott Ullrich
require_once("functions.inc");
47
require_once("filter.inc");
48
require_once("shaper.inc");
49 5b237745 Scott Ullrich
50 f1c49ff4 Scott Ullrich
function check_for_advaned_options(&$item) {
51
	$item_set = "";
52 a56b2fa0 pierrepomes
	if($item['max'])
53
		$item_set .= "max {$item['max']} ";
54 f1c49ff4 Scott Ullrich
	if($item['max-src-nodes'])
55
		$item_set .= "max-src-nodes {$item['max-src-nodes']} ";
56 26dd6a54 pierrepomes
	if($item['max-src-conn'])
57
		$item_set .= "max-src-conn {$item['max-src-conn']} ";
58 f1c49ff4 Scott Ullrich
	if($item['max-src-states'])
59
		$item_set .= "max-src-states {$item['max-src-states']} ";
60
	if($item['statetype'] != "keep state" && $item['statetype'] != "")
61
		$item_set .= "statetype {$item['statetype']} {$item['statetype']}";
62
	if($item['statetimeout'])
63
		$item_set .= "statetimeout {$item['statetimeout']}";
64
	if($item['nosync'])
65
		$item_set .= "nosync ";
66
	if($item['max-src-conn-rate'])
67
		$item_set .= "max-src-conn-rate {$item['max-src-conn-rate']} ";
68
	if($item['max-src-conn-rates'])
69
		$item_set .= "max-src-conn-rates {$item['max-src-conn-rates']} ";
70
	return $item_set;
71
}
72
73 00c82782 Renato Botelho
function delete_nat_association($id) {
74
	global $config;
75
76
	if (!$id || !is_array($config['nat']['rule']))
77 673d29c0 Renato Botelho
		return;
78
79 00c82782 Renato Botelho
	$a_nat = &$config['nat']['rule'];
80
81
	foreach ($a_nat as &$natent)
82
		if ($natent['associated-rule-id'] == $id)
83
			$natent['associated-rule-id'] = '';
84 673d29c0 Renato Botelho
}
85
86 5b237745 Scott Ullrich
if (!is_array($config['filter']['rule'])) {
87
	$config['filter']['rule'] = array();
88
}
89
filter_rules_sort();
90
$a_filter = &$config['filter']['rule'];
91
92 07bd3f83 Scott Ullrich
$if = $_GET['if'];
93
if ($_POST['if'])
94
	$if = $_POST['if'];
95 b2ffe419 Scott Ullrich
96 cbe3ea96 Ermal Luçi
$ifdescs = get_configured_interface_with_descr();
97 07bd3f83 Scott Ullrich
98 90ba56ad Scott Ullrich
/* add group interfaces */
99
if (is_array($config['ifgroups']['ifgroupentry']))
100
	foreach($config['ifgroups']['ifgroupentry'] as $ifgen)
101
		if (have_ruleint_access($ifgen['ifname']))
102
			$iflist[$ifgen['ifname']] = $ifgen['ifname'];
103
104 aef4dc74 Ermal Luçi
foreach ($ifdescs as $ifent => $ifdesc)
105
	if(have_ruleint_access($ifent)) 
106
		$iflist[$ifent] = $ifdesc;
107 88bcd1d2 Scott Dale
108 617f8d25 Ermal Lu?i
if ($config['l2tp']['mode'] == "server")
109
        if(have_ruleint_access("l2tp"))
110
                $iflist['l2tp'] = "L2TP VPN";
111
112 07bd3f83 Scott Ullrich
if ($config['pptpd']['mode'] == "server")
113 d81c2ad1 Scott Ullrich
	if(have_ruleint_access("pptp")) 
114
		$iflist['pptp'] = "PPTP VPN";
115 50e0d2a1 Scott Ullrich
116 0e1e0183 Scott Ullrich
if ($config['pppoe']['mode'] == "server")
117 d81c2ad1 Scott Ullrich
	if(have_ruleint_access("pppoe")) 
118
		$iflist['pppoe'] = "PPPoE VPN";
119 0c554ff6 Scott Ullrich
120 88bcd1d2 Scott Dale
/* add ipsec interfaces */
121 d81c2ad1 Scott Ullrich
if (isset($config['ipsec']['enable']) || isset($config['ipsec']['mobileclients']['enable']))
122
	if(have_ruleint_access("enc0")) 
123 0f266b2e Chris Buechler
		$iflist["enc0"] = "IPsec";
124 07bd3f83 Scott Ullrich
125 bfb60ac8 Ermal Luçi
/* add openvpn/tun interfaces */
126 d799787e Matthew Grooms
if  ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"])
127
   	$iflist["openvpn"] = "OpenVPN";
128 bfb60ac8 Ermal Luçi
129 92125c97 Ermal Luçi
if (!$if || !isset($iflist[$if])) {
130
	if ("any" == $if)
131 15160475 Ermal Luçi
                $if = "FloatingRules";
132 92125c97 Ermal Luçi
        else if ("FloatingRules" != $if)
133
                $if = "wan";
134
}
135 07bd3f83 Scott Ullrich
136 5b237745 Scott Ullrich
if ($_POST) {
137
138
	$pconfig = $_POST;
139
140
	if ($_POST['apply']) {
141 37e2071c Scott Ullrich
		$retval = 0;
142 9a7e416c Scott Ullrich
		$retval = filter_configure();
143
144 a368a026 Ermal Lu?i
		clear_subsystem_dirty('filter');
145 a985eac2 Scott Ullrich
146 4739bd06 Scott Ullrich
		$savemsg = "The settings have been applied.  The firewall rules are now reloading in the background.  You can also <a href='status_filter_reload.php'>monitor</a> the reload progress.";
147 5b237745 Scott Ullrich
	}
148
}
149
150 d97c50cd Bill Marquette
if ($_GET['act'] == "del") {
151 673d29c0 Renato Botelho
	if ($a_filter[$_GET['id']]) {
152
		if (!empty($a_filter[$_GET['id']]['associated-rule-id'])) {
153 00c82782 Renato Botelho
			delete_nat_association($a_filter[$_GET['id']]['associated-rule-id']);
154 673d29c0 Renato Botelho
		}
155
		unset($a_filter[$_GET['id']]);
156
		write_config();
157 a368a026 Ermal Lu?i
		mark_subsystem_dirty('filter');
158 673d29c0 Renato Botelho
		header("Location: firewall_rules.php?if={$if}");
159
		exit;
160
	}
161 d97c50cd Bill Marquette
}
162
163 07bd3f83 Scott Ullrich
if (isset($_POST['del_x'])) {
164
	/* delete selected rules */
165
	if (is_array($_POST['rule']) && count($_POST['rule'])) {
166
		foreach ($_POST['rule'] as $rulei) {
167 00c82782 Renato Botelho
			delete_nat_association($a_filter[$rulei]['associated-rule-id']);
168 07bd3f83 Scott Ullrich
			unset($a_filter[$rulei]);
169
		}
170 5b237745 Scott Ullrich
		write_config();
171 a368a026 Ermal Lu?i
		mark_subsystem_dirty('filter');
172 07bd3f83 Scott Ullrich
		header("Location: firewall_rules.php?if={$if}");
173 5b237745 Scott Ullrich
		exit;
174
	}
175 07bd3f83 Scott Ullrich
} else if ($_GET['act'] == "toggle") {
176
	if ($a_filter[$_GET['id']]) {
177 f53b85a3 Scott Ullrich
                if(isset($a_filter[$_GET['id']]['disabled']))
178 734edbdf Bill Marquette
                        unset($a_filter[$_GET['id']]['disabled']);
179
                else
180
                        $a_filter[$_GET['id']]['disabled'] = true;
181 5b237745 Scott Ullrich
		write_config();
182 a368a026 Ermal Lu?i
		mark_subsystem_dirty('filter');
183 07bd3f83 Scott Ullrich
		header("Location: firewall_rules.php?if={$if}");
184 5b237745 Scott Ullrich
		exit;
185
	}
186 07bd3f83 Scott Ullrich
} else {
187 b2ffe419 Scott Ullrich
	/* yuck - IE won't send value attributes for image buttons, while Mozilla does -
188 37e2071c Scott Ullrich
	   so we use .x/.y to fine move button clicks instead... */
189 07bd3f83 Scott Ullrich
	unset($movebtn);
190
	foreach ($_POST as $pn => $pd) {
191
		if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
192
			$movebtn = $matches[1];
193
			break;
194
		}
195 5b237745 Scott Ullrich
	}
196 07bd3f83 Scott Ullrich
	/* move selected rules before this rule */
197
	if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
198
		$a_filter_new = array();
199 b2ffe419 Scott Ullrich
200 07bd3f83 Scott Ullrich
		/* copy all rules < $movebtn and not selected */
201
		for ($i = 0; $i < $movebtn; $i++) {
202
			if (!in_array($i, $_POST['rule']))
203
				$a_filter_new[] = $a_filter[$i];
204
		}
205 b2ffe419 Scott Ullrich
206 07bd3f83 Scott Ullrich
		/* copy all selected rules */
207
		for ($i = 0; $i < count($a_filter); $i++) {
208
			if ($i == $movebtn)
209
				continue;
210
			if (in_array($i, $_POST['rule']))
211
				$a_filter_new[] = $a_filter[$i];
212
		}
213 b2ffe419 Scott Ullrich
214 07bd3f83 Scott Ullrich
		/* copy $movebtn rule */
215
		if ($movebtn < count($a_filter))
216
			$a_filter_new[] = $a_filter[$movebtn];
217 b2ffe419 Scott Ullrich
218 07bd3f83 Scott Ullrich
		/* copy all rules > $movebtn and not selected */
219
		for ($i = $movebtn+1; $i < count($a_filter); $i++) {
220
			if (!in_array($i, $_POST['rule']))
221
				$a_filter_new[] = $a_filter[$i];
222
		}
223 b2ffe419 Scott Ullrich
224 07bd3f83 Scott Ullrich
		$a_filter = $a_filter_new;
225 5b237745 Scott Ullrich
		write_config();
226 a368a026 Ermal Lu?i
		mark_subsystem_dirty('filter');
227 07bd3f83 Scott Ullrich
		header("Location: firewall_rules.php?if={$if}");
228 5b237745 Scott Ullrich
		exit;
229
	}
230
}
231 3a54b6ca Scott Dale
$closehead = false;
232 5b237745 Scott Ullrich
233 9a25487b Scott Ullrich
include("head.inc");
234
235 3a54b6ca Scott Dale
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/domLib.js\"></script>";
236
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/domTT.js\"></script>";
237
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/behaviour.js\"></script>";
238
echo "<script type=\"text/javascript\" language=\"javascript\" src=\"/javascript/domTT/fadomatic.js\"></script>";
239 5b237745 Scott Ullrich
?>
240 3a54b6ca Scott Dale
</head>
241
242 5b237745 Scott Ullrich
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
243
<?php include("fbegin.inc"); ?>
244
<form action="firewall_rules.php" method="post">
245 625dcc40 Bill Marquette
<script type="text/javascript" language="javascript" src="/javascript/row_toggle.js">
246 fa65a62b Scott Ullrich
</script>
247 5b237745 Scott Ullrich
<?php if ($savemsg) print_info_box($savemsg); ?>
248 a368a026 Ermal Lu?i
<?php if (is_subsystem_dirty('filter')): ?><p>
249 5b237745 Scott Ullrich
<?php print_info_box_np("The firewall rule configuration has been changed.<br>You must apply the changes in order for them to take effect.");?><br>
250
<?php endif; ?>
251 07bd3f83 Scott Ullrich
<table width="100%" border="0" cellpadding="0" cellspacing="0">
252 37e2071c Scott Ullrich
  <tr><td class="tabnavtbl">
253 0366b748 Scott Ullrich
  <?php
254
	/* active tabs */
255
	$tab_array = array();
256 92125c97 Ermal Luçi
       if ("FloatingRules" == $if)
257
                        $active = true;
258
                else
259
                        $active = false;
260 661aed33 Ermal Luçi
        $tab_array[] = array("Floating", $active, "firewall_rules.php?if=FloatingRules");
261 0366b748 Scott Ullrich
	$tabscounter = 0; $i = 0; foreach ($iflist as $ifent => $ifname) {
262
		if ($ifent == $if)
263
			$active = true;
264
		else
265
			$active = false;
266
		$tab_array[] = array($ifname, $active, "firewall_rules.php?if={$ifent}");
267
	}
268
	display_top_tabs($tab_array);
269
  ?>
270 07bd3f83 Scott Ullrich
  </td></tr>
271 b2ffe419 Scott Ullrich
  <tr>
272 d732f186 Bill Marquette
    <td>
273
	<div id="mainarea">
274
              <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
275 fa65a62b Scott Ullrich
                <tr id="frheader">
276 37e2071c Scott Ullrich
                  <td width="3%" class="list">&nbsp;</td>
277 5b237745 Scott Ullrich
                  <td width="5%" class="list">&nbsp;</td>
278 b9e28d57 unknown
                  <td width="3%" class="listhdrr">ID</td>
279 197bfe96 Ermal Luçi
                  <td width="6%" class="listhdrr">Proto</td>
280 664742f7 Renato Botelho
                  <td width="12%" class="listhdrr">Source</td>
281
                  <td width="6%" class="listhdrr">Port</td>
282
                  <td width="12%" class="listhdrr">Destination</td>
283
                  <td width="6%" class="listhdrr">Port</td>
284 197bfe96 Ermal Luçi
		  <td width="5%" class="listhdrr">Gateway</td>
285 664742f7 Renato Botelho
		  <td width="8%" class="listhdrr">Queue</td>
286 197bfe96 Ermal Luçi
		  <td width="5%" class="listhdrr">Schedule</td>
287 664742f7 Renato Botelho
                  <td width="19%" class="listhdr">Description</td>
288 d415d821 Seth Mos
                  <td width="10%" class="list">
289
			<table border="0" cellspacing="0" cellpadding="1">
290
			   <tr>
291
				<?php
292
					$nrules = 0;
293
					for ($i = 0; isset($a_filter[$i]); $i++) {
294
						$filterent = $a_filter[$i];
295 92125c97 Ermal Luçi
						if ($filterent['interface'] != $if && !isset($filterent['floating']))
296 f1c49ff4 Scott Ullrich
							continue;
297
						if (isset($filterent['floating']) && "FloatingRules" != $if)
298 d415d821 Seth Mos
							continue;
299
						$nrules++;
300
					}
301
				?>
302
				<td>
303
				<?php if ($nrules == 0): ?>
304
				<img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="delete selected rules" border="0"><?php else: ?>
305
				<input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="delete selected rules" onclick="return confirm('Do you really want to delete the selected rules?')"><?php endif; ?>
306
				</td>
307
				<td align="center" valign="middle"><a href="firewall_rules_edit.php?if=<?=$if;?>&after=-1"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="add new rule" width="17" height="17" border="0"></a></td>
308
			   </tr>
309
			</table>
310
		  </td>
311
		</tr>
312 f1f60c92 Ermal Luçi
<?php if (isset($config['interfaces'][$if]['blockpriv'])): ?>
313 d9eeccbd Scott Ullrich
                <tr valign="top" id="frrfc1918">
314 664742f7 Renato Botelho
                  <td class="list">&nbsp;</td>
315 f77830b3 Scott Ullrich
                  <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0"></td>
316 b9e28d57 unknown
                  <td class="listlr" style="background-color: #e0e0e0"></td>
317
                  <td class="listr" style="background-color: #e0e0e0">*</td>
318 d9eeccbd Scott Ullrich
                  <td class="listr" style="background-color: #e0e0e0">RFC 1918 networks</td>
319
                  <td class="listr" style="background-color: #e0e0e0">*</td>
320
                  <td class="listr" style="background-color: #e0e0e0">*</td>
321
                  <td class="listr" style="background-color: #e0e0e0">*</td>
322 40ad834c Scott Dale
                  <td class="listr" style="background-color: #e0e0e0">*</td>
323 b45dcff4 Scott Ullrich
		<td class="listr" style="background-color: #e0e0e0">*</td>
324 8ff2395b Scott Ullrich
	 		 <td class="listr" style="background-color: #e0e0e0"></td>
325 c3fdc1fd Scott Ullrich
                  <td class="listbg">Block private networks</td>
326 d9eeccbd Scott Ullrich
                  <td valign="middle" nowrap class="list">
327
				    <table border="0" cellspacing="0" cellpadding="1">
328
					<tr>
329
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="move selected rules before this rule"></td>
330 67d5b508 Chris Buechler
					  <td><a href="interfaces.php?if=<?=$if?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="edit rule" width="17" height="17" border="0"></a></td>
331 d9eeccbd Scott Ullrich
					</tr>
332
					<tr>
333
					  <td align="center" valign="middle"></td>
334 83b81db7 Scott Ullrich
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="add a new rule based on this one" width="17" height="17" border="0"></td>
335 d9eeccbd Scott Ullrich
					</tr>
336
					</table>
337
				  </td>
338
				</tr>
339 c20c0f5a Scott Ullrich
<?php endif; ?>
340 f1f60c92 Ermal Luçi
<?php if (isset($config['interfaces'][$if]['blockbogons'])): ?>
341 c20c0f5a Scott Ullrich
                <tr valign="top" id="frrfc1918">
342 664742f7 Renato Botelho
                  <td class="list">&nbsp;</td>
343 c20c0f5a Scott Ullrich
                  <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0"></td>
344 b9e28d57 unknown
                  <td class="listlr" style="background-color: #e0e0e0"></td>
345
                  <td class="listr" style="background-color: #e0e0e0">*</td>
346 40ad834c Scott Dale
                  <td class="listr" style="background-color: #e0e0e0">Reserved/not assigned by IANA</td>
347 c20c0f5a Scott Ullrich
                  <td class="listr" style="background-color: #e0e0e0">*</td>
348
                  <td class="listr" style="background-color: #e0e0e0">*</td>
349
                  <td class="listr" style="background-color: #e0e0e0">*</td>
350 40ad834c Scott Dale
				  <td class="listr" style="background-color: #e0e0e0">*</td>
351
				   <td class="listr" style="background-color: #e0e0e0">*</td>
352 f1f60c92 Ermal Luçi
		  <td class="listr" style="background-color: #e0e0e0">*</td>
353 e34ecb20 Chris Buechler
                  <td class="listbg">Block bogon networks</td>
354 c20c0f5a Scott Ullrich
                  <td valign="middle" nowrap class="list">
355
				    <table border="0" cellspacing="0" cellpadding="1">
356
					<tr>
357
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="move selected rules before this rule"></td>
358 67d5b508 Chris Buechler
					  <td><a href="interfaces.php?if=<?=$if?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="edit rule" width="17" height="17" border="0"></a></td>
359 c20c0f5a Scott Ullrich
					</tr>
360
					<tr>
361
					  <td align="center" valign="middle"></td>
362
					  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="add a new rule based on this one" width="17" height="17" border="0"></td>
363
					</tr>
364
					</table>
365
				  </td>
366
				</tr>
367
<?php endif; ?>
368 07bd3f83 Scott Ullrich
				<?php $nrules = 0; for ($i = 0; isset($a_filter[$i]); $i++):
369
					$filterent = $a_filter[$i];
370 92125c97 Ermal Luçi
					if ($filterent['interface'] != $if && !isset($filterent['floating']))
371 f1c49ff4 Scott Ullrich
						continue;
372
					if (isset($filterent['floating']) && "FloatingRules" != $if)
373
						continue;
374
					$isadvset = check_for_advaned_options($filterent);
375
					if($isadvset)
376 9c347273 Scott Ullrich
						$advanced_set = "<img src=\"./themes/{$g['theme']}/images/icons/icon_advanced.gif\" title=\"advanced settings set: $isadvset\" border=\"0\">";
377 f1c49ff4 Scott Ullrich
					else 
378
						$advanced_set = ""
379 07bd3f83 Scott Ullrich
				?>
380 37e2071c Scott Ullrich
                <tr valign="top" id="fr<?=$nrules;?>">
381 f1c49ff4 Scott Ullrich
                  <td class="listt">
382
					<input type="checkbox" id="frc<?=$nrules;?>" name="rule[]" value="<?=$i;?>" onClick="fr_bgcolor('<?=$nrules;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;">
383
					<?php echo $advanced_set; ?>
384
				  </td>
385 37e2071c Scott Ullrich
                  <td class="listt" align="center">
386 5b237745 Scott Ullrich
				  <?php if ($filterent['type'] == "block")
387
				  			$iconfn = "block";
388
						else if ($filterent['type'] == "reject") {
389 e91baab8 Chris Buechler
							$iconfn = "reject";
390 5b237745 Scott Ullrich
						} else
391
							$iconfn = "pass";
392
						if (isset($filterent['disabled'])) {
393
							$textss = "<span class=\"gray\">";
394
							$textse = "</span>";
395
							$iconfn .= "_d";
396
						} else {
397
							$textss = $textse = "";
398
						}
399
				  ?>
400 677c0869 Erik Kristensen
				  <a href="?if=<?=$if;?>&act=toggle&id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0" title="click to toggle enabled/disabled status"></a>
401 5b237745 Scott Ullrich
				  <?php if (isset($filterent['log'])):
402 6fecc73b Scott Dale
							$iconfnlog = "log_s";
403 5b237745 Scott Ullrich
						if (isset($filterent['disabled']))
404 6fecc73b Scott Dale
							$iconfnlog .= "_d";
405 5b237745 Scott Ullrich
				  	?>
406 6fecc73b Scott Dale
				  <br><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfnlog;?>.gif" width="11" height="15" border="0">
407 5b237745 Scott Ullrich
				  <?php endif; ?>
408
				  </td>
409 3a54b6ca Scott Dale
				<?php
410 2a9db752 Scott Dale
				
411 2a113ca9 Scott Dale
				//build Alias popup box
412 3a54b6ca Scott Dale
				$span_end = "";
413
				$alias_src_span_begin = "";
414
				$alias_src_port_span_begin = "";
415
				$alias_dst_span_begin = "";
416
				$alias_dst_port_span_begin = "";
417
				
418 2a9db752 Scott Dale
				$alias_popup = rule_popup($filterent['source']['address'],pprint_port($filterent['source']['port']),$filterent['destination']['address'],pprint_port($filterent['destination']['port']));
419
				$span_end = "</U></span>";
420 3a54b6ca Scott Dale
					
421 2a9db752 Scott Dale
				$alias_src_span_begin = $alias_popup["src"];
422
				 									
423
				$alias_src_port_span_begin = $alias_popup["srcport"];
424
													
425
				$alias_dst_span_begin = $alias_popup["dst"];
426
														
427
				$alias_dst_port_span_begin = $alias_popup["dstport"];
428 3a54b6ca Scott Dale
					
429 2a113ca9 Scott Dale
				//build Schedule popup box
430
				$a_schedules = &$config['schedules']['schedule'];
431
				$schedule_span_begin = "";
432
				$schedule_span_end = "";
433 d2aa8cd6 sullrich
				$sched_caption_escaped = "";
434 eace1363 Scott Dale
				$sched_content = "";
435 3b907eb1 Scott Dale
				$schedstatus = false;
436 2a113ca9 Scott Dale
				$dayArray = array ('Mon','Tues','Wed','Thur','Fri','Sat','Sun');
437
				$monthArray = array ('January','February','March','April','May','June','July','August','September','October','November','December');
438 8ce97a08 Scott Dale
				if($config['schedules']['schedule'] <> "" and is_array($config['schedules']['schedule'])){
439
					foreach ($a_schedules as $schedule)
440
					{
441
						if ($schedule['name'] == $filterent['sched'] ){
442 60120e37 Ermal Lu?i
							$schedstatus = filter_get_time_based_rule_status($schedule);
443 8ce97a08 Scott Dale
							
444
							foreach($schedule['timerange'] as $timerange) {
445
								$tempFriendlyTime = "";
446
								$tempID = "";
447
								$firstprint = false;
448
								if ($timerange){
449
									$dayFriendly = "";
450
									$tempFriendlyTime = "";							
451
										
452
									//get hours
453
									$temptimerange = $timerange['hour'];
454
									$temptimeseparator = strrpos($temptimerange, "-");
455 2a113ca9 Scott Dale
									
456 8ce97a08 Scott Dale
									$starttime = substr ($temptimerange, 0, $temptimeseparator); 
457
									$stoptime = substr ($temptimerange, $temptimeseparator+1); 
458 2a113ca9 Scott Dale
										
459 8ce97a08 Scott Dale
									if ($timerange['month']){
460
										$tempmontharray = explode(",", $timerange['month']);
461
										$tempdayarray = explode(",",$timerange['day']);
462
										$arraycounter = 0;
463
										$firstDayFound = false;
464
										$firstPrint = false;
465
										foreach ($tempmontharray as $monthtmp){
466
											$month = $tempmontharray[$arraycounter];
467
											$day = $tempdayarray[$arraycounter];
468 2a113ca9 Scott Dale
											
469
											if (!$firstDayFound)
470
											{
471 8ce97a08 Scott Dale
												$firstDay = $day;
472
												$firstmonth = $month;
473 2a113ca9 Scott Dale
												$firstDayFound = true;
474
											}
475 8ce97a08 Scott Dale
												
476
											$currentDay = $day;
477
											$nextDay = $tempdayarray[$arraycounter+1];
478
											$currentDay++;
479
											if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])){
480
												if ($firstPrint)
481 2a113ca9 Scott Dale
													$dayFriendly .= ", ";
482
												$currentDay--;
483
												if ($currentDay != $firstDay)
484 8ce97a08 Scott Dale
													$dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
485 2a113ca9 Scott Dale
												else
486 8ce97a08 Scott Dale
													$dayFriendly .=  $monthArray[$month-1] . " " . $day;
487 2a113ca9 Scott Dale
												$firstDayFound = false;	
488 8ce97a08 Scott Dale
												$firstPrint = true;
489
											}													
490
											$arraycounter++;	
491 2a113ca9 Scott Dale
										}
492
									}
493 8ce97a08 Scott Dale
									else
494
									{
495
										$tempdayFriendly = $timerange['position'];
496
										$firstDayFound = false;
497
										$tempFriendlyDayArray = explode(",", $tempdayFriendly);								
498
										$currentDay = "";
499
										$firstDay = "";
500
										$nextDay = "";
501
										$counter = 0;													
502
										foreach ($tempFriendlyDayArray as $day){
503
											if ($day != ""){
504
												if (!$firstDayFound)
505
												{
506
													$firstDay = $tempFriendlyDayArray[$counter];
507
													$firstDayFound = true;
508
												}
509
												$currentDay =$tempFriendlyDayArray[$counter];
510
												//get next day
511
												$nextDay = $tempFriendlyDayArray[$counter+1];
512
												$currentDay++;					
513
												if ($currentDay != $nextDay){
514
													if ($firstprint)
515
														$dayFriendly .= ", ";
516
													$currentDay--;
517
													if ($currentDay != $firstDay)
518
														$dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
519
													else
520
														$dayFriendly .= $dayArray[$firstDay-1];
521
													$firstDayFound = false;	
522
													$firstprint = true;			
523
												}
524
												$counter++;
525
											}
526
										}
527
									}		
528
									$timeFriendly = $starttime . " - " . $stoptime;
529
									$description = $timerange['rangedescr'];
530
									$sched_content .= $dayFriendly . "; " . $timeFriendly . "<br>";
531
								}
532 2a113ca9 Scott Dale
							}
533 d2aa8cd6 sullrich
							$sched_caption_escaped = str_replace("'", "\'", $schedule['descr']);
534
							$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>";
535 8ce97a08 Scott Dale
							$schedule_span_end = "</U></span>";
536 2a113ca9 Scott Dale
						}
537
					}
538
				}
539 6fecc73b Scott Dale
				$printicon = false;
540 616dd997 Scott Dale
				$alttext = "";
541
				$image = "";
542
				if (!isset($filterent['disabled'])){
543
					 if ($schedstatus) 
544
					 { 
545
					 	if ($iconfn == "block" || $iconfn == "reject")
546
					 	{
547 5b552ac7 Scott Dale
					 		$image = "icon_block";
548 616dd997 Scott Dale
					 		$alttext = "Traffic matching this rule is currently being denied";
549
					 	}
550
					 	else
551
					 	{
552 5b552ac7 Scott Dale
					 		$image = "icon_pass";
553 616dd997 Scott Dale
					 		$alttext = "Traffic matching this rule is currently being allowed";
554
					 	}
555
					 	$printicon = true;
556
					  }
557
					  else if ($filterent['sched'])
558
					  { 
559
					 	if ($iconfn == "block" || $iconfn == "reject")
560 5b552ac7 Scott Dale
					 		$image = "icon_block_d";
561 616dd997 Scott Dale
					 	else
562 5b552ac7 Scott Dale
					 		$image = "icon_block";
563 eb01fcec Ermal
					 	$alttext = "This rule is not currently active because its period has expired";
564 616dd997 Scott Dale
					 	$printicon = true;				  	
565
					  }
566
				}
567 3a54b6ca Scott Dale
				?>
568 98e29097 Bill Marquette
                  <td class="listlr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
569 b9e28d57 unknown
                    <?=$textss;?><?php if (isset($filterent['id'])) echo $filterent['id']; else echo ""; ?><?=$textse;?>
570
                  </td>
571
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
572 5b237745 Scott Ullrich
                    <?=$textss;?><?php if (isset($filterent['protocol'])) echo strtoupper($filterent['protocol']); else echo "*"; ?><?=$textse;?>
573
                  </td>
574 98e29097 Bill Marquette
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
575 3a54b6ca Scott Dale
				    <?=$textss;?><?php echo $alias_src_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['source']));?><?php echo $alias_src_span_end;?><?=$textse;?>
576 5b237745 Scott Ullrich
                  </td>
577 98e29097 Bill Marquette
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
578 3a54b6ca Scott Dale
                    <?=$textss;?><?php echo $alias_src_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['source']['port'])); ?><?php echo $alias_src_port_span_end;?><?=$textse;?>
579 5b237745 Scott Ullrich
                  </td>
580 98e29097 Bill Marquette
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
581 3a54b6ca Scott Dale
				    <?=$textss;?><?php echo $alias_dst_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['destination'])); ?><?php echo $alias_dst_span_end;?><?=$textse;?>
582 5b237745 Scott Ullrich
                  </td>
583 3a54b6ca Scott Dale
	              <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
584
                    <?=$textss;?><?php echo $alias_dst_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['destination']['port'])); ?><?php echo $alias_dst_port_span_end;?><?=$textse;?>
585 5b237745 Scott Ullrich
                  </td>
586 b504c2f8 Scott Ullrich
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
587 e9832b41 Bill Marquette
                    <?=$textss;?><?php if (isset($config['interfaces'][$filterent['gateway']]['descr'])) echo htmlspecialchars($config['interfaces'][$filterent['gateway']]['descr']); else  echo htmlspecialchars(pprint_port($filterent['gateway'])); ?><?=$textse;?>
588 b504c2f8 Scott Ullrich
                  </td>
589 197bfe96 Ermal Luçi
<td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';"><?=$textss;?>
590
                          <?php
591
							if (isset($filterent['ackqueue']) && isset($filterent['defaultqueue'])) {
592
								$desc = $filterent['ackqueue'] ;
593
							    echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['ackqueue']}&action=show\">{$desc}</a>";
594
								$desc = $filterent['defaultqueue'];
595
							    echo "/<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&action=show\">{$desc}</a>";
596
							} else if (isset($filterent['defaultqueue'])) {
597
								$desc = $filterent['defaultqueue'];
598
							    echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&action=show\">{$desc}</a>"; }
599
							else echo "none";
600
						  ?><?=$textse;?>
601
                        </td>
602 3595b631 Scott Dale
                  <td class="listr" onClick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';"><font color="black">
603 d3bcf522 Scott Dale
                    <?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;?>
604 7738faa8 Scott Ullrich
                  </td>
605 c2a6f323 Scott Ullrich
                  <td class="listbg" onClick="fr_toggle(<?=$nrules;?>)" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';" class="descr">
606 07bd3f83 Scott Ullrich
                    <?=$textss;?><?=htmlspecialchars($filterent['descr']);?>&nbsp;<?=$textse;?>
607 5b237745 Scott Ullrich
                  </td>
608
                  <td valign="middle" nowrap class="list">
609 07bd3f83 Scott Ullrich
				    <table border="0" cellspacing="0" cellpadding="1">
610
					<tr>
611 677c0869 Erik Kristensen
					  <td><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" width="17" height="17" title="move selected rules before this rule" onMouseOver="fr_insline(<?=$nrules;?>, true)" onMouseOut="fr_insline(<?=$nrules;?>, false)"></td>
612
					  <td><a href="firewall_rules_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="edit rule" width="17" height="17" border="0"></a></td>
613 07bd3f83 Scott Ullrich
					</tr>
614
					<tr>
615 1cfed9db Scott Ullrich
					  <td align="center" valign="middle"><a href="firewall_rules.php?act=del&if=<?=$if;?>&id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="delete rule" onclick="return confirm('Do you really want to delete this rule?')"></a></td>
616 677c0869 Erik Kristensen
					  <td><a href="firewall_rules_edit.php?dup=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="add a new rule based on this one" width="17" height="17" border="0"></a></td>
617 07bd3f83 Scott Ullrich
					</tr>
618
					</table>
619 5b237745 Scott Ullrich
				  </td>
620
				</tr>
621 07bd3f83 Scott Ullrich
			  <?php $nrules++; endfor; ?>
622
			  <?php if ($nrules == 0): ?>
623 37e2071c Scott Ullrich
              <td class="listt"></td>
624 07bd3f83 Scott Ullrich
			  <td class="listt"></td>
625 d5a1008d Scott Ullrich
			  <td class="listlr" colspan="10" align="center" valign="middle">
626 07bd3f83 Scott Ullrich
			  <span class="gray">
627
			  No rules are currently defined for this interface.<br>
628
			  All incoming connections on this interface will be blocked until you add pass rules.<br><br>
629 677c0869 Erik Kristensen
			  Click the <a href="firewall_rules_edit.php?if=<?=$if;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="add new rule" border="0" width="17" height="17" align="absmiddle"></a> button to add a new rule.</span>
630 07bd3f83 Scott Ullrich
			  </td>
631
			  <?php endif; ?>
632 37e2071c Scott Ullrich
                <tr id="fr<?=$nrules;?>">
633
                  <td class="list"></td>
634
                  <td class="list"></td>
635
                  <td class="list">&nbsp;</td>
636
                  <td class="list">&nbsp;</td>
637
                  <td class="list">&nbsp;</td>
638 b9e28d57 unknown
                  <td class="list">&nbsp;</td>
639 1c7e3ec6 Bill Marquette
		  <td class="list">&nbsp;</td>
640
		  <td class="list">&nbsp;</td>
641
                  <td class="list">&nbsp;</td>
642 37e2071c Scott Ullrich
                  <td class="list">&nbsp;</td>
643
                  <td class="list">&nbsp;</td>
644
                  <td class="list">&nbsp;</td>
645 07bd3f83 Scott Ullrich
                  <td class="list">
646
				    <table border="0" cellspacing="0" cellpadding="1">
647
					<tr>
648
				      <td>
649 677c0869 Erik Kristensen
					  <?php if ($nrules == 0): ?><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="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="move selected rules to end" onMouseOver="fr_insline(<?=$nrules;?>, true)" onMouseOut="fr_insline(<?=$nrules;?>, false)"><?php endif; ?></td>
650 37e2071c Scott Ullrich
					  <td></td>
651 07bd3f83 Scott Ullrich
				    </tr>
652
					<tr>
653 3086d0f8 Scott Ullrich
					  <td>
654
					  <?php if ($nrules == 0): ?>
655
					  <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="delete selected rules" border="0"><?php else: ?>
656
					  <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="delete selected rules" onclick="return confirm('Do you really want to delete the selected rules?')"><?php endif; ?>
657
					  </td>
658 d415d821 Seth Mos
			                  <td><a href="firewall_rules_edit.php?if=<?=$if;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="add new rule" width="17" height="17" border="0"></a></td>
659 07bd3f83 Scott Ullrich
					</tr>
660
				    </table>
661
				  </td>
662 5b237745 Scott Ullrich
				</tr>
663
              </table>
664 d732f186 Bill Marquette
	      <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
665 b2ffe419 Scott Ullrich
                <tr>
666 677c0869 Erik Kristensen
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11"></td>
667 5b237745 Scott Ullrich
                  <td>pass</td>
668
                  <td width="14"></td>
669 677c0869 Erik Kristensen
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11"></td>
670 5b237745 Scott Ullrich
                  <td>block</td>
671
                  <td width="14"></td>
672 677c0869 Erik Kristensen
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject.gif" width="11" height="11"></td>
673 5b237745 Scott Ullrich
                  <td>reject</td>
674
                  <td width="14"></td>
675 677c0869 Erik Kristensen
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" width="11" height="11"></td>
676 5b237745 Scott Ullrich
                  <td>log</td>
677
                </tr>
678 b2ffe419 Scott Ullrich
                <tr>
679 677c0869 Erik Kristensen
                  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass_d.gif" width="11" height="11"></td>
680 d732f186 Bill Marquette
                  <td nowrap>pass (disabled)</td>
681
                  <td>&nbsp;</td>
682 677c0869 Erik Kristensen
                  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block_d.gif" width="11" height="11"></td>
683 d732f186 Bill Marquette
                  <td nowrap>block (disabled)</td>
684
                  <td>&nbsp;</td>
685 677c0869 Erik Kristensen
                  <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject_d.gif" width="11" height="11"></td>
686 d732f186 Bill Marquette
                  <td nowrap>reject (disabled)</td>
687
                  <td>&nbsp;</td>
688 677c0869 Erik Kristensen
                  <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log_d.gif" width="11" height="11"></td>
689 d732f186 Bill Marquette
                  <td nowrap>log (disabled)</td>
690 5b237745 Scott Ullrich
                </tr>
691 d732f186 Bill Marquette
		<tr>
692 05860c07 Scott Ullrich
		  <td colspan="10">
693 07bd3f83 Scott Ullrich
  <p>
694
  <strong><span class="red">Hint:<br>
695 37e2071c Scott Ullrich
  </span></strong>Rules are evaluated on a first-match basis (i.e.
696 b2ffe419 Scott Ullrich
  the action of the first rule to match a packet will be executed).
697
  This means that if you use block rules, you'll have to pay attention
698
  to the rule order. Everything that isn't explicitly passed is blocked
699 07bd3f83 Scott Ullrich
  by default.</p>
700 d732f186 Bill Marquette
		 </td>
701
	        </tr>
702
              </table>
703
	</div>
704
    </td>
705
  </tr>
706
</table>
707 37e2071c Scott Ullrich
  <input type="hidden" name="if" value="<?=$if;?>">
708 07bd3f83 Scott Ullrich
</form>
709 5b237745 Scott Ullrich
<?php include("fend.inc"); ?>
710 af4aa061 Scott Ullrich
</body>
711
</html>