Merge branch 'MDL-59544-master-filemanagervalidation' of git://github.com/mudrd8mz/moodle

This commit is contained in:
David Monllao 2017-07-25 11:17:07 +02:00
commit a2b326c232
9 changed files with 99 additions and 62 deletions

View File

@ -41,6 +41,7 @@ $string['err_nopunctuation'] = 'You must enter no punctuation characters here.';
$string['err_numeric'] = 'You must enter a number here.';
$string['err_rangelength'] = 'You must enter between {$a->format[0]} and {$a->format[1]} characters here.';
$string['err_required'] = 'You must supply a value here.';
$string['err_wrongfileextension'] = 'Some files ({$a->wrongfiles}) cannot be uploaded. Only file types {$a->whitelist} are allowed.';
$string['filetypesany'] = 'All file types';
$string['filetypesnotall'] = 'It is not allowed to select \'All file types\' here';
$string['filetypesnotwhitelisted'] = 'These file types are not allowed here: {$a}';

View File

@ -308,6 +308,47 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element implements temp
$context['html'] = $this->toHtml();
return $context;
}
/**
* Check that all files have the allowed type.
*
* @param array $value Draft item id with the uploaded files.
* @return string|null Validation error message or null.
*/
public function validateSubmitValue($value) {
$filetypesutil = new \core_form\filetypes_util();
$whitelist = $filetypesutil->normalize_file_types($this->_options['accepted_types']);
if (empty($whitelist) || $whitelist === ['*']) {
// Any file type is allowed, nothing to check here.
return;
}
$draftfiles = file_get_drafarea_files($value);
$wrongfiles = array();
if (empty($draftfiles)) {
// No file uploaded, nothing to check here.
return;
}
foreach ($draftfiles->list as $file) {
if (!$filetypesutil->is_allowed_file_type($file->filename, $whitelist)) {
$wrongfiles[] = $file->filename;
}
}
if ($wrongfiles) {
$a = array(
'whitelist' => implode(', ', $whitelist),
'wrongfiles' => implode(', ', $wrongfiles),
);
return get_string('err_wrongfileextension', 'core_form', $a);
}
return;
}
}
/**

View File

@ -230,4 +230,45 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_input implements templat
$context['html'] = $this->toHtml();
return $context;
}
/**
* Check that the file has the allowed type.
*
* @param array $value Draft item id with the uploaded files.
* @return string|null Validation error message or null.
*/
public function validateSubmitValue($value) {
$filetypesutil = new \core_form\filetypes_util();
$whitelist = $filetypesutil->normalize_file_types($this->_options['accepted_types']);
if (empty($whitelist) || $whitelist === ['*']) {
// Any file type is allowed, nothing to check here.
return;
}
$draftfiles = file_get_drafarea_files($value);
$wrongfiles = array();
if (empty($draftfiles)) {
// No file uploaded, nothing to check here.
return;
}
foreach ($draftfiles->list as $file) {
if (!$filetypesutil->is_allowed_file_type($file->filename, $whitelist)) {
$wrongfiles[] = $file->filename;
}
}
if ($wrongfiles) {
$a = array(
'whitelist' => implode(', ', $whitelist),
'wrongfiles' => implode(', ', $wrongfiles),
);
return get_string('err_wrongfileextension', 'core_form', $a);
}
return;
}
}

View File

@ -34,4 +34,15 @@ Feature: There is a form element allowing to select filetypes
Then I should see "Unknown file types: .doesnoexist"
And I should see "These file types are not allowed here: .doc, .docx, .rtf"
And I should see "It is not allowed to select 'All file types' here"
And I should not see "Unknown file types: .neverminditdoesnotexist"
And I should not see "Unknown file types: .neverminditdoesnotexist"
@javascript @_file_upload
Scenario: File manager element implicitly validates submitted files
# We can't directly upload the invalid file here as the upload repository would throw an exception.
# So instead we try to trick the filemanager, to be finally stopped by the implicit validation.
And I upload "lib/tests/fixtures/empty.txt" file to "Picky file manager" filemanager
And I follow "empty.txt"
And I set the field "Name" to "renamed.exe"
And I press "Update"
When I press "Save changes"
Then I should see "Some files (renamed.exe) cannot be uploaded. Only file types .txt are allowed."

