Diff for /loncom/lond between versions 1.534 and 1.540

version 1.534, 2017/03/20 03:19:37 version 1.540, 2017/06/06 20:03:24
Line 229  my %trust = ( Line 229  my %trust = (
                dump => {remote => 1, enroll => 1, domroles => 1},                 dump => {remote => 1, enroll => 1, domroles => 1},
                edit => {institutiononly => 1},  #not used currently                 edit => {institutiononly => 1},  #not used currently
                eget => {remote => 1, domroles => 1, enroll => 1}, #not used currently                 eget => {remote => 1, domroles => 1, enroll => 1}, #not used currently
                  egetdom => {remote => 1, domroles => 1, enroll => 1, },
                ekey => {}, #not used currently                 ekey => {}, #not used currently
                exit => {anywhere => 1},                 exit => {anywhere => 1},
                fetchuserfile => {remote => 1, enroll => 1},                 fetchuserfile => {remote => 1, enroll => 1},
Line 265  my %trust = ( Line 266  my %trust = (
                putstore => {remote => 1, enroll => 1},                 putstore => {remote => 1, enroll => 1},
                queryreply => {anywhere => 1},                 queryreply => {anywhere => 1},
                querysend => {anywhere => 1},                 querysend => {anywhere => 1},
                  querysend_activitylog => {remote => 1},
                  querysend_allusers => {remote => 1, domroles => 1},
                  querysend_courselog => {remote => 1},
                  querysend_fetchenrollment => {remote => 1},
                  querysend_getinstuser => {remote => 1},
                  querysend_getmultinstusers => {remote => 1},
                  querysend_instdirsearch => {remote => 1, domroles => 1, coaurem => 1},
                  querysend_institutionalphotos => {remote => 1},
                  querysend_portfolio_metadata => {remote => 1, content => 1},
                  querysend_userlog => {remote => 1, domroles => 1},
                  querysend_usersearch => {remote => 1, enroll => 1, coaurem => 1},
                quit => {anywhere => 1},                 quit => {anywhere => 1},
                readlonnetglobal => {institutiononly => 1},                 readlonnetglobal => {institutiononly => 1},
                reinit => {manageronly => 1}, #not used currently                 reinit => {manageronly => 1}, #not used currently
Line 1594  sub du2_handler { Line 1606  sub du2_handler {
 #  #
 #    1. for a directory, and the path does not begin with one of:  #    1. for a directory, and the path does not begin with one of:
 #        (a) /home/httpd/html/res/<domain>  #        (a) /home/httpd/html/res/<domain>
 #        (b) /home/httpd/html/res/userfiles/  #        (b) /home/httpd/html/userfiles/
 #        (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles  #        (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles
 #    or is:  #    or is:
 #  #
 #    2. for a file, and the path (after prepending) does not begin with:  #    2. for a file, and the path (after prepending) does not begin with one of:
 #    /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/  #        (a) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/
   #        (b) /home/httpd/html/res/<domain>/<username>/
   #        (c) /home/httpd/html/userfiles/<domain>/<username>/
 #  #
 #    the response will be "refused".  #    the response will be "refused".
 #  #
Line 1630  sub ls_handler { Line 1644  sub ls_handler {
     }      }
     if (-e $ulsdir) {      if (-e $ulsdir) {
  if(-d $ulsdir) {   if(-d $ulsdir) {
             unless (($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) ||              unless (($ulsdir =~ m{^/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) ||
                     ($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/})) {                      ($ulsdir =~ m{^/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_name/userfiles})) {
                 &Failure($client,"refused\n",$userinput);                  &Failure($client,"refused\n",$userinput);
                 return 1;                  return 1;
             }              }
Line 1658  sub ls_handler { Line 1672  sub ls_handler {
  closedir(LSDIR);   closedir(LSDIR);
     }      }
  } else {   } else {
             unless ($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/}) {              unless (($ulsdir =~ m{^/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_name/}) ||
                       ($ulsdir =~ m{^/home/httpd/html/(?:res|userfiles)/$LONCAPA::match_domain/$LONCAPA::match_name/})) {
                 &Failure($client,"refused\n",$userinput);                  &Failure($client,"refused\n",$userinput);
                 return 1;                  return 1;
             }              }
Line 1691  sub ls_handler { Line 1706  sub ls_handler {
 #  #
 #    1. for a directory, and the path does not begin with one of:  #    1. for a directory, and the path does not begin with one of:
 #        (a) /home/httpd/html/res/<domain>  #        (a) /home/httpd/html/res/<domain>
 #        (b) /home/httpd/html/res/userfiles/  #        (b) /home/httpd/html/userfiles/
 #        (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles  #        (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles
 #    or is:  #    or is:
 #  #
 #    2. for a file, and the path (after prepending) does not begin with:  #    2. for a file, and the path (after prepending) does not begin with one of:
 #    /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/  #        (a) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/
   #        (b) /home/httpd/html/res/<domain>/<username>/
   #        (c) /home/httpd/html/userfiles/<domain>/<username>/
 #  #
 #    the response will be "refused".  #    the response will be "refused".
 #  #
Line 1726  sub ls2_handler { Line 1743  sub ls2_handler {
     }      }
     if (-e $ulsdir) {      if (-e $ulsdir) {
         if(-d $ulsdir) {          if(-d $ulsdir) {
             unless (($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) ||              unless (($ulsdir =~ m{^/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) ||
                     ($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/})) {                      ($ulsdir =~ m{^/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_name/userfiles})) {
                 &Failure($client,"refused\n","$userinput");                  &Failure($client,"refused\n","$userinput");
                 return 1;                  return 1;
             }              }
Line 1755  sub ls2_handler { Line 1772  sub ls2_handler {
                 closedir(LSDIR);                  closedir(LSDIR);
             }              }
         } else {          } else {
             unless ($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/}) {              unless (($ulsdir =~ m{^/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_name/}) ||
                       ($ulsdir =~ m{^/home/httpd/html/(?:res|userfiles)/$LONCAPA::match_domain/$LONCAPA::match_name/})) {
                 &Failure($client,"refused\n",$userinput);                  &Failure($client,"refused\n",$userinput);
                 return 1;                  return 1;
             }              }
Line 1780  sub ls2_handler { Line 1798  sub ls2_handler {
 #  #
 #    1. for a directory, and the path does not begin with one of:  #    1. for a directory, and the path does not begin with one of:
 #        (a) /home/httpd/html/res/<domain>  #        (a) /home/httpd/html/res/<domain>
 #        (b) /home/httpd/html/res/userfiles/  #        (b) /home/httpd/html/userfiles/
 #        (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles  #        (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles
 #        (d) /home/httpd/html/priv/<domain>/ and client is the homeserver  #        (d) /home/httpd/html/priv/<domain> and client is the homeserver
 #  #
 #    or is:  #    or is:
 #  #
 #    2. for a file, and the path (after prepending) does not begin with:  #    2. for a file, and the path (after prepending) does not begin with one of:
 #    /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/  #        (a) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/
   #        (b) /home/httpd/html/res/<domain>/<username>/
   #        (c) /home/httpd/html/userfiles/<domain>/<username>/
   #        (d) /home/httpd/html/priv/<domain>/<username>/ and client is the homeserver
 #  #
 #    the response will be "refused".  #    the response will be "refused".
 #  #
Line 1864  sub ls3_handler { Line 1885  sub ls3_handler {
     if (-e $ulsdir) {      if (-e $ulsdir) {
         if(-d $ulsdir) {          if(-d $ulsdir) {
             unless (($getpropath) || ($getuserdir) ||              unless (($getpropath) || ($getuserdir) ||
                     ($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) ||                      ($ulsdir =~ m{^/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) ||
                     ($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/}) ||                      ($ulsdir =~ m{^/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_name/userfiles}) ||
                     (($ulsdir =~ m{/home/httpd/html/priv/$LONCAPA::match_domain/}) && ($islocal))) {                      (($ulsdir =~ m{^/home/httpd/html/priv/$LONCAPA::match_domain}) && ($islocal))) {
                 &Failure($client,"refused\n",$userinput);                  &Failure($client,"refused\n",$userinput);
                 return 1;                  return 1;
             }              }
Line 1895  sub ls3_handler { Line 1916  sub ls3_handler {
             }              }
         } else {          } else {
             unless (($getpropath) || ($getuserdir) ||              unless (($getpropath) || ($getuserdir) ||
                     ($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/})) {                      ($ulsdir =~ m{^/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_name/}) ||
                       ($ulsdir =~ m{^/home/httpd/html/(?:res|userfiles)/$LONCAPA::match_domain/$LONCAPA::match_name/}) ||
                       (($ulsdir =~ m{^/home/httpd/html/priv/$LONCAPA::match_domain/$LONCAPA::match_name/}) && ($islocal))) {
                 &Failure($client,"refused\n",$userinput);                  &Failure($client,"refused\n",$userinput);
                 return 1;                  return 1;
             }              }
Line 2579  sub update_resource_handler { Line 2602  sub update_resource_handler {
  my $transname="$fname.in.transfer";   my $transname="$fname.in.transfer";
  my $remoteurl=&Apache::lonnet::reply("sub:$fname","$clientname");   my $remoteurl=&Apache::lonnet::reply("sub:$fname","$clientname");
  my $response;   my $response;
 # FIXME: cannot replicate files that take more than two minutes to transfer?  # FIXME: cannot replicate files that take more than two minutes to transfer -- needs checking now 1200s timeout used
 # alarm(120);  # for LWP request.
 # FIXME: this should use the LWP mechanism, not internal alarms.   my $request=new HTTP::Request('GET',"$remoteurl");
                 alarm(1200);                  $response=&LONCAPA::LWPReq::makerequest($clientname,$request,$transname,\%perlvar,1200,0,1);
  {  
     my $request=new HTTP::Request('GET',"$remoteurl");  
                     $response=&LONCAPA::LWPReq::makerequest($clientname,$request,$transname,\%perlvar,1200,0,1);  
  }  
  alarm(0);  
  if ($response->is_error()) {   if ($response->is_error()) {
 # FIXME: we should probably clean up here instead of just whine  # FIXME: we should probably clean up here instead of just whine
     unlink($transname);      unlink($transname);
Line 2595  sub update_resource_handler { Line 2613  sub update_resource_handler {
     &logthis("LWP GET: $message for $fname ($remoteurl)");      &logthis("LWP GET: $message for $fname ($remoteurl)");
  } else {   } else {
     if ($remoteurl!~/\.meta$/) {      if ($remoteurl!~/\.meta$/) {
 # FIXME: isn't there an internal LWP mechanism for this?   my $mrequest=new HTTP::Request('GET',$remoteurl.'.meta');
  alarm(120);                          my $mresponse = &LONCAPA::LWPReq::makerequest($clientname,$mrequest,$fname.'.meta',\%perlvar,120,0,1);
  {   if ($mresponse->is_error()) {
     my $mrequest=new HTTP::Request('GET',$remoteurl.'.meta');      unlink($fname.'.meta');
                             my $mresponse = &LONCAPA::LWPReq::makerequest($clientname,$mrequest,$fname.'.meta',\%perlvar,120,0,1);  
     if ($mresponse->is_error()) {  
  unlink($fname.'.meta');  
     }  
  }   }
  alarm(0);  
     }      }
                     # we successfully transfered, copy file over to real name                      # we successfully transfered, copy file over to real name
     rename($transname,$fname);      rename($transname,$fname);
Line 2674  sub fetch_user_file_handler { Line 2687  sub fetch_user_file_handler {
  my $remoteurl=$clientprotocol.'://'.$clienthost.'/userfiles/'.$fname;   my $remoteurl=$clientprotocol.'://'.$clienthost.'/userfiles/'.$fname;
  my $response;   my $response;
  Debug("Remote URL : $remoteurl Transfername $transname Destname: $destname");   Debug("Remote URL : $remoteurl Transfername $transname Destname: $destname");
  alarm(1200);   my $request=new HTTP::Request('GET',"$remoteurl");
  {          my $verifycert = 1;
     my $request=new HTTP::Request('GET',"$remoteurl");          my @machine_ids = &Apache::lonnet::current_machine_ids();
             my $verifycert = 1;          if (grep(/^\Q$clientname\E$/,@machine_ids)) {
             my @machine_ids = &Apache::lonnet::current_machine_ids();              $verifycert = 0;
             if (grep(/^\Q$clientname\E$/,@machine_ids)) {          }
                 $verifycert = 0;          $response = &LONCAPA::LWPReq::makerequest($clientname,$request,$transname,\%perlvar,1200,$verifycert);
             }  
             $response = &LONCAPA::LWPReq::makerequest($clientname,$request,$transname,\%perlvar,1200,$verifycert);  
  }  
  alarm(0);  
  if ($response->is_error()) {   if ($response->is_error()) {
     unlink($transname);      unlink($transname);
     my $message=$response->status_line;      my $message=$response->status_line;
Line 3382  sub get_profile_entry { Line 3391  sub get_profile_entry {
 #  #
 #  Parameters:  #  Parameters:
 #     $cmd               - Command keyword of request (eget).  #     $cmd               - Command keyword of request (eget).
 #     $tail              - Tail of the command.  See GetProfileEntry #                          for more information about this.  #     $tail              - Tail of the command.  See GetProfileEntry
   #                          for more information about this.
 #     $client            - File open on the client.  #     $client            - File open on the client.
 #  Returns:  #  Returns:
 #     1      - Continue processing  #     1      - Continue processing
Line 3954  sub retrieve_chat_handler { Line 3964  sub retrieve_chat_handler {
 #  serviced.  #  serviced.
 #  #
 #  Parameters:  #  Parameters:
 #     $cmd       - COmmand keyword that initiated the request.  #     $cmd       - Command keyword that initiated the request.
 #     $tail      - Remainder of the command after the keyword.  #     $tail      - Remainder of the command after the keyword.
 #                  For this function, this consists of a query and  #                  For this function, this consists of a query and
 #                  3 arguments that are self-documentingly labelled  #                  3 arguments that are self-documentingly labelled
Line 3968  sub retrieve_chat_handler { Line 3978  sub retrieve_chat_handler {
 sub send_query_handler {  sub send_query_handler {
     my ($cmd, $tail, $client) = @_;      my ($cmd, $tail, $client) = @_;
   
   
     my $userinput = "$cmd:$tail";      my $userinput = "$cmd:$tail";
   
     my ($query,$arg1,$arg2,$arg3)=split(/\:/,$tail);      my ($query,$arg1,$arg2,$arg3)=split(/\:/,$tail);
Line 4866  sub get_domain_handler { Line 4875  sub get_domain_handler {
     my ($cmd, $tail, $client) = @_;      my ($cmd, $tail, $client) = @_;
   
   
     my $userinput = "$client:$tail";      my $userinput = "$cmd:$tail";
   
       my ($udom,$namespace,$what)=split(/:/,$tail,3);
       chomp($what);
       if ($namespace =~ /^enc/) {
           &Failure( $client, "refused\n", $userinput);
       } else {
           my @queries=split(/\&/,$what);
           my $qresult='';
           my $hashref = &tie_domain_hash($udom, "$namespace", &GDBM_READER());
           if ($hashref) {
               for (my $i=0;$i<=$#queries;$i++) {
                   $qresult.="$hashref->{$queries[$i]}&";
               }
               if (&untie_domain_hash($hashref)) {
                   $qresult=~s/\&$//;
                   &Reply($client, \$qresult, $userinput);
               } else {
                   &Failure( $client, "error: ".($!+0)." untie(GDBM) Failed ".
                             "while attempting getdom\n",$userinput);
               }
           } else {
               &Failure($client, "error: ".($!+0)." tie(GDBM) Failed ".
                        "while attempting getdom\n",$userinput);
           }
       }
   
       return 1;
   }
   &register_handler("getdom", \&get_domain_handler, 0, 1, 0);
   
   sub encrypted_get_domain_handler {
       my ($cmd, $tail, $client) = @_;
   
       my $userinput = "$cmd:$tail";
   
     my ($udom,$namespace,$what)=split(/:/,$tail,3);      my ($udom,$namespace,$what)=split(/:/,$tail,3);
     chomp($what);      chomp($what);
Line 4879  sub get_domain_handler { Line 4922  sub get_domain_handler {
         }          }
         if (&untie_domain_hash($hashref)) {          if (&untie_domain_hash($hashref)) {
             $qresult=~s/\&$//;              $qresult=~s/\&$//;
             &Reply($client, \$qresult, $userinput);              if ($cipher) {
                   my $cmdlength=length($qresult);
                   $qresult.="         ";
                   my $encqresult='';
                   for (my $encidx=0;$encidx<=$cmdlength;$encidx+=8) {
                       $encqresult.= unpack("H16",
                                            $cipher->encrypt(substr($qresult,
                                                                    $encidx,
                                                                    8)));
                   }
                   &Reply( $client, "enc:$cmdlength:$encqresult\n", $userinput);
               } else {
                   &Failure( $client, "error:no_key\n", $userinput);
               }
         } else {          } else {
             &Failure( $client, "error: ".($!+0)." untie(GDBM) Failed ".              &Failure( $client, "error: ".($!+0)." untie(GDBM) Failed ".
                       "while attempting getdom\n",$userinput);                        "while attempting egetdom\n",$userinput);
         }          }
     } else {      } else {
         &Failure($client, "error: ".($!+0)." tie(GDBM) Failed ".          &Failure($client, "error: ".($!+0)." tie(GDBM) Failed ".
                  "while attempting getdom\n",$userinput);                   "while attempting egetdom\n",$userinput);
     }      }
   
     return 1;      return 1;
 }  }
 &register_handler("getdom", \&get_domain_handler, 0, 1, 0);  &register_handler("egetdom", \&encrypted_get_domain_handler, 1, 1, 0);
   
 #  #
 #  Puts an id to a domains id database.   #  Puts an id to a domains id database. 
Line 5791  sub auto_export_grades_handler { Line 5846  sub auto_export_grades_handler {
     return 1;      return 1;
 }  }
 &register_handler("autoexportgrades", \&auto_export_grades_handler,  &register_handler("autoexportgrades", \&auto_export_grades_handler,
                   0, 1, 0);                    1, 1, 0);
   
 #   Retrieve and remove temporary files created by/during autoenrollment.  #   Retrieve and remove temporary files created by/during autoenrollment.
 #  #
Line 6542  sub process_request { Line 6597  sub process_request {
     $ok = 0;      $ok = 0;
  }   }
         if ($ok) {          if ($ok) {
               my $realcommand = $command;
               if ($command eq 'querysend') {
                   my ($query,$rest)=split(/\:/,$tail,2);
                   $query=~s/\n*$//g;
                   my @possqueries = 
                       qw(userlog courselog fetchenrollment institutionalphotos usersearch instdirsearch getinstuser getmultinstusers);
                   if (grep(/^\Q$query\E$/,@possqueries)) {
                       $command .= '_'.$query;
                   } elsif ($query eq 'prepare activity log') {
                       $command .= '_activitylog';
                   }
               }
             if (ref($trust{$command}) eq 'HASH') {              if (ref($trust{$command}) eq 'HASH') {
                 my $donechecks;                  my $donechecks;
                 if ($trust{$command}{'anywhere'}) {                  if ($trust{$command}{'anywhere'}) {
Line 6583  sub process_request { Line 6650  sub process_request {
                     }                      }
                 }                  }
             }              }
               $command = $realcommand;
         }          }
   
  if($ok) {   if($ok) {
Line 8671  IO::File Line 8739  IO::File
 Apache::File  Apache::File
 POSIX  POSIX
 Crypt::IDEA  Crypt::IDEA
 LWP::UserAgent()  
 GDBM_File  GDBM_File
 Authen::Krb4  Authen::Krb4
 Authen::Krb5  Authen::Krb5

Removed from v.1.534  
changed lines
  Added in v.1.540


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