Diff for /loncom/publisher/lonupload.pm between versions 1.21 and 1.22

version 1.21, 2003/11/08 10:58:30 version 1.22, 2003/11/08 11:04:52
Line 46  my $DEBUG=0; Line 46  my $DEBUG=0;
   
 sub Debug {  sub Debug {
       
   # Marshall the parameters.      # Marshall the parameters.
       
   my $r       = shift;      my $r       = shift;
   my $log     = $r->log;      my $log     = $r->log;
   my $message = shift;      my $message = shift;
       
   # Put out the indicated message butonly if DEBUG is false.      # Put out the indicated message butonly if DEBUG is false.
       
   if ($DEBUG) {      if ($DEBUG) {
     $log->debug($message);   $log->debug($message);
   }      }
 }  }
   
 sub upfile_store {  sub upfile_store {
Line 79  sub upfile_store { Line 79  sub upfile_store {
   
   
 sub phaseone {  sub phaseone {
    my ($r,$fn,$uname,$udom)=@_;      my ($r,$fn,$uname,$udom)=@_;
    $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/\/[^\/]+$//;   $fn=~s/\/[^\/]+$//;
     $fn=~s/([^\/])$/$1\//;   $fn=~s/([^\/])$/$1\//;
     $fn.=$ENV{'form.upfile.filename'};   $fn.=$ENV{'form.upfile.filename'};
     $fn=~s/^\///;   $fn=~s/^\///;
     $fn=~s/(\/)+/\//g;   $fn=~s/(\/)+/\//g;
   
 #    Fn is the full path to the destination filename.  #    Fn is the full path to the destination filename.
 #      #    
   
     &Debug($r, "Filename for upload: $fn");   &Debug($r, "Filename for upload: $fn");
     if (($fn) && ($fn!~/\/$/)) {   if (($fn) && ($fn!~/\/$/)) {
       $r->print(      $r->print('<form action=/adm/upload method=post>'.
  '<form action=/adm/upload method=post>'.        '<input type=hidden name=phase value=two>'.
  '<input type=hidden name=phase value=two>'.        '<input type=hidden name=datatoken value="'.
  '<input type=hidden name=datatoken value="'.&upfile_store.'">'.        &upfile_store.'">'.
  '<input type=hidden name=uploaduname value="'.$uname.'">'.        '<input type=hidden name=uploaduname value="'.$uname.'">'.
  &mt('Store uploaded file as ')."<tt>/priv/$uname/</tt>".        &mt('Store uploaded file as ')."<tt>/priv/$uname/</tt>".
  '<input type=text size=50 name=filename value="'.$fn.'"><br>'.        '<input type=text size=50 name=filename value="'.$fn.'"><br>'.
  '<input type=submit value="'.&mt('Store').'"></form>');        '<input type=submit value="'.&mt('Store').'"></form>');
       # Check for bad extension and warn user      # Check for bad extension and warn user
       if ($fn=~/\.(\w+)$/ &&       if ($fn=~/\.(\w+)$/ && 
   (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {   (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
   $r->print(   $r->print('<font color=red>'.&mt('The extension on this file,').
  '<font color=red>'.    ' "'.$1.'"'.&mt(', is reserved internally by LON-CAPA.').
  &mt('The extension on this file,').' "'.$1.    ' <br \>'.&mt('Please change the extension.').'</font>');
  '"'.&mt(', is reserved internally by LON-CAPA.').' <br \>'.      } elsif($fn=~/\.(\w+)$/ && 
  &mt('Please change the extension.').      !defined(&Apache::loncommon::fileembstyle($1))) {
  '</font>');   $r->print('<font color=red>'.&mt('The extension on this file,').
       } elsif($fn=~/\.(\w+)$/ &&     ' "'.$1.'"'.&mt(', is not recognized by LON-CAPA.').
       !defined(&Apache::loncommon::fileembstyle($1))) {    ' <br \>'.&mt('Please change the extension.').
   $r->print(    '</font>');
  '<font color=red>'.      }
  &mt('The extension on this file,').' "'.$1.   } else {
  '"'.&mt(', is not recognized by LON-CAPA.').' <br \>'.      $r->print('<font color=red>'.&mt('Illegal filename.').'</font>');
  &mt('Please change the extension.').   }
  '</font>');      } else {
       }   $r->print('<font color=red>'.&mt('No upload file specified.').'</font>');
   } else {      }
       $r->print('<font color=red>'.&mt('Illegal filename.').'</font>');  
   }  
  } else {  
      $r->print('<font color=red>'.&mt('No upload file specified.').'</font>');  
  }  
 }  }
   
 sub phasetwo {  sub phasetwo {
    my ($r,$tfn,$uname,$udom)=@_;      my ($r,$tfn,$uname,$udom)=@_;
    my $fn='/priv/'.$uname.'/'.$tfn;      my $fn='/priv/'.$uname.'/'.$tfn;
    $fn=~s/\/+/\//g;      $fn=~s/\/+/\//g;
    &Debug($r, "Filename is ".$tfn);      &Debug($r, "Filename is ".$tfn);
    if ($tfn) {      if ($tfn) {
     &Debug($r, "Filename for tfn = ".$tfn);   &Debug($r, "Filename for tfn = ".$tfn);
     my $target='/home/'.$uname.'/public_html'.$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=$ENV{'form.datatoken'};
     if (($fn) && ($datatoken)) {   if (($fn) && ($datatoken)) {
  if ((-e $target) && ($ENV{'form.override'} ne 'Yes')) {      if ((-e $target) && ($ENV{'form.override'} ne 'Yes')) {
            $r->print(   $r->print('<form action=/adm/upload method=post>'.
  '<form action=/adm/upload method=post>'.    &mt('File').' <tt>'.$fn.'</tt> '.
  &mt('File').' <tt>'.$fn.'</tt> '.&mt('exists. Overwrite?').' '.    &mt('exists. Overwrite?').' '.
  '<input type=hidden name=phase value=two>'.    '<input type=hidden name=phase value=two>'.
  '<input type=hidden name=filename value="'."$url".'">'.    '<input type=hidden name=filename value="'."$url".'">'.
  '<input type=hidden name=datatoken value="'.$datatoken.'">'.    '<input type=hidden name=datatoken value="'.$datatoken.'">'.
  '<input type=submit name=override value="'.&mt('Yes').'"></form>');    '<input type=submit name=override value="'.&mt('Yes').'"></form>');
        } else {      } else {
            my $source=$r->dir_config('lonDaemons').   my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp';
                              '/tmp/'.$datatoken.'.tmp';   # 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')) {      $r->print(&mt('File').' <tt>'.$fn.'</tt> '.
        $r->print(        &mt('could not be copied.').'<br />'.
  &mt('File').' <tt>'.$fn.'</tt> '.&mt('could not be copied.').'<br />'.        '<font color=red>'.
  '<font color=red>'.        &mt('The extension on this file is reserved internally by LON-CAPA.').
  &mt('The extension on this file is reserved internally by LON-CAPA.').        '</font>');
  '</font>');      $r->print('<p><font size=+2><a href="'.$path.'">'.
               $r->print('<p><font size=+2><a href="'.$path.        &mt('Back to Directory').'</a></font>');
                         '">'.&mt('Back to Directory').'</a></font>');   } elsif ($fn=~/\.(\w+)$/ && 
    } elsif ($fn=~/\.(\w+)$/ &&    !defined(&Apache::loncommon::fileembstyle($1))) {
     !defined(&Apache::loncommon::fileembstyle($1))) {      $r->print(&mt('File').' <tt>'.$fn.'</tt> '.
        $r->print(        &mt('could not be copied.').'<br />'.
  &mt('File').' <tt>'.$fn.'</tt> '.&mt('could not be copied.').'<br />'.        '<font color=red>'.
  '<font color=red>'.        &mt('The extension on this file is not recognized by LON-CAPA.').
  &mt('The extension on this file is not recognized by LON-CAPA.').        '</font>');
  '</font>');      $r->print('<p><font size=+2><a href="'.$path.'">'.
        $r->print('<p><font size=+2><a href="'.$path.        &mt('Back to Directory').'</a></font>');
                         '">'.&mt('Back to Directory').'</a></font>');   } elsif (-d $target) {
    } elsif (-d $target) {      $r->print('File <tt>'.$fn.'</tt> could not be copied.<br />'.
        $r->print(        '<font color=red>'.
  'File <tt>'.$fn.'</tt> could not be copied.<br />'.        &mt('The target is an existing directory.').
  '<font color=red>'.        '</font>');
  &mt('The target is an existing directory.').      $r->print('<p><font size=+2><a href="'.$path.'">'.
  '</font>');        &mt('Back to Directory').'</a></font>');
        $r->print('<p><font size=+2><a href="'.$path.   } elsif (copy($source,$target)) {
                         '">'.&mt('Back to Directory').'</a></font>');      chmod(0660, $target); # Set permissions to rw-rw---.
    } elsif (copy($source,$target)) {      $r->print(&mt('File copied.'));
        chmod(0660, $target); # Set permissions to rw-rw---.      $r->print('<p><font size=+2><a href="'.$url.'">'.
       $r->print(&mt('File copied.'));        &mt('View file').'</a></font>');
               $r->print('<p><font size=+2><a href="'.$url.      $r->print('<p><font size=+2><a href="'.$path.'">'.
                         '">'.&mt('View file').'</a></font>');        &mt('Back to Directory').'</a></font>');
               $r->print('<p><font size=+2><a href="'.$path.   } else {
                         '">'.&mt('Back to Directory').'</a></font>');      $r->print('Failed to copy: '.$!);
    } else {      $r->print('<p><font size=+2><a href="'.$path.'">'.
               $r->print('Failed to copy: '.$!);        &mt('Back to Directory').'</a></font>');
               $r->print('<p><font size=+2><a href="'.$path.   }
                         '">'.&mt('Back to Directory').'</a></font>');      }
    }   } else {
        }      $r->print('<font size=+1 color=red>'.
         &mt('Please use browser "Back" button and pick a filename').
         '</font><p>');
    }
     } else {      } else {
        $r->print(   $r->print('<font size=+1 color=red>'.
    '<font size=+1 color=red>'.    &mt('Please use browser "Back" button and pick a filename').
 &mt('Please use browser "Back" button and pick a filename').'</font><p>');    '</font><p>');
     }      }
   } else {  
     $r->print(  
    '<font size=+1 color=red>'.&mt('Please use browser "Back" button and pick a filename').'</font><p>');  
   }  
 }  }
   
 # ---------------------------------------------------------------- Main Handler  # ---------------------------------------------------------------- Main Handler
 sub handler {  sub handler {
   
   my $r=shift;      my $r=shift;
   
   my $uname;      my $uname;
   my $udom;      my $udom;
 #  #
 # phase two: re-attach user  # phase two: re-attach user
 #  #
   if ($ENV{'form.uploaduname'}) {      if ($ENV{'form.uploaduname'}) {
       $ENV{'form.filename'}='/priv/'.$ENV{'form.uploaduname'}.'/'.   $ENV{'form.filename'}='/priv/'.$ENV{'form.uploaduname'}.'/'.
   $ENV{'form.filename'};      $ENV{'form.filename'};
   }      }
 #  #
   
   ($uname,$udom)=      ($uname,$udom)=
     &Apache::loncacc::constructaccess(   &Apache::loncacc::constructaccess($ENV{'form.filename'},
  $ENV{'form.filename'},$r->dir_config('lonDefDomain'));    $r->dir_config('lonDefDomain'));
   unless (($uname) && ($udom)) {      unless (($uname) && ($udom)) {
      $r->log_reason($uname.' at '.$udom.   $r->log_reason($uname.' at '.$udom.
          ' trying to publish file '.$ENV{'form.filename'}.         ' trying to publish file '.$ENV{'form.filename'}.
          ' - not authorized',          ' - not authorized', 
          $r->filename);          $r->filename); 
      return HTTP_NOT_ACCEPTABLE;   return HTTP_NOT_ACCEPTABLE;
   }      }
       
   my $fn;      my $fn;
   if ($ENV{'form.filename'}) {      if ($ENV{'form.filename'}) {
       $fn=$ENV{'form.filename'};   $fn=$ENV{'form.filename'};
       $fn=~s/^http\:\/\/[^\/]+\///;   $fn=~s/^http\:\/\/[^\/]+\///;
       $fn=~s/^\///;   $fn=~s/^\///;
       $fn=~s/(\~|priv\/)(\w+)//;   $fn=~s/(\~|priv\/)(\w+)//;
       $fn=~s/\/+/\//g;   $fn=~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); 
      return HTTP_NOT_FOUND;   return HTTP_NOT_FOUND;
   }      }
   
 # ----------------------------------------------------------- Start page output  # ----------------------------------------------------------- Start page output
   
   
   &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;      $r->send_http_header;
   
   $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');      $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
   
   $r->print(&Apache::loncommon::bodytag('Upload file to Construction Space'));      $r->print(&Apache::loncommon::bodytag('Upload file to Construction Space'));
       
   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><font color=red>'.&mt('Co-Author').': '.$uname.   $r->print('<h3><font color=red>'.&mt('Co-Author').': '.$uname.
  &mt(' at ').$udom.'</font></h3>');    &mt(' at ').$udom.'</font></h3>');
   }      }
   
   if ($ENV{'form.phase'} eq 'two') {      if ($ENV{'form.phase'} eq 'two') {
       &phasetwo($r,$fn,$uname,$udom);   &phasetwo($r,$fn,$uname,$udom);
   } else {      } else {
       &phaseone($r,$fn,$uname,$udom);   &phaseone($r,$fn,$uname,$udom);
   }      }
   
   $r->print('</body></html>');      $r->print('</body></html>');
   return OK;        return OK;  
 }  }
   
 1;  1;

Removed from v.1.21  
changed lines
  Added in v.1.22


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