View File

@ -57,6 +57,8 @@ class test_form extends moodleform {
$mform->addElement('filetypes', 'filetypes3', 'Unknown file types are allowed here',
['allowunknown' => true]);
$mform->addElement('filemanager', 'fileman1', 'Picky file manager', null, ['accepted_types' => '.txt']);
$this->add_action_buttons(false);
}
}

View File

@ -120,41 +120,4 @@ class workshop_assessment_form extends moodleform {
public function is_editable() {
return !$this->_form->isFrozen();
}
/**
* Validate assessment form data.
*
* @param array $data
* @param array $files
* @return array
*/
public function validation($data, $files) {
$errors = parent::validation($data, $files);
if (isset($data['feedbackauthorattachment_filemanager']) and isset($this->workshop->overallfeedbackfiletypes)) {
$filetypesutil = new \core_form\filetypes_util();
$whitelist = $filetypesutil->normalize_file_types($this->workshop->overallfeedbackfiletypes);
if ($whitelist) {
$draftfiles = file_get_drafarea_files($data['feedbackauthorattachment_filemanager']);
if ($draftfiles) {
$wrongfiles = array();
foreach ($draftfiles->list as $file) {
if (!$filetypesutil->is_allowed_file_type($file->filename, $whitelist)) {
$wrongfiles[] = $file->filename;
}
}
if ($wrongfiles) {
$a = array(
'whitelist' => implode(', ', $whitelist),
'wrongfiles' => implode(', ', $wrongfiles),
);
$errors['feedbackauthorattachment_filemanager'] = get_string('err_wrongfileextension', 'mod_workshop', $a);
}
}
}
}
return $errors;
}
}

View File

@ -1,2 +1,3 @@
err_unknownfileextension,mod_workshop
err_wrongfileextension,mod_workshop
yourassessment,mod_workshop

View File

@ -107,7 +107,6 @@ $string['editingsubmission'] = 'Editing submission';
$string['editsubmission'] = 'Edit submission';
$string['err_multiplesubmissions'] = 'While editing this form, another version of the submission has been saved. Multiple submissions per user are not allowed.';
$string['err_removegrademappings'] = 'Unable to remove the unused grade mappings';
$string['err_wrongfileextension'] = 'Some files ({$a->wrongfiles}) cannot be uploaded. Only file types {$a->whitelist} are allowed.';
$string['evaluategradeswait'] = 'Please wait until the assessments are evaluated and the grades are calculated';
$string['evaluation'] = 'Grading evaluation';
$string['evaluationmethod'] = 'Grading evaluation method';
@ -375,3 +374,4 @@ $string['yourassessment'] = 'Your assessment';
// Deprecated since Moodle 3.4.
$string['err_unknownfileextension'] = 'Unknown file extension: {$a}';
$string['err_wrongfileextension'] = 'Some files ({$a->wrongfiles}) cannot be uploaded. Only file types {$a->whitelist} are allowed.';

View File

@ -94,29 +94,6 @@ class workshop_submission_form extends moodleform {
$errors['attachment_filemanager'] = get_string('submissionrequiredfile', 'mod_workshop');
}
if (isset($data['attachment_filemanager']) and isset($this->_customdata['workshop']->submissionfiletypes)) {
$filetypesutil = new \core_form\filetypes_util();
$whitelist = $filetypesutil->normalize_file_types($this->_customdata['workshop']->submissionfiletypes);
if ($whitelist) {
$draftfiles = file_get_drafarea_files($data['attachment_filemanager']);
if ($draftfiles) {
$wrongfiles = array();
foreach ($draftfiles->list as $file) {
if (!$filetypesutil->is_allowed_file_type($file->filename, $whitelist)) {
$wrongfiles[] = $file->filename;
}
}
if ($wrongfiles) {
$a = array(
'whitelist' => implode(', ', $whitelist),
'wrongfiles' => implode(', ', $wrongfiles),
);
$errors['attachment_filemanager'] = get_string('err_wrongfileextension', 'mod_workshop', $a);
}
}
}
}
return $errors;
}
}