require './tcpwrappers-lib.pl';
&ReadParse();
+$type = $in{'allow'} ? 'allow' : 'deny';
@xservices = &list_services();
unshift @xservices, "ALL" if (@xservices);
if ($in{'new'}) {
- &ui_print_header(undef, $text{'edit_title1'}, "", "edit_rule");
+ &ui_print_header(undef, $text{'edit_title1'.$type}, "", "edit_rule");
} else {
- &ui_print_header(undef, $text{'edit_title2'}, "", "edit_rule");
- @rules = &list_rules($in{'allow'} ? $config{'hosts_allow'} : $config{'hosts_deny'});
+ &ui_print_header(undef, $text{'edit_title2'.$type}, "", "edit_rule");
+
+ # Get the rule
+ @rules = &list_rules($config{'hosts_'.$type});
($rule) = grep { $_->{'id'} == $in{'id'} } @rules;
$rule || &error($text{'edit_eid'});
print &ui_hidden("new", $in{'new'}),"\n";
print &ui_hidden("id", $in{'id'}),"\n";
print &ui_hidden($in{'allow'} ? 'allow' : 'deny', 1),"\n";
-#print &ui_table_start($text{'edit_header'}, "width=100%", 5);
-print &ui_table_start($text{'edit_header'}, "", 5);
-
+print &ui_table_start($text{'edit_header'}, "", 2);
# Services
if (@xservices) {
- # listed from (x)inetd
- print &ui_table_row("<b>$text{'edit_service'}</b> ", &ui_select("service", \@services, \@xservices, 10, 1));
- print &ui_table_row("EXCEPT", &ui_select("service_except", \@eservices, \@xservices, 10, 1));
-} else {
- print &ui_table_row("<b>$text{'edit_service'}</b> ", &ui_textbox("service_custom", join(",",@services), 23));
- print &ui_table_row("EXCEPT", &ui_textbox("service_except_custom", join(",",@eservices), 23));
-}
+ # listed from (x)inetd
+ print &ui_table_row($text{'edit_service'},
+ &ui_select("service", \@services, \@xservices, 5, 1));
+ print &ui_table_row($text{'edit_except'},
+ &ui_select("service_except", \@eservices, \@xservices, 5, 1));
+ }
+else {
+ print &ui_table_row($text{'edit_service'},
+ &ui_textbox("service_custom", join(",",@services), 40));
+ print &ui_table_row($text{'edit_except'},
+ &ui_textbox("service_except_custom", join(",",@eservices), 40));
+ }
+
print &ui_table_hr();
# Hosts
foreach my $w (@wildcards) {
$found = $w if ($w eq $hosts);
}
-print &ui_table_row("<b>$text{'edit_hosts'}</b> ", &ui_opt_textbox("host_text", ($found ? "" : $hosts), 41, &ui_select("host_select", $found, \@wildcards)), 3);
-print &ui_table_row("", "<b>EXCEPT</b> ".&ui_textbox("host_except", $ehosts, 50), 3);
+print &ui_table_row($text{'edit_hosts'},
+ &ui_opt_textbox("host_text", ($found ? "" : $hosts), 41,
+ &ui_select("host_select", $found, \@wildcards)), 3);
+print &ui_table_row($text{'edit_hostsexcept'},
+ &ui_textbox("host_except", $ehosts, 50), 3);
+
print &ui_table_hr();
# Shell commands
@directives = ('none', 'spawn', 'twist');
@cmds = split /:/, $rule->{'cmd'} if (!$in{'new'});
-print &ui_table_row($text{'edit_cmd'}, "", 3);
+$label = $text{'edit_cmd'};
for ($i = 0; $i <= $#cmds; $i++) {
$cmds[$i] =~ s/^\s*//;
my $choosed = $cmds[$i] =~ /^(spawn|twist)/ ? $1 : 'none';
$cmds[$i] =~ s/^\s*${choosed}\s*// if ($cmds[$i] =~ /^\s*(spawn)|(twist)/);
- print &ui_table_row("", &ui_select("cmd_directive_$i", $choosed, \@directives).' '.&ui_textbox("cmd_$i", $cmds[$i], 50), 3);
+ print &ui_table_row($label, &ui_select("cmd_directive_$i", $choosed, \@directives).' '.&ui_textbox("cmd_$i", $cmds[$i], 50), 3);
+ $label = "";
}
+
# Row for new command
-print &ui_table_row("", &ui_select("cmd_directive_$i", undef, \@directives).' '.&ui_textbox("cmd_$i", "", 50), 3);
+print &ui_table_row($label, &ui_select("cmd_directive_$i", undef, \@directives).' '.&ui_textbox("cmd_$i", "", 50), 3);
print &ui_hidden("cmd_count", $i),"\n";
-
# Form footer
print &ui_table_end();
print &ui_form_end([
: ( [ "save", $text{'save'} ],
[ "delete", $text{'delete'} ] ) ]);
-&ui_print_footer("", $text{'index_return'});
+&ui_print_footer("index.cgi?type=$type", $text{'index_return'});
#!/usr/local/bin/perl
-# index.cgi
+# Show allowed and denied lists
require './tcpwrappers-lib.pl';
-
+&ReadParse();
&ui_print_header(undef, $text{'index_title'}, "", "intro", 1, 1);
-# ALLOWED HOSTS & DENIED HOSTS
+# Start of tabs
+@types = ('allow', 'deny');
+print &ui_tabs_start(
+ [ map { [ $_, $text{'index_'.$_.'title'},
+ "index.cgi?type=$_" ] } @types ],
+ "type",
+ $in{'type'} || "allow",
+ 1);
+
+# Tables of rules
foreach my $type ('allow', 'deny') {
- my $file = $type eq 'allow' ? $config{'hosts_allow'} : $config{'hosts_deny'};
- @rules = &list_rules($file);
- print "<font size=+1>".($type eq 'allow' ? $text{'index_allowtitle'} : $text{'index_denytitle'})."</font><p />\n";
- if (@rules) {
- print &ui_form_start("delete_rules.cgi", "post");
- print &ui_hidden($type, 1),"\n";
- print &select_all_link("d"),"\n";
- print &select_invert_link("d"),"\n";
- print "<a href='edit_rule.cgi?$type=1&new=1'>$text{'index_add'}</a><br />\n";
-
- @tds = ( "width=5" );
- print &ui_columns_start([
- "",
- $text{'index_service'},
- $text{'index_hosts'},
- $text{'index_cmd'},
- ], "width=100%", 0, \@tds);
+ print &ui_tabs_start_tab("type", $type);
+ my $file = $type eq 'allow' ? $config{'hosts_allow'}
+ : $config{'hosts_deny'};
+ @rules = &list_rules($file);
+
+ # Build grid of rules
+ @table = ( );
foreach my $r (@rules) {
- print &ui_checked_columns_row([
- "<a href='edit_rule.cgi?$type=1&id=$r->{'id'}'>$r->{'service'}</a>",
- $r->{'host'},
- $r->{'cmd'} ? join("<br>", split /:/, $r->{'cmd'}) : $text{'index_none'},
- ], \@tds, "d", $r->{'id'});
- }
- print &ui_columns_end();
-
- print &select_all_link("d"),"\n";
- print &select_invert_link("d"),"\n";
- print "<a href='edit_rule.cgi?$type=1&new=1'>$text{'index_add'}</a><br />\n";
- print &ui_form_end([ [ "delete", $text{'index_delete'} ] ]);
- } else {
- if (-r $file) {
- print "<b>".&text('index_norule', $file)."</b><br />\n";
- print "<a href='edit_rule.cgi?$type=1&new=1'>$text{'index_add'}</a><p />\n";
- } else {
- print "<br>".&text('index_nofile', $file)."</b><p />\n";
+ push(@table, [
+ { 'type' => 'checkbox', 'name' => 'd',
+ 'value' => $r->{'id'} },
+ "<a href='edit_rule.cgi?$type=1&id=$r->{'id'}'>".
+ "$r->{'service'}</a>",
+ $r->{'host'},
+ $r->{'cmd'} ? join("<br>", split /:/, $r->{'cmd'})
+ : $text{'index_none'},
+ ]);
+ }
+
+ # Show them
+ print &ui_form_columns_table(
+ "delete_rules.cgi",
+ [ [ "delete", $text{'index_delete'} ] ],
+ 1,
+ [ [ "edit_rule.cgi?$type=1&new=1", $text{'index_add'} ] ],
+ [ [ $type, 1 ] ],
+ [ "", $text{'index_service'},
+ $text{'index_hosts'}, $text{'index_cmd'}, ],
+ 100,
+ \@table,
+ undef,
+ 0,
+ undef,
+ &text('index_norule', $file),
+ );
+ print &ui_tabs_end_tab("type", $type);
}
- }
- print "<hr />\n" if ($type eq 'allow');
-}
+
+print &ui_tabs_end(1);
&ui_print_footer("/", $text{'index_return'});
require './tcpwrappers-lib.pl';
&ReadParse();
&error_setup($text{'save_errtitle'});
-$file = $in{'allow'} ? $config{'hosts_allow'} : $config{'hosts_deny'};
+$type = $in{'allow'} ? 'allow' : 'deny';
+$file = $config{'hosts_'.$type};
@rules = &list_rules($file);
if (!$in{'new'}) {
if ($in{'delete'}) {
# Delete one rule
&delete_rule($file, $rule);
+ goto ALLDONE;
} else {
# Check input
&error($text{'save_eservice'}) if ($in{'service_custom'} && $in{'service_custom'} !~ /^[\w\d\s\-\/\.,]+$/);
for (my $i = 0; $i <= $in{'cmd_count'}; $i++) {
&error($text{'save_ecmd'}) if ($in{'cmd_'.$i} && $in{'cmd_'.$i} !~ /^[\w\d\s\-\/\@\%\|\(\)\'\"\&\.,]+$/);
}
-
}
# Build rule record
if ($in{'service_custom'}) {
- $service = $in{'service_custom'}." EXCEPT ".$in{'service_except_custom'};
+ $service = $in{'service_custom'};
+ if ($in{'service_except_custom'}) {
+ $service .= " EXCEPT ".$in{'service_except_custom'};
+ }
} else {
# listed from (x)inetd
$service = join(",", split /\0/, $in{'service'});
&modify_rule($file, $rule, \%newrule);
}
+ALLDONE:
&unlock_file($file);
&webmin_log($in{'new'} ? "create" : $in{'delete'} ? "delete" : "modify", "rule", $rule->{'id'});
-&redirect("");
+&redirect("index.cgi?type=$type");
+