add cmd ratelimits, restore regex is_ipaddr
[spider.git] / perl / DXChannel.pm
index dd13781fcf41abe4f9401a3fc175c777a9d5ea8d..ceaaf551907c0b8aaee3e19a55737c58bf92df6f 100644 (file)
@@ -33,6 +33,8 @@ use DXDebug;
 use Filter;
 use Prefix;
 use Route;
+use DXLog;
+
 
 use strict;
 use vars qw(%channels %valid @ISA $count $maxerrors);
@@ -50,6 +52,8 @@ $count = 0;
                  beep => '0,Want Beeps,yesno',
                  build => '1,Node Build',
                  call => '0,Callsign',
+                 cmdcount => '5,Cmds in cmdinterval',
+                 cmdintstart => '5,Cmd int start,atime',
                  cluster => '5,Cluster data',
                  conf => '0,In Conference?,yesno',
                  conn => '9,Msg Conn ref',
@@ -64,7 +68,8 @@ $count = 0;
                  enhanced => '5,Enhanced Client,yesno',
                  errors => '9,Errors',
                  func => '5,Function',
-                 group => '0,Access Group,parray',     # used to create a group of users/nodes for some purpose or other
+                 group => '0,Access Group,parray',# used to create a group of users/nodes for some purpose or other.
+                 gtk => '5,Using GTK,yesno',
                  handle_xml => '9,Handles XML,yesno',
                  here => '0,Here?,yesno',
                  hostname => '0,Hostname',
@@ -77,9 +82,11 @@ $count = 0;
                  inspotsfilter => '5,Spot Filt-inp',
                  inwcyfilter => '5,WCY Filt-inp',
                  inwwvfilter => '5,WWV Filt-inp',
+                 isbasic => '9,Internal Connection', 
                  isolate => '5,Isolate network,yesno',
                  isslugged => '9,Still Slugged,yesno',
                  itu => '0,ITU Zone',
+                 K => '9,Seen on PC92 K,yesno',
                  lang => '0,Language',
                  lastmsgpoll => '0,Last Msg Poll,atime',
                  lastping => '5,Ping last sent,atime',
@@ -106,6 +113,7 @@ $count = 0;
                  priv => '9,Privilege',
                  prompt => '0,Required Prompt',
                  rbnfilter => '5,RBN Filt-out',
+                 rbnseeme => '0,RBN See Me,yesno',
                  redirect => '0,Redirect messages to',
                  registered => '9,Registered?,yesno',
                  remotecmd => '9,doing rcmd,yesno',
@@ -120,15 +128,19 @@ $count = 0;
                  talk => '0,Want Talk,yesno',
                  talklist => '0,Talk List,parray',
                  user => '9,DXUser ref',
+                 user_interval => '0,Prompt Idle Time',
                  ve7cc => '0,VE7CC program special,yesno',
                  verified => '9,Verified?,yesno',
                  version => '1,Node Version',
+                 wcy => '0,Want WCY,yesno',
                  wcyfilter => '5,WCY Filt-out',
                  width => '0,Column Width',
+                 wwv => '0,Want WWV,yesno',
                  wwvfilter => '5,WWV Filt-out',
+                 wx => '0,Want WX,yesno',                
                 );
 
-$maxerrors = 20;                               # the maximum number of concurrent errors allowed before disconnection
+$maxerrors = 10;                               # the maximum number of concurrent errors allowed before disconnection
 
 # object destruction
 sub DESTROY
@@ -168,6 +180,7 @@ sub alloc
        $self->{lang} = $main::lang if !$self->{lang};
        $self->{func} = "";
        $self->{width} ||=  80;
+       $self->{_nospawn} = 0;
 
        # add in all the dxcc, itu, zone info
        my @dxcc = Prefix::extract($call);
@@ -178,6 +191,11 @@ sub alloc
        }
        $self->{inqueue} = [];
 
+       if ($conn) {
+               $self->{hostname} = $self->{conn}->peerhost;
+               $self->{sockhost} = $self->{conn}->sockhost;
+       }
+
        $count++;
        dbg("DXChannel $self->{call} created ($count)") if isdbg('chan');
        bless $self, $pkg; 
@@ -191,12 +209,13 @@ sub _error_out
 {
        my $self = shift;
        my $e = shift;
-       if (++$self->{errors} > $maxerrors) {
+       if ($self != $main::me && ++$self->{errors} > $maxerrors) {
                $self->send($self->msg('e26'));
+               LogDbg('err', "DXChannel $self->{call}: too many errors ($self->{errors} > $maxerrors), disconnecting");
                $self->disconnect;
                return ();
        } else {
-               return ($self->msg($e));
+               return ($e ? $self->msg($e) : '');
        }
 }
 
@@ -708,9 +727,14 @@ sub process_one
        while (my $data = shift @{$self->{inqueue}}) {
                my ($sort, $call, $line) = $self->decode_input($data);
                next unless defined $sort;
-               
-               # do the really sexy console interface bit! (Who is going to do the TK interface then?)
-               dbg("<- $sort $call $line") if $sort ne 'D' && isdbg('chan');
+
+               if ($sort ne 'D') {
+                       if (isdbg('chan')) {
+                               if (($self->is_rbn && isdbg('rbnchan')) || !$self->is_rbn) {
+                                       dbg("<- $sort $call $line") if isdbg('chan'); # you may think this is tautology, but it's needed get the correct label on the debug line
+                               }
+                       }
+               }
                
                # handle A records
                my $user = $self->user;
@@ -765,6 +789,15 @@ sub error_handler
        $self->disconnect(1);
 }
 
+sub refresh_user
+{
+       my $call = shift;
+       my $user = shift;
+       return unless $call && $user && ref $user;
+       my $self = DXChannel::get($call);
+       $self->{user} = $user;
+       return $user;
+}
 
 sub isregistered
 {