# The filter returns 0 if an entry is matched by any reject rule and also if any
# accept rule fails otherwise it returns 1
#
-# Either set of rules may be missing meaning an implicit 'ok'
+# Either set of rules may be missing meaning an implicit 'opposite' ie if it
+# a reject then ok else if an accept then not ok.
+#
+# you can set a default with either an accept/xxxx all or reject/xxxx all
#
# Unlike the old system, this is kept as a hash of hashes so that you can
# easily change them by program.
#
-# You can have a [any] number of 'filters', they are tried in random order until
+# You can have 10 filter lines (0->9), they are tried in order until
# one matches
#
# There is a parser that takes a Filter::Cmd object which describes all the possible
my $self = shift;
my $hops = undef;
- my $r = 1;
my $filter;
- foreach $filter ($self->getfilters) {
- $r = 0;
+ my @keys = sort $self->getfilkeys;
+ my $key;
+ my $r = @keys > 0 ? 0 : 1;
+ foreach $key (@keys) {
+ $filter = $self->{$key};
if ($filter->{reject} && exists $filter->{reject}->{code}) {
- next if &{$filter->{reject}->{code}}(\@_);
+ if (&{$filter->{reject}->{code}}(\@_)) {
+ $r = 0;
+ last;
+ } else {
+ $r = 1;
+ }
}
if ($filter->{accept} && exists $filter->{accept}->{code}) {
- next unless &{$filter->{accept}->{code}}(\@_);
+ if (&{$filter->{accept}->{code}}(\@_)) {
+ $r = 1;
+ last;
+ } else {
+ $r = 0;
+ }
}
- $r = 1;
- last;
}
# hops are done differently
foreach $key (sort $self->getfilkeys) {
my $filter = $self->{$key};
if ($filter->{reject} && exists $filter->{reject}->{user}) {
- push @out, ' ' . join(' ', $key, 'reject', $filter->{reject}->{user});
+ push @out, ' ' . join(' ', $key, 'reject', $filter->{reject}->{user});
}
if ($filter->{accept} && exists $filter->{accept}->{user}) {
- push @out, ' ' . join(' ', $key, 'accept', $filter->{accept}->{user});
+ push @out, ' ' . join(' ', $key, 'accept', $filter->{accept}->{user});
}
}
return @out;
# get rid
if ($filter->{hops} || $filter->getfilkeys) {
$filter->install;
+ $filter->write;
} else {
$filter->install(1);
unlink $fn;
package Filter::Cmd;
use strict;
+use DXVars;
+use DXUtil;
+use DXDebug;
use vars qw(@ISA);
@ISA = qw(Filter);
while (@f) {
if ($ntoken == 0) {
- if (@f && $dxchan->priv >= 8 && (DXUser->get($f[0]) || $f[0] =~ /(?:node|user)_default/)) {
+ if (@f && $dxchan->priv >= 8 && ((is_callsign(uc $f[0]) && DXUser->get(uc $f[0])) || $f[0] =~ /(?:node|user)_default/)) {
$call = shift @f;
if ($f[0] eq 'input') {
shift @f;
$s .= $tok;
$user .= $tok;
next;
+ } elsif ($tok eq 'all') {
+ $s .= '1';
+ $user .= $tok;
+ last;
} elsif ($tok eq 'or') {
$conj = ' || ' if $conj ne ' || ';
next;
$user =~ s/\!/ not /g;
$user =~ s/\s+/ /g;
- return (0, $filter, $fno, $user, "sub { my \$r = shift; return $s }");
+ return (0, $filter, $fno, $user, "sub { my \$r = shift; return ($s) ? 1 : 0 }");
}
package Filter::Old;
use strict;
+use DXVars;
+use DXUtil;
+use DXDebug;
use vars qw(@ISA);
@ISA = qw(Filter);