Try to fix auto-locking (only for nodes)
[spider.git] / perl / DXProtHandle.pm
index 79b9b8ba4a67498a7accde3f7753ab8a1f75dce1..979a619a3050b92976632769c0ac0b141f013a81 100644 (file)
@@ -763,23 +763,27 @@ sub handle_18
        $self->send(pc20());
 }
 
-sub check_add_node
+sub check_add_user
 {
        my $call = shift;
        my $type = shift;
-       
+       my $homenode = shift;
 
        # add this station to the user database, if required (don't remove SSID from nodes)
        my $user = DXUser::get_current($call);
        unless ($user) {
                $user = DXUser->new($call);
-               $user->priv(1);         # I have relented and defaulted nodes
-               $user->lockout(1);
-               $user->homenode($call);
-               $user->node($call);
-               $user->sort($type || 'A');
+               $user->sort($type || 'U');
+               if ($user->is_node) {
+                       $user->priv(1);         # I have relented and defaulted nodes
+                       $user->lockout(1) if $user->is_node;
+               } else {
+                       $user->homenode($homenode) if $homenode;
+                       $user->node($homenode);
+               }
                $user->lastin($main::systime); # this make it last longer than just this invocation
                $user->put;                             # just to make sure it gets written away!!!
+               dbg("DXProt: PC92 new user record for $call created");
        }
        return $user;
 }
@@ -855,7 +859,7 @@ sub handle_19
                        next;
                }
 
-               my $user = check_add_node($call);
+               my $user = check_add_user($call, 'A');
 
 #              if (eph_dup($genline)) {
 #                      dbg("PCPROT: dup PC19 for $call detected") if isdbg('chanerr');
