use WCY;
use Time::HiRes qw(gettimeofday tv_interval);
use BadWords;
+use DXHash;
use strict;
use vars qw($me $pc11_max_age $pc23_max_age
$last_hour %pings %rcmds
- %nodehops @baddx $baddxfn $censorpc
+ %nodehops $baddx $badspotter $badnode $censorpc
$allowzero $decode_dk0wcy $send_opernam @checklist);
$me = undef; # the channel id for this cluster
%pings = (); # outstanding ping requests outbound
%rcmds = (); # outstanding rcmd requests outbound
%nodehops = (); # node specific hop control
-@baddx = (); # list of illegal spotted callsigns
$censorpc = 0; # Do a BadWords::check on text fields and reject things
-
-$baddxfn = "$main::data/baddx.pl";
+ # loads of 'bad things'
+$baddx = new DXHash "baddx";
+$badspotter = new DXHash "badspotter";
+$badnode = new DXHash "badnode";
@checklist =
(
do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl";
confess $@ if $@;
$me->{sort} = 'S'; # S for spider
-
- # load the baddx file
- do "$baddxfn" if -e "$baddxfn";
- print "$@\n" if $@;
}
#
}
# if this is a 'nodx' node then ignore it
- if (grep $field[7] =~ /^$_/, @DXProt::nodx_node) {
- dbg('chan', "PCPROT: Bad DXNode, dropped");
+ if ($badnode->in($field[7])) {
+ dbg('chan', "PCPROT: Bad Node, dropped");
+ return;
+ }
+
+ # if this is a 'bad spotter' user then ignore it
+ if ($badspotter->in($field[7])) {
+ dbg('chan', "PCPROT: Bad Spotter, dropped");
return;
}
}
# is it 'baddx'
- if (grep $field[2] eq $_, @baddx) {
+ if ($baddx->in($field[2])) {
dbg('chan', "PCPROT: Bad DX spot, ignored");
return;
}
} else {
my $ref = DXUser->get_current($field[1]);
if ($ref && $ref->is_clx) {
- route($field[1], pc84($field[2], $field[1], $field[2], $field[3]));
+ $self->route($field[1], pc84($field[2], $field[1], $field[2], $field[3]));
} else {
$self->route($field[1], $line);
}
} else {
my $ref = DXUser->get_current($field[1]);
if ($ref && $ref->is_clx) {
- route($field[1], pc85($field[2], $field[1], $field[2], $field[3]));
+ $self->route($field[1], pc85($field[2], $field[1], $field[2], $field[3]));
} else {
$self->route($field[1], $line);
}
$dxchan->send($dxchan->msg('pingi', $field[2], $s, $ave))
} elsif ($dxchan->is_node) {
if ($tochan) {
- $tochan->{nopings} = 2; # pump up the timer
+ $tochan->{nopings} = $tochan->user->nopings || 2; # pump up the timer
push @{$tochan->{pingtime}}, $t;
shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6;
my $st;
if ($ref && $ref->is_clx) {
$self->route($field[1], $line);
} else {
- route($field[1], pc34($field[2], $field[1], $field[4]));
+ $self->route($field[1], pc34($field[2], $field[1], $field[4]));
}
}
return;
if ($ref && $ref->is_clx) {
$self->route($field[1], $line);
} else {
- route($field[1], pc35($field[2], $field[1], $field[4]));
+ $self->route($field[1], pc35($field[2], $field[1], $field[4]));
}
}
return;
unless ($dxchan) {
my $cl = DXCluster->get_exact($call);
$dxchan = $cl->dxchan if $cl;
+ if (ref $dxchan) {
+ if (ref $self && $dxchan eq $self) {
+ dbg('chan', "PCPROT: Trying to route back to source, dropped");
+ return;
+ }
+ }
}
if ($dxchan) {
my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name
if ($routeit) {
$dxchan->send($routeit);
}
+ } else {
+ dbg('chan', "PCPROT: No route available, dropped");
}
}