MDL-34311 formslib: warn when no param type set
authorDan Poltawski <dan@moodle.com>
Fri, 22 Mar 2013 08:38:10 +0000 (16:38 +0800)
committerDan Poltawski <dan@moodle.com>
Mon, 25 Mar 2013 01:30:51 +0000 (09:30 +0800)
Params without a type set will not be getting cleaned, so if developers
really do not want cleaning, they should set it explicitly.

lib/formslib.php
lib/upgrade.txt

index c84c9b8..7bec20d 100644 (file)
@@ -278,6 +278,7 @@ abstract class moodleform {
             $submission = array();
             $files = array();
         }
+        $this->detectMissingSetType();
 
         $this->_form->updateSubmission($submission, $files);
     }
@@ -914,6 +915,9 @@ abstract class moodleform {
             $this->_definition_finalized = true;
             $this->definition_after_data();
         }
+
+        $this->detectMissingSetType();
+
         $this->_form->display();
     }
 
@@ -1238,6 +1242,38 @@ abstract class moodleform {
             'requires' => array('base', 'node')
         );
     }
+
+    /**
+     * Detects elements with missing setType() declerations.
+     *
+     * Finds elements in the form which should a PARAM_ type set and throws a
+     * developer debug warning for any elements without it. This is to reduce the
+     * risk of potential security issues by developers mistakenly forgetting to set
+     * the type.
+     *
+     * @return void
+     */
+    private function detectMissingSetType() {
+        if (!debugging('', DEBUG_DEVELOPER)) {
+            // Only for devs.
+            return;
+        }
+
+        $mform = $this->_form;
+        foreach ($mform->_elements as $element) {
+            switch ($element->getType()) {
+                case 'hidden':
+                case 'text':
+                case 'url':
+                    $key = $element->getName();
+                    if (!array_key_exists($key, $mform->_types)) {
+                        debugging("Did you remember to call setType() for '$key'? ".
+                            'Defaulting to PARAM_RAW cleaning.', DEBUG_DEVELOPER);
+                    }
+                    break;
+            }
+        }
+    }
 }
 
 /**
index 3b243b8..6d90bb6 100644 (file)
@@ -26,6 +26,8 @@ information provided here is intended especially for developers.
 * Function get_users_listing now return list of users except guest and deleted users. Previously
   deleted users were excluded by get_users_listing. As guest user is not expected while browsing users,
   and not included in get_user function, it will not be returned by get_users_listing.
+* Formslib will now throw a developer warning if a PARAM_ type hasn't been set for elements which
+  need it. Please set PARAM_RAW explicitly if you do not want any cleaning.
 
 YUI changes:
 * M.util.help_icon has been deprecated. Code should be updated to use moodle-core-popuphelp