Diff for /loncom/publisher/lonupload.pm between versions 1.42 and 1.70

version 1.42, 2008/12/12 02:32:27 version 1.70, 2019/03/06 03:39:54
Line 1 Line 1
   
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Handler to upload files into construction space  # Handler to upload files into construction space
 #  #
Line 70  Start page output Line 69  Start page output
   
 =item *  =item *
   
 output relevant interface phase (phaseone or phasetwo or phasethree)  output relevant interface phase (phaseone, phasetwo, phasethree or phasefour)
   
 =item *  =item *
   
Line 99  as overwriting an existing file). Line 98  as overwriting an existing file).
 Interface for handling secondary uploads of embedded objects  Interface for handling secondary uploads of embedded objects
 in an html file.  in an html file.
   
   =item phasefour()
   
   Interface for handling optional renaming of links to embedded
   objects. 
   
 =item upfile_store()  =item upfile_store()
   
 Store contents of uploaded file into temporary space.  Invoked  Store contents of uploaded file into temporary space.  Invoked
Line 121  use Apache::File; Line 125  use Apache::File;
 use File::Copy;  use File::Copy;
 use File::Basename;  use File::Basename;
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use Apache::loncacc;  
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonnet;  use Apache::lonnet;
 use HTML::Entities();  use HTML::Entities();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use LONCAPA();  use LONCAPA qw(:DEFAULT :match);
   
 my $DEBUG=0;  my $DEBUG=0;
   
