add a modicum of security to the remote key get
[spider.git] / perl / DXDb.pm
index f54d6f14ff02b882fbefdd26cf21bbcab0fa1f4b..a088866c5873e675586b4a72c8c93c6565170e70 100644 (file)
@@ -42,6 +42,7 @@ $dbbase = "$main::root/db";           # where all the databases are kept;
                  tae => '9,End App txt',
                  atemplate => '9,App Templates,parray',
                  help => '0,Help txt,parray',
+                 localcmd => '0,Local Command',
                 );
 
 $lastprocesstime = time;
@@ -155,9 +156,22 @@ sub getkey
        my $key = uc shift;
        my $value;
 
+       # massage the key
+       $key =~ s/[\@\$\&\%\*]+//g;
+       $key =~ s/^[\.\/]+//g;
+       
        # make sure we are open
        $self->open;
-       if ($self->{db}) {
+       if ($self->{localcmd}) {
+               my $dxchan = $main::me;
+               $dxchan->{remotecmd} = 1; # for the benefit of any command that needs to know
+               my $oldpriv = $dxchan->{priv};
+               $dxchan->{priv} = 0;
+               my @in = (DXCommandmode::run_cmd($dxchan, "$self->{localcmd} $key"));
+               $dxchan->{priv} = $oldpriv;
+               delete $dxchan->{remotecmd};
+               return @in ? join("\n", @in) : undef;
+       } elsif ($self->{db}) {
                my $s = $self->{db}->get($key, $value);
                return $s ? undef : $value;
        }
@@ -187,10 +201,14 @@ sub new
        my $name = shift;
        my $remote = shift;
        my $chain = shift;
+       my $cmd = shift;
+       
        $self->{name} = lc $name;
        $self->{remote} = uc $remote if $remote;
        $self->{chain} = $chain if $chain && ref $chain;
        $self->{accesst} = $self->{createt} = $self->{lastt} = $main::systime;
+       $self->{localcmd} = lc $cmd if $cmd;
+       
        $avail{$self->{name}} = $self;
        mkdir $dbbase, 02775 unless -e $dbbase;
        save();
@@ -226,81 +244,58 @@ sub normal
 #
 sub process
 {
-       my ($dxchan, $line) = @_;
-
-       # this is periodic processing
-       if (!$dxchan || !$line) {
-               if ($main::systime - $lastprocesstime >= 60) {
-                       if (%avail) {
-                               for (values %avail) {
-                                       if ($main::systime - $_->{accesst} > $opentime) {
-                                               $_->close;
-                                       }
+       if ($main::systime - $lastprocesstime >= 60) {
+               if (%avail) {
+                       for (values %avail) {
+                               if ($main::systime - $_->{accesst} > $opentime) {
+                                       $_->close;
                                }
                        }
-                       $lastprocesstime = $main::systime;
                }
-               return;
+               $lastprocesstime = $main::systime;
        }
+}
 
-       my @f = split /\^/, $line;
-       my ($pcno) = $f[0] =~ /^PC(\d\d)/; # just get the number
+sub handle_37
+{              
 
-       # route out ones that are not for us
-       if ($f[1] eq $main::mycall) {
-               ;
-       } else {
-               $dxchan->route($f[1], $line);
-               return;
-       }
+}
 
- SWITCH: {
-               if ($pcno == 37) {              # probably obsolete
-                       last SWITCH;
-               }
+sub handle_44
+{      
+       my $self = shift;
 
-               if ($pcno == 44) {              # incoming DB Request
-                       my $db = getdesc($f[4]);
-                       if ($db) {
-                               if ($db->{remote}) {
-                                       sendremote($dxchan, $f[2], $f[3], $dxchan->msg('db1', $db->{remote}));
-                               } else {
-                                       my $value = $db->getkey($f[5]);
-                                       if ($value) {
-                                               my @out = split /\n/, $value;
-                                               sendremote($dxchan, $f[2], $f[3], @out);
-                                       } else {
-                                               sendremote($dxchan, $f[2], $f[3], $dxchan->msg('db2', $f[5], $db->{name}));
-                                       }
-                               }
-                       } else {
-                               sendremote($dxchan, $f[2], $f[3], $dxchan->msg('db3', $f[4]));
-                       }
-                       last SWITCH;
-               }
+       # incoming DB Request
+       my @in = DXCommandmode::run_cmd($self, "dbshow $_[4] $_[5]");
+       sendremote($self, $_[2], $_[3], @in);
+}
 
-               if ($pcno == 45) {              # incoming DB Information
-                       my $n = getstream($f[3]);
-                       if ($n) {
-                               my $mchan = DXChannel->get($n->{call});
-                               $mchan->send($f[2] . ":$f[4]") if $mchan;
-                       }
-                       last SWITCH;
-               }
+sub handle_45
+{              
+       my $self = shift;
 
-               if ($pcno == 46) {              # incoming DB Complete
-                       delstream($f[3]);
-                       last SWITCH;
-               }
+       # incoming DB Information
+       my $n = getstream($_[3]);
+       if ($n) {
+               my $mchan = DXChannel->get($n->{call});
+               $mchan->send($_[2] . ":$_[4]") if $mchan;
+       }
+}
 
-               if ($pcno == 47) {              # incoming DB Update request
-                       last SWITCH;
-               }
+sub handle_46
+{              
+       my $self = shift;
 
-               if ($pcno == 48) {              # incoming DB Update request 
-                       last SWITCH;
-               }
-       }       
+       # incoming DB Complete
+       delstream($_[3]);
+}
+
+sub handle_47
+{
+}
+
+sub handle_48
+{
 }
 
 # send back a trache of data to the remote