--- loncom/publisher/lonupload.pm 2006/12/06 22:22:39 1.34
+++ loncom/publisher/lonupload.pm 2008/06/17 02:20:08 1.37
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# Handler to upload files into construction space
#
-# $Id: lonupload.pm,v 1.34 2006/12/06 22:22:39 albertel Exp $
+# $Id: lonupload.pm,v 1.37 2008/06/17 02:20:08 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -71,7 +71,6 @@ sub upfile_store {
return $datatoken;
}
-
sub phaseone {
my ($r,$fn,$uname,$udom,$mode)=@_;
my $action = '/adm/upload';
@@ -99,7 +98,7 @@ sub phaseone {
''.
''.&mt('Store uploaded file as ').
+ '" />'.&mt('Save uploaded file as ').
"/priv/$uname/".
' '.
@@ -112,7 +111,7 @@ sub phaseone {
');
- $r->print('');
+ $r->print('');
# Check for bad extension and warn user
if ($fn=~/\.(\w+)$/ &&
(&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
@@ -136,6 +135,7 @@ sub phaseone {
sub phasetwo {
my ($r,$tfn,$uname,$udom,$mode)=@_;
+ my $output;
my $action = '/adm/upload';
my $returnflag = '';
if ($mode eq 'testbank') {
@@ -158,73 +158,131 @@ sub phasetwo {
&Debug($r, "URL is now ".$url);
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---.
- if ($mode eq 'testbank' || $mode eq 'imsimport') {
- $r->print(&mt("Your file - $fn - was uploaded successfully")."
");
- $returnflag = 'ok';
- } else {
- $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.")."
'.&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 $returnflag;
+ return $result;
}
# ---------------------------------------------------------------- Main Handler
@@ -244,20 +302,6 @@ sub handler {
}
unless ($env{'form.phase'} eq 'two') {
- my %body_layout = ('rightmargin' => "0",
- 'leftmargin' => "0",
- 'marginwidth' => "0",
- 'topmargin' => "0",
- 'marginheight' => "0");
- my $start_page =
- &Apache::loncommon::start_page('Importing a Testbank file into LON-CAPA',
- undef,
- {'only_body' => 1,
- 'add_entries' => \%body_layout,
- 'js_ready' => 1,});
- my $end_page =
- &Apache::loncommon::end_page({'js_ready' => 1,});
-
$javascript = qq|
function verifyForm() {
var mode = document.fileupload.filetype.options[document.fileupload.filetype.selectedIndex].value
@@ -277,6 +321,7 @@ function verifyForm() {
($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'}.
@@ -311,12 +356,16 @@ function verifyForm() {
$javascript));
if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
- $r->print('
'.&mt('Co-Author').': '.$uname.
- &mt(' at ').$udom.'
');
+ $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);
}
@@ -370,12 +419,14 @@ Start page output
=item *
-output relevant interface phase (phaseone or phasetwo)
+output relevant interface phase (phaseone or phasetwo or phasethree)
=item *
(phase one is to specify upload file; phase two is to handle conditions
-subsequent to specification--like overwriting an existing file)
+subsequent to specification--like overwriting an existing file; phase three
+is to handle processing of secondary uploads - of embedded objects in an
+html file).
=back
@@ -394,9 +445,20 @@ as overwriting an existing file).
=item *
+phasethree() : Interface for handling secondary uploads of embedded objects
+in an html file.
+
+=item *
+
upfile_store() : Store contents of uploaded file into temporary space. Invoked
by phaseone subroutine.
+= item *
+
+check_extension() : Checks if filename extension is permitted and checks type
+ of file - if html file, calls parser to check for embedded objects.
+ Invoked by phasetwo subroutine.
+
=back
=cut