Fix showdx, is_ipaddr, create_master_badip_files.pl
[spider.git] / perl / DXCommandmode.pm
index 90812225dfe772c4bd8b2671f6ff3600bc70a521..2c49fabe07cb7422ef8536efb981a5fce5c980c5 100644 (file)
@@ -49,7 +49,8 @@ use DXCIDR;
 
 use strict;
 use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug
-       $maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers);
+       $maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers
+);
 
 %Cache = ();                                   # cache of dynamically loaded routine's mod times
 %cmd_cache = ();                               # cache of short names
@@ -74,14 +75,15 @@ sub new
        # routing, this must go out here to prevent race condx
        my $pkg = shift;
        my $call = shift;
-#      my @rout = $main::routeroot->add_user($call, Route::here(1));
-       DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->hostname], );
+       #       my @rout = $main::routeroot->add_user($call, Route::here(1));
+       my $ipaddr = alias_localhost($self->hostname);
+       DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $ipaddr], );
 
-       # ALWAYS output the user
+       # ALWAYS output the user (except if the updates not enabled)
        my $ref = Route::User::get($call);
        if ($ref) {
                $main::me->route_pc16($main::mycall, undef, $main::routeroot, $ref);
-               $main::me->route_pc92a($main::mycall, undef, $main::routeroot, $ref) unless $DXProt::pc92_slug_changes;
+               $main::me->route_pc92a($main::mycall, undef, $main::routeroot, $ref) unless $DXProt::pc92_slug_changes || ! $DXProt::pc92_ad_enable;
        }
 
        return $self;
@@ -452,7 +454,8 @@ sub send_chats
 
        my $msgid = DXProt::nextchatmsgid();
        $text = "#$msgid $text";
-       $main::me->normal(DXProt::pc93($target, $self->{call}, undef, $text));
+       my $ipaddr = alias_localhost($self->hostname || '127.0.0.1');
+       $main::me->normal(DXProt::pc93($target, $self->{call}, undef, $text, undef, $ipaddr));
 }
 
 sub special_prompt
@@ -667,7 +670,7 @@ sub disconnect
 
                # issue a pc17 to everybody interested
                $main::me->route_pc17($main::mycall, undef, $main::routeroot, $uref);
-               $main::me->route_pc92d($main::mycall, undef, $main::routeroot, $uref) unless $DXProt::pc92_slug_changes;
+               $main::me->route_pc92d($main::mycall, undef, $main::routeroot, $uref) unless $DXProt::pc92_slug_changes || ! $DXProt::pc92_ad_enable;
        } else {
                confess "trying to disconnect a non existant user $call";
        }
@@ -1027,41 +1030,45 @@ sub format_dx_spot
        $c =~ s/\t/ /g;
        my $comment = substr (($c || ''), 0, $clth);
        $comment .= ' ' x ($clth - (length($comment)));
-       
-    if (!$slot1 && $self->{user}->wantgrid) {
-               my $ref = DXUser::get_current($_[1]);
-               if ($ref && $ref->qra) {
-                       $slot1 = ' ' . substr($ref->qra, 0, 4);
+
+       if ($self->{user}) {            # to allow the standalone program 'showdx' to work
+               if (!$slot1 && $self->{user}->wantgrid) {
+                       my $ref = DXUser::get_current($_[1]);
+                       if ($ref && $ref->qra) {
+                               $slot1 = ' ' . substr($ref->qra, 0, 4);
+                       }
                }
-       }
-       if (!$slot1 && $self->{user}->wantusstate) {
-               $slot1 = " $_[12]" if $_[12];
-       }
-       unless ($slot1) {
-               if ($self->{user}->wantdxitu) {
-                       $slot1 = sprintf(" %2d", $_[8]) if defined $_[8]; 
-               } elsif ($self->{user}->wantdxcq) {
-                       $slot1 = sprintf(" %2d", $_[9]) if defined $_[9];
+               if (!$slot1 && $self->{user}->wantusstate) {
+                       $slot1 = " $_[12]" if $_[12];
                }
-       }
-       $comment = substr($comment, 0,  $clth-length($slot1)) . $slot1 if $slot1;
+               unless ($slot1) {
+                       if ($self->{user}->wantdxitu) {
+                               $slot1 = sprintf(" %2d", $_[8]) if defined $_[8]; 
+                       }
+                       elsif ($self->{user}->wantdxcq) {
+                               $slot1 = sprintf(" %2d", $_[9]) if defined $_[9];
+                       }
+               }
+               $comment = substr($comment, 0,  $clth-length($slot1)) . $slot1 if $slot1;
        
-    if (!$slot2 && $self->{user}->wantgrid) {
-               my $origin = $_[4];
-               $origin =~ s/-#$//;                     # sigh......
-               my $ref = DXUser::get_current($origin);
-               if ($ref && $ref->qra) {
-                       $slot2 = ' ' . substr($ref->qra, 0, 4);
+               if (!$slot2 && $self->{user}->wantgrid) {
+                       my $origin = $_[4];
+                       $origin =~ s/-#$//;     # sigh......
+                       my $ref = DXUser::get_current($origin);
+                       if ($ref && $ref->qra) {
+                               $slot2 = ' ' . substr($ref->qra, 0, 4);
+                       }
                }
-       }
-       if (!$slot2 && $self->{user}->wantusstate) {
-               $slot2 = " $_[13]" if $_[13];
-       }
-       unless ($slot2) {
-               if ($self->{user}->wantdxitu) {
-                       $slot2 = sprintf(" %2d", $_[10]) if defined $_[10]; 
-               } elsif ($self->{user}->wantdxcq) {
-                       $slot2 = sprintf(" %2d", $_[11]) if defined $_[11]; 
+               if (!$slot2 && $self->{user}->wantusstate) {
+                       $slot2 = " $_[13]" if $_[13];
+               }
+               unless ($slot2) {
+                       if ($self->{user}->wantdxitu) {
+                               $slot2 = sprintf(" %2d", $_[10]) if defined $_[10]; 
+                       }
+                       elsif ($self->{user}->wantdxcq) {
+                               $slot2 = sprintf(" %2d", $_[11]) if defined $_[11]; 
+                       }
                }
        }
 
@@ -1438,5 +1445,20 @@ sub user_count
     return ($users, $maxusers);
 }
 
+# alias localhost if required. This is designed to repress all localhost and other
+# internal interfaces to a fixed (outside) IPv4 or IPV6 address
+sub alias_localhost
+{
+       my $hostname = shift;
+       if ($hostname =~ /./) {
+               return $hostname unless $main::localhost_alias_ipv4;
+               return (grep $hostname eq $_, @main::localhost_names) ? $main::localhost_alias_ipv4 : $hostname;
+       } elsif ($hostname =~ /:/) {
+               return $hostname unless $main::localhost_alias_ipv6;
+               return (grep $hostname eq $_, @main::localhost_names) ? $main::localhost_alias_ipv6 : $hostname;
+       }
+       return $hostname;
+}
+
 1;
 __END__