@@ -1599,42 +1603,31 @@ sub _add_thingy
                my $ncall = $parent->call;
                if ($ncall ne $call) {
                        my $user;
-                       unless (DXChannel::get($call)) { # i.e. external entity - create an user entry for it - ALL entities will appear in ALL user files from now on.
-                               $user = DXUser::get($call);
-                               unless ($user) {
-                                       $user = DXUser->new($call);
-                                       dbg("PCProt::_add_thingy new user $call") if isdbg('route');
-                               }
-                       }
+                       my $r;
+                       
                        if ($is_node) {
                                dbg("ROUTE: added node $call to $ncall") if isdbg('routelow');
+                               $user = check_add_user($call, 'A');
                                @rout = $parent->add($call, $version, Route::here($here), $ip);
-                               my $r = Route::Node::get($call);
+                               $r = Route::Node::get($call);
                                $r->PC92C_dxchan($dxchan->call, $hops) if $r;
-                               if ($ip) {
-                                       $r->ip($ip);
-                                       Log('DXProt', "PC92A $call -> $ip on $ncall");
-                               }
-                               if ($user && $user->sort eq 'U') {
-                                       if (defined $version) {
-                                               if ($version >= 5455 && $build > 0 || $version >= 3000 ) {
-                                                       $user->sort('S');
-                                               } else {
-                                                       $user->sort('A');
-                                               }
-                                               dbg("PCProt::_add_thingy node $call sort updated " . $user->sort) if isdbg('route');
-                                       }
+                               if ($version) {
+                                       my $old = $user->sort;
+                                       if ($version >= 5455 && defined $build && $build > 0 || $version >= 3000 ) {
+                                               $user->sort('S');
+                                               dbg("PCProt::_add_thingy node $call sort ($old) updated to " . $user->sort) if isdbg('route');
+                                       } 
                                }
                        } else {
                                dbg("ROUTE: added user $call to $ncall") if isdbg('routelow');
-                               my $user = check_add_node($call, 'U');
+                               $user = check_add_user($call, 'U', $parent->call);
                                @rout = $parent->add_user($call, Route::here($here), $ip);
                                $dxchan->tell_buddies('loginb', $call, $ncall) if $dxchan;
-                               my $r = Route::User::get($call);
-                               if ($ip) {
-                                       $r->ip($ip);
-                                       Log('DXProt', "PC92A $call -> $ip on $ncall");
-                               }
+                               $r = Route::User::get($call);
+                       }
+                       if ($ip) {
+                               $r->ip($ip);
+                               Log('DXProt', "PC92A $call -> $ip on $ncall");
                        }
                        if ($pc92_slug_changes && $parent == $main::routeroot) {
                                $things_add{$call} = Route::get($call);
@@ -1807,11 +1800,11 @@ sub pc92_handle_first_slot
        my ($call, $is_node, $is_extnode, $here, $version, $build) = @$slot;
        if ($call && $is_node) {
                if ($call eq $main::mycall) {
-                       dbg("PCPROT: $call looped back onto \$main::mycall ($main::mycall), ignored") if isdbg('chan');
+                       LogDbg('err', "PCPROT: $self->{call} : $call looped back onto \$main::mycall ($main::mycall), ignored");
                        return;
                }
                if ($call eq $main::myalias) {
-                       dbg("PCPROT: $call looped back onto \$main::myalias ($main::myalias), ignored") if isdbg('chan');
+                       LogDbg('err', "PCPROT: $self->{call} : $call looped back onto \$main::myalias ($main::myalias), ignored");
                        return;
                }
                # this is only accepted from my "self".
@@ -1872,12 +1865,12 @@ sub handle_92
 #      }
 
        if ($pcall eq $main::mycall) {
-               dbg("PCPROT: looped back, ignored") if isdbg('chan');
+               LogDbg('err', "PCPROT: looped back, ignored");
                return;
        }
 
        if ($pcall eq $main::myalias) {
-               dbg("PCPROT: looped back to \$myalias ($main::myalias), misconfiguration ignored") if isdbg('chan');
+               LogDbg('err', "PCPROT: looped back to \$myalias ($main::myalias), misconfiguration ignored");
                return;
        }
 
@@ -1941,10 +1934,10 @@ sub handle_92
                                        if (@dxchan) {
                                                $_->send($line) for @dxchan;
                                        } else {
-                                               dbg("PCPROT: no return route, ignored") if isdbg('chanerr')
+                                               dbg("PCPROT: $self->{call} : type R no return route, ignored") if isdbg('chanerr') || isdbg('route');
                                        }
                                } else {
-                                       dbg("PCPROT: no return route, ignored") if isdbg('chanerr')
+                                       dbg("PCPROT: $self->{call} : type R no return route, ignored") if isdbg('chanerr') || isdbg('route');
                                }
                        }
                        return;
@@ -2013,11 +2006,11 @@ sub handle_92
                        my $dxc;
                        next unless $_ && @$_;
                        if ($_->[0] eq $main::mycall) {
-                               dbg("PCPROT: $_->[0] refers to me, ignored") if isdbg('chanerr');
+                               LogDbg('err', "PCPROT: $self->{call} : type $sort $_->[0] refers to me, ignored");
                                next;
                        }
                        if ($_->[0] eq $main::myalias && $_->[1] || $_->[0] eq $main::mycall && $_->[1] == 0) {
-                               dbg("PCPROT: $_->[0] changing type to " . $_->[1]?"Node":"User" . ", ignored") if isdbg('chanerr');
+                               LogDbg('err',"PCPROT: $self->{call} : type $sort $_->[0] changing type to " . $_->[1]?"Node":"User" . ", ignored");
                                next;
                        }
                        
@@ -2049,7 +2042,7 @@ sub handle_92
                                                push @users, $r->[0];
                                        }
                                } else {
-                                       dbg("PCPROT: pc92 call entry '$_' not decoded, ignored") if isdbg('chanerr');
+                                       dbg("PCPROT: $self->{call} :  pc92 call entry '$_' not decoded, ignored") if isdbg('chanerr') || isdbg('route');
                                }
                        }