Line 147  sub upfile_store { Line 150  sub upfile_store {
           
     chomp($env{'form.upfile'});      chomp($env{'form.upfile'});
       
     my $datatoken=$env{'user.name'}.'_'.$env{'user.domain'}.      my $datatoken;
   '_upload_'.$fname.'_'.time.'_'.$$;      if (($env{'user.name'} =~ /^$match_username$/) && ($env{'user.domain'} =~ /^$match_domain$/)) {
           $datatoken=$env{'user.name'}.'_'.$env{'user.domain'}.
                      '_upload_'.$fname.'_'.time.'_'.$$;
       }
       return if ($datatoken eq '');
     {      {
        my $fh=Apache::File->new('>'.$r->dir_config('lonDaemons').         my $fh=Apache::File->new('>'.$r->dir_config('lonDaemons').
                                    '/tmp/'.$datatoken.'.tmp');                                     '/tmp/'.$datatoken.'.tmp');
Line 158  sub upfile_store { Line 165  sub upfile_store {
 }  }
   
 sub phaseone {  sub phaseone {
     my ($r,$fn,$uname,$udom,$mode)=@_;      my ($r,$fn,$mode,$uname,$udom)=@_;
     my $action = '/adm/upload';      my $action = '/adm/upload';
     if ($mode eq 'testbank') {      if ($mode eq 'testbank') {
         $action = '/adm/testbank';          $action = '/adm/testbank';
     } elsif ($mode eq 'imsimport') {      } elsif ($mode eq 'imsimport') {
         $action = '/adm/imsimport';          $action = '/adm/imsimport';
     }      }
   
       # Check for file to be uploaded
     $env{'form.upfile.filename'}=~s/\\/\//g;      $env{'form.upfile.filename'}=~s/\\/\//g;
     $env{'form.upfile.filename'}=~s/^.*\/([^\/]+)$/$1/;      $env{'form.upfile.filename'}=~s/^.*\/([^\/]+)$/$1/;
     if ($env{'form.upfile.filename'}) {      $env{'form.upfile.filename'}=~s/(\s+$|^\s+)//g;
  $fn=~s/\/[^\/]+$//;      if (!$env{'form.upfile.filename'}) {
  $fn=~s/([^\/])$/$1\//;          $r->print('<p class="LC_warning">'.&mt('No upload file specified.').'</p>'.
  $fn.=$env{'form.upfile.filename'};                    &earlyout($fn,$uname,$udom));
  $fn=~s/^\///;          return;
  $fn=~s/(\/)+/\//g;      }
   
 #    Fn is the full path to the destination filename.      # Append the name of the uploaded file
 #          $fn.=$env{'form.upfile.filename'};
       $fn=~s/(\/)+/\//g;
  &Debug($r, "Filename for upload: $fn");  
  if (($fn) && ($fn!~/\/$/)) {      # Check for illegal filename
     $r->print('<form action="'.$action.'" method="post" name="fileupload">'.      &Debug($r, "Filename for upload: $fn");
       '<input type="hidden" name="phase" value="two" />'.      if (!(($fn) && ($fn!~/\/$/))) {
       '<input type="hidden" name="datatoken" value="'.          $r->print('<p class="LC_warning">'.&mt('Illegal filename.').'</p>');
       &upfile_store.'" />'.          return;
       '<input type="hidden" name="uploaduname" value="'.$uname.      }
       '" />'.&mt('Save uploaded file as [_1]',      # Check if quota exceeded
                       "<span class='LC_filename'>/priv/$uname/</span>".      my $filesize = length($env{'form.upfile'});
                       '<input type="text" size="50" name="filename" value="'.$fn.      if (!$filesize) {
                       '" />').          $r->print('<p class="LC_warning">'.
                       '<br />'.                    &mt('Unable to upload [_1]. (size = [_2] bytes)',
       '<br />'.&mt('Choose file type:').'                        '<span class="LC_filename">'.$env{'form.upfile.filename'}.'</span>',
 <select name="filetype">                        $filesize).'<br />'.
  <option value="standard" selected>'.&mt('Regular file').'                    &mt('Either the file you attempted to upload was empty, or your web browser was unable to read its contents.').'<br />'.
  <option value="testbank">'.&mt('Testbank file').'                    '</p>'.
  <option value="imsimport">'.&mt('IMS package').'                    &earlyout($fn,$uname,$udom));
 </select>'.&Apache::loncommon::help_open_topic("Uploading_File_Options").'          return;
 <br />      }
 <br />      $filesize = int($filesize/1000); #expressed in kb
 ');      my $output = &Apache::loncommon::excess_filesize_warning($uname,$udom,'author',
             $r->print('<input type="button" value="'.&mt('Save').'" onClick="javascript:verifyForm()"/></form>');                                                               $env{'form.upfile.filename'},$filesize,'upload');
     # Check for bad extension and warn user      if ($output) {
     if ($fn=~/\.(\w+)$/ &&           $r->print($output.&earlyout($fn,$uname,$udom));
  (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {          return;
       }
   
   # Split part that I can change from the part that I cannot change
       my ($fn1,$fn2)=($fn=~/^(\/priv\/[^\/]+\/[^\/]+\/)(.*)$/);
   # Check for pattern: .number.extension which is reserved for LON-CAPA versioning. 
   # Check for disallowed characters: #?&%:<>`|, and remove
       if ($fn2 ne '') {
           ($fn2,my $warning) = &check_filename($fn2);
           if ($warning ne '') {
               $r->print($warning);
           }
       }
       # Display additional options for upload
       # and upload button
       $r->print(
           '<form action="'.$action.'" method="post" name="fileupload">'
          .'<input type="hidden" name="phase" value="two" />'
          .'<input type="hidden" name="datatoken" value="'.&upfile_store.'" />'
       );
       $r->print(
           &Apache::lonhtmlcommon::start_pick_box()
          .&Apache::lonhtmlcommon::row_title(&mt('Save uploaded file as'))
          .'<span class="LC_filename">'.$fn1.'</span>'
          .'<input type="hidden" name="filename1" value="'.$fn1.'" />'
          .'<input type="text" size="50" name="filename2" value="'.$fn2.'" />'
          .&Apache::lonhtmlcommon::row_closure()
          .&Apache::lonhtmlcommon::row_title(&mt('File Type'))
          .'<select name="filetype">'
          .'<option value="standard" selected="selected">'.&mt('Regular file').'</option>'
          .'<option value="testbank">'.&mt('Testbank file').'</option>'
          .'<option value="imsimport">'.&mt('IMS package').'</option>'
          .'</select>'.&Apache::loncommon::help_open_topic("Uploading_File_Options")
          .&Apache::lonhtmlcommon::row_closure(1)
          .&Apache::lonhtmlcommon::end_pick_box()
       );
       $r->print(
           '<p>'
          .'<input type="button" value="'.&mt('Upload').'" onclick="javascript:verifyForm()"/>'
          .'</p>'
          .'</form>'
       );
   
      # Check for bad extension and warn user
       if ($fn=~/\.(\w+)$/ && 
           (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
                 $r->print('<p class="LC_error">'                  $r->print('<p class="LC_error">'
                           .&mt('The extension on this file, [_1], is reserved internally by LON-CAPA.','"'.$1.'"')                            .&mt('The extension on this file, [_1], is reserved internally by LON-CAPA.',
                                  '<span class="LC_filename">'.$1.'</span>')
                           .' <br />'.&mt('Please change the extension.')                            .' <br />'.&mt('Please change the extension.')
                           .'</p>');                            .'</p>');
     } elsif($fn=~/\.(\w+)$/ &&       } elsif($fn=~/\.(\w+)$/ && 
     !defined(&Apache::loncommon::fileembstyle($1))) {                      !defined(&Apache::loncommon::fileembstyle($1))) {
                 $r->print('<p class="LC_error">'                  $r->print('<p class="LC_error">'
                          .&mt('The extension on this file, [_1], is not recognized by LON-CAPA.','"'.$1.'"')                           .&mt('The extension on this file, [_1], is not recognized by LON-CAPA.',
                                 '<span class="LC_filename">'.$1.'</span>')
                          .' <br />'.&mt('Please change the extension.')                           .' <br />'.&mt('Please change the extension.')
                          .'</p>');                           .'</p>');
     }  
  } else {  
     $r->print('<span class="LC_error">'.&mt('Illegal filename.').'</span>');  
  }  
     } else {  
  $r->print('<span class="LC_error">'.&mt('No upload file specified.').'</span>');  
     }      }
 }  }
   
 sub phasetwo {  sub phasetwo {
     my ($r,$tfn,$uname,$udom,$mode)=@_;      my ($r,$fn,$mode)=@_;
   
     my $output;      my $output;
     my $action = '/adm/upload';      my $action = '/adm/upload';
     my $returnflag = '';      my $returnflag = '';
Line 231  sub phasetwo { Line 282  sub phasetwo {
     } elsif ($mode eq 'imsimport') {      } elsif ($mode eq 'imsimport') {
         $action = '/adm/imsimport';          $action = '/adm/imsimport';
     }      }
     my $fn='/priv/'.$uname.'/'.$tfn;  
     $fn=~s/\/+/\//g;      $fn=~s/\/+/\//g;
     &Debug($r, "Filename is ".$tfn);      if ($fn) {
     if ($tfn) {   my $target= $r->dir_config('lonDocRoot').'/'.$fn;
  &Debug($r, "Filename for tfn = ".$tfn);  
  my $target='/home/'.$uname.'/public_html'.$tfn;  
  &Debug($r, "target -> ".$target);   &Debug($r, "target -> ".$target);
 #     target is the full filesystem path of the destination file.  #     target is the full filesystem path of the destination file.
  my $base = &File::Basename::basename($fn);   my $base = &File::Basename::basename($fn);
  my $path = &File::Basename::dirname($fn);   my $path = &File::Basename::dirname($fn);
  $base    = &HTML::Entities::encode($base,'<>&"');   $base    = &HTML::Entities::encode($base,'<>&"');
  my $url  = $path."/".$base;    my $url  = $path."/".$base;
  &Debug($r, "URL is now ".$url);   &Debug($r, "URL is now ".$url);
  my $datatoken=$env{'form.datatoken'};   my $datatoken;
           if ($env{'form.datatoken'} =~ /^$match_username\_$match_domain\_upload_\w*_\d+_\d+$/) {
               $datatoken = $env{'form.datatoken'};
           }
  if (($fn) && ($datatoken)) {   if (($fn) && ($datatoken)) {
             if ($env{'form.cancel'}) {              if ($env{'form.cancel'}) {
                 my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp';                  my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp';
                 my $dirpath=$path.'/';                  my $dirpath=$path.'/';
                 $dirpath=~s/\/+/\//g;                  $dirpath=~s/\/+/\//g;
                 $output .= &mt('Upload cancelled.').'<br /><font size="+2"><a href="'.$dirpath.'">'.                  $output .= '<p class="LC_warning">'.&mt('Upload cancelled.').'</p>'
                           &mt('Back to Directory').'</a></font>';                            .'<p><a href="'.$dirpath.'">'.
     } elsif ((-e $target) && (!$env{'form.override'})) {                            &mt('Back to Directory').'</a></p>';
  $output .= '<form action="'.$action.'" method="post">'.              } elsif ((-e $target) && (!$env{'form.override'})) {
   &mt('File [_1] exists. Overwrite?','<span class="LC_filename">'.$fn.'</span>').                  $output .= '<form action="'.$action.'" method="post">'
   '<input type="hidden" name="phase" value="two" />'.                            .'<p class="LC_warning">'
   '<input type="hidden" name="filename" value="'.$url.'" />'.                            .&mt('File [_1] already exists.',
   '<input type="hidden" name="datatoken" value="'.$datatoken.'" />'.                                 '<span class="LC_filename">'.$fn.'</span>')
   '<input type="submit" name="override" value="'.&mt('Yes').'" />'.                           .'<input type="hidden" name="phase" value="two" />'
                           '<input type="submit" name="cancel" value="'.&mt('Cancel').'" />'.                           .'<input type="hidden" name="filename" value="'.$url.'" />'
                           '</form>';                           .'<input type="hidden" name="datatoken" value="'.$datatoken.'" />'
                            .'<p>'
                            .'<input type="submit" name="cancel" value="'.&mt('Cancel').'" />'
                            .' <input type="submit" name="override" value="'.&mt('Overwrite').'" />'
                            .'</p>'
                            .'</form>';
             } else {              } else {
  my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp';   my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp';
  my $dirpath=$path.'/';   my $dirpath=$path.'/';
Line 289  sub check_extension { Line 345  sub check_extension {
     # Check for bad extension and disallow upload      # Check for bad extension and disallow upload
     if ($fn=~/\.(\w+)$/ &&      if ($fn=~/\.(\w+)$/ &&
         (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {          (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
         $result .= &mt('File [_1] could not be copied.',          $result .= '<p class="LC_warning">'.
                       '<span class="LC_filename">'.$fn.'</span> ').                     &mt('File [_1] could not be copied.',
                   '<p class="LC_error">'.                         '<span class="LC_filename">'.$fn.'</span> ').
                   &mt('The extension on this file is reserved internally by LON-CAPA.').                     '<br />'.
                   '</p>';                     &mt('The extension on this file is reserved internally by LON-CAPA.').
                      '</p>';
     } elsif ($fn=~/\.(\w+)$/ &&      } elsif ($fn=~/\.(\w+)$/ &&
              !defined(&Apache::loncommon::fileembstyle($1))) {               !defined(&Apache::loncommon::fileembstyle($1))) {
         $result .= &mt('File [_1] could not be copied.',          $result .= '<p class="LC_warning">'.
                       '<span class="LC_filename">'.$fn.'</span> ').                     &mt('File [_1] could not be copied.',
                   '<p class="LC_error">'.                         '<span class="LC_filename">'.$fn.'</span> ').
                   &mt('The extension on this file is not recognized by LON-CAPA.').                     '<br />'.
                   '</p>';                     &mt('The extension on this file is not recognized by LON-CAPA.').
                      '</p>';
     } elsif (-d $target) {      } elsif (-d $target) {
         $result .= &mt('File [_1] could not be copied.',          $result .= '<p class="LC_warning">'.
                       '<span class="LC_filename">'.$fn.'</span>').                     &mt('File [_1] could not be copied.',
                   '<p class="LC_error">'.                         '<span class="LC_filename">'.$fn.'</span>').
                   &mt('The target is an existing directory.').                     '<br />'.
                   '</p>';                     &mt('The target is an existing directory.').
                      '</p>';
     } elsif (copy($source,$target)) {      } elsif (copy($source,$target)) {
         chmod(0660, $target); # Set permissions to rw-rw---.          chmod(0660, $target); # Set permissions to rw-rw---.
         if ($mode eq 'testbank' || $mode eq 'imsimport') {          if ($mode eq 'testbank' || $mode eq 'imsimport') {
             $returnflag = 'ok';              $returnflag = 'ok';
             $result .= &mt('Your file - [_1] - was uploaded successfully',$fn).'<br /><br />';              $result .= '<p class="LC_success">'
                         .&mt('Your file - [_1] - was uploaded successfully.',
                              '<span class="LC_filename">'.$fn.'<span>')
                         .'</p>';
         } else {          } else {
             $result .= &mt('File copied.').'<br />';              $result .= '<p class="LC_success">'
                         .&mt('File copied.')  
                         .'</p>';
         }          }
         # Check for embedded objects.          # Check for embedded objects.
         my (%allfiles,%codebase);          my (%allfiles,%codebase);
Line 322  sub check_extension { Line 386  sub check_extension {
             my (%allfiles,%codebase);              my (%allfiles,%codebase);
             &Apache::lonnet::extract_embedded_items($target,\%allfiles,\%codebase);              &Apache::lonnet::extract_embedded_items($target,\%allfiles,\%codebase);
             if (keys(%allfiles) > 0) {              if (keys(%allfiles) > 0) {
                 my $state = <<STATE;                  my ($currentpath) = ($url =~ m{^(.+)/[^/]+$});
     <input type="hidden" name="action"      value="upload_embedded" />                  my $state = &embedded_form_elems('upload_embedded',$url,$mode);
     <input type="hidden" name="currentpath" value="$env{'form.currentpath'}" />                  my ($embedded,$num,$pathchg) = 
     <input type="hidden" name="mode"        value="$mode" />                      &Apache::loncommon::ask_for_embedded_content($action,$state,\%allfiles,
     <input type="hidden" name="phase"       value="three" />                                                                   \%codebase,
     <input type="hidden" name="filename" value="$url" />                                                                   {'error_on_invalid_names'   => 1,
 STATE                                                                    'ignore_remote_references' => 1,
                 $result .= "<h3>".&mt("Reference Warning")."</h3>".                                                                    'current_path'             => $currentpath});
                            "<p>".&mt("Completed upload of the file. This file contained references to other files.")."</p>".                  if ($embedded) {
                           "<p>".&mt("Please select the locations from which the referenced files are to be uploaded.")."</p>".                      $result .= '<h3>'.&mt('Reference Warning').'</h3>';
                           &Apache::loncommon::ask_for_embedded_content($action,$state,\%allfiles,\%codebase,                      if ($num) {
                                       {'error_on_invalid_names'   => 1,                          $result .= '<p>'.&mt('Completed upload of the file.').' '.&mt('This file contained references to other files.').'</p>'.
                                        'ignore_remote_references' => 1,});                                     '<p>'.&mt('Please select the locations from which the referenced files are to be uploaded.').'</p>'.
                 if ($mode eq 'testbank') {                                     $embedded;
                     $returnflag = 'embedded';                          if ($mode eq 'testbank') {
                     $result .=  '<p>'.&mt('Or [_1]continue[_2] the testbank import without these files','<a href="javascript:document.testbankForm.submit();">','</a>').'</p>';                              $returnflag = 'embedded';
                               $result .=  '<p>'.&mt('Or [_1]continue[_2] the testbank import without these files.','<a href="javascript:document.testbankForm.submit();">','</a>').'</p>';
                           }
                       } else {
                           $result .= '<p>'.&mt('Completed upload of the file.').'</p>'.$embedded;
                           if ($pathchg) {
                               if ($mode eq 'testbank') {
                                   $returnflag = 'embedded';
                                   $result .=  '<p>'.&mt('Or [_1]continue[_2] the testbank import without modifying the reference(s).','<a href="javascript:document.testbankForm.submit();">','</a>').'</p>';
                               }
                           }
                       }
                 }                  }
             }              }
         }          }
         if (($mode ne 'imsimport') && ($mode ne 'testbank')) {          if (($mode ne 'imsimport') && ($mode ne 'testbank')) {
             $result .= '<br /><font size="+2"><a href="'.$url.'">'.              $result .= '<br /><a href="'.$url.'">'.
                         &mt('View file').'</a></font>';                          &mt('View file').'</a>';
         }          }
     } else {      } else {
         $result .= &mt('Failed to copy: [_1].',$!);          $result .= &mt('Failed to copy: [_1].',$!);
     }      }
     if ($mode ne 'imsimport' && $mode ne 'testbank') {      if ($mode ne 'imsimport' && $mode ne 'testbank') {
         $result .= '<br /><font size="+2"><a href="'.$dirpath.'">'.          $result .= '<br /><a href="'.$dirpath.'">'.
                    &mt('Back to Directory').'</a></font><br />';                     &mt('Back to Directory').'</a><br />';
     }      }
     return ($result,$returnflag);      return ($result,$returnflag);
 }  }
   
   sub check_filename {
       my ($fname) = @_;
       my $warning;
       if ($fname =~/[#\?&%":<>`|]/) {
           $fname =~s/[#\?&%":<>`|]//g;
           $warning .= '<p class="LC_warning">'
                      .&mt('Removed one or more disallowed characters from filename')
                      .'</p>';
       }
       if ($fname=~ /\.(\d+)\.(\w+)$/) {
           my $num = $1;
           $warning .= '<p class="LC_warning">'
                      .&mt('Bad filename [_1]','<span class="LC_filename">'.$fname.'</span>')
                      .'<br />'
                      .&mt('[_1](name).(number).(extension)[_2] not allowed.','<tt>','</tt>')
                      .'<br />'
                      .&mt('Replacing the [_1].number.[_2] with [_1]_letter.[_2] in requested filename.','<tt>','</tt>')
                      .'</p>';
           if ($num eq '0') {
               $fname =~ s/\.(\d+)(\.\w+)$/_A$2/;
           } else {
               my $letts = '';
               my %digletter = reverse &Apache::lonnet::letter_to_digits();
               if ($num >= 100) {
                   $num = substr($num,-2);
               }
               foreach my $digit (split('',$num)) {
                   $letts .= $digletter{$digit};
               }
               $fname =~ s/\.(\d+)(\.\w+)$/_$letts$2/;
           }
       }
       if ($fname =~/___/) {
           $fname =~s/_+/_/g;
           $warning .= '<p class="LC_warning">'
                       .&mt('Changed ___ to a single _ in filename')
                       .'</p>';
       }
       return ($fname,$warning);
   }
   
 sub phasethree {  sub phasethree {
     my ($r,$fn,$uname,$udom,$mode) = @_;      my ($r,$fn,$uname,$udom,$mode) = @_;
   
       my $action = '/adm/upload'; 
       if ($mode eq 'testbank') {
           $action = '/adm/testbank';
       } elsif ($mode eq 'imsimport') {
           $action = '/adm/imsimport';
       }
       my $url_root = "/priv/$udom/$uname";
       my $dir_root = $r->dir_config('lonDocRoot').$url_root;
       my $path = &File::Basename::dirname($fn);
       $path =~ s{^\Q$url_root\E}{};
       my $dirpath = $url_root.$path.'/';
       $dirpath=~s{/+}{/}g;
       my $filename = &HTML::Entities::encode($env{'form.filename'},'<>&"');
       my $state = &embedded_form_elems('modify_orightml',$filename,$mode).
                   '<input type="hidden" name="phase" value="four" />';
       my ($result,$returnflag) = 
           &Apache::loncommon::upload_embedded($mode,$path,$uname,$udom,
                                               $dir_root,$url_root,undef,
                                               undef,undef,$state,$action);
       if ($mode ne 'imsimport' && $mode ne 'testbank') {
           $result .= '<br /><h3><a href="'.$fn.'">'.
                     &mt('View main file').'</a></h3>'.
                     '<h3><a href="'.$dirpath.'">'.
                     &mt('Back to Directory').'</a></h3><br />';
       }
       return ($result,$returnflag);
   }
   
   sub embedded_form_elems {
       my ($action,$filename,$mode) = @_;
       return <<STATE;
       <input type="hidden" name="action" value="$action" />
       <input type="hidden" name="mode" value="$mode" />
       <input type="hidden" name="filename" value="$filename" />
   STATE
   }
   
   sub phasefour {
       my ($r,$fn,$uname,$udom,$mode) = @_;
   
       my $action = '/adm/upload';
       if ($mode eq 'testbank') {
           $action = '/adm/testbank';
       } elsif ($mode eq 'imsimport') {
           $action = '/adm/imsimport';
       }
     my $result;      my $result;
     my $dir_root = '/home/'.$uname.'/public_html';      my $url_root = "/priv/$udom/$uname";
     my $url_root = '/priv/'.$uname;      my $dir_root = $r->dir_config('lonDocRoot').$url_root;
     my $base = &File::Basename::basename($fn);  
     my $path = &File::Basename::dirname($fn);      my $path = &File::Basename::dirname($fn);
     $result = &Apache::loncommon::upload_embedded($mode,$path,$uname,$udom,      $path =~ s{^\Q$url_root\E}{};
                                                   $dir_root,$url_root);      my $dirpath = $url_root.$path.'/';
       $dirpath=~s{/+}{/}g;
       my $outcome = 
           &Apache::loncommon::modify_html_refs($mode,$path,$uname,$udom,$dir_root);
       $result .= $outcome;
     if ($mode ne 'imsimport' && $mode ne 'testbank') {      if ($mode ne 'imsimport' && $mode ne 'testbank') {
         $result = '<br /><font size="+2"><a href="'.$url_root.$fn.'">'.          $result .= '<br /><h3><a href="'.$fn.'">'.
                   &mt('View main file').'</a></font>'.                    &mt('View main file').'</a></h3>'.
                   '<br /><font size="+2"><a href="'.$url_root.$path.'">'.                    '<h3><a href="'.$dirpath.'">'.
                   &mt('Back to Directory').'</a></font><br />';                    &mt('Back to Directory').'</a></h3><br />';
     }      }
     return $result;      return $result;
 }  }
   
   sub earlyout {
       my ($fn,$uname,$udom) = @_;
       if ($fn =~ m{^(/priv/$udom/$uname(?:.*)/)[^/]*}) {
           return &Apache::lonhtmlcommon::actionbox(
                  ['<a href="'.$1.'">'.&mt('Return to Directory').'</a>']);
       }
       return;
   }
   
 # ---------------------------------------------------------------- Main Handler  # ---------------------------------------------------------------- Main Handler
 sub handler {  sub handler {
   
     my $r=shift;      my $r=shift;
   
     my $uname;  
     my $udom;  
     my $javascript = '';      my $javascript = '';
 #      my $fn;
 # phase two: re-attach user      my $warning;
 #  
     if ($env{'form.uploaduname'}) {      if ($env{'form.filename1'}) {
  $env{'form.filename'}='/priv/'.$env{'form.uploaduname'}.'/'.          my $fn1 = $env{'form.filename1'};
     $env{'form.filename'};          my $fn2 = $env{'form.filename2'};
           $fn2 =~ s/(\s+$|^\s+)//g;
           $fn2 =~ s/\/+/\//g;
           ($fn2,$warning) = &check_filename($fn2);
           $fn = $fn1.$fn2;
       } else {
           $fn = $env{'form.filename'};
     }      }
       $fn=~s/\/+/\//g;
       if ($fn =~ m{/\.\./}) {
           $warning .= '<p class="LC_warning">'
                      .&mt('Path modified as a result of one or more instances of /../')
                      .'</p>';
           while ($fn =~ m{/\.\./}) {
               $fn =~ s{/[^/]+/\.\./}{/}g;
           }
       }
   
       unless ($fn) {
           $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
                          ' unspecified filename for upload', $r->filename);
           return HTTP_NOT_FOUND;
       }
   
       my ($uname,$udom)=&Apache::lonnet::constructaccess($fn);
   
       unless (($uname) && ($udom)) {
           $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
                          ' trying to upload file '.$fn.
                          ' - not authorized',
                          $r->filename);
           return HTTP_NOT_ACCEPTABLE;
       }
   
   # ----------------------------------------------------------- Start page output
   
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
   
     unless ($env{'form.phase'} eq 'two') {      unless ($env{'form.phase'} eq 'two') {
         $javascript = qq|          $javascript = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
 function verifyForm() {  function verifyForm() {
     var mode = document.fileupload.filetype.options[document.fileupload.filetype.selectedIndex].value      var mode = document.fileupload.filetype.options[document.fileupload.filetype.selectedIndex].value
     if (mode == "testbank") {      if (mode == "testbank") {
Line 404  function verifyForm() { Line 614  function verifyForm() {
     }      }
     document.fileupload.submit();      document.fileupload.submit();
 }  }
  |;  // ]]>
     }  </script>
     ($uname,$udom)=  ENDJS
  &Apache::loncacc::constructaccess($env{'form.filename'},      }
   $r->dir_config('lonDefDomain'));  
       my $londocroot = $r->dir_config('lonDocRoot');
     unless (($uname) && ($udom)) {      my $trailfile = $fn;
  $r->log_reason($uname.' at '.$udom.      $trailfile =~ s{^/(priv/)}{$londocroot/$1};
        ' trying to publish file '.$env{'form.filename'}.  
        ' - not authorized',       # Breadcrumbs
        $r->filename);       my $brcrum = [{'href' => &Apache::loncommon::authorspace($fn),
  return HTTP_NOT_ACCEPTABLE;                     'text' => 'Authoring Space'},
     }                    {'href' => '/adm/upload',
                          'text' => 'Upload file to Authoring Space'}];
     my $fn;      $r->print(&Apache::loncommon::start_page('Upload file to Authoring Space',
     if ($env{'form.filename'}) {                                               $javascript,
  $fn=$env{'form.filename'};                                               {'bread_crumbs' => $brcrum,})
  $fn=~s/^http\:\/\/[^\/]+\///;               .&Apache::loncommon::head_subbox(
  $fn=~s/^\///;                  &Apache::loncommon::CSTR_pageheader($trailfile))
  $fn=~s{(~|priv/)($LONCAPA::username_re)}{};      );
  $fn=~s/\/+/\//g;  
     } else {  
  $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.  
        ' unspecified filename for upload', $r->filename);   
  return HTTP_NOT_FOUND;  
     }  
   
 # ----------------------------------------------------------- Start page output  
   
   
     &Apache::loncommon::content_type($r,'text/html');  
     $r->send_http_header;  
   
    $javascript = "<script type=\"text/javascript\">\n//<!--\n".  
  $javascript."\n// --></script>\n";  
   
     $r->print(&Apache::loncommon::start_page('Upload file to Construction Space',  
      $javascript));  
       
     if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {      if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
  $r->print('<h3><span class="LC_error">'.&mt('Co-Author').': '.$uname.          $r->print('<p class="LC_info">'
   &mt(' at ').$udom.'</span></h3>');                   .&mt('Co-Author [_1]',$uname.':'.$udom)
                    .'</p>'
           );
     }      }
       if ($warning) {
     if ($env{'form.phase'} eq 'three') {          $r->print($warning);
         my $output = &phasethree($r,$fn,$uname,$udom,'author');      }
       if ($env{'form.phase'} eq 'four') {
           my $output = &phasefour($r,$fn,$uname,$udom,'author');
           $r->print($output);
       } elsif ($env{'form.phase'} eq 'three') {
           my ($output,$rtnflag) = &phasethree($r,$fn,$uname,$udom,'author');
         $r->print($output);          $r->print($output);
     } elsif ($env{'form.phase'} eq 'two') {      } elsif ($env{'form.phase'} eq 'two') {
  my ($output,$returnflag) = &phasetwo($r,$fn,$uname,$udom);   my ($output,$returnflag) = &phasetwo($r,$fn);
         $r->print($output);          $r->print($output);
     } else {      } else {
  &phaseone($r,$fn,$uname,$udom);   &phaseone($r,$fn,undef,$uname,$udom);
     }      }
   
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;        return OK;
 }  }
   
 1;  1;

Removed from v.1.42  
changed lines
  Added in v.1.70


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