--- loncom/publisher/lonupload.pm 2001/04/10 01:57:28 1.2
+++ loncom/publisher/lonupload.pm 2011/11/07 13:38:45 1.53.2.1
@@ -1,131 +1,568 @@
+
# The LearningOnline Network with CAPA
# Handler to upload files into construction space
#
-# (Handler to retrieve an old version of a file
+# $Id: lonupload.pm,v 1.53.2.1 2011/11/07 13:38:45 raeburn Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
-# (Publication Handler
-#
-# (TeX Content Handler
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
#
-# 05/29/00,05/30,10/11 Gerd Kortemeyer)
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
#
-# 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
-# 03/23 Guy Albertelli
-# 03/24,03/29 Gerd Kortemeyer)
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-# 03/31,04/03 Gerd Kortemeyer)
+# /home/httpd/html/adm/gpl.txt
#
-# 04/05,04/09 Gerd Kortemeyer
+# http://www.lon-capa.org/
+#
+###
+
+=head1 NAME
+
+Apache::lonupload - upload files into construction space
+
+=head1 SYNOPSIS
+
+Invoked by /etc/httpd/conf/srm.conf:
+
+
'.&mt('No upload file specified.').'
'); + return; + } + $fn=~s/\/[^\/]+$//; $fn=~s/([^\/])$/$1\//; - $fn.=$ENV{'form.upfile.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(''.&mt('Illegal filename.').'
'); + return; + } + + # Display additional options for upload + # and upload button + $r->print( + ''); + &Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title(&mt('Save uploaded file as')) + .'/priv/'.$uname.'/' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('File Type')) + .''.&Apache::loncommon::help_open_topic("Uploading_File_Options") + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + ); + $r->print( + '' + .'' + .'
' + .'' + ); + + # Check for bad extension and warn user + if ($fn=~/\.(\w+)$/ && + (&Apache::loncommon::fileembstyle($1) eq 'hdn')) { + $r->print(''
+ .&mt('The extension on this file, [_1], is reserved internally by LON-CAPA.',
+ ''.$1.'')
+ .'
'.&mt('Please change the extension.')
+ .'
'
+ .&mt('The extension on this file, [_1], is not recognized by LON-CAPA.',
+ ''.$1.'')
+ .'
'.&mt('Please change the extension.')
+ .'
View file'); - } else { - $r->print('Failed to copy: '.$!); - } - } + my ($r,$tfn,$uname,$udom,$mode)=@_; + my $output; + my $action = '/adm/upload'; + my $returnflag = ''; + if ($mode eq 'testbank') { + $action = '/adm/testbank'; + } elsif ($mode eq 'imsimport') { + $action = '/adm/imsimport'; + } + my $fn='/priv/'.$uname.'/'.$tfn; + $fn=~s/\/+/\//g; + &Debug($r, "Filename is ".$tfn); + if ($tfn) { + &Debug($r, "Filename for tfn = ".$tfn); + my $target='/home/'.$uname.'/public_html'.$tfn; + &Debug($r, "target -> ".$target); +# target is the full filesystem path of the destination file. + my $base = &File::Basename::basename($fn); + my $path = &File::Basename::dirname($fn); + $base = &HTML::Entities::encode($base,'<>&"'); + my $url = $path."/".$base; + &Debug($r, "URL is now ".$url); + my $datatoken=$env{'form.datatoken'}; + if (($fn) && ($datatoken)) { + if ($env{'form.cancel'}) { + my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp'; + my $dirpath=$path.'/'; + $dirpath=~s/\/+/\//g; + $output .= '
'.&mt('Upload cancelled.').'
' + .''. + &mt('Back to Directory').'
'; + } elsif ((-e $target) && (!$env{'form.override'})) { + $output .= ''; + } else { + my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp'; + my $dirpath=$path.'/'; + $dirpath=~s/\/+/\//g; + # Check for bad extension and disallow upload + my $result; + ($result,$returnflag) = &check_extension($fn,$mode,$source,$target,$action,$dirpath,$url); + $output .= $result; + } + } else { + $output .= ''. + &mt('Please use browser "Back" button and pick a filename'). + '');
- &phaseone($r,$fn,$uname,$udom);
+ $output .= ''.
+ &mt('Please use browser "Back" button and pick a filename').
+ '
';
}
+ return ($output,$returnflag);
}
+sub check_extension {
+ my ($fn,$mode,$source,$target,$action,$dirpath,$url) = @_;
+ my ($result,$returnflag);
+ # Check for bad extension and disallow upload
+ if ($fn=~/\.(\w+)$/ &&
+ (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
+ $result .= '
'.
+ &mt('File [_1] could not be copied.',
+ ''.$fn.' ').
+ '
'.
+ &mt('The extension on this file is reserved internally by LON-CAPA.').
+ '
'.
+ &mt('File [_1] could not be copied.',
+ ''.$fn.' ').
+ '
'.
+ &mt('The extension on this file is not recognized by LON-CAPA.').
+ '
'.
+ &mt('File [_1] could not be copied.',
+ ''.$fn.'').
+ '
'.
+ &mt('The target is an existing directory.').
+ '
' + .&mt('Your file - [_1] - was uploaded successfully.', + ''.$fn.'') + .'
'; + } else { + $result .= '' + .&mt('File copied.') + .'
'; + } + # Check for embedded objects. + my (%allfiles,%codebase); + my ($text,$header,$css,$js); + if (($mode ne 'imsimport') && ($target =~ /\.(htm|html|shtml)$/i)) { + my (%allfiles,%codebase); + &Apache::lonnet::extract_embedded_items($target,\%allfiles,\%codebase); + if (keys(%allfiles) > 0) { + my ($currentpath) = ($url =~ m{^(.+)/[^/]+$}); + my $state = &embedded_form_elems('upload_embedded',$url,$mode); + my ($embedded,$num,$pathchg) = + &Apache::loncommon::ask_for_embedded_content($action,$state,\%allfiles, + \%codebase, + {'error_on_invalid_names' => 1, + 'ignore_remote_references' => 1, + 'current_path' => $currentpath}); + if ($embedded) { + $result .= ''.&mt('Completed upload of the file.').' '.&mt('This file contained references to other files.').'
'. + ''.&mt('Please select the locations from which the referenced files are to be uploaded.').'
'. + $embedded; + if ($mode eq 'testbank') { + $returnflag = 'embedded'; + $result .= ''.&mt('Or [_1]continue[_2] the testbank import without these files.','','').'
'; + } + } else { + $result .= ''.&mt('Completed upload of the file.').'
'.$embedded; + if ($pathchg) { + if ($mode eq 'testbank') { + $returnflag = 'embedded'; + $result .= ''.&mt('Or [_1]continue[_2] the testbank import without modifying the references(s).','','').'
'; + } + } + } + } + } + } + if (($mode ne 'imsimport') && ($mode ne 'testbank')) { + $result .= '' + .&mt('Co-Author [_1]',$uname.':'.$udom) + .'
' + ); + } + 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); + } elsif ($env{'form.phase'} eq 'two') { + my ($output,$returnflag) = &phasetwo($r,$fn,$uname,$udom); + $r->print($output); + } else { + &phaseone($r,$fn,$uname,$udom); + } - $r->print(''); - return OK; + $r->print(&Apache::loncommon::end_page()); + return OK; } + +1; +__END__ + +