--- loncom/publisher/lonupload.pm 2001/04/05 19:35:15 1.1 +++ loncom/publisher/lonupload.pm 2008/12/21 04:43:41 1.38.2.3 @@ -1,164 +1,466 @@ + # 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.38.2.3 2008/12/21 04:43:41 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 Gerd Kortemeyer +# http://www.lon-capa.org/ +# +### package Apache::lonupload; use strict; use Apache::File; use File::Copy; +use File::Basename; use Apache::Constants qw(:common :http :methods); +use Apache::loncacc; +use Apache::loncommon(); +use Apache::lonnet; +use HTML::Entities(); +use Apache::lonlocal; +use Apache::lonnet; +use LONCAPA(); + +my $DEBUG=0; + +sub Debug { + # Put out the indicated message but only if DEBUG is true. + if ($DEBUG) { + my ($r,$message) = @_; + $r->log_reason($message); + } +} -sub phaseone { - my ($r,$fn,$uname,$udom)=@_; - my $docroot=$r->dir_config('lonDocRoot'); - - my $urldir='/res/'.$udom.'/'.$uname.$fn; - $urldir=~s/\/[^\/]+$/\//; - - my $resfn=$docroot.'/res/'.$udom.'/'.$uname.$fn; - my $resdir=$resfn; - $resdir=~s/\/[^\/]+$/\//; - - $fn=~/^\/(.+)\.(\w+)$/; - my $main=$1; - my $suffix=$2; +sub upfile_store { + my $r=shift; + + my $fname=$env{'form.upfile.filename'}; + $fname=~s/\W//g; + + chomp($env{'form.upfile'}); - $r->print('
'); } sub phasetwo { - my ($r,$fn,$uname,$udom)=@_; - if ($ENV{'form.version'}) { - my $version=$ENV{'form.version'}; - if ($version eq 'new') { - $r->print(''. + &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).'".&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','','').'
'; + } + } } - print $logfile -"\n\n================= Retrieve ".localtime()." ================\n". -"Version: $version\nSource: $csource\nTarget: $ctarget\n"; - $r->print('Copying file: '); - if (copy($csource,$ctarget)) { - $r->print('ok
'); - print $logfile "Copied sucessfully.\n\n"; - } else { - my $error=$!; - $r->print('fail, '.$error.'
');
- print $logfile "Copy failed: $error\n\n";
+ if (($mode ne 'imsimport') && ($mode ne 'testbank')) {
+ $result .= '
'.
+ &mt('View file').'';
}
- $r->print('Back to '.$fn.'');
} else {
- $r->print(
- 'Please pick a version to retrieve
');
- &phaseone($r,$fn,$uname,$udom);
+ $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
sub handler {
- my $r=shift;
+ my $r=shift;
- my $fn;
+ 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.filename'}) {
- $fn=$ENV{'form.filename'};
- $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)//;
- } else {
- $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
- ' unspecified filename for retrieval', $r->filename);
- return HTTP_NOT_FOUND;
- }
-
- unless ($fn) {
- $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
- ' trying to retrieve non-existing file', $r->filename);
- return HTTP_NOT_FOUND;
- }
+ 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
- my $uname=$ENV{'user.name'};
- my $udom=$ENV{'user.domain'};
-
- $r->content_type('text/html');
- $r->send_http_header;
- $r->print('