ids.cgi: Rework code for displaying the single rules

The complete ruleset will be grouped as categories by it's
corresponding rulefile and printed in hidden tables.

They easiely can be displayed by klicking on the show link and
vice-versa.

Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
This commit is contained in:
Stefan Schantl
2017-12-10 10:07:41 +01:00
parent f7fcd1c020
commit 177266446a

View File

@@ -204,7 +204,18 @@ $selected{'RULES'}{$snortsettings{'RULES'}} = "selected='selected'";
&Header::openpage($Lang::tr{'intrusion detection system'}, 1, ''); &Header::openpage($Lang::tr{'intrusion detection system'}, 1, '');
print "<script type='text/javascript' src='/include/snortupdateutility.js'></script>"; ### Java Script ###
print <<END
<script>
// Tiny java script function to show/hide the rules
// of a given category.
function showhide(tblname) {
\$("#" + tblname).toggle();
}
</script>
END
;
print <<END print <<END
<style type="text/css"> <style type="text/css">
<!-- <!--
@@ -353,150 +364,102 @@ if ($results ne '') {
&Header::openbox('100%', 'LEFT', $Lang::tr{'intrusion detection system rules'}); &Header::openbox('100%', 'LEFT', $Lang::tr{'intrusion detection system rules'});
# Output display table for rule files # Output display table for rule files
print "<table width='100%'><tr><td valign='top'><table>"; print "<table width='100%'>\n";
print "<form method='post'>"; # Local variable required for java script to show/hide
# rules of a rulefile.
# Local vars my $rulesetcount = 1;
my $ruledisplaycnt = 1;
my $rulecnt = keys %snortrules;
$rulecnt++;
$rulecnt = $rulecnt / 2;
# Loop over each rule file # Loop over each rule file
foreach my $rulefile (sort keys(%snortrules)) { foreach my $rulefile (sort keys(%snortrules)) {
my $rulechecked = ''; my $rulechecked = '';
# Hide inkompatible Block rules
if ($rulefile =~'-BLOCK.rules') {
next;
}
# Check if reached half-way through rule file rules to start new column
if ($ruledisplaycnt > $rulecnt) {
print "</table></td><td valign='top'><table>";
$ruledisplaycnt = 0;
}
# Check if rule file is enabled # Check if rule file is enabled
if ($snortrules{$rulefile}{"State"} eq 'Enabled') { if ($snortrules{$rulefile}{"State"} eq 'Enabled') {
$rulechecked = 'CHECKED'; $rulechecked = 'CHECKED';
} }
# Create rule file link, vars array, and display flag # Table and rows for the rule files.
my $rulefilelink = "?RULEFILE=$rulefile"; print"<tr>\n";
my $rulefiletoclose = ''; print"<td class='base' width='5%'>\n";
my @queryvars = (); print"<input type='checkbox' name='SNORT_RULE_$rulefile' $rulechecked>\n";
my $displayrulefilerules = 0; print"</td>\n";
print"<td class='base' width='90%'><b>$rulefile</b></td>\n";
print"<td class='base' width='5%' align='right'>\n";
print"<a href=\"javascript:showhide('ruleset$rulesetcount')\">SHOW</a>\n";
print"</td>\n";
print"</tr>\n";
# Check for passed in query string # Rows which will be hidden per default and will contain the single rules.
if ($ENV{'QUERY_STRING'}) { print"<tr style='display:none' id='ruleset$rulesetcount'>\n";
# Split out vars print"<td colspan='3'>\n";
@queryvars = split(/\&/, $ENV{'QUERY_STRING'});
# Loop over values
foreach $value (@queryvars) {
# Split out var pairs
($var, $linkedrulefile) = split(/=/, $value);
# Check if var is 'RULEFILE'
if ($var eq 'RULEFILE') {
# Check if rulefile equals linkedrulefile
if ($rulefile eq $linkedrulefile) {
# Set display flag
$displayrulefilerules = 1;
# Strip out rulefile from rulefilelink
$rulefilelink =~ s/RULEFILE=$linkedrulefile//g;
} else {
# Add linked rule file to rulefilelink
$rulefilelink .= "&RULEFILE=$linkedrulefile";
}
}
}
}
# Strip out extra & & ? from rulefilelink
$rulefilelink =~ s/^\?\&/\?/i;
# Check for a single '?' and replace with page for proper link display
if ($rulefilelink eq '?') {
$rulefilelink = "ids.cgi";
}
# Output rule file name and checkbox
print "<tr><td class='base' valign='top'><input type='checkbox' NAME='SNORT_RULE_$rulefile' $rulechecked> <a href='$rulefilelink'>$rulefile</a></td></tr>";
print "<tr><td class='base' valign='top'>";
# Check for empty 'Description'
if ($snortrules{$rulefile}{'Description'} eq '') {
print "<table width='100%'><tr><td class='base'>No description available</td></tr>";
} else {
# Output rule file 'Description'
print "<table width='100%'><tr><td class='base'>$snortrules{$rulefile}{'Description'}</td></tr>";
}
# Check for display flag
if ($displayrulefilerules) {
# Rule file definition rule display
print "<tr><td class='base' valign='top'><table border='0'><tr>";
# Local vars # Local vars
my $ruledefdisplaycnt = 0; my $lines;
my $ruledefcnt = keys %{$snortrules{$rulefile}{"Definition"}}; my $rows;
$ruledefcnt++; my $col;
$ruledefcnt = $ruledefcnt / 2;
# New table for the single rules.
print "<table width='100%'>\n";
# Loop over rule file rules # Loop over rule file rules
foreach my $ruledef (sort {$a <=> $b} keys(%{$snortrules{$rulefile}{"Definition"}})) { foreach my $sid (sort {$a <=> $b} keys(%{$snortrules{$rulefile}})) {
# Local vars # Local vars
my $ruledefchecked = ''; my $ruledefchecked = '';
# If have display 2 rules, start new row # If 2 rules have been displayed, start a new row
if (($ruledefdisplaycnt % 2) == 0) { if (($lines % 2) == 0) {
print "</tr><tr>"; print "</tr><tr>\n";
$ruledefdisplaycnt = 0;
# Increase rows by once.
$rows++;
} }
# Check for rules state # Colour lines.
if ($snortrules{$rulefile}{'Definition'}{$ruledef}{'State'} eq 'Enabled') { if ($rows % 2) {
$col="bgcolor='$color{'color20'}'";
} else {
$col="bgcolor='$color{'color22'}'";
}
# Set rule state
if ($snortrules{$rulefile}{$sid}{'State'} eq 'Enabled') {
$ruledefchecked = 'CHECKED'; $ruledefchecked = 'CHECKED';
} }
# Create rule file rule's checkbox # Create rule checkbox and display rule description
$checkboxname = "SNORT_RULE_$rulefile"; print "<td class='base' width='5%' align='right' $col>\n";
$checkboxname .= "_$ruledef"; print "<input type='checkbox' NAME='$sid' $ruledefchecked>\n";
print "<td class='base'><input type='checkbox' NAME='$checkboxname' $ruledefchecked> $snortrules{$rulefile}{'Definition'}{$ruledef}{'Description'}</td>"; print "</td>\n";
print "<td class='base' width='45%' $col>$snortrules{$rulefile}{$sid}{'Description'}</td>";
# Increment count # Increment rule count
$ruledefdisplaycnt++; $lines++;
} }
# If do not have second rule for row, create empty cell # If do not have a second rule for row, create empty cell
if (($ruledefdisplaycnt % 2) != 0) { if (($lines % 2) != 0) {
print "<td class='base'></td>"; print "<td class='base'></td>";
} }
# Close display table # Close display table
print "</tr></table></td></tr>"; print "</tr></table></td></tr>";
# Finished whith the rule file, increase count.
$rulesetcount++;
} }
# Close display table # Close display table
print "</table>"; print "</table>";
# Increment ruledisplaycnt
$ruledisplaycnt++;
}
print "</td></tr></table></td></tr></table>";
print <<END print <<END
<table width='100%'> <table width='100%'>
<tr> <tr>
<td width='100%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td> <td width='100%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'update'}'>
&nbsp; <!-- space for future online help link --> &nbsp; <!-- space for future online help link -->
</td> </td>
</tr> </tr>
</table> </table>
</form>
END END
; ;
&Header::closebox(); &Header::closebox();