Diff for /loncom/homework/daxesave.pm between versions 1.3 and 1.7

version 1.3, 2016/02/17 00:05:14 version 1.7, 2023/08/28 18:58:44
Line 28 Line 28
 ###  ###
   
 package Apache::daxesave;  package Apache::daxesave;
   use strict;
   
 use Apache::Constants;  use Apache::Constants qw(:common);
 use Apache::lonnet;  use Apache::lonnet;
 use Try::Tiny;  use Try::Tiny;
 use File::Copy;  use File::Copy;
Line 44  sub handler { Line 45  sub handler {
     $request->content_type('text/plain');      $request->content_type('text/plain');
           
     # path should be in the form "/daxeopen/priv/..."      # path should be in the form "/daxeopen/priv/..."
     # or ^/daxeopen/uploaded/[^/]+/[^/]+/supplemental/.*html?$      # or "/daxeopen/uploaded/$cdom/$cnum/(docs|supplemental)/(default|\d+)/\d+/"
     my $path = $env{'form.path'};      my $path = $env{'form.path'};
     $path =~ s/^\/daxeopen//;      $path =~ s/^\/daxeopen//;
           
     my $allowed = 0;      my $allowed = 0;
     if ($path =~ /^\/priv/) {      my ($cdom,$cnum);
       if ($path =~ m{^/priv/}) {
         my ($ownername,$ownerdom,$ownerhome) =           my ($ownername,$ownerdom,$ownerhome) = 
             &Apache::lonnet::constructaccess($path, 'setpriv');              &Apache::lonnet::constructaccess($path);
         if (($ownername ne '') && ($ownerdom ne '') && ($ownerhome ne '')) {          if (($ownername ne '') && ($ownerdom ne '') && ($ownerhome ne '')) {
             unless ($ownerhome eq 'no_host') {              unless ($ownerhome eq 'no_host') {
                 my @hosts = &Apache::lonnet::current_machine_ids();                  my @hosts = &Apache::lonnet::current_machine_ids();
Line 60  sub handler { Line 62  sub handler {
                 }                  }
             }              }
         }          }
     } elsif ($path =~ m|^/uploaded/[^/]+/[^/]+/supplemental/|) {      } elsif ($path =~ m|^/uploaded/|) {
         if ($env{'user.name'} ne '' && $env{'user.domain'} ne '' && $env{'request.course.id'}) {          if ($env{'user.name'} ne '' && $env{'user.domain'} ne '' && $env{'request.course.id'}) {
             $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};              $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
             $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};              $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
             if ($path =~ m|^/uploaded/\Q$cdom\E/\Q$cnum\E/supplemental/| && $path !~ /\.\./) {              if ($path =~ m|^/uploaded/\Q$cdom\E/\Q$cnum\E/| && $path !~ /\.\./) {
                 if (&Apache::lonnet::allowed('mdc', $env{'request.course.id'})) {                  if (&Apache::lonnet::allowed('mdc', $env{'request.course.id'})) {
                     $allowed = 1;                      $allowed = 1;
                 }                  }
Line 78  sub handler { Line 80  sub handler {
         return OK;          return OK;
     }      }
   
     my $newpath = &Apache::lonnet::filelocation('', $path);      if ($path =~ m{^/priv/}) {
           my $newpath = &Apache::lonnet::filelocation('', $path);
     my $contents = $env{'form.file'};          my $contents = $env{'form.file'};
           
     try {          my $mode;
         $contents = &Apache::xml_to_loncapa::convert_file($contents);          if ($path =~ /\.(task|problem|exam|quiz|assess|survey|library|xml|html|htm|xhtml|xhtm)$/) {
     } catch {              try {
         $request->print("error\nconvert failed for $path: $_");                  $contents = &Apache::xml_to_loncapa::convert_file($contents);
         return OK;              } catch {
     };                  $request->print("error\nconvert failed for $path: $_");
                       return OK;
     my $filebak = $newpath.".bak";              };
     if (-e $newpath) {              $mode = '>:encoding(UTF-8)';
         copy($newpath, $filebak); # errors ignored          } else {
               $mode = '>';
           }
     
           my $filebak = $newpath.".bak";
           if (-e $newpath) {
               copy($newpath, $filebak); # errors ignored
           }
           if (open(my $out, $mode, $newpath)) {
               print $out $contents;
               close($out);
               $request->print("ok\n");
           } else {
               $request->print("error\nFailed to open file to save $path");
           }
       } elsif ($path =~ m{^/uploaded/}) {
           my ($unauthorized,$unsupported);
           if ($path =~ m{^\Q/uploaded/$cdom/$cnum/\E(docs|supplemental)/(default|\d+)/(\d+)/(.+)$}) {
               my ($type,$folder,$rid,$fname) = ($1,$2,$3,$4);
               my $referrer = $request->headers_in->{'Referer'};
               if ($referrer =~ m{\Qfile=/daxeopen/uploaded/$cdom/$cnum/$type/$folder/$rid/\E}) {
                   if ($fname =~ /\.(html|htm|xhtml|xhtm)$/) {
                       try {
                           $env{'form.file'} = &Apache::xml_to_loncapa::convert_file($env{'form.file'});
                       } catch {
                           $request->print("error\nconvert failed for $fname: $_");
                           return OK;
                       }
                   } elsif ($fname =~ /\.(task|problem|exam|quiz|assess|survey|library|xml)$/) {
                       $unsupported = $1;
                   }
                   unless ($unsupported) {
                       my $url = &Apache::lonnet::finishuserfileupload($cnum,$cdom,'file',
                                                                       "$type/$folder/$rid/$fname");
                       if ($url =~ m{^/uploaded/$cdom/$cnum/$type/$folder/$rid/}) {
                           $request->print("ok\n");
                       } else {
                           $request->print("error\nFailed to save uploaded file: $fname");
                       }
                   }
               } else {
                   $unauthorized = 1;
               }
           } else {
               $unauthorized = 1;
           }
           if ($unauthorized) {
               $request->log_reason("Unauthorized path: $path", $path);
               $request->print("error\nUnauthorized path: $path");
               $request->status(403);
           } elsif ($unsupported) {
               $request->log_reason("File extension: $unsupported -- not allowed for upload to course", $path);
               $request->print("error\nFile extension: $unsupported -- not allowed for upload to course");
               $request->status(403);
           }
     }      }
     open my $out, '>:encoding(UTF-8)', $newpath;  
     print $out $contents;  
     close $out;  
       
     $request->print("ok\n");  
     return OK;      return OK;
 }  }
   

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


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