Diff for /loncom/lonnet/perl/lonnet.pm between versions 1.11 and 1.12

version 1.11, 2000/02/29 16:24:00 version 1.12, 2000/05/01 20:19:38
Line 1 Line 1
 # The LearningOnline Network  # The LearningOnline Network
 # TCP networking package  # TCP networking package
   #
   # Functions for use by content handlers:
   #
   # plaintext(short)   : plain text explanation of short term
   # allowed(short,url) : returns codes for allowed actions
   # appendenv(hash)    : adds hash to session environment
   # store(hash)        : stores hash permanently for this url
   # restore            : returns hash for this url
   # eget(namesp,array) : returns hash with keys from array filled in from namesp
   # get(namesp,array)  : returns hash with keys from array filled in from namesp
   # put(namesp,hash)   : stores hash in namesp
   #
 # 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30,  # 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30,
 # 7/1,7/2,7/9,7/10,7/12,7/14,7/15,7/19,  # 7/1,7/2,7/9,7/10,7/12,7/14,7/15,7/19,
 # 11/8,11/16,11/18,11/22,11/23,12/22,  # 11/8,11/16,11/18,11/22,11/23,12/22,
 # 01/06,01/13,02/24,02/28,02/29 Gerd Kortemeyer  # 01/06,01/13,02/24,02/28,02/29,
   # 03/01,03/02,03/06,03/07,03/13,
   # 04/05 Gerd Kortemeyer
   
 package Apache::lonnet;  package Apache::lonnet;
   
Line 56  sub reply { Line 70  sub reply {
     my ($cmd,$server)=@_;      my ($cmd,$server)=@_;
     my $answer=subreply($cmd,$server);      my $answer=subreply($cmd,$server);
     if ($answer eq 'con_lost') { $answer=subreply($cmd,$server); }      if ($answer eq 'con_lost') { $answer=subreply($cmd,$server); }
       if (($answer=~/^error:/) || ($answer=~/^refused/) || 
           ($answer=~/^rejected/)) {
          &logthis("<font color=blue>WARNING:".
                   " $cmd to $server returned $answer</font>");
       }
     return $answer;      return $answer;
 }  }
   
