Skip to content

Commit

Permalink
MDL-37802 repository: return error if unzipping files fails.
Browse files Browse the repository at this point in the history
For instance, when a user tried to unzip a password protected zip
archive using the file manager.
  • Loading branch information
paulholden committed Sep 25, 2020
1 parent 5486b03 commit 582bb53
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 1 deletion.
1 change: 1 addition & 0 deletions lang/en/repository.php
Expand Up @@ -58,6 +58,7 @@
$string['cannotdownloaddir'] = 'Cannot download this folder';
$string['cannotinitplugin'] = 'Call plugin_init failed';
$string['cannotunzipcontentunreadable'] = 'Cannot unzip this file because the contents of the file cannot be read.';
$string['cannotunzipextractfileerror'] = 'Cannot unzip this file because one or more of it\'s files cannot be read.';
$string['cannotunzipquotaexceeded'] = 'Cannot unzip this file because the maximum size allowed in this draft area will be exceeded.';
$string['cleancache'] = 'Clean my cache files';
$string['close'] = 'Close';
Expand Down
Binary file added lib/filestorage/tests/fixtures/passwordis1.zip
Binary file not shown.
18 changes: 18 additions & 0 deletions lib/filestorage/tests/zip_packer_test.php
Expand Up @@ -525,6 +525,24 @@ public function test_open_archive() {
unlink($archive);
}

/**
* Test opening an encrypted archive
*/
public function test_open_encrypted_archive() {
$this->resetAfterTest();

// The archive contains a single encrypted "hello.txt" file.
$archive = __DIR__ . '/fixtures/passwordis1.zip';

/** @var zip_packer $packer */
$packer = get_file_packer('application/zip');
$result = $packer->extract_to_pathname($archive, make_temp_directory('zip'));

$this->assertIsArray($result);
$this->assertArrayHasKey('hello.txt', $result);
$this->assertEquals('Can not read file from zip archive', $result['hello.txt']);
}

/**
* Tests the progress reporting.
*/
Expand Down
14 changes: 13 additions & 1 deletion repository/draftfiles_ajax.php
Expand Up @@ -227,8 +227,20 @@
$temppath = $fs->get_unused_dirname($usercontext->id, 'user', 'draft', $draftid, $filepath. pathinfo($filename, PATHINFO_FILENAME). '/');
$donotremovedirs = array();
$doremovedirs = array($temppath);

// Extract archive and move all files from $temppath to $filepath
if ($file->extract_to_storage($zipper, $usercontext->id, 'user', 'draft', $draftid, $temppath, $USER->id) !== false) {
if (($processed = $file->extract_to_storage($zipper, $usercontext->id, 'user', 'draft', $draftid, $temppath, $USER->id))
!== false) {

// Find all failures within the processed files, and return an error if any are found.
$failed = array_filter($processed, static function($result): bool {
return $result !== true;
});
if (count($failed) > 0) {
$return->error = get_string('cannotunzipextractfileerror', 'repository');
die(json_encode($return));
}

$extractedfiles = $fs->get_directory_files($usercontext->id, 'user', 'draft', $draftid, $temppath, true);
$xtemppath = preg_quote($temppath, '|');
foreach ($extractedfiles as $file) {
Expand Down

0 comments on commit 582bb53

Please sign in to comment.