[LON-CAPA-cvs] cvs: loncom /interface multidownload.pl
raeburn
raeburn at source.lon-capa.org
Sun Nov 5 13:19:41 EST 2017
raeburn Sun Nov 5 18:19:41 2017 EDT
Modified files:
/loncom/interface multidownload.pl
Log:
- Replace use of system() with use of File::Path::remove_tree() and
Archive::Zip. LONCAPA-prerequisites will need perl-Archive-Zip added.
Index: loncom/interface/multidownload.pl
diff -u loncom/interface/multidownload.pl:1.40 loncom/interface/multidownload.pl:1.41
--- loncom/interface/multidownload.pl:1.40 Fri Nov 3 18:08:54 2017
+++ loncom/interface/multidownload.pl Sun Nov 5 18:19:41 2017
@@ -2,7 +2,7 @@
# CGI-script to allow download of all essay submissions of
# multiple students.
#
-# $Id: multidownload.pl,v 1.40 2017/11/03 18:08:54 raeburn Exp $
+# $Id: multidownload.pl,v 1.41 2017/11/05 18:19:41 raeburn Exp $
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
@@ -31,6 +31,7 @@
use File::Path;
use File::Basename;
use File::Copy;
+use Archive::Zip qw( :ERROR_CODES );
use Apache::lonhtmlcommon();
use Apache::lonnavmaps();
use Apache::loncommon();
@@ -38,6 +39,7 @@
use Apache::lonmsg();
use Apache::lonnet;
use LONCAPA::Enrollment;
+use LONCAPA;
use strict;
sub is_flat {
@@ -74,7 +76,7 @@
$|=1;
&Apache::lonlocal::get_language_handle();
&Apache::loncommon::content_type(undef,'text/html');
-my ($nocookie,$identifier,$unique_path,$scope);
+my ($nocookie,$identifier,$unique_path,$scope,$unique_user);
if (! &LONCAPA::loncgi::check_cookie_and_load_env()) {
print(&LONCAPA::loncgi::missing_cookie_msg());
$nocookie = 1;
@@ -89,6 +91,10 @@
$identifier = $ENV{'QUERY_STRING'};
$unique_path = $identifier.time();
}
+ if (($env{'user.name'} =~ /^$LONCAPA::match_username$/) &&
+ ($env{'user.domain'} =~ /^$LONCAPA::match_domain$/)) {
+ $unique_user = $env{'user.name'}.':'.$env{'user.domain'};
+ }
print(&Apache::loncommon::start_page('Multiple Downloads'));
}
if ($scope eq '') {
@@ -101,6 +107,14 @@
print(&mt('You are not authorized to download student submissions.'));
}
}
+} elsif ($unique_user eq '') {
+ unless ($nocookie) {
+ if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') {
+ print(&mt('Characters in your username and/or domain prevent download of submissions.'));
+ } else {
+ print(&mt('You are not authorized to download student submissions.'));
+ }
+ }
} elsif (&Apache::lonnet::allowed('vgr',$scope) eq 'F') {
my $symb = $env{'cgi.'.$identifier.'.symb'};
my $navmap = Apache::lonnavmaps::navmap->new();
@@ -109,6 +123,7 @@
my ($flat_part, $flat_resp) = &is_flat($partlist, $res);
my ($zipout) = ($symb =~ /^.*\/(.+)\.problem$/);
$zipout =~ s/\s/_/g;
+ $zipout =~ s/[^\w.\-]+//g;
$zipout .= "$identifier.zip";
my $courseid = $env{'request.course.id'};
my @stuchecked = split(/\n/,$env{'cgi.'.$identifier.'.students'});
@@ -116,11 +131,10 @@
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('',$number_of_students);
my @parts = split(/\n/,$env{'cgi.'.$identifier.'.parts'});
my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'};
- my $uname = $env{'user.name'};
- my $udom = $env{'user.domain'};
- my $unique_user = $uname.":".$udom;
my $manifest;
- &mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700);
+ unless (-d "$doc_zip_root/zipdir/$unique_user/$unique_path") {
+ &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700);
+ }
if (open(MANIFEST, ">$doc_zip_root/zipdir/$unique_user/$unique_path/manifest.txt")) {
$manifest = 1;
print MANIFEST (&mt("Zip file generated on [_1]",&Apache::lonlocal::locallocaltime(time()))."\n");
@@ -148,7 +162,7 @@
my @ids = $res->responseIds($partid);
foreach my $respid (@ids) {
my $part_resp_path = &get_part_resp_path($flat_part,$flat_resp, $partid, $respid);
- &mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700);
+ &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700);
foreach my $origin ('portfiles','uploadedurl') {
my @files;
if ($record{"resource.$partid.$respid.$origin"} ne '') {
@@ -194,27 +208,41 @@
print MANIFEST ("\t".&mt("No Files Submitted")."\n");
}
}
-
- &mkpath($doc_zip_root."/zipout/$unique_user",0,0700);
- my $statement;
- if (! -e "$doc_zip_root/zipout/$unique_user/$zipout") {
- $statement = "cd $doc_zip_root/zipdir/$unique_user/$unique_path\n";
- $statement .= "zip -r $doc_zip_root/zipout/$unique_user/$zipout * > /dev/null";
- system($statement);
- } else {
- # should happen only if user reloads page
- &Apache::lonnet::logthis("$zipout is already there");
- }
- $statement = "rm -rf $doc_zip_root/zipdir/$unique_user/$unique_path";
- system($statement);
- &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
- print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'.
- &mt("Click to download").'</a></p><br />');
if ($manifest) {
close(MANIFEST);
}
+ my $madezip;
+ unless (-d "$doc_zip_root/zipout/$unique_user") {
+ &File::Path::mkpath($doc_zip_root."/zipout/$unique_user",0,0700);
+ }
+ if ((-d "$doc_zip_root/zipout/$unique_user") &&
+ (-d "$doc_zip_root/zipdir/$unique_user/$unique_path")) {
+ if (!-e "$doc_zip_root/zipout/$unique_user/$zipout") {
+ my $zip = Archive::Zip->new();
+ $zip->addTree("$doc_zip_root/zipdir/$unique_user/$unique_path");
+ if ($zip->writeToFileNamed("$doc_zip_root/zipout/$unique_user/$zipout") == AZ_OK) {
+ $madezip = 1;
+ }
+ } else {
+ $madezip = 1;
+ # should happen only if user reloads page
+ &Apache::lonnet::logthis("$zipout is already there");
+ }
+ &File::Path::remove_tree("$doc_zip_root/zipdir/$unique_user/$unique_path",{ safe => 1, });
+ }
+ &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
+ if ($madezip) {
+ print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'.
+ &mt("Click to download").'</a></p><br />');
+ } else {
+ print('<p class="LC_error">'.
+ &mt('Failed to create zip archive of student submissions').
+ '</p>');
+ }
} else {
- print(&mt('You are not authorized to download student submissions.'));
+ print('<p class="LC_error">'.
+ &mt('You are not authorized to download student submissions.').
+ '</p>');
}
unless ($nocookie) {
print(&Apache::loncommon::end_page());
More information about the LON-CAPA-cvs
mailing list