Line 76  sub reconlonc { Line 95  sub reconlonc {
             &logthis("$peerfile still not there, give it another try");              &logthis("$peerfile still not there, give it another try");
             sleep 5;              sleep 5;
             if (-e "$peerfile") { return; }              if (-e "$peerfile") { return; }
             &logthis("$peerfile still not there, giving up");              &logthis(
     "<font color=blue>WARNING: $peerfile still not there, giving up</font>");
         } else {          } else {
     &logthis("lonc at pid $loncpid not responding, giving up");      &logthis(
                  "<font color=blue>WARNING:".
                  " lonc at pid $loncpid not responding, giving up</font>");
         }          }
     } else {      } else {
         &logthis('lonc not running, giving up');       &logthis('<font color=blue>WARNING: lonc not running, giving up</font>');
     }      }
 }  }
   
 # ------------------------------------------------------ Critical communication  # ------------------------------------------------------ Critical communication
   
 sub critical {  sub critical {
     my ($cmd,$server)=@_;      my ($cmd,$server)=@_;
     my $answer=reply($cmd,$server);      my $answer=reply($cmd,$server);
Line 118  sub critical { Line 141  sub critical {
             }              }
             chomp($wcmd);              chomp($wcmd);
             if ($wcmd eq $cmd) {              if ($wcmd eq $cmd) {
  &logthis("Connection buffer $dfilename: $cmd");   &logthis("<font color=blue>WARNING: ".
                            "Connection buffer $dfilename: $cmd</font>");
                 &logperm("D:$server:$cmd");                  &logperm("D:$server:$cmd");
         return 'con_delayed';          return 'con_delayed';
             } else {              } else {
                 &logthis("CRITICAL CONNECTION FAILED: $server $cmd");                  &logthis("<font color=red>CRITICAL:"
                           ." Critical connection failed: $server $cmd</font>");
                 &logperm("F:$server:$cmd");                  &logperm("F:$server:$cmd");
                 return 'con_failed';                  return 'con_failed';
             }              }
Line 183  sub spareserver { Line 208  sub spareserver {
   
 sub authenticate {  sub authenticate {
     my ($uname,$upass,$udom)=@_;      my ($uname,$upass,$udom)=@_;
       $upass=escape($upass);
     if (($perlvar{'lonRole'} eq 'library') &&       if (($perlvar{'lonRole'} eq 'library') && 
         ($udom eq $perlvar{'lonDefDomain'})) {          ($udom eq $perlvar{'lonDefDomain'})) {
     my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'});      my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'});
Line 290  sub repcopy { Line 315  sub repcopy {
            if ($response->is_error()) {             if ($response->is_error()) {
        unlink($transname);         unlink($transname);
                my $message=$response->status_line;                 my $message=$response->status_line;
                &logthis("LWP GET: $message: $filename");                 &logthis("<font color=blue>WARNING:"
                          ." LWP get: $message: $filename</font>");
                return HTTP_SERVICE_UNAVAILABLE;                 return HTTP_SERVICE_UNAVAILABLE;
            } else {             } else {
                rename($transname,$filename);                 rename($transname,$filename);
Line 303  sub repcopy { Line 329  sub repcopy {
   
 sub store {  sub store {
     my %storehash=shift;      my %storehash=shift;
     my $command="store:$ENV{'user.domain'}:$ENV{'user.name'}:"      my $command=;
                ."$ENV{'user.class'}:$ENV{'request.filename'}:";      my $namevalue='';
       map {
           $namevalue.=escape($_).'='.escape($storehash{$_}).'&';
       } keys %storehash;
       $namevalue=~s/\&$//;
       return reply("store:$ENV{'user.domain'}:$ENV{'user.name'}:"
                  ."$ENV{'user.class'}:$ENV{'request.filename'}:$namevalue",
    "$ENV{'user.home'}");
 }  }
   
 # --------------------------------------------------------------------- Restore  # --------------------------------------------------------------------- Restore
   
 sub restore {  sub restore {
     my $command="restore:$ENV{'user.domain'}:$ENV{'user.name'}:"      my $answer=reply("restore:$ENV{'user.domain'}:$ENV{'user.name'}:"
                ."$ENV{'user.class'}:$ENV{'request.filename'}:";                 ."$ENV{'user.class'}:$ENV{'request.filename'}",
                   "$ENV{'user.home'}");
       my %returnhash=();
       map {
    my ($name,$value)=split(/\=/,$_);
           $returnhash{&unescape($name)}=&unescape($value);
       } split(/\&/,$answer);
       return $returnhash;
 }  }
   
 # -------------------------------------------------------- Get user priviledges  # -------------------------------------------------------- Get user priviledges
Line 319  sub restore { Line 359  sub restore {
 sub rolesinit {  sub rolesinit {
     my ($domain,$username,$authhost)=@_;      my ($domain,$username,$authhost)=@_;
     my $rolesdump=reply("dump:$domain:$username:roles",$authhost);      my $rolesdump=reply("dump:$domain:$username:roles",$authhost);
       if (($rolesdump eq 'con_lost') || ($rolesdump eq '')) { return ''; }
     my %allroles=();      my %allroles=();
     my %thesepriv=();      my %thesepriv=();
     my $userroles='';      my $userroles='';
     my $now=time;      my $now=time;
     my $thesestr;      my $thesestr;
   
     &logthis("$domain, $username, $authhost, $rolesdump");  
   
     if ($rolesdump ne '') {      if ($rolesdump ne '') {
         map {          map {
     if ($_!~/rolesdef\&/) {
             my ($area,$role)=split(/=/,$_);              my ($area,$role)=split(/=/,$_);
             my ($trole,$tend,$tstart)=split(/_/,$role);              my ($trole,$tend,$tstart)=split(/_/,$role);
             if ($tend!=0) {              if ($tend!=0) {
Line 342  sub rolesinit { Line 382  sub rolesinit {
                 }                  }
             }              }
             if (($area ne '') && ($trole ne '')) {              if (($area ne '') && ($trole ne '')) {
                 $userroles.='user.role.'.$trole.'='.$area."\n";                 $userroles.='user.role.'.$trole.'.'.$area.'='.
                 my ($tdummy,$tdomain,$trest)=split(/\//,$area);                             $tstart.'.'.$tend."\n";
         $allroles{'/'}.=':'.$pr{$trole.':s'};                 my ($tdummy,$tdomain,$trest)=split(/\//,$area);
                 if ($tdomain ne '') {                 if ($trole =~ /^cr\//) {
                    $allroles{'/'.$tdomain.'/'}.=':'.$pr{$trole.':d'};     my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$trole);
                    if ($trest ne '') {                     my $homsvr=homeserver($rauthor,$rdomain);
        $allroles{$area}.=':'.$pr{$trole.':c'};                     if ($hostname{$homsvr} ne '') {
                         my $roledef=
     reply("get:$rdomain:$rauthor:roles:rolesdef&$rrole",
                                   $homsvr);
                         if (($roledef ne 'con_lost') && ($roledef ne '')) {
                            my ($syspriv,$dompriv,$coursepriv)=
        split(/&&/,$roledef);
                     $allroles{'/'}.=':'.$syspriv;
                            if ($tdomain ne '') {
                                $allroles{'/'.$tdomain.'/'}.=':'.$dompriv;
                                if ($trest ne '') {
                   $allroles{$area}.=':'.$coursepriv;
                                }
                    }
                         }
                    }                     }
                  } else {
              $allroles{'/'}.=':'.$pr{$trole.':s'};
                      if ($tdomain ne '') {
                         $allroles{'/'.$tdomain.'/'}.=':'.$pr{$trole.':d'};
                         if ($trest ne '') {
             $allroles{$area}.=':'.$pr{$trole.':c'};
                         }
              }
        }         }
             }               }
             } 
         } split(/&/,$rolesdump);          } split(/&/,$rolesdump);
         map {          map {
             %thesepriv=();              %thesepriv=();
Line 375  sub rolesinit { Line 438  sub rolesinit {
     return $userroles;        return $userroles;  
 }  }
   
   # --------------------------------------------------------------- get interface
   
   sub get {
      my ($namespace,@storearr)=@_;
      my $items='';
      map {
          $items.=escape($_).'&';
      } @storearr;
      $items=~s/\&$//;
    my $rep=reply("get:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items",
                    $ENV{'user.home'});
      my @pairs=split(/\&/,$rep);
      my %returnhash=();
      map {
         my ($key,$value)=split(/=/,$_);
         $returnhash{unespace($key)}=unescape($value);
      } @pairs;
      return %returnhash;
   }
   
   # --------------------------------------------------------------- put interface
   
   sub put {
      my ($namespace,%storehash)=@_;
      my $items='';
      map {
          $items.=escape($_).'='.escape($storehash{$_}).'&';
      } keys %storehash;
      $items=~s/\&$//;
      return reply("put:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items",
                    $ENV{'user.home'});
   }
   
   # -------------------------------------------------------------- eget interface
   
   sub eget {
      my ($namespace,@storearr)=@_;
      my $items='';
      map {
          $items.=escape($_).'&';
      } @storearr;
      $items=~s/\&$//;
    my $rep=reply("eget:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items",
                    $ENV{'user.home'});
      my @pairs=split(/\&/,$rep);
      my %returnhash=();
      map {
         my ($key,$value)=split(/=/,$_);
         $returnhash{unespace($key)}=unescape($value);
      } @pairs;
      return %returnhash;
   }
   
   # ------------------------------------------------- Check for a user priviledge
   
   sub allowed {
       my ($priv,$uri)=@_;
       $uri=~s/^\/res//;
       $uri=~s/^\///;
       my $thisallowed='';
       if ($ENV{'user.priv./'}=~/$priv\&([^\:]*)/) {
          $thisallowed.=$1;
       }
       if ($ENV{'user.priv./'.(split(/\//,$uri))[0].'/'}=~/$priv\&([^\:]*)/) {
          $thisallowed.=$1;
       }
       if ($ENV{'user.priv./'.$uri}=~/$priv\&([^\:]*)/) {
          $thisallowed.=$1;
       }
       return $thisallowed;
   }
   
   # ----------------------------------------------------------------- Define Role
   
   sub definerole {
     if (allowed('mcr','/')) {
       my ($rolename,$sysrole,$domrole,$courole)=@_;
       my $command="encrypt:rolesput:$ENV{'user.domain'}:$ENV{'user.name'}:".
                   "$ENV{'user.domain'}:$ENV{'user.name'}:".
           "rolesdef&$rolename=$sysrole&&$domrole&&$courole";
       return reply($command,$ENV{'user.home'});
     } else {
       return 'refused';
     }
   }
   
   # ------------------------------------------------------------------ Plain Text
   
   sub plaintext {
       return $prp{$_};
   }
   
   # ----------------------------------------------------------------- Assign Role
   
   sub assignrole {
   }
   
   # -------------------------------------------------------- Escape Special Chars
   
   sub escape {
       my $str=shift;
       $str =~ s/(\W)/"%".unpack('H2',$1)/eg;
       return $str;
   }
   
   # ----------------------------------------------------- Un-Escape Special Chars
   
   sub unescape {
       my $str=shift;
       $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
       return $str;
   }
   
 # ================================================================ Main Program  # ================================================================ Main Program
   
Line 439  if ($readit ne 'done') { Line 614  if ($readit ne 'done') {
 }  }
   
 $readit='done';  $readit='done';
 &logthis('Read configuration');  &logthis('<font color=yellow>INFO: Read configuration</font>');
 }  }
 }  }
 1;  1;

Removed from v.1.11  
changed lines
  Added in v.1.12


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>