X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FFilter.pm;h=226aff4a22987f820934fcbfef9b11f7f4b124dc;hb=478a52c72ec787bf037111f4b46233fcf60d5068;hp=6a0dad7a9b5debfcdfd27168acc5284101e2481a;hpb=211b54d504170a8c9dad2bf25b9ed686d5eeac11;p=spider.git diff --git a/perl/Filter.pm b/perl/Filter.pm index 6a0dad7a..226aff4a 100644 --- a/perl/Filter.pm +++ b/perl/Filter.pm @@ -143,12 +143,15 @@ sub getfilkeys # 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 @@ -178,19 +181,29 @@ sub it 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 @@ -247,10 +260,10 @@ sub print 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; @@ -293,6 +306,7 @@ sub delete # get rid if ($filter->{hops} || $filter->getfilkeys) { $filter->install; + $filter->write; } else { $filter->install(1); unlink $fn; @@ -303,6 +317,9 @@ sub delete package Filter::Cmd; use strict; +use DXVars; +use DXUtil; +use DXDebug; use vars qw(@ISA); @ISA = qw(Filter); @@ -331,7 +348,7 @@ sub parse 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; @@ -375,6 +392,10 @@ sub parse $s .= $tok; $user .= $tok; next; + } elsif ($tok eq 'all') { + $s .= '1'; + $user .= $tok; + last; } elsif ($tok eq 'or') { $conj = ' || ' if $conj ne ' || '; next; @@ -460,12 +481,15 @@ sub parse $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);