MDL-57587 question file access: fix regression caused by MDL-53744
authorTim Hunt <T.J.Hunt@open.ac.uk>
Thu, 26 Jan 2017 18:53:16 +0000 (18:53 +0000)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Thu, 26 Jan 2017 18:53:16 +0000 (18:53 +0000)
question/type/gapselect/questionbase.php
question/type/match/question.php
question/type/multichoice/question.php
question/type/questionbase.php
question/type/upgrade.txt

index 180a448..76a3882 100644 (file)
@@ -321,7 +321,7 @@ abstract class qtype_gapselect_question_base extends question_graded_automatical
     public function check_file_access($qa, $options, $component, $filearea, $args, $forcedownload) {
         if ($component == 'question' && in_array($filearea,
                 array('correctfeedback', 'partiallycorrectfeedback', 'incorrectfeedback'))) {
-            return $this->check_combined_feedback_file_access($qa, $options, $filearea);
+            return $this->check_combined_feedback_file_access($qa, $options, $filearea, $args);
 
         } else if ($component == 'question' && $filearea == 'hint') {
             return $this->check_hint_file_access($qa, $options, $args);
index b373fba..4113010 100644 (file)
@@ -342,7 +342,7 @@ class qtype_match_question extends question_graded_automatically_with_countback
 
         } else if ($component == 'question' && in_array($filearea,
                 array('correctfeedback', 'partiallycorrectfeedback', 'incorrectfeedback'))) {
-            return $this->check_combined_feedback_file_access($qa, $options, $filearea);
+            return $this->check_combined_feedback_file_access($qa, $options, $filearea, $args);
 
         } else if ($component == 'question' && $filearea == 'hint') {
             return $this->check_hint_file_access($qa, $options, $args);
index 2c5e17c..09b9493 100644 (file)
@@ -113,7 +113,7 @@ abstract class qtype_multichoice_base extends question_graded_automatically {
     public function check_file_access($qa, $options, $component, $filearea, $args, $forcedownload) {
         if ($component == 'question' && in_array($filearea,
                 array('correctfeedback', 'partiallycorrectfeedback', 'incorrectfeedback'))) {
-            return $this->check_combined_feedback_file_access($qa, $options, $filearea);
+            return $this->check_combined_feedback_file_access($qa, $options, $filearea, $args);
 
         } else if ($component == 'question' && $filearea == 'answer') {
             $answerid = reset($args); // Itemid is answer id.
index 879381e..b6a4b89 100644 (file)
@@ -668,11 +668,18 @@ abstract class question_graded_automatically extends question_with_responses
      * @param question_attempt $qa the question attempt being displayed.
      * @param question_display_options $options the options that control display of the question.
      * @param string $filearea the name of the file area.
+     * @param array $args the remaining bits of the file path.
      * @return bool whether access to the file should be allowed.
      */
-    protected function check_combined_feedback_file_access($qa, $options, $filearea) {
+    protected function check_combined_feedback_file_access($qa, $options, $filearea, $args = null) {
         $state = $qa->get_state();
 
+        if ($args === null) {
+            debugging('You must pass $args as the fourth argument to check_combined_feedback_file_access.',
+                    DEBUG_DEVELOPER);
+            $args = array($this->id); // Fake it for now, so the rest of this method works.
+        }
+
         if (!$state->is_finished()) {
             $response = $qa->get_last_qt_data();
             if (!$this->is_gradable_response($response)) {
index 470629c..6a74061 100644 (file)
@@ -1,5 +1,11 @@
 This files describes API changes for question type plugins.
 
+=== 3.1.5, 3.2.2, 3.3 ===
+
+* If you are using check_combined_feedback_file_access in your check_file_access method,
+  then you must now pass $args as the 4th argument, so the correct permission checks
+  can be performed. If you don't, you will get a developer debug notice.
+
 === 3.1 ===
 
 * The following functions, previously used (exclusively) by upgrade steps are not available