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

version 1.42, 2008/12/12 02:32:27 version 1.53.2.1, 2011/11/07 13:38:45
Line 70  Start page output Line 70  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 99  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 165  sub phaseone { Line 170  sub phaseone {
     } 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'}) {      if (!$env{'form.upfile.filename'}) {
  $fn=~s/\/[^\/]+$//;          $r->print('<p class="LC_warning">'.&mt('No upload file specified.').'</p>');
  $fn=~s/([^\/])$/$1\//;          return;
  $fn.=$env{'form.upfile.filename'};      }
  $fn=~s/^\///;  
  $fn=~s/(\/)+/\//g;      $fn=~s/\/[^\/]+$//;
       $fn=~s/([^\/])$/$1\//;
 #    Fn is the full path to the destination filename.      $fn.=$env{'form.upfile.filename'};
 #          $fn=~s/^\///;
       $fn=~s/(\/)+/\//g;
       #    Fn is the full path to the destination filename.
   
       # Check for illegal filename
       &Debug($r, "Filename for upload: $fn");
       if (!(($fn) && ($fn!~/\/$/))) {
           $r->print('<p class="LC_warning">'.&mt('Illegal filename.').'</p>');
           return;
       }
   
       # 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.'" />'
          .'<input type="hidden" name="uploaduname" value="'.$uname.'" />'
       );
       $r->print(
           &Apache::lonhtmlcommon::start_pick_box()
          .&Apache::lonhtmlcommon::row_title(&mt('Save uploaded file as'))
          .'<span class="LC_filename">/priv/'.$uname.'/</span>'
          .'<input type="text" size="50" name="filename" value="'.$fn.'" />'
          .&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>'
       );
   
  &Debug($r, "Filename for upload: $fn");     # Check for bad extension and warn user
  if (($fn) && ($fn!~/\/$/)) {      if ($fn=~/\.(\w+)$/ && 
     $r->print('<form action="'.$action.'" method="post" name="fileupload">'.          (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
       '<input type="hidden" name="phase" value="two" />'.  
       '<input type="hidden" name="datatoken" value="'.  
       &upfile_store.'" />'.  
       '<input type="hidden" name="uploaduname" value="'.$uname.  
       '" />'.&mt('Save uploaded file as [_1]',  
                       "<span class='LC_filename'>/priv/$uname/</span>".  
                       '<input type="text" size="50" name="filename" value="'.$fn.  
                       '" />').  
                       '<br />'.  
       '<br />'.&mt('Choose file type:').'  
 <select name="filetype">  
  <option value="standard" selected>'.&mt('Regular file').'  
  <option value="testbank">'.&mt('Testbank file').'  
  <option value="imsimport">'.&mt('IMS package').'  
 </select>'.&Apache::loncommon::help_open_topic("Uploading_File_Options").'  
 <br />  
 <br />  
 ');  
             $r->print('<input type="button" value="'.&mt('Save').'" onClick="javascript:verifyForm()"/></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>');  
     }      }
 }  }
   
Line 250  sub phasetwo { Line 270  sub phasetwo {
                 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 314  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 355  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 references(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 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 $dir_root = '/home/'.$uname.'/public_html';
       my $url_root = '/priv/'.$uname;
       my $path = &File::Basename::dirname($fn);
       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="'.$url_root.$fn.'">'.
                     &mt('View main file').'</a></h3>'.
                     '<h3><a href="'.$url_root.$path.'">'.
                     &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 $dir_root = '/home/'.$uname.'/public_html';
     my $url_root = '/priv/'.$uname;      my $url_root = '/priv/'.$uname;
     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,      $result .= &Apache::loncommon::modify_html_refs($mode,$path,
                                                   $dir_root,$url_root);                                $uname,$udom,$dir_root);
     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="'.$url_root.$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="'.$url_root.$path.'">'.
                   &mt('Back to Directory').'</a></font><br />';                    &mt('Back to Directory').'</a></h3><br />';
     }      }
     return $result;      return $result;
 }  }
Line 418  function verifyForm() { Line 503  function verifyForm() {
  return HTTP_NOT_ACCEPTABLE;   return HTTP_NOT_ACCEPTABLE;
     }      }
           
     my $fn;      my ($fn,$trailfile);
     if ($env{'form.filename'}) {      if ($env{'form.filename'}) {
  $fn=$env{'form.filename'};   $fn=$env{'form.filename'};
  $fn=~s/^http\:\/\/[^\/]+\///;   $fn=~s/^https?\:\/\/[^\/]+\///;
  $fn=~s/^\///;   $fn=~s/^\///;
  $fn=~s{(~|priv/)($LONCAPA::username_re)}{};   $fn=~s{(~|priv/)($LONCAPA::username_re)}{};
  $fn=~s/\/+/\//g;   $fn=~s/\/+/\//g;
           $trailfile = "/home/$uname/public_html/".$trailfile;
           $trailfile=~s{//+}{/}g;
     } else {      } else {
  $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.   $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
        ' unspecified filename for upload', $r->filename);          ' unspecified filename for upload', $r->filename); 
Line 440  function verifyForm() { Line 527  function verifyForm() {
    $javascript = "<script type=\"text/javascript\">\n//<!--\n".     $javascript = "<script type=\"text/javascript\">\n//<!--\n".
  $javascript."\n// --></script>\n";   $javascript."\n// --></script>\n";
   
       # Breadcrumbs
       my $brcrum = [{'href' => &Apache::loncommon::authorspace(),
                      'text' => 'Construction Space'},
                     {'href' => '/adm/upload',
                      'text' => 'Upload file to Construction Space'}];
     $r->print(&Apache::loncommon::start_page('Upload file to Construction Space',      $r->print(&Apache::loncommon::start_page('Upload file to Construction Space',
      $javascript));                                               $javascript,
                                                {'bread_crumbs' => $brcrum,})
                .&Apache::loncommon::head_subbox(
                   &Apache::loncommon::CSTR_pageheader($trailfile))
       );
       
     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 ($env{'form.phase'} eq 'four') {
     if ($env{'form.phase'} eq 'three') {          my $output = &phasefour($r,$fn,$uname,$udom,'author');
         my $output = &phasethree($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,$uname,$udom);

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


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