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

version 1.7, 1999/12/22 17:18:04 version 1.11, 2000/02/29 16:24:00
Line 2 Line 2
 # TCP networking package  # TCP networking package
 # 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 Gerd Kortemeyer  # 11/8,11/16,11/18,11/22,11/23,12/22,
   # 01/06,01/13,02/24,02/28,02/29 Gerd Kortemeyer
   
 package Apache::lonnet;  package Apache::lonnet;
   
 use strict;  use strict;
 use Apache::File;  use Apache::File;
 use vars qw(%perlvar %hostname %homecache %spareid %hostdom %libserv $readit);  use LWP::UserAgent();
   use vars 
   qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp $readit);
 use IO::Socket;  use IO::Socket;
   use Apache::Constants qw(:common :http);
   
 # --------------------------------------------------------------------- Logging  # --------------------------------------------------------------------- Logging
   
Line 43  sub subreply { Line 47  sub subreply {
        or return "con_lost";         or return "con_lost";
     print $client "$cmd\n";      print $client "$cmd\n";
     my $answer=<$client>;      my $answer=<$client>;
     chomp($answer);  
     if (!$answer) { $answer="con_lost"; }      if (!$answer) { $answer="con_lost"; }
       chomp($answer);
     return $answer;      return $answer;
 }  }
   
