From dae2f76b7db12a6e21911b7d26aa7265b2cb6191 Mon Sep 17 00:00:00 2001 From: Neill Magill Date: Fri, 1 Jun 2018 10:48:58 +0100 Subject: [PATCH 1/2] MDL-49025 assign: Test than an empty directory will not submit --- .../submission/file/tests/locallib_test.php | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/mod/assign/submission/file/tests/locallib_test.php b/mod/assign/submission/file/tests/locallib_test.php index b033946bb33..c055ecedc80 100644 --- a/mod/assign/submission/file/tests/locallib_test.php +++ b/mod/assign/submission/file/tests/locallib_test.php @@ -72,6 +72,34 @@ class assignsubmission_file_locallib_testcase extends advanced_testcase { $this->assertTrue($result === $expected); } + /** + * Test that an empty directory is is not detected as a valid submission by submission_is_empty. + */ + public function test_submission_is_empty_directory_only() { + $this->resetAfterTest(); + $course = $this->getDataGenerator()->create_course(); + $student = $this->getDataGenerator()->create_and_enrol($course, 'student'); + $assign = $this->create_instance($course, [ + 'assignsubmission_file_enabled' => 1, + 'assignsubmission_file_maxfiles' => 12, + 'assignsubmission_file_maxsizebytes' => 10, + ]); + $this->setUser($student->id); + $itemid = file_get_unused_draft_itemid(); + $submission = (object)['files_filemanager' => $itemid]; + $plugin = $assign->get_submission_plugin_by_type('file'); + $fs = get_file_storage(); + $fs->create_directory( + context_user::instance($student->id)->id, + 'user', + 'draft', + $itemid, + '/subdirectory/' + ); + + $this->assertTrue($plugin->submission_is_empty($submission)); + } + /** * Test new_submission_empty * @@ -105,6 +133,34 @@ class assignsubmission_file_locallib_testcase extends advanced_testcase { $this->assertTrue($result === $expected); } + /** + * Test that an empty directory is is not detected as a valid submission by new_submission_is_empty. + */ + public function test_new_submission_empty_directory_only() { + $this->resetAfterTest(); + $course = $this->getDataGenerator()->create_course(); + $student = $this->getDataGenerator()->create_and_enrol($course, 'student'); + $assign = $this->create_instance($course, [ + 'assignsubmission_file_enabled' => 1, + 'assignsubmission_file_maxfiles' => 12, + 'assignsubmission_file_maxsizebytes' => 10, + ]); + $this->setUser($student->id); + $itemid = file_get_unused_draft_itemid(); + $submission = (object)['files_filemanager' => $itemid]; + $plugin = $assign->get_submission_plugin_by_type('file'); + $fs = get_file_storage(); + $fs->create_directory( + context_user::instance($student->id)->id, + 'user', + 'draft', + $itemid, + '/subdirectory/' + ); + + $this->assertTrue($assign->new_submission_empty($submission)); + } + /** * Dataprovider for the test_submission_is_empty testcase * @@ -121,6 +177,15 @@ class assignsubmission_file_locallib_testcase extends advanced_testcase { ], false ], + 'With file in directory' => [ + [ + 'component' => 'user', + 'filearea' => 'draft', + 'filepath' => '/subdir/', + 'filename' => 'not_a_virus.exe' + ], + false + ], 'Without file' => [null, true] ]; } From 3c5064892c61201b4a82486cfa3a29061c2b3e90 Mon Sep 17 00:00:00 2001 From: Neill Magill Date: Fri, 1 Jun 2018 10:53:06 +0100 Subject: [PATCH 2/2] MDL-49025 assign: Submissions of an empty directory should not save Before this change if only a folder was submitted the submission_is_empty check would return true. This meant that the draft area would be saved. The is_empty check would then be called which would return false. This caused the submission form to indicate to the user that the submission had failed. Now is_empty and submission_is_empty should both return false if only folders are submitted. --- mod/assign/submission/file/locallib.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mod/assign/submission/file/locallib.php b/mod/assign/submission/file/locallib.php index 2a02a855fcb..3b1959bf7f3 100644 --- a/mod/assign/submission/file/locallib.php +++ b/mod/assign/submission/file/locallib.php @@ -513,8 +513,16 @@ class assign_submission_file extends assign_submission_plugin { * @return bool */ public function submission_is_empty(stdClass $data) { - $files = file_get_drafarea_files($data->files_filemanager); - return count($files->list) == 0; + global $USER; + $fs = get_file_storage(); + // Get a count of all the draft files, excluding any directories. + $files = $fs->get_area_files(context_user::instance($USER->id)->id, + 'user', + 'draft', + $data->files_filemanager, + 'id', + false); + return count($files) == 0; } /**