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 # Local vars
foreach $value (@queryvars) { my $lines;
# Split out var pairs my $rows;
($var, $linkedrulefile) = split(/=/, $value); my $col;
# Check if var is 'RULEFILE' # New table for the single rules.
if ($var eq 'RULEFILE') { print "<table width='100%'>\n";
# 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>";
# Loop over rule file rules
foreach my $sid (sort {$a <=> $b} keys(%{$snortrules{$rulefile}})) {
# Local vars # Local vars
my $ruledefdisplaycnt = 0; my $ruledefchecked = '';
my $ruledefcnt = keys %{$snortrules{$rulefile}{"Definition"}};
$ruledefcnt++;
$ruledefcnt = $ruledefcnt / 2;
# Loop over rule file rules # If 2 rules have been displayed, start a new row
foreach my $ruledef (sort {$a <=> $b} keys(%{$snortrules{$rulefile}{"Definition"}})) { if (($lines % 2) == 0) {
# Local vars print "</tr><tr>\n";
my $ruledefchecked = '';
# If have display 2 rules, start new row # Increase rows by once.
if (($ruledefdisplaycnt % 2) == 0) { $rows++;
print "</tr><tr>";
$ruledefdisplaycnt = 0;
}
# Check for rules state
if ($snortrules{$rulefile}{'Definition'}{$ruledef}{'State'} eq 'Enabled') {
$ruledefchecked = 'CHECKED';
}
# Create rule file rule's checkbox
$checkboxname = "SNORT_RULE_$rulefile";
$checkboxname .= "_$ruledef";
print "<td class='base'><input type='checkbox' NAME='$checkboxname' $ruledefchecked> $snortrules{$rulefile}{'Definition'}{$ruledef}{'Description'}</td>";
# Increment count
$ruledefdisplaycnt++;
} }
# If do not have second rule for row, create empty cell # Colour lines.
if (($ruledefdisplaycnt % 2) != 0) { if ($rows % 2) {
print "<td class='base'></td>"; $col="bgcolor='$color{'color20'}'";
} else {
$col="bgcolor='$color{'color22'}'";
} }
# Close display table # Set rule state
print "</tr></table></td></tr>"; if ($snortrules{$rulefile}{$sid}{'State'} eq 'Enabled') {
$ruledefchecked = 'CHECKED';
}
# Create rule checkbox and display rule description
print "<td class='base' width='5%' align='right' $col>\n";
print "<input type='checkbox' NAME='$sid' $ruledefchecked>\n";
print "</td>\n";
print "<td class='base' width='45%' $col>$snortrules{$rulefile}{$sid}{'Description'}</td>";
# Increment rule count
$lines++;
}
# If do not have a second rule for row, create empty cell
if (($lines % 2) != 0) {
print "<td class='base'></td>";
} }
# Close display table # Close display table
print "</table>"; print "</tr></table></td></tr>";
# Increment ruledisplaycnt # Finished whith the rule file, increase count.
$ruledisplaycnt++; $rulesetcount++;
} }
print "</td></tr></table></td></tr></table>";
# Close display table
print "</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();