From c241edb5cf70b7331c63148c25362003edc5418c Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Wed, 31 Dec 2014 10:47:49 +0530 Subject: [PATCH 1/2] MDL-44393 tasks: Validate cron fields --- .../task/classes/edit_scheduled_task_form.php | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/admin/tool/task/classes/edit_scheduled_task_form.php b/admin/tool/task/classes/edit_scheduled_task_form.php index 7b593cafd3f..d59710c46e9 100644 --- a/admin/tool/task/classes/edit_scheduled_task_form.php +++ b/admin/tool/task/classes/edit_scheduled_task_form.php @@ -53,22 +53,27 @@ class tool_task_edit_scheduled_task_form extends moodleform { $mform->addElement('text', 'minute', get_string('taskscheduleminute', 'tool_task')); $mform->setType('minute', PARAM_RAW); $mform->addHelpButton('minute', 'taskscheduleminute', 'tool_task'); + $mform->addRule('minute', get_string('required'), 'required'); $mform->addElement('text', 'hour', get_string('taskschedulehour', 'tool_task')); $mform->setType('hour', PARAM_RAW); $mform->addHelpButton('hour', 'taskschedulehour', 'tool_task'); + $mform->addRule('hour', get_string('required'), 'required'); $mform->addElement('text', 'day', get_string('taskscheduleday', 'tool_task')); $mform->setType('day', PARAM_RAW); $mform->addHelpButton('day', 'taskscheduleday', 'tool_task'); + $mform->addRule('day', get_string('required'), 'required'); $mform->addElement('text', 'month', get_string('taskschedulemonth', 'tool_task')); $mform->setType('month', PARAM_RAW); $mform->addHelpButton('month', 'taskschedulemonth', 'tool_task'); + $mform->addRule('month', get_string('required'), 'required'); $mform->addElement('text', 'dayofweek', get_string('taskscheduledayofweek', 'tool_task')); $mform->setType('dayofweek', PARAM_RAW); $mform->addHelpButton('dayofweek', 'taskscheduledayofweek', 'tool_task'); + $mform->addRule('dayofweek', get_string('required'), 'required'); $mform->addElement('advcheckbox', 'disabled', get_string('disabled', 'tool_task')); $mform->addHelpButton('disabled', 'disabled', 'tool_task'); @@ -92,5 +97,63 @@ class tool_task_edit_scheduled_task_form extends moodleform { // Do not use defaults for existing values, the set_data() is the correct way. $this->set_data(\core\task\manager::record_from_scheduled_task($task)); } + + /** + * Custom validations. + * + * @param array $data + * @param array $files + * + * @return array + */ + public function validation($data, $files) { + $error = parent::validation($data, $files); + $fields = array('minute', 'hour', 'day', 'month', 'dayofweek'); + foreach ($fields as $field) { + if (!self::validate_fields($field, $data[$field])) { + $error[$field] = get_string('invaliddata', 'core_error'); + } + } + return $error; + } + + /** + * Helper function that validates the submitted data. + * + * Explanation of the regex:- + * + * \A\*\z - matches * + * \A[0-5]?[0-9]\z - matches entries like 23 + * \A\*\/[0-5]?[0-9]\z - matches entries like * / 5 + * \A[0-5]?[0-9](,[0-5]?[0-9])*\z - matches entries like 1,2,3 + * \A[0-5]?[0-9]-[0-5]?[0-9]\z - matches entries like 2-10 + * + * @param string $field field to validate + * @param string $value value + * + * @return bool true if validation passes, false other wise. + */ + public static function validate_fields($field, $value) { + switch ($field) { + case 'minute' : + case 'hour' : + $regex = "/\A\*\z|\A[0-5]?[0-9]\z|\A\*\/[0-5]?[0-9]\z|\A[0-5]?[0-9](,[0-5]?[0-9])*\z|\A[0-5]?[0-9]-[0-5]?[0-9]\z/"; + break; + case 'day': + $regex = "/\A\*\z|\A([1-2]?[0-9]|3[0-1])\z|\A\*\/([1-2]?[0-9]|3[0-1])\z|"; + $regex .= "\A([1-2]?[0-9]|3[0-1])(,([1-2]?[0-9]|3[0-1]))*\z|\A([1-2]?[0-9]|3[0-1])-([1-2]?[0-9]|3[0-1])\z/"; + break; + case 'month': + $regex = "/\A\*\z|\A([0-9]|1[0-2])\z|\A\*\/([0-9]|1[0-2])\z|\A([0-9]|1[0-2])(,([0-9]|1[0-2]))*\z|"; + $regex .= "\A([0-9]|1[0-2])-([0-9]|1[0-2])\z/"; + break; + case 'dayofweek': + $regex = "/\A\*\z|\A[0-6]\z|\A\*\/[0-6]\z|\A[0-6](,[0-6])*\z|\A[0-6]-[0-6]\z/"; + break; + default: + return false; + } + return (bool)preg_match($regex, $value); + } } From 3726a0c3fccc83efa4deb1b16906efe5acc7ede5 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Wed, 31 Dec 2014 10:48:12 +0530 Subject: [PATCH 2/2] MDL-44393 tasks: Add unit tests for cron field validations --- admin/tool/task/tests/form_test.php | 275 ++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 admin/tool/task/tests/form_test.php diff --git a/admin/tool/task/tests/form_test.php b/admin/tool/task/tests/form_test.php new file mode 100644 index 00000000000..a9b8aa12bf9 --- /dev/null +++ b/admin/tool/task/tests/form_test.php @@ -0,0 +1,275 @@ +. + +/** + * File containing tests for the mform class. + * + * @package tool_task + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +/** + * Mform test class. + * + * @package tool_task + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or late + */ +class tool_task_form_testcase extends advanced_testcase { + + /** + * Test validations for minute field. + */ + public function test_validate_fields_minute() { + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '*'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '65'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '*/'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '*/1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '*/20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '*/65'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '1,2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '2,20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '20,30,45'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '65,20,30'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '25,75'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '1-2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '2-20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '20-30'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '65-20'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('minute', '25-75'); + $this->assertFalse($valid); + } + + /** + * Test validations for minute hour. + */ + public function test_validate_fields_hour() { + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '*'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '65'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '*/'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '*/1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '*/20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '*/65'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '1,2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '2,20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '20,30,45'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '65,20,30'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '25,75'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '1-2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '2-20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '20-30'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '65-20'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('hour', '25-75'); + $this->assertFalse($valid); + } + + /** + * Test validations for day field. + */ + public function test_validate_fields_day() { + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '*'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '65'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '*/'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '*/1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '*/20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '*/65'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '*/35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '1,2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '2,20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '20,30,25'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '65,20,30'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '25,35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '1-2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '2-20'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '20-30'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '65-20'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('day', '25-35'); + $this->assertFalse($valid); + } + + /** + * Test validations for month field. + */ + public function test_validate_fields_month() { + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '*'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '10'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '13'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '*/'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '*/1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '*/12'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '*/13'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '*/35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '1,2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '2,11'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '2,10,12'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '65,2,13'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '25,35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '1-2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '2-12'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '3-6'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '65-2'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('month', '25-26'); + $this->assertFalse($valid); + } + + /** + * Test validations for dayofweek field. + */ + public function test_validate_fields_dayofweek() { + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '*'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '0'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '6'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '7'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '20'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '*/'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '*/1'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '*/6'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '*/13'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '*/35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '1,2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '2,6'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '2,6,3'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '65,2,13'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '25,35'); + $this->assertFalse($valid); + + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '1-2'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '2-6'); + $this->assertTrue($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '65-2'); + $this->assertFalse($valid); + $valid = \tool_task_edit_scheduled_task_form::validate_fields('dayofweek', '3-7'); + $this->assertFalse($valid); + } +} +