$to = $field[2];
}
+ # if this is a 'nodx' node then ignore it
+ if ($badnode->in($field[6]) || ($via && $badnode->in($via))) {
+ dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr');
+ return;
+ }
+
+ # if this is a 'bad spotter' user then ignore it
+ if ($badspotter->in($from)) {
+ dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
+ return;
+ }
+
# if we are converting announces to talk is it a dup?
if ($ann_to_talk) {
if (AnnTalk::is_talk_candidate($from, $field[3]) && AnnTalk::dup($from, $to, $field[3])) {
}
}
+
my @spot = Spot::prepare($field[1], $field[2], $d, $field[5], $field[6], $field[7]);
# global spot filtering on INPUT
if ($self->{inspotsfilter}) {
return;
}
}
-
+
+ # this goes after the input filtering, but before the add
+ # so that if it is input filtered, it isn't added to the dup
+ # list. This allows it to come in from a "legitimate" source
if (Spot::dup($field[1], $field[2], $d, $field[5])) {
dbg("PCPROT: Duplicate Spot ignored\n") if isdbg('chanerr');
return;
}
}
+ # if this is a 'nodx' node then ignore it
+ if ($badnode->in($field[5])) {
+ dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr');
+ return;
+ }
+
+ # if this is a 'bad spotter' user then ignore it
+ if ($badspotter->in($field[1])) {
+ dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
+ return;
+ }
+
if ($field[2] eq '*' || $field[2] eq $main::mycall) {
next unless $call && $conf && defined $here && is_callsign($call);
next if $call eq $main::mycall;
- eph_del_regex("^PC17\^$call\^$ncall");
+ eph_del_regex("^PC17\\^$call\\^$ncall");
$conf = $conf eq '*';
my $ncall = $field[2];
my $ucall = $field[1];
- if (eph_dup($line)) {
- dbg("PCPROT: dup PC17 detected") if isdbg('chanerr');
- return;
- }
-
- eph_del_regex("^PC16.*$ncall.*$ucall");
+ eph_del_regex("^PC16\\^$ncall.*$ucall");
if ($ncall eq $main::mycall) {
dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr');
return unless $self->in_filter_route($parent);
$parent->del_user($uref);
+
+ if (eph_dup($line)) {
+ dbg("PCPROT: dup PC17 detected") if isdbg('chanerr');
+ return;
+ }
+
$self->route_pc17($parent, $uref);
return;
}
my $ver = $field[$i+3];
next unless defined $here && defined $conf && is_callsign($call);
- eph_del_regex("^PC(?:21\^$call|17\^[^\^]+\^$call)");
+ eph_del_regex("^PC(?:21\\^$call|17\\^[^\\^]+\\^$call)");
# check for sane parameters
# $ver = 5000 if $ver eq '0000';
my $dxchan = DXChannel->get($call);
if ($dxchan && $dxchan != $self) {
dbg("PCPROT: PC19 from $self->{call} trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr');
- return;
+ next;
}
# update it if required
if ($pcno == 21) { # delete a cluster from the list
my $call = uc $field[1];
- if (eph_dup($line)) {
- dbg("PCPROT: dup PC21 detected") if isdbg('chanerr');
- return;
- }
-
+ eph_del_regex("^PC1[79].*$call");
+
# if I get a PC21 from the same callsign as self then treat it
# as a PC39: I have gone away
if ($call eq $self->call) {
$self->disconnect(1);
- eph_del_regex("^PC(?:1[679]|21).*$field[1]");
return;
}
- eph_del_regex("^PC1[79].*$call");
-
my @rout;
my $parent = Route::Node::get($self->{call});
unless ($parent) {
return;
}
+# if (eph_dup($line)) {
+# dbg("PCPROT: dup PC21 detected") if isdbg('chanerr');
+# return;
+# }
+
$self->route_pc21(@rout) if @rout;
return;
}
}
if ($pcno == 35) { # remote command replies
- eph_del_regex("^PC35\^$field[2]\^$field[1]\^");
+ eph_del_regex("^PC35\\^$field[2]\\^$field[1]\\^");
$self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]);
return;
}
if ($pcno == 39) { # incoming disconnect
if ($field[1] eq $self->{call}) {
$self->disconnect(1);
- eph_del_regex("^PC(?:1[679]|21).*$field[1]");
} else {
dbg("PCPROT: came in on wrong channel") if isdbg('chanerr');
}
$self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op")));
}
+ # get rid of any PC16 and 19s
+ eph_del_regex("^PC16\\^$call");
+ eph_del_regex("^PC19\\^.*$call");
+
# do routing stuff
my $node = Route::Node::get($call);
my @rout;