Line 141  sub appenv { Line 145  sub appenv {
     }      }
     for (my $i=0; $i<=$#oldenv; $i++) {      for (my $i=0; $i<=$#oldenv; $i++) {
         chomp($oldenv[$i]);          chomp($oldenv[$i]);
         my ($name,$value)=split(/=/,$oldenv[$i]);          if ($oldenv[$i] ne '') {
  $newenv{$name}=$value;             my ($name,$value)=split(/=/,$oldenv[$i]);
      $newenv{$name}=$value;
           }
     }      }
     {      {
      my $fh;       my $fh;
Line 158  sub appenv { Line 164  sub appenv {
 }  }
   
 # ------------------------------ Find server with least workload from spare.tab  # ------------------------------ Find server with least workload from spare.tab
   
 sub spareserver {  sub spareserver {
     my $tryserver;      my $tryserver;
     my $spareserver='';      my $spareserver='';
Line 173  sub spareserver { Line 180  sub spareserver {
 }  }
   
 # --------- Try to authenticate user from domain's lib servers (first this one)  # --------- Try to authenticate user from domain's lib servers (first this one)
   
 sub authenticate {  sub authenticate {
     my ($uname,$upass,$udom)=@_;      my ($uname,$upass,$udom)=@_;
   
Line 180  sub authenticate { Line 188  sub authenticate {
         ($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'});
         if ($answer =~ /authorized/) {          if ($answer =~ /authorized/) {
               if ($answer eq 'authorized') { return $perlvar{'lonHostID'}; }                if ($answer eq 'authorized') {
               if ($answer eq 'non_authorized') { return 'no_host'; }                   &logthis("User $uname at $udom authorized by local server"); 
                    return $perlvar{'lonHostID'}; 
                 }
                 if ($answer eq 'non_authorized') {
                    &logthis("User $uname at $udom rejected by local server"); 
                    return 'no_host'; 
                 }
  }   }
     }      }
   
     my $tryserver;      my $tryserver;
     foreach $tryserver (keys %libserv) {      foreach $tryserver (keys %libserv) {
  if ($hostdom{$tryserver} eq $udom) {   if ($hostdom{$tryserver} eq $udom) {
            my $answer=reply("enc:auth:$udom:$uname:$upass",$tryserver);             my $answer=reply("encrypt:auth:$udom:$uname:$upass",$tryserver);
            if ($answer =~ /authorized/) {             if ($answer =~ /authorized/) {
               if ($answer eq 'authorized') { return $tryserver; }                 if ($answer eq 'authorized') {
                    &logthis("User $uname at $udom authorized by $tryserver"); 
                    return $tryserver; 
                 }
                 if ($answer eq 'non_authorized') {
                    &logthis("User $uname at $udom rejected by $tryserver");
                    return 'no_host';
                 } 
    }     }
        }         }
     }          }
       &logthis("User $uname at $udom could not be authenticated");    
     return 'no_host';      return 'no_host';
 }  }
   
 # ---------------------- Find the homebase for a user from domain's lib servers  # ---------------------- Find the homebase for a user from domain's lib servers
   
 sub homeserver {  sub homeserver {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
   
Line 218  sub homeserver { Line 241  sub homeserver {
 }  }
   
 # ----------------------------- Subscribe to a resource, return URL if possible  # ----------------------------- Subscribe to a resource, return URL if possible
   
 sub subscribe {  sub subscribe {
     my $fname=shift;      my $fname=shift;
     &logthis($fname);  
     my $author=$fname;      my $author=$fname;
     $author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/;      $author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/;
     my ($udom,$uname)=split(/\//,$author);      my ($udom,$uname)=split(/\//,$author);
     my $home=homeserver($uname,$udom);      my $home=homeserver($uname,$udom);
     &logthis("$home $udom $uname");  
     if (($home eq 'no_host') || ($home eq $perlvar{'lonHostID'})) {       if (($home eq 'no_host') || ($home eq $perlvar{'lonHostID'})) { 
         return 'not_found';           return 'not_found'; 
     }      }
Line 233  sub subscribe { Line 255  sub subscribe {
     return $answer;      return $answer;
 }  }
           
   # -------------------------------------------------------------- Replicate file
   
   sub repcopy {
       my $filename=shift;
       my $transname="$filename.in.transfer";
       my $remoteurl=subscribe($filename);
       if ($remoteurl eq 'con_lost') {
      &logthis("Subscribe returned con_lost: $filename");
              return HTTP_SERVICE_UNAVAILABLE;
       } elsif ($remoteurl eq 'not_found') {
      &logthis("Subscribe returned not_found: $filename");
      return HTTP_NOT_FOUND;
       } elsif ($remoteurl eq 'forbidden') {
      &logthis("Subscribe returned forbidden: $filename");
              return FORBIDDEN;
       } else {
              my @parts=split(/\//,$filename);
              my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]";
              if ($path ne "$perlvar{'lonDocRoot'}/res") {
                  &logthis("Malconfiguration for replication: $filename");
          return HTTP_BAD_REQUEST;
              }
              my $count;
              for ($count=5;$count<$#parts;$count++) {
                  $path.="/$parts[$count]";
                  if ((-e $path)!=1) {
      mkdir($path,0777);
                  }
              }
              my $ua=new LWP::UserAgent;
              my $request=new HTTP::Request('GET',"$remoteurl");
              my $response=$ua->request($request,$transname);
              if ($response->is_error()) {
          unlink($transname);
                  my $message=$response->status_line;
                  &logthis("LWP GET: $message: $filename");
                  return HTTP_SERVICE_UNAVAILABLE;
              } else {
                  rename($transname,$filename);
                  return OK;
              }
       }
   }
   
   # ----------------------------------------------------------------------- Store
   
   sub store {
       my %storehash=shift;
       my $command="store:$ENV{'user.domain'}:$ENV{'user.name'}:"
                  ."$ENV{'user.class'}:$ENV{'request.filename'}:";
   }
   
   # --------------------------------------------------------------------- Restore
   
   sub restore {
       my $command="restore:$ENV{'user.domain'}:$ENV{'user.name'}:"
                  ."$ENV{'user.class'}:$ENV{'request.filename'}:";
   }
   
   # -------------------------------------------------------- Get user priviledges
   
   sub rolesinit {
       my ($domain,$username,$authhost)=@_;
       my $rolesdump=reply("dump:$domain:$username:roles",$authhost);
       my %allroles=();
       my %thesepriv=();
       my $userroles='';
       my $now=time;
       my $thesestr;
   
       &logthis("$domain, $username, $authhost, $rolesdump");
   
       if ($rolesdump ne '') {
           map {
               my ($area,$role)=split(/=/,$_);
               my ($trole,$tend,$tstart)=split(/_/,$role);
               if ($tend!=0) {
           if ($tend<$now) {
               $trole='';
                   } 
               }
               if ($tstart!=0) {
                   if ($tstart>$now) {
                      $trole='';        
                   }
               }
               if (($area ne '') && ($trole ne '')) {
                   $userroles.='user.role.'.$trole.'='.$area."\n";
                   my ($tdummy,$tdomain,$trest)=split(/\//,$area);
           $allroles{'/'}.=':'.$pr{$trole.':s'};
                   if ($tdomain ne '') {
                      $allroles{'/'.$tdomain.'/'}.=':'.$pr{$trole.':d'};
                      if ($trest ne '') {
          $allroles{$area}.=':'.$pr{$trole.':c'};
                      }
          }
               } 
           } split(/&/,$rolesdump);
           map {
               %thesepriv=();
               map {
                   if ($_ ne '') {
       my ($priviledge,$restrictions)=split(/&/,$_);
                       if ($restrictions eq '') {
    $thesepriv{$priviledge}='F';
                       } else {
                           if ($thesepriv{$priviledge} ne 'F') {
       $thesepriv{$priviledge}.=$restrictions;
                           }
                       }
                   }
               } split(/:/,$allroles{$_});
               $thesestr='';
               map { $thesestr.=':'.$_.'&'.$thesepriv{$_}; } keys %thesepriv;
               $userroles.='user.priv.'.$_.'='.$thesestr."\n";
           } keys %allroles;            
       }
       return $userroles;  
   }
   
   
 # ================================================================ Main Program  # ================================================================ Main Program
   
Line 245  if ($readit ne 'done') { Line 387  if ($readit ne 'done') {
     while (my $configline=<$config>) {      while (my $configline=<$config>) {
         if ($configline =~ /PerlSetVar/) {          if ($configline =~ /PerlSetVar/) {
    my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);     my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
              chomp($varvalue);
            $perlvar{$varname}=$varvalue;             $perlvar{$varname}=$varvalue;
         }          }
     }      }
Line 273  if ($readit ne 'done') { Line 416  if ($readit ne 'done') {
        }         }
     }      }
 }  }
   # ------------------------------------------------------------ Read permissions
   {
       my $config=Apache::File->new("$perlvar{'lonTabDir'}/roles.tab");
   
       while (my $configline=<$config>) {
          chomp($configline);
          my ($role,$perm)=split(/ /,$configline);
          if ($perm ne '') { $pr{$role}=$perm; }
       }
   }
   
   # -------------------------------------------- Read plain texts for permissions
   {
       my $config=Apache::File->new("$perlvar{'lonTabDir'}/rolesplain.tab");
   
       while (my $configline=<$config>) {
          chomp($configline);
          my ($short,$plain)=split(/:/,$configline);
          if ($plain ne '') { $prp{$short}=$plain; }
       }
   }
   
 $readit='done';  $readit='done';
 &logthis('Read configuration');  &logthis('Read configuration');
 }  }
Line 281  $readit='done'; Line 446  $readit='done';
   
   
   
   

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


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