fix ping problem
[spider.git] / perl / DXCommandmode.pm
index 510adac255f8a7caa397d1f88daf866f2057569d..8720e940ac016e4ec5e8da04346f106d80722787 100644 (file)
@@ -50,6 +50,7 @@ use DXCIDR;
 use strict;
 use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug
        $maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers
+    $maxcmdlth
 );
 
 %Cache = ();                                   # cache of dynamically loaded routine's mod times
@@ -64,6 +65,8 @@ $cmdimportdir = "$main::root/cmd_import"; # the base directory for importing com
 $users = 0;                                      # no of users on this node currently
 $maxusers = 0;                           # max no users on this node for this run
 
+$maxcmdlth = 512;                              # max length of incoming cmd line (including the command and any arguments
+
 #
 # obtain a new connection this is derived from dxchannel
 #
@@ -249,6 +252,7 @@ sub start
        }
 
        $self->lastmsgpoll($main::systime);
+       $self->{user_interval} = $self->user->user_interval || $main::user_interval; # allow user to change idle time between prompts
        $self->prompt;
 }
 
@@ -534,15 +538,15 @@ sub run_cmd
                
        if ($cmd) {
 
-               # check cmd
-               if ($cmd =~ m|^/| || $cmd =~ m|[^-?\w/]|) {
+               # strip out // on command only
+               $cmd =~ s|//+|/|g;
+
+               # check for length of whole command line and any invalid characters
+               if (length $cmdline > $maxcmdlth || $cmd =~ m|\.| || $cmd !~ m|^\w+(?:/\w+){0,1}(?:/\d+)?$|) {
                        LogDbg('DXCommand', "cmd: $self->{call} - invalid characters in '$cmd'");
-                       return $self->_error_out('e1');
+                       return $self->_error_out('e40');
                }
 
-               # strip out // on command only
-               $cmd =~ s|//|/|g;
-                                       
                my ($path, $fcmd);
                        
                dbg("cmd: $cmd") if isdbg('command');
@@ -585,7 +589,7 @@ sub run_cmd
                                return $self->_error_out('e1');
                        }
                } else {
-                       dbg("cmd: $cmd not found") if isdbg('command');
+                       LogDbg('DXCommand', "$self->{call} cmd: '$cmd' not found");
                        return $self->_error_out('e1');
                }
        }
@@ -594,11 +598,7 @@ sub run_cmd
        if ($ok) {
                delete $self->{errors};
        } else {
-               if (++$self->{errors} > $DXChannel::maxerrors) {
-                       $self->send($self->msg('e26'));
-                       $self->disconnect;
-                       return ();
-               }
+               return $self->_error_out('e26');
        }
        return map {s/([^\s])\s+$/$1/; $_} @ans;
 }
@@ -624,7 +624,7 @@ sub process
                }
                
                # send a prompt if no activity out on this channel
-               if ($t >= $dxchan->t + $main::user_interval) {
+               if ($t >= $dxchan->t + $dxchan->{user_interval}) {
                        $dxchan->prompt() if $dxchan->{state} =~ /^prompt/o;
                        $dxchan->t($t);
                }
@@ -1030,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]; 
+                       }
                }
        }
 
@@ -1375,7 +1379,7 @@ sub spawn_cmd
        no strict 'refs';
 
        # just behave normally if something has set the "one-shot" _nospawn in the channel
-       if ($self->{_nospawn}) {
+       if ($self->{_nospawn} || $main::is_win == 1) {
                eval { @out = $cmdref->(@$args); };
                if ($@) {
                        DXDebug::dbgprintring(25);