use strict;
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
-
use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime
$last_hour $last10 %eph %pings %rcmds $ann_to_talk
$pingint $obscount %pc19list $chatdupeage $chatimportfn
$investigation_int $pc19_version $myprot_version
%nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
$allowzero $decode_dk0wcy $send_opernam @checklist
+ $eph_pc15_restime
);
$pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11
$rspfcheck = 1;
$eph_restime = 180;
$eph_info_restime = 60*60;
+$eph_pc15_restime = 6*60;
$eph_pc34_restime = 30;
$pingint = 5*60;
$obscount = 2;
# add this node to the table, the values get filled in later
my $pkg = shift;
my $call = shift;
+
+ # if we have an entry already, then send a PC21 to all connect
+ # old style connections, because we are about to get the real deal
+ if (my $ref = Route::Node::get($call)) {
+ dbg("ROUTE: $call is already in the routing table, deleting") if isdbg('route');
+ my @rout = $ref->delete;
+ $self->route_pc21($main::mycall, undef, @rout) if @rout;
+ }
$main::routeroot->add($call, '5000', Route::here(1)) if $call ne $main::mycall;
return $self;
# process PC frames, this will fail unless the frame starts PCnn
my ($pcno) = $field[0] =~ /^PC(\d\d)/; # just get the number
- unless (defined $pcno && $pcno >= 10 && $pcno <= 99) {
+ unless (defined $pcno && $pcno >= 10 && $pcno <= 89) { # reject PC9x messages
dbg("PCPROT: unknown protocol") if isdbg('chanerr');
return;
}
$self->route($_[2], $line);
}
}
+
+
+sub handle_15
+{
+ my $self = shift;
+ my $pcno = shift;
+ my $line = shift;
+ my $origin = shift;
+
+ if (eph_dup($line, $eph_pc15_restime)) {
+ dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr');
+ } else {
+ unless ($self->{isolate}) {
+ DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me
+ }
+ }
+}
# incoming user
sub handle_16
}
# is it me?
if ($ncall eq $main::mycall) {
- dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr');
+ dbg("PCPROT: trying to alter my config from outside!") if isdbg('chanerr');
+ return;
+ }
+ if (DXChannel::get($ncall) && $ncall ne $self->{call}) {
+ dbg("PCPROT: trying to alter locally connected $ncall from $self->{call}, ignored") if isdbg('chanerr');
return;
}
my $uref = Route::User::get($ucall);
unless ($uref) {
dbg("PCPROT: Route::User $ucall not in config") if isdbg('chanerr');
+ return;
}
my $parent = Route::Node::get($ncall);
unless ($parent) {
dbg("PCPROT: Route::Node $ncall not in config") if isdbg('chanerr');
+ return;
}
- $dxchan = $parent->dxchan if $parent;
+ $dxchan = DXChannel::get($ncall);
if ($dxchan && $dxchan ne $self) {
dbg("PCPROT: PC17 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr');
return;
}
# input filter if required and then remove user if present
- if ($parent) {
# return unless $self->in_filter_route($parent);
- $parent->del_user($uref) if $uref;
- } else {
- $parent = Route->new($ncall); # throw away
- }
+ $parent->del_user($uref);
# send info to all logged in thingies
$self->tell_login('logoutu', "$ncall: $ucall") if DXUser->get_current($ncall)->is_local_node;
return;
}
- $uref = Route->new($ucall) unless $uref; # throw away
$self->route_pc17($origin, $line, $parent, $uref);
}
$self->state('init');
# record the type and version offered
- if ($_[1] =~ /DXSpider Version: (\d+\.\d+) Build: (\d+\.\d+)/) {
+ if ($_[1] =~ /DXSpider Version: (\d+\.\d+) Build: (\d+(?:\.\d+)?)/) {
$self->version(53 + $1);
$self->user->version(53 + $1);
$self->build(0 + $2);
$user = DXUser->new($call) unless $user;
if ($_[2] == 1) {
+ if (($_[3] =~ /spotter/i || $_[3] =~ /self/i) && $user->name && $user->name ne $_[3]) {
+ dbg("PCPROT: invalid name") if isdbg('chanerr');
+ return;
+ }
$user->name($_[3]);
} elsif ($_[2] == 2) {
$user->qth($_[3]);
return "" if defined $newhops && $newhops == 0;
$newhops = $ref->{default} unless $newhops;
return "" if defined $newhops && $newhops == 0;
- $newhops = $hops if !$newhops;
+ $newhops = $hops unless $newhops;
+ return "" unless $newhops > 0;
$s =~ s/\^H(\d+)(\^~?)$/\^H$newhops$2/ if $newhops;
} else {
# simply decrement it
$hops--;
- return "" if !$hops;
- $s =~ s/\^H(\d+)(\^~?)$/\^H$hops$2/ if $hops;
+ return "" unless $hops > 0;
+ $s =~ s/\^H(\d+)(\^~?)$/\^H$hops$2/;
}
}
return $s;