--- loncom/publisher/lonupload.pm 2003/08/04 17:45:06 1.18
+++ loncom/publisher/lonupload.pm 2010/10/27 01:04:15 1.50
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# Handler to upload files into construction space
#
-# $Id: lonupload.pm,v 1.18 2003/08/04 17:45:06 www Exp $
+# $Id: lonupload.pm,v 1.50 2010/10/27 01:04:15 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -28,6 +28,92 @@
#
###
+=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. -# Fn is the full path to the destination filename. -# - + # Check for illegal filename &Debug($r, "Filename for upload: $fn"); - if (($fn) && ($fn!~/\/$/)) { - $r->print( - ''); - # Check for bad extension and warn user - if ($fn=~/\.(\w+)$/ && - (&Apache::loncommon::fileembstyle($1) eq 'hdn')) { - $r->print( - ''. - 'The extension on this file, "'.$1. - '", is reserved internally by LON-CAPA.'.&mt('Illegal filename.').'
'); + return; + } + + # Display additional options for upload + # and upload button + $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.')
+ .'
'.&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'). + ''.
+ &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 = <'.&mt('Completed upload of the file. 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','','').'
'; + } + } + } + if (($mode ne 'imsimport') && ($mode ne 'testbank')) { + $result .= 'View file'); - $r->print('
Back to Directory'); - } else { - $r->print('Failed to copy: '.$!); - } - } - } else { - $r->print( - 'Please pick a filename
');
- &phaseone($r,$fn,$uname,$udom);
+ $result = &Apache::loncommon::upload_embedded($mode,$path,$uname,$udom,
+ $dir_root,$url_root);
+ if ($mode ne 'imsimport' && $mode ne 'testbank') {
+ $result = '
'.
+ &mt('View main file').''.
+ '
'.
+ &mt('Back to Directory').'
';
}
- } else {
- $r->print(
- 'Please pick a filename
'); - &phaseone($r,$fn,$uname,$udom); - } + return $result; } # ---------------------------------------------------------------- Main Handler sub handler { - my $r=shift; + my $r=shift; - my $uname; - my $udom; + my $uname; + my $udom; + my $javascript = ''; # # phase two: re-attach user # - if ($ENV{'form.uploaduname'}) { - $ENV{'form.filename'}='/priv/'.$ENV{'form.uploaduname'}.'/'. - $ENV{'form.filename'}; - } -# - - ($uname,$udom)= - &Apache::loncacc::constructaccess( - $ENV{'form.filename'},$r->dir_config('lonDefDomain')); - unless (($uname) && ($udom)) { - $r->log_reason($uname.' at '.$udom. - ' trying to publish file '.$ENV{'form.filename'}. - ' - not authorized', - $r->filename); - return HTTP_NOT_ACCEPTABLE; - } - - my $fn; - if ($ENV{'form.filename'}) { - $fn=$ENV{'form.filename'}; - $fn=~s/^http\:\/\/[^\/]+\///; - $fn=~s/^\///; - $fn=~s/(\~|priv\/)(\w+)//; - $fn=~s/\/+/\//g; - } else { - $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}. - ' unspecified filename for upload', $r->filename); - return HTTP_NOT_FOUND; - } + if ($env{'form.uploaduname'}) { + $env{'form.filename'}='/priv/'.$env{'form.uploaduname'}.'/'. + $env{'form.filename'}; + } + + unless ($env{'form.phase'} eq 'two') { + $javascript = qq| +function verifyForm() { + var mode = document.fileupload.filetype.options[document.fileupload.filetype.selectedIndex].value + if (mode == "testbank") { + document.fileupload.action = "/adm/testbank"; + } + if (mode == "imsimport") { + document.fileupload.action = "/adm/imsimport"; + } + if (mode == "standard") { + document.fileupload.action = "/adm/upload"; + } + document.fileupload.submit(); +} + |; + } + ($uname,$udom)= + &Apache::loncacc::constructaccess($env{'form.filename'}, + $r->dir_config('lonDefDomain')); + + unless (($uname) && ($udom)) { + $r->log_reason($uname.' at '.$udom. + ' trying to publish file '.$env{'form.filename'}. + ' - not authorized', + $r->filename); + return HTTP_NOT_ACCEPTABLE; + } + + my $fn; + if ($env{'form.filename'}) { + $fn=$env{'form.filename'}; + $fn=~s/^https?\:\/\/[^\/]+\///; + $fn=~s/^\///; + $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 - $r->content_type('text/html'); - $r->send_http_header; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; - $r->print('
' + .&mt('Co-Author [_1]',$uname.':'.$udom) + .'
' + ); + } - if ($ENV{'form.phase'} eq 'two') { - &phasetwo($r,$fn,$uname,$udom); - } else { - &phaseone($r,$fn,$uname,$udom); - } + if ($env{'form.phase'} eq 'three') { + my $output = &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('