--- loncom/publisher/lonupload.pm 2003/11/08 11:13:50 1.24
+++ loncom/publisher/lonupload.pm 2008/07/18 03:27:48 1.38
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# Handler to upload files into construction space
#
-# $Id: lonupload.pm,v 1.24 2003/11/08 11:13:50 albertel Exp $
+# $Id: lonupload.pm,v 1.38 2008/07/18 03:27:48 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,55 +37,54 @@ use File::Basename;
use Apache::Constants qw(:common :http :methods);
use Apache::loncacc;
use Apache::loncommon();
-use Apache::Log();
use Apache::lonnet;
use HTML::Entities();
use Apache::lonlocal;
+use Apache::lonnet;
+use LONCAPA();
my $DEBUG=0;
sub Debug {
-
- # Marshall the parameters.
-
- my $r = shift;
- my $log = $r->log;
- my $message = shift;
-
- # Put out the indicated message butonly if DEBUG is false.
-
+ # Put out the indicated message but only if DEBUG is true.
if ($DEBUG) {
- $log->debug($message);
+ my ($r,$message) = @_;
+ $r->log_reason($message);
}
}
sub upfile_store {
my $r=shift;
- my $fname=$ENV{'form.upfile.filename'};
+ my $fname=$env{'form.upfile.filename'};
$fname=~s/\W//g;
- chomp($ENV{'form.upfile'});
+ chomp($env{'form.upfile'});
- my $datatoken=$ENV{'user.name'}.'_'.$ENV{'user.domain'}.
+ my $datatoken=$env{'user.name'}.'_'.$env{'user.domain'}.
'_upload_'.$fname.'_'.time.'_'.$$;
{
my $fh=Apache::File->new('>'.$r->dir_config('lonDaemons').
'/tmp/'.$datatoken.'.tmp');
- print $fh $ENV{'form.upfile'};
+ print $fh $env{'form.upfile'};
}
return $datatoken;
}
-
sub phaseone {
- my ($r,$fn,$uname,$udom)=@_;
- $ENV{'form.upfile.filename'}=~s/\\/\//g;
- $ENV{'form.upfile.filename'}=~s/^.*\/([^\/]+)$/$1/;
- if ($ENV{'form.upfile.filename'}) {
+ my ($r,$fn,$uname,$udom,$mode)=@_;
+ my $action = '/adm/upload';
+ if ($mode eq 'testbank') {
+ $action = '/adm/testbank';
+ } elsif ($mode eq 'imsimport') {
+ $action = '/adm/imsimport';
+ }
+ $env{'form.upfile.filename'}=~s/\\/\//g;
+ $env{'form.upfile.filename'}=~s/^.*\/([^\/]+)$/$1/;
+ if ($env{'form.upfile.filename'}) {
$fn=~s/\/[^\/]+$//;
$fn=~s/([^\/])$/$1\//;
- $fn.=$ENV{'form.upfile.filename'};
+ $fn.=$env{'form.upfile.filename'};
$fn=~s/^\///;
$fn=~s/(\/)+/\//g;
@@ -94,39 +93,56 @@ sub phaseone {
&Debug($r, "Filename for upload: $fn");
if (($fn) && ($fn!~/\/$/)) {
- $r->print('
');
+ '" />'.&mt('Save uploaded file as ').
+ "/priv/$uname/".
+ '
'.
+ '
'.&mt('Choose file type:').'
+'.&Apache::loncommon::help_open_topic("Uploading_File_Options").'
+
+
+');
+ $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,').
+ $r->print(''.&mt('The extension on this file,').
' "'.$1.'"'.&mt(', is reserved internally by LON-CAPA.').
- '
'.&mt('Please change the extension.').'');
+ '
'.&mt('Please change the extension.').'');
} elsif($fn=~/\.(\w+)$/ &&
!defined(&Apache::loncommon::fileembstyle($1))) {
- $r->print(''.&mt('The extension on this file,').
+ $r->print(''.&mt('The extension on this file,').
' "'.$1.'"'.&mt(', is not recognized by LON-CAPA.').
'
'.&mt('Please change the extension.').
- '');
+ '');
}
} else {
- $r->print(''.&mt('Illegal filename.').'');
+ $r->print(''.&mt('Illegal filename.').'');
}
} else {
- $r->print(''.&mt('No upload file specified.').'');
+ $r->print(''.&mt('No upload file specified.').'');
}
}
sub phasetwo {
- my ($r,$tfn,$uname,$udom)=@_;
+ 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);
@@ -137,70 +153,136 @@ sub phasetwo {
# 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);
+ $base = &HTML::Entities::encode($base,'<>&"');
my $url = $path."/".$base;
&Debug($r, "URL is now ".$url);
- my $datatoken=$ENV{'form.datatoken'};
+ my $datatoken=$env{'form.datatoken'};
if (($fn) && ($datatoken)) {
- if ((-e $target) && ($ENV{'form.override'} ne 'Yes')) {
- $r->print('');
- } else {
+ ''.
+ ''.
+ '';
+ } else {
my $source=$r->dir_config('lonDaemons').'/tmp/'.$datatoken.'.tmp';
+ my $dirpath=$path.'/';
+ $dirpath=~s/\/+/\//g;
# Check for bad extension and disallow upload
- if ($fn=~/\.(\w+)$/ &&
- (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
- $r->print(&mt('File').' '.$fn.' '.
- &mt('could not be copied.').'
'.
- ''.
- &mt('The extension on this file is reserved internally by LON-CAPA.').
- '');
- $r->print('
'.
- &mt('Back to Directory').'');
- } elsif ($fn=~/\.(\w+)$/ &&
- !defined(&Apache::loncommon::fileembstyle($1))) {
- $r->print(&mt('File').' '.$fn.' '.
- &mt('could not be copied.').'
'.
- ''.
- &mt('The extension on this file is not recognized by LON-CAPA.').
- '');
- $r->print('
'.
- &mt('Back to Directory').'');
- } elsif (-d $target) {
- $r->print('File '.$fn.' could not be copied.
'.
- ''.
- &mt('The target is an existing directory.').
- '
');
- $r->print(''.
- &mt('Back to Directory').'');
- } elsif (copy($source,$target)) {
- chmod(0660, $target); # Set permissions to rw-rw---.
- $r->print(&mt('File copied.'));
- $r->print('
'.
- &mt('View file').'');
- $r->print('
'.
- &mt('Back to Directory').'
');
- } else {
- $r->print('Failed to copy: '.$!);
- $r->print('
'.
- &mt('Back to Directory').'');
- }
+ my $result;
+ ($result,$returnflag) = &check_extension($fn,$mode,$source,$target,$action,$dirpath,$url);
+ $output .= $result;
}
} else {
- $r->print(''.
+ $output .= ''.
&mt('Please use browser "Back" button and pick a filename').
- '
');
+ '
';
}
} else {
- $r->print(''.
- &mt('Please use browser "Back" button and pick a filename').
- '
>');
+ $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.').
+ '';
+ } elsif ($fn=~/\.(\w+)$/ &&
+ !defined(&Apache::loncommon::fileembstyle($1))) {
+ $result .= &mt('File [_1] could not be copied.',
+ ''.$fn.' ').
+ '
'.
+ &mt('The extension on this file is not recognized by LON-CAPA.').
+ '';
+ } elsif (-d $target) {
+ $result .= &mt('File [_1] could not be copied.',
+ ''.$fn.'').
+ '
'.
+ &mt('The target is an existing directory.').
+ '';
+ } elsif (copy($source,$target)) {
+ chmod(0660, $target); # Set permissions to rw-rw---.
+ if ($mode eq 'testbank' || $mode eq 'imsimport') {
+ $returnflag = 'ok';
+ $result .= &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 $state = <
+
+
+
+
+STATE
+ $result .= "".&mt("Reference Warning")."
".
+ "".&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.")."
".
+ &Apache::loncommon::ask_for_embedded_content($action,$state,\%allfiles,\%codebase,
+ {'error_on_invalid_names' => 1,
+ 'ignore_remote_references' => 1,});
+ 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 .= '
'.
+ &mt('View file').'';
+ }
+ } else {
+ $result .= &mt('Failed to copy: [_1].',$!);
+ }
+ if ($mode ne 'imsimport' && $mode ne 'testbank') {
+ $result .= '
'.
+ &mt('Back to Directory').'
';
+ }
+ return ($result,$returnflag);
+}
+
+sub phasethree {
+ my ($r,$fn,$uname,$udom,$mode) = @_;
+ my $result;
+ my $dir_root = '/home/'.$uname.'/public_html';
+ my $url_root = '/priv/'.$uname;
+ my $base = &File::Basename::basename($fn);
+ my $path = &File::Basename::dirname($fn);
+ $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').'
';
+ }
+ return $result;
}
# ---------------------------------------------------------------- Main Handler
@@ -210,35 +292,53 @@ sub handler {
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'};
+ 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'},
+ &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'}.
+ ' 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'};
+ if ($env{'form.filename'}) {
+ $fn=$env{'form.filename'};
$fn=~s/^http\:\/\/[^\/]+\///;
$fn=~s/^\///;
- $fn=~s/(\~|priv\/)(\w+)//;
+ $fn=~s{(~|priv/)($LONCAPA::username_re)}{};
$fn=~s/\/+/\//g;
} 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);
return HTTP_NOT_FOUND;
}
@@ -249,22 +349,28 @@ sub handler {
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
- $r->print('LON-CAPA Construction Space');
+ $javascript = "\n";
- $r->print(&Apache::loncommon::bodytag('Upload file to Construction Space'));
+ $r->print(&Apache::loncommon::start_page('Upload file to Construction Space',
+ $javascript));
- if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
- $r->print(''.&mt('Co-Author').': '.$uname.
- &mt(' at ').$udom.'
');
+ if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
+ $r->print(''.&mt('Co-Author').': '.$uname.
+ &mt(' at ').$udom.'
');
}
- if ($ENV{'form.phase'} eq 'two') {
- &phasetwo($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('