]>
Commit | Line | Data |
---|---|---|
ac1cfefa MT |
1 | #!/usr/bin/perl |
2 | # | |
3 | # This file is part of the IPCop Firewall. | |
4 | # | |
5 | # IPCop is free software; you can redistribute it and/or modify | |
6 | # it under the terms of the GNU General Public License as published by | |
7 | # the Free Software Foundation; either version 2 of the License, or | |
8 | # (at your option) any later version. | |
9 | # | |
10 | # IPCop is distributed in the hope that it will be useful, | |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
14 | # | |
15 | # You should have received a copy of the GNU General Public License | |
16 | # along with IPCop; if not, write to the Free Software | |
17 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | # | |
19 | # Copyright (C) 2003-09-22 Darren Critchley <darrenc@telus.net> | |
20 | # | |
21 | # $Id: services.cgi,v 1.2.2.3 2005/04/29 23:37:07 franck78 Exp $ | |
22 | # | |
23 | ||
24 | use strict; | |
25 | ||
26 | require 'CONFIG_ROOT/general-functions.pl'; | |
27 | require "${General::swroot}/lang.pl"; | |
28 | require "${General::swroot}/header.pl"; | |
29 | ||
30 | my @icmptypes = &get_icmptypes(); | |
31 | ||
32 | &Header::showhttpheaders(); | |
33 | ||
34 | my %cgiparams=(); | |
35 | my %selected=(); | |
36 | my %checked=(); | |
37 | my $filename = "${General::swroot}/firewall/customservices"; | |
38 | my $key = 0; # used for finding last sequence number used | |
39 | ||
40 | # Darren Critchley - vars for setting up sort order | |
41 | my $sort_col = '1'; | |
42 | my $sort_type = 'a'; | |
43 | my $sort_dir = 'asc'; | |
44 | ||
45 | if ($ENV{'QUERY_STRING'} ne '') { | |
46 | my ($item1, $item2, $item3) = split(/\&/,$ENV{'QUERY_STRING'}); | |
47 | if ($item1 ne '') { | |
48 | ($junk, $sort_col) = split(/\=/,$item1) | |
49 | } | |
50 | if ($item2 ne '') { | |
51 | ($junk, $sort_type) = split(/\=/,$item2) | |
52 | } | |
53 | if ($item3 ne '') { | |
54 | ($junk, $sort_dir) = split(/\=/,$item3) | |
55 | } | |
56 | } | |
57 | ||
58 | $cgiparams{'KEY'} = ''; | |
59 | $cgiparams{'PORTS'} = ''; | |
60 | $cgiparams{'PROTOCOL'} = '6'; | |
61 | $cgiparams{'NAME'} = ''; | |
62 | $cgiparams{'PORT_INVERT'} = 'off'; | |
63 | $cgiparams{'PROTOCOL_INVERT'} = 'off'; | |
64 | $cgiparams{'ICMP'} = 'BLANK'; | |
65 | ||
66 | &Header::getcgihash(\%cgiparams); | |
67 | ||
68 | if ($cgiparams{'ACTION'} eq $Lang::tr{'add'}){ | |
69 | ||
70 | &validateparams(); | |
71 | unless($errormessage){ | |
72 | $key++; # Add one to last sequence number | |
73 | open(FILE,">>$filename") or die 'Unable to open config file.'; | |
74 | flock FILE, 2; | |
75 | print FILE "$key,$cgiparams{'NAME'},$cgiparams{'PORTS'},$cgiparams{'PROTOCOL'},$cgiparams{'PORT_INVERT'},$cgiparams{'PROTOCOL_INVERT'},$cgiparams{'ICMP'}\n"; | |
76 | close(FILE); | |
77 | &General::log("$Lang::tr{'service added'}: $cgiparams{'NAME'}"); | |
78 | undef %cgiparams; | |
79 | } | |
80 | } | |
81 | ||
82 | if ($cgiparams{'ACTION'} eq $Lang::tr{'update'}) | |
83 | { | |
84 | &validateparams(); | |
85 | # Darren Critchley - If there is an error don't waste any more processing time | |
86 | if ($errormessage) { $cgiparams{'ACTION'} = $Lang::tr{'edit'}; goto UPD_ERROR; } | |
87 | ||
88 | unless($errormessage){ | |
89 | open(FILE, $filename) or die 'Unable to open custom services file.'; | |
90 | my @current = <FILE>; | |
91 | close(FILE); | |
92 | my $line; | |
93 | open(FILE, ">$filename") or die 'Unable to open config file.'; | |
94 | flock FILE, 2; | |
95 | foreach $line (@current) { | |
96 | chomp($line); | |
97 | my @temp = split(/\,/,$line); | |
98 | if ($cgiparams{'KEY'} eq $temp[0]) { | |
99 | print FILE "$cgiparams{'KEY'},$cgiparams{'NAME'},$cgiparams{'PORTS'},$cgiparams{'PROTOCOL'},$cgiparams{'PORT_INVERT'},$cgiparams{'PROTOCOL_INVERT'},$cgiparams{'ICMP'}\n"; | |
100 | } else { | |
101 | print FILE "$line\n"; | |
102 | } | |
103 | } | |
104 | close(FILE); | |
105 | &General::log("$Lang::tr{'service updated'}: $cgiparams{'NAME'}"); | |
106 | undef %cgiparams; | |
107 | } | |
108 | UPD_ERROR: | |
109 | } | |
110 | ||
111 | if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}) | |
112 | { | |
113 | open(FILE, "$filename") or die 'Unable to open custom services file.'; | |
114 | my @current = <FILE>; | |
115 | close(FILE); | |
116 | ||
117 | unless ($errormessage) | |
118 | { | |
119 | foreach my $line (@current) | |
120 | { | |
121 | chomp($line); | |
122 | my @temp = split(/\,/,$line); | |
123 | if ($cgiparams{'KEY'} eq $temp[0]) { | |
124 | $cgiparams{'NAME'} = $temp[1]; | |
125 | $cgiparams{'PORTS'} = $temp[2]; | |
126 | $cgiparams{'PROTOCOL'} = $temp[3]; | |
127 | $cgiparams{'PORT_INVERT'} = $temp[4]; | |
128 | $cgiparams{'PROTOCOL_INVERT'} = $temp[5]; | |
129 | $cgiparams{'ICMP'} = $temp[6]; | |
130 | } | |
131 | ||
132 | } | |
133 | } | |
134 | } | |
135 | ||
136 | if ($cgiparams{'ACTION'} eq $Lang::tr{'remove'}) | |
137 | { | |
138 | open(FILE, $filename) or die 'Unable to open custom services file.'; | |
139 | my @current = <FILE>; | |
140 | close(FILE); | |
141 | ||
142 | open(FILE, ">$filename") or die 'Unable to open custom services file.'; | |
143 | flock FILE, 2; | |
144 | foreach my $line (@current) | |
145 | { | |
146 | chomp($line); | |
147 | if ($line ne '') { | |
148 | my @temp = split(/\,/,$line); | |
149 | if ($cgiparams{'KEY'} eq $temp[0]) { | |
150 | &General::log("$Lang::tr{'service removed'}: $temp[1]"); | |
151 | } else { | |
152 | print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6]\n"; | |
153 | } | |
154 | } | |
155 | } | |
156 | close(FILE); | |
157 | undef %cgiparams; | |
158 | } | |
159 | ||
160 | if ($cgiparams{'ACTION'} eq $Lang::tr{'reset'}) | |
161 | { | |
162 | undef %cgiparams; | |
163 | } | |
164 | ||
165 | if ($cgiparams{'ACTION'} eq '') | |
166 | { | |
167 | $cgiparams{'KEY'} = ''; | |
168 | $cgiparams{'PORTS'} = ''; | |
169 | $cgiparams{'PROTOCOL'} = '6'; | |
170 | $cgiparams{'NAME'} = ''; | |
171 | $cgiparams{'PORT_INVERT'} = 'off'; | |
172 | $cgiparams{'PROTOCOL_INVERT'} = 'off'; | |
173 | $cgiparams{'ICMP'} = 'BLANK'; | |
174 | } | |
175 | ||
176 | # Darren Critchley - Bring in the protocols file built from /etc/protocols into hash %protocol | |
177 | require "${General::swroot}/firewall/protocols.pl"; | |
178 | ||
179 | # Darren Critchley - figure out which protocol is selected | |
180 | $selected{'PROTOCOL'}{'tcpudp'}= ''; | |
181 | $selected{'PROTOCOL'}{'all'}= ''; | |
182 | foreach $line (keys %protocols) { | |
183 | # $selected{'PROTOCOL'}{"$protocols{$line}"}= ''; | |
184 | $selected{'PROTOCOL'}{$line}= ''; | |
185 | } | |
186 | $selected{'PROTOCOL'}{$cgiparams{'PROTOCOL'}} = 'SELECTED'; | |
187 | ||
188 | # Darren Critchley - figure out which icmptype is selected | |
189 | $selected{'ICMP'}{$cgiparams{'ICMP'}} = 'SELECTED'; | |
190 | ||
191 | $checked{'PORT_INVERT'}{'off'} = ''; | |
192 | $checked{'PORT_INVERT'}{'on'} = ''; | |
193 | $checked{'PORT_INVERT'}{$cgiparams{'PORT_INVERT'}} = 'CHECKED'; | |
194 | $checked{'PROTOCOL_INVERT'}{'off'} = ''; | |
195 | $checked{'PROTOCOL_INVERT'}{'on'} = ''; | |
196 | $checked{'PROTOCOL_INVERT'}{$cgiparams{'PROTOCOL_INVERT'}} = 'CHECKED'; | |
197 | ||
198 | &Header::openpage($Lang::tr{'services settings'}, 1, ''); | |
199 | ||
200 | &Header::openbigbox('100%', 'LEFT', '', $errormessage); | |
201 | ||
202 | # DEBUG DEBUG | |
203 | #&Header::openbox('100%', 'LEFT', 'DEBUG'); | |
204 | #foreach $line (keys %cgiparams) { | |
205 | # print "<CLASS NAME='base'>$line = $cgiparams{$line}<BR>"; | |
206 | #} | |
207 | #print "$sort_col\n"; | |
208 | #print "$ENV{'QUERY_STRING'}\n"; | |
209 | #print " </CLASS>\n"; | |
210 | #&Header::closebox(); | |
211 | ||
212 | if ($errormessage) { | |
213 | &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'}); | |
214 | print "<CLASS NAME='base'><FONT COLOR='${Header::colourred}'>$errormessage\n</FONT>"; | |
215 | print " </CLASS>\n"; | |
216 | &Header::closebox(); | |
217 | } | |
218 | ||
219 | if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}){ | |
220 | &Header::openbox('100%', 'LEFT', "$Lang::tr{'edit service'}:"); | |
221 | } else { | |
222 | &Header::openbox('100%', 'LEFT', "$Lang::tr{'add service'}:"); | |
223 | } | |
224 | # Darren Critchley - Show protocols with TCP, UDP, etc at the top of the list. | |
225 | print <<END | |
226 | <FORM METHOD='POST'> | |
227 | <DIV ALIGN='CENTER'> | |
228 | <TABLE WIDTH='100%' ALIGN='CENTER'> | |
229 | <TR align="center"> | |
230 | <TD><strong>$Lang::tr{'servicename'}</strong></TD> | |
231 | <TD ALIGN='RIGHT'><strong>$Lang::tr{'invert'}</strong></TD> | |
232 | <TD><strong>$Lang::tr{'ports'}</strong></TD> | |
233 | <TD ALIGN='RIGHT'><strong>$Lang::tr{'invert'}</strong></TD> | |
234 | <TD><strong>$Lang::tr{'protocol'}</strong></TD> | |
235 | <TD> </TD> | |
236 | <TD> </TD> | |
237 | </TR> | |
238 | <TR align="center"> | |
239 | <TD> | |
240 | <INPUT TYPE='TEXT' NAME='NAME' VALUE='$cgiparams{'NAME'}' SIZE='20' MAXLENGTH='20'> | |
241 | </TD> | |
242 | <TD ALIGN='RIGHT'> | |
243 | <INPUT TYPE='CHECKBOX' NAME='PORT_INVERT' $checked{'PORT_INVERT'}{'on'}> | |
244 | </TD> | |
245 | <TD> | |
246 | <INPUT TYPE='TEXT' NAME='PORTS' VALUE='$cgiparams{'PORTS'}' SIZE='15' MAXLENGTH='11'> | |
247 | </TD> | |
248 | <TD ALIGN='RIGHT'> | |
249 | <INPUT TYPE='CHECKBOX' NAME='PROTOCOL_INVERT' $checked{'PROTOCOL_INVERT'}{'on'}> | |
250 | </TD> | |
251 | <TD ALIGN='LEFT'> | |
252 | <SELECT NAME='PROTOCOL'> | |
253 | <OPTION VALUE='tcp' $selected{'PROTOCOL'}{'tcp'}>TCP</OPTION> | |
254 | <OPTION VALUE='udp' $selected{'PROTOCOL'}{'udp'}>UDP</OPTION> | |
255 | <OPTION VALUE='tcpudp' $selected{'PROTOCOL'}{'tcpudp'}>TCP & UDP</OPTION> | |
256 | <OPTION VALUE='all' $selected{'PROTOCOL'}{'all'}>ALL</OPTION> | |
257 | <OPTION VALUE='icmp' $selected{'PROTOCOL'}{'icmp'}>ICMP</OPTION> | |
258 | <OPTION VALUE='gre' $selected{'PROTOCOL'}{'gre'}>GRE</OPTION> | |
259 | END | |
260 | ; | |
261 | foreach $line (sort keys %protocols) { | |
262 | # Darren Critchley - do not have duplicates in the list | |
263 | if ($protocols{$line} ne '6' && $protocols{$line} ne '17' && $protocols{$line} ne '1' && $protocols{$line} ne '47'){ | |
264 | # print "<OPTION VALUE='$line' $selected{'PROTOCOL'}{$protocols{$line}}>".uc($line)."</OPTION>\n"; | |
265 | print "<OPTION VALUE='$line' $selected{'PROTOCOL'}{$line}>".uc($line)."</OPTION>\n"; | |
266 | } | |
267 | } | |
268 | print <<END | |
269 | </SELECT> | |
270 | </TD> | |
271 | </TR> | |
272 | <TR> | |
273 | <TD> </TD> | |
274 | <TD> </TD> | |
275 | <TD> </TD> | |
276 | <TD><strong>$Lang::tr{'icmp type'}:</strong></TD> | |
277 | <TD ALIGN='LEFT'> | |
278 | <SELECT NAME='ICMP'> | |
279 | <OPTION VALUE='BLANK' $selected{'ICMP'}{'BLANK'}>Valid ICMP Types</OPTION> | |
280 | END | |
281 | ; | |
282 | foreach $line (@icmptypes) { | |
283 | if ($cgiparams{'ICMP'} eq $line){ | |
284 | print "<OPTION VALUE='$line' SELECTED>$line</OPTION>\n"; | |
285 | } else { | |
286 | print "<OPTION VALUE='$line' >$line</OPTION>\n"; | |
287 | } | |
288 | } | |
289 | print <<END | |
290 | </SELECT> | |
291 | </TD> | |
292 | </TR> | |
293 | <TR> | |
294 | END | |
295 | ; | |
296 | if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}){ | |
297 | print "<TD ALIGN='CENTER'><INPUT TYPE='SUBMIT' NAME='ACTION' VALUE='$Lang::tr{'update'}'></TD>\n"; | |
298 | print "<INPUT TYPE='HIDDEN' NAME='KEY' VALUE='$cgiparams{'KEY'}'>\n"; | |
299 | print "<TD ALIGN='CENTER'><INPUT TYPE='SUBMIT' NAME='ACTION' VALUE='$Lang::tr{'reset'}'></TD>\n"; | |
300 | } else { | |
301 | print "<TD ALIGN='CENTER'><INPUT TYPE='SUBMIT' NAME='ACTION' VALUE='$Lang::tr{'add'}'></TD>\n"; | |
302 | print "<TD ALIGN='CENTER'><INPUT TYPE='SUBMIT' NAME='ACTION' VALUE='$Lang::tr{'reset'}'></TD>\n"; | |
303 | } | |
304 | print <<END | |
305 | </TR> | |
306 | </TABLE> | |
307 | </DIV> | |
308 | </FORM> | |
309 | END | |
310 | ; | |
311 | ||
312 | &Header::closebox(); | |
313 | ||
314 | &Header::openbox('100%', 'LEFT', "$Lang::tr{'custom services'}:"); | |
315 | print <<END | |
316 | <DIV ALIGN='CENTER'> | |
317 | <TABLE WIDTH='100%' ALIGN='CENTER'> | |
318 | <TR align="center"> | |
319 | END | |
320 | ; | |
321 | ||
322 | if ($sort_dir eq 'asc' && $sort_col eq '2') { | |
323 | print "<TD WIDTH='25%'><strong><a href='services.cgi?sortcol=2&srtype=a&srtdir=dsc' title='$Lang::tr{'sort descending'}'>$Lang::tr{'servicename'}</a></strong></TD>\n"; | |
324 | } else { | |
325 | print "<TD WIDTH='25%'><strong><a href='services.cgi?sortcol=2&srtype=a&srtdir=asc' title='$Lang::tr{'sort ascending'}'>$Lang::tr{'servicename'}</a></strong></TD>\n"; | |
326 | } | |
327 | if ($sort_dir eq 'asc' && $sort_col eq '3') { | |
328 | print "<TD WIDTH='25%'><strong><a href='services.cgi?sortcol=3&srtype=n&srtdir=dsc' title='$Lang::tr{'sort descending'}'>$Lang::tr{'ports'}</a></strong></TD>\n"; | |
329 | } else { | |
330 | print "<TD WIDTH='25%'><strong><a href='services.cgi?sortcol=3&srtype=n&srtdir=asc' title='$Lang::tr{'sort ascending'}'>$Lang::tr{'ports'}</a></strong></TD>\n"; | |
331 | } | |
332 | if ($sort_dir eq 'asc' && $sort_col eq '4') { | |
333 | print "<TD WIDTH='25%'><strong><a href='services.cgi?sortcol=4&srtype=a&srtdir=dsc' title='$Lang::tr{'sort descending'}'>$Lang::tr{'protocol'}</a></strong></TD>\n"; | |
334 | } else { | |
335 | print "<TD WIDTH='25%'><strong><a href='services.cgi?sortcol=4&srtype=a&srtdir=asc' title='$Lang::tr{'sort ascending'}'>$Lang::tr{'protocol'}</a></strong></TD>\n"; | |
336 | } | |
337 | ||
338 | print <<END | |
339 | <TD WIDTH='25%'><strong>$Lang::tr{'icmp type'}</strong></TD> | |
340 | <TD WIDTH='5%'> </TD> | |
341 | <TD WIDTH='5%'> </TD> | |
342 | </TR> | |
343 | END | |
344 | ; | |
345 | &display_custom_services(); | |
346 | print <<END | |
347 | </TABLE> | |
348 | </DIV> | |
349 | END | |
350 | ; | |
351 | &Header::closebox(); | |
352 | ||
353 | &Header::openbox('100%', 'LEFT', "$Lang::tr{'default services'}:"); | |
354 | print <<END | |
355 | <DIV ALIGN='CENTER'> | |
356 | <TABLE WIDTH='100%' ALIGN='CENTER'> | |
357 | <TR align="center"> | |
358 | <TD><strong>$Lang::tr{'servicename'}</strong></TD> | |
359 | <TD><strong>$Lang::tr{'ports'}</strong></TD> | |
360 | <TD><strong>$Lang::tr{'protocol'}</strong></TD> | |
361 | </TR> | |
362 | END | |
363 | ; | |
364 | &display_default_services(); | |
365 | print <<END | |
366 | </TABLE> | |
367 | </DIV> | |
368 | END | |
369 | ; | |
370 | &Header::closebox(); | |
371 | ||
372 | print "$Lang::tr{'this feature has been sponsored by'} : "; | |
373 | print "<A HREF='http://www.kdi.ca/' TARGET='_blank'>Kobelt Development Inc.</A>.\n"; | |
374 | ||
375 | ||
376 | &Header::closebigbox(); | |
377 | ||
378 | &Header::closepage(); | |
379 | ||
380 | sub display_custom_services | |
381 | { | |
382 | ||
383 | open(FILE, "$filename") or die 'Unable to open services file.'; | |
384 | my @current = <FILE>; | |
385 | close(FILE); | |
386 | ||
387 | my $id = 0; | |
388 | my $port_inv = ''; | |
389 | my $prot_inv = ''; | |
390 | my $port_inv_tail = ''; | |
391 | my $prot_inv_tail = ''; | |
392 | my @outarray = &General::srtarray($sort_col,$sort_type,$sort_dir,@current); | |
393 | foreach $line (@outarray) | |
394 | { | |
395 | chomp($line); | |
396 | if ($line ne ''){ | |
397 | my @temp = split(/\,/,$line); | |
398 | # Darren Critchley highlight the row we are editing | |
399 | if ( $cgiparams{'ACTION'} eq $Lang::tr{'edit'} && $cgiparams{'KEY'} eq $temp[0] ) { | |
400 | print "<TR BGCOLOR='${Header::colouryellow}'>\n"; | |
401 | } else { | |
402 | if ($id % 2) { | |
403 | print "<TR BGCOLOR='${Header::table1colour}'>\n"; | |
404 | } else { | |
405 | print "<TR BGCOLOR='${Header::table2colour}'>\n"; | |
406 | } | |
407 | } | |
408 | print "<TD>$temp[1]</TD>\n"; | |
409 | if ($temp[4] eq 'on'){$port_inv = " <strong><font color='RED'>! (</font></strong>";$port_inv_tail = "<strong><font color='RED'>)</font></strong>";}else{$port_inv='';$port_inv_tail='';} | |
410 | print "<TD ALIGN='CENTER'>" . $port_inv . &cleanport("$temp[2]") . $port_inv_tail . "</TD>\n"; | |
411 | if ($temp[5] eq 'on'){$prot_inv = " <strong><font color='RED'>! (</font></strong>";$prot_inv_tail = "<strong><font color='RED'>)</font></strong>";}else{$prot_inv='';$prot_inv_tail='';} | |
412 | print "<TD ALIGN='CENTER'>" . $prot_inv . &cleanprotocol("$temp[3]") . $prot_inv_tail . "</TD>\n"; | |
413 | if ($temp[6] eq 'BLANK') { | |
414 | print "<TD ALIGN='CENTER'>N/A</TD>\n"; | |
415 | } else { | |
416 | print "<TD ALIGN='CENTER'>$temp[6]</TD>\n"; | |
417 | } | |
418 | print <<END | |
419 | <FORM METHOD='POST' NAME='frm$temp[0]'> | |
420 | <TD ALIGN='CENTER'> | |
421 | <INPUT TYPE='hidden' NAME='ACTION' VALUE='$Lang::tr{'edit'}'> | |
422 | <INPUT TYPE='image' NAME='$Lang::tr{'edit'}' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' width='20' height='20' border='0'> | |
423 | <INPUT TYPE='hidden' NAME='KEY' VALUE='$temp[0]'> | |
424 | </TD> | |
425 | </FORM> | |
426 | <FORM METHOD='POST' NAME='frm$temp[0]b'> | |
427 | <TD ALIGN='CENTER'> | |
428 | <INPUT TYPE='hidden' NAME='ACTION' VALUE='$Lang::tr{'remove'}'> | |
429 | <INPUT TYPE='image' NAME='$Lang::tr{'remove'}' src='/images/delete.gif' alt='$Lang::tr{'remove'}' title='$Lang::tr{'remove'}' width='20' height='20' border='0'> | |
430 | <INPUT TYPE='hidden' NAME='KEY' VALUE='$temp[0]'> | |
431 | </TD> | |
432 | </FORM> | |
433 | END | |
434 | ; | |
435 | print "</TR>\n"; | |
436 | $id++; | |
437 | } | |
438 | } | |
439 | } | |
440 | ||
441 | sub display_default_services | |
442 | { | |
443 | my $fname = "${General::swroot}/firewall/defaultservices"; | |
444 | my $prev = ""; | |
445 | my $newline=""; | |
446 | ||
447 | open(FILE, "$fname") or die 'Unable to open default services file.'; | |
448 | my @current = <FILE>; | |
449 | close(FILE); | |
450 | ||
451 | my $id = 0; | |
452 | ||
453 | foreach my $line (sort @current) | |
454 | { | |
455 | my @temp = split(/\,/,$line); | |
456 | if ($id % 2) { | |
457 | print "<TR BGCOLOR='${Header::table1colour}'>\n"; | |
458 | } else { | |
459 | print "<TR BGCOLOR='${Header::table2colour}'>\n"; | |
460 | } | |
461 | print "<TD>$temp[0]</TD>\n"; | |
462 | print "<TD ALIGN='CENTER'>$temp[1]</TD>\n"; | |
463 | print "<TD ALIGN='CENTER'>" . &cleanprotocol("$temp[2]") . "</TD>\n"; | |
464 | print "</TR>\n"; | |
465 | $id++; | |
466 | } | |
467 | } | |
468 | ||
469 | sub cleanprotocol | |
470 | { | |
471 | my $prtcl = $_[0]; | |
472 | chomp($prtcl); | |
473 | if ($prtcl eq 'tcpudp') { | |
474 | $prtcl = 'TCP & UDP'; | |
475 | } else { | |
476 | $prtcl = uc($prtcl); | |
477 | } | |
478 | return $prtcl; | |
479 | } | |
480 | ||
481 | sub cleanport | |
482 | { | |
483 | my $prt = $_[0]; | |
484 | chomp($prt); | |
485 | # Darren Critchley - Format the ports | |
486 | $prt =~ s/-/ - /; | |
487 | $prt =~ s/:/ - /; | |
488 | return $prt; | |
489 | } | |
490 | ||
491 | # Validate Field Entries | |
492 | sub validateparams | |
493 | { | |
494 | $erromessage=''; | |
495 | if ($cgiparams{'PROTOCOL'} eq 'tcp' || $cgiparams{'PROTOCOL'} eq 'udp' || $cgiparams{'PROTOCOL'} eq 'tcpudp' || $cgiparams{'PROTOCOL'} eq 'all') { | |
496 | # Darren Critchley - Get rid of dashes in port ranges | |
497 | $cgiparams{'PORTS'}=~ tr/-/:/; | |
498 | # Darren Critchley - code to substitue wildcards | |
499 | if ($cgiparams{'PORTS'} eq "*") { | |
500 | $cgiparams{'PORTS'} = "1:65535"; | |
501 | } | |
502 | if ($cgiparams{'PORTS'} =~ /^(\D)\:(\d+)$/) { | |
503 | $cgiparams{'PORTS'} = "1:$2"; | |
504 | } | |
505 | if ($cgiparams{'PORTS'} =~ /^(\d+)\:(\D)$/) { | |
506 | $cgiparams{'PORTS'} = "$1:65535"; | |
507 | } | |
508 | # Darren Critchley - watch the order here, the validportrange sets errormessage='' | |
509 | $errormessage = &General::validportrange($cgiparams{'PORTS'}, 'src'); | |
510 | if ($errormessage) {return;} | |
511 | } else { | |
512 | $cgiparams{'PORTS'} = ""; | |
513 | } | |
514 | if ($cgiparams{'PROTOCOL'} eq 'tcp') { | |
515 | $cgiparams{'ICMP'} = "BLANK"; | |
516 | } | |
517 | ||
518 | if($cgiparams{'PORTS'} eq '' && $cgiparams{'PORT_INVERT'} ne 'off'){ | |
519 | $cgiparams{'PORT_INVERT'} = 'off'; | |
520 | } | |
521 | if ($cgiparams{'NAME'} eq '') { | |
522 | $errormessage = $Lang::tr{'noservicename'}; | |
523 | return; | |
524 | } | |
525 | if ($cgiparams{'PROTOCOL'} eq 'icmp' && $cgiparams{'ICMP'} eq 'BLANK'){ | |
526 | $errormessage = $Lang::tr{'icmp selected but no type'}; | |
527 | return; | |
528 | } | |
529 | unless($errormessage){ | |
530 | $cgiparams{'NAME'}=&Header::cleanhtml($cgiparams{'NAME'}); | |
531 | open(FILE, $filename) or die 'Unable to open custom services file.'; | |
532 | my @current = <FILE>; | |
533 | close(FILE); | |
534 | foreach my $line (@current) | |
535 | { | |
536 | chomp($line); | |
537 | if ($line ne '') { | |
538 | my @temp = split(/\,/,$line); | |
539 | if ($cgiparams{'NAME'} eq $temp[1] && $cgiparams{'KEY'} ne $temp[0]) { | |
540 | $errormessage=$Lang::tr{'duplicate name'}; | |
541 | return; | |
542 | } | |
543 | $key=$temp[0]; | |
544 | } | |
545 | } | |
546 | unless($errormessage){ | |
547 | my $fname = "${General::swroot}/firewall/defaultservices"; | |
548 | my $prev = ""; | |
549 | my $newline=""; | |
550 | ||
551 | open(FILE, "$fname") or die 'Unable to open default services file.'; | |
552 | my @current = <FILE>; | |
553 | close(FILE); | |
554 | ||
555 | foreach my $line (sort @current) | |
556 | { | |
557 | my @temp = split(/\,/,$line); | |
558 | if ($cgiparams{'NAME'} eq $temp[0]) { | |
559 | $errormessage=$Lang::tr{'duplicate name'}; | |
560 | return; | |
561 | } | |
562 | } | |
563 | } | |
564 | } | |
565 | } | |
566 | ||
567 | sub get_icmptypes | |
568 | { | |
569 | my $fname = "${General::swroot}/firewall/icmptypes"; | |
570 | my $newline=""; | |
571 | my @newarray=(); | |
572 | ||
573 | open(FILE, "$fname") or die 'Unable to open icmp file.'; | |
574 | my @current = <FILE>; | |
575 | close(FILE); | |
576 | ||
577 | foreach $newline (sort @current) | |
578 | { | |
579 | chomp ($newline); | |
580 | if (substr($newline, 0, 1) ne "#") { | |
581 | push (@newarray, $newline); | |
582 | } | |
583 | } | |
584 | return (@newarray); | |
585 | } | |
586 |