MDL-29401 introduce new frankenstyle PARAM types
authorPetr Skoda <commits@skodak.org>
Sat, 24 Sep 2011 13:07:27 +0000 (15:07 +0200)
committerPetr Skoda <commits@skodak.org>
Sun, 25 Sep 2011 07:59:55 +0000 (09:59 +0200)
New PARAM_COMPONENT, PARAM_AREA and PARAM_PLUGIN + fixing of hopefully all current incorrect parameter types. This should help with diagnosing of incorrectly named 3rd party plugins too.

50 files changed:
admin/auth.php
admin/auth_config.php
admin/editors.php
admin/enrol.php
admin/localplugins.php
admin/modules.php
admin/qbehaviours.php
admin/qtypes.php
admin/report/customlang/locallib.php
admin/report/questioninstances/index.php
admin/repositoryinstance.php
admin/tool/health/index.php
backup/backupfilesedit.php
backup/restorefile.php
comment/comment_ajax.php
comment/comment_post.php
comment/lib.php
course/externallib.php
course/modedit.php
course/moodleform_mod.php
course/report/log/index.php
course/search.php
files/externallib.php
files/filebrowser_ajax.php
filter/local_settings_form.php
grade/lib.php
help.php
lib/adminlib.php
lib/blocklib.php
lib/enrollib.php
lib/filestorage/file_storage.php
lib/moodlelib.php
lib/portfolio/forms.php
lib/setup.php
lib/simpletest/testmoodlelib.php
lib/upgradelib.php
mod/assignment/lib.php
mod/lesson/locallib.php
mod/workshop/form/assessment_form.php
mod/workshop/form/edit_form.php
pluginfile.php
rating/index.php
rating/rate.php
rating/rate_ajax.php
repository/coursefiles/lib.php
repository/lib.php
repository/local/lib.php
repository/recent/lib.php
theme/index.php
user/externallib.php

index 8345aad..93711ee 100644 (file)
@@ -19,7 +19,7 @@ $returnurl = new moodle_url('/admin/settings.php', array('section'=>'manageauths
 $PAGE->set_url($returnurl);
 
 $action = optional_param('action', '', PARAM_ACTION);
-$auth   = optional_param('auth', '', PARAM_SAFEDIR);
+$auth   = optional_param('auth', '', PARAM_PLUGIN);
 
 get_enabled_auth_plugins(true); // fix the list of enabled auths
 if (empty($CFG->auth)) {
index 71dafdf..c702711 100644 (file)
@@ -6,7 +6,7 @@
 require_once '../config.php';
 require_once $CFG->libdir.'/adminlib.php';
 
-$auth = required_param('auth', PARAM_SAFEDIR);
+$auth = required_param('auth', PARAM_PLUGIN);
 $PAGE->set_pagetype('admin-auth-' . $auth);
 
 admin_externalpage_setup('authsetting'.$auth);
index 476df6c..fbb7be5 100644 (file)
@@ -14,7 +14,7 @@ require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
 $returnurl = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageeditors";
 
 $action = optional_param('action', '', PARAM_ACTION);
-$editor = optional_param('editor', '', PARAM_SAFEDIR);
+$editor = optional_param('editor', '', PARAM_PLUGIN);
 
 // get currently installed and enabled auth plugins
 $available_editors = editors_get_available();
index 26e430e..efb4dc3 100644 (file)
@@ -27,7 +27,7 @@ require_once('../config.php');
 require_once($CFG->libdir.'/adminlib.php');
 
 $action  = required_param('action', PARAM_ACTION);
-$enrol   = required_param('enrol', PARAM_SAFEDIR);
+$enrol   = required_param('enrol', PARAM_PLUGIN);
 $confirm = optional_param('confirm', 0, PARAM_BOOL);
 
 $PAGE->set_url('/admin/enrol.php');
index 674138b..9146c82 100644 (file)
@@ -33,7 +33,7 @@ require_once($CFG->libdir.'/tablelib.php');
 
 admin_externalpage_setup('managelocalplugins');
 
-$delete  = optional_param('delete', '', PARAM_SAFEDIR);
+$delete  = optional_param('delete', '', PARAM_PLUGIN);
 $confirm = optional_param('confirm', '', PARAM_BOOL);
 
 /// If data submitted, then process and store.
index 71e22bd..45f7a57 100644 (file)
@@ -11,9 +11,9 @@
 
     admin_externalpage_setup('managemodules');
 
-    $show    = optional_param('show', '', PARAM_SAFEDIR);
-    $hide    = optional_param('hide', '', PARAM_SAFEDIR);
-    $delete  = optional_param('delete', '', PARAM_SAFEDIR);
+    $show    = optional_param('show', '', PARAM_PLUGIN);
+    $hide    = optional_param('hide', '', PARAM_PLUGIN);
+    $delete  = optional_param('delete', '', PARAM_PLUGIN);
     $confirm = optional_param('confirm', '', PARAM_BOOL);
 
 
index 88b75fc..db76b95 100644 (file)
@@ -85,7 +85,7 @@ if (!empty($config->disabledbehaviours)) {
 // Process actions ============================================================
 
 // Disable.
-if (($disable = optional_param('disable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($disable = optional_param('disable', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($behaviours[$disable])) {
         print_error('unknownbehaviour', 'question', $thispageurl, $disable);
     }
@@ -98,7 +98,7 @@ if (($disable = optional_param('disable', '', PARAM_SAFEDIR)) && confirm_sesskey
 }
 
 // Enable.
-if (($enable = optional_param('enable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($enable = optional_param('enable', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($behaviours[$enable])) {
         print_error('unknownbehaviour', 'question', $thispageurl, $enable);
     }
@@ -115,7 +115,7 @@ if (($enable = optional_param('enable', '', PARAM_SAFEDIR)) && confirm_sesskey()
 }
 
 // Move up in order.
-if (($up = optional_param('up', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($up = optional_param('up', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($behaviours[$up])) {
         print_error('unknownbehaviour', 'question', $thispageurl, $up);
     }
@@ -127,7 +127,7 @@ if (($up = optional_param('up', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
 }
 
 // Move down in order.
-if (($down = optional_param('down', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($down = optional_param('down', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($behaviours[$down])) {
         print_error('unknownbehaviour', 'question', $thispageurl, $down);
     }
@@ -139,7 +139,7 @@ if (($down = optional_param('down', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
 }
 
 // Delete.
-if (($delete = optional_param('delete', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($delete = optional_param('delete', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     // Check it is OK to delete this question type.
     if ($delete == 'missing') {
         print_error('cannotdeletemissingbehaviour', 'question', $thispageurl);
index a95de20..05e7c75 100644 (file)
@@ -79,7 +79,7 @@ $sortedqtypes = question_bank::sort_qtype_array($sortedqtypes, $config);
 // Process actions ============================================================
 
 // Disable.
-if (($disable = optional_param('disable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($disable = optional_param('disable', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($qtypes[$disable])) {
         print_error('unknownquestiontype', 'question', $thispageurl, $disable);
     }
@@ -89,7 +89,7 @@ if (($disable = optional_param('disable', '', PARAM_SAFEDIR)) && confirm_sesskey
 }
 
 // Enable.
-if (($enable = optional_param('enable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($enable = optional_param('enable', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($qtypes[$enable])) {
         print_error('unknownquestiontype', 'question', $thispageurl, $enable);
     }
@@ -103,7 +103,7 @@ if (($enable = optional_param('enable', '', PARAM_SAFEDIR)) && confirm_sesskey()
 }
 
 // Move up in order.
-if (($up = optional_param('up', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($up = optional_param('up', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($qtypes[$up])) {
         print_error('unknownquestiontype', 'question', $thispageurl, $up);
     }
@@ -114,7 +114,7 @@ if (($up = optional_param('up', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
 }
 
 // Move down in order.
-if (($down = optional_param('down', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($down = optional_param('down', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     if (!isset($qtypes[$down])) {
         print_error('unknownquestiontype', 'question', $thispageurl, $down);
     }
@@ -125,7 +125,7 @@ if (($down = optional_param('down', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
 }
 
 // Delete.
-if (($delete = optional_param('delete', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+if (($delete = optional_param('delete', '', PARAM_PLUGIN)) && confirm_sesskey()) {
     // Check it is OK to delete this question type.
     if ($delete == 'missingtype') {
         print_error('cannotdeletemissingqtype', 'question', $thispageurl);
index c3aa6ca..180518f 100644 (file)
@@ -262,7 +262,7 @@ class report_customlang_utils {
             debugging('Unable to dump local strings for non-installed language pack .'.s($lang));
             return false;
         }
-        if ($component !== clean_param($component, PARAM_SAFEDIR)) {
+        if ($component !== clean_param($component, PARAM_COMPONENT)) {
             throw new coding_exception('Incorrect component name');
         }
         if (!$filename = self::get_component_filename($component)) {
index 24299d3..2add057 100644 (file)
@@ -12,7 +12,7 @@ require_once($CFG->libdir.'/adminlib.php');
 require_once($CFG->libdir.'/questionlib.php');
 
 // Get URL parameters.
-$requestedqtype = optional_param('qtype', '', PARAM_SAFEDIR);
+$requestedqtype = optional_param('qtype', '', PARAM_PLUGIN);
 
 // Print the header & check permissions.
 admin_externalpage_setup('reportquestioninstances');
index 7ba94df..e75193d 100644 (file)
@@ -10,7 +10,7 @@ $new     = optional_param('new', '', PARAM_FORMAT);
 $hide    = optional_param('hide', 0, PARAM_INT);
 $delete  = optional_param('delete', 0, PARAM_INT);
 $sure    = optional_param('sure', '', PARAM_ALPHA);
-$type    = optional_param('type', '', PARAM_ALPHAEXT);
+$type    = optional_param('type', '', PARAM_PLUGIN);
 
 $context = get_context_instance(CONTEXT_SYSTEM);
 
index d7596ae..bb63e3c 100644 (file)
@@ -42,7 +42,7 @@
     define('SEVERITY_SIGNIFICANT', 'significant');
     define('SEVERITY_CRITICAL',    'critical');
 
-    $solution = optional_param('solution', 0, PARAM_SAFEDIR); //in fact it is class name alhanumeric and _
+    $solution = optional_param('solution', 0, PARAM_PLUGIN);
 
     require_login();
     require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
index 41d0320..0059bbc 100644 (file)
@@ -31,8 +31,8 @@ require_once($CFG->dirroot . '/repository/lib.php');
 $contextid = required_param('contextid', PARAM_INT);
 $currentcontext = required_param('currentcontext', PARAM_INT);
 // file parameters
-$component  = optional_param('component', null, PARAM_ALPHAEXT);
-$filearea   = optional_param('filearea', null, PARAM_ALPHAEXT);
+$component  = optional_param('component', null, PARAM_COMPONENT);
+$filearea   = optional_param('filearea', null, PARAM_AREA);
 $returnurl  = optional_param('returnurl', null, PARAM_URL);
 
 list($context, $course, $cm) = get_context_info_array($currentcontext);
index d89143d..92f8eb0 100644 (file)
@@ -33,8 +33,8 @@ $filecontextid = optional_param('filecontextid', 0, PARAM_INT);
 $action = optional_param('action', '', PARAM_ALPHA);
 // file parameters
 // non js interface may require these parameters
-$component  = optional_param('component', null, PARAM_ALPHAEXT);
-$filearea   = optional_param('filearea', null, PARAM_ALPHAEXT);
+$component  = optional_param('component', null, PARAM_COMPONENT);
+$filearea   = optional_param('filearea', null, PARAM_AREA);
 $itemid     = optional_param('itemid', null, PARAM_INT);
 $filepath   = optional_param('filepath', null, PARAM_PATH);
 $filename   = optional_param('filename', null, PARAM_FILE);
index 50d7805..828d5c8 100644 (file)
@@ -48,12 +48,12 @@ if (!confirm_sesskey()) {
 }
 
 $client_id = required_param('client_id', PARAM_ALPHANUM);
-$area      = optional_param('area',      '', PARAM_ALPHAEXT);
+$area      = optional_param('area',      '', PARAM_AREA);
 $commentid = optional_param('commentid', -1, PARAM_INT);
 $content   = optional_param('content',   '', PARAM_RAW);
 $itemid    = optional_param('itemid',    '', PARAM_INT);
 $page      = optional_param('page',      0,  PARAM_INT);
-$component = optional_param('component', '',  PARAM_ALPHAEXT);
+$component = optional_param('component', '',  PARAM_COMPONENT);
 
 // initilising comment object
 $args = new stdClass;
index 56a0e28..4e852b4 100644 (file)
@@ -31,11 +31,11 @@ require_login($course, true, $cm);
 require_sesskey();
 
 $action    = optional_param('action',    '',  PARAM_ALPHA);
-$area      = optional_param('area',      '',  PARAM_ALPHAEXT);
+$area      = optional_param('area',      '',  PARAM_AREA);
 $content   = optional_param('content',   '',  PARAM_RAW);
 $itemid    = optional_param('itemid',    '',  PARAM_INT);
 $returnurl = optional_param('returnurl', '/', PARAM_URL);
-$component = optional_param('component', '',  PARAM_ALPHAEXT);
+$component = optional_param('component', '',  PARAM_COMPONENT);
 
 // Currently this script can only add comments
 if ($action !== 'add') {
index 2d90ba7..99e92f9 100644 (file)
@@ -285,7 +285,7 @@ class comment {
         self::$comment_itemid  = optional_param('comment_itemid',  '', PARAM_INT);
         self::$comment_context = optional_param('comment_context', '', PARAM_INT);
         self::$comment_page    = optional_param('comment_page',    '', PARAM_INT);
-        self::$comment_area    = optional_param('comment_area',    '', PARAM_ALPHAEXT);
+        self::$comment_area    = optional_param('comment_area',    '', PARAM_AREA);
 
         $page->requires->string_for_js('addcomment', 'moodle');
         $page->requires->string_for_js('deletecomment', 'moodle');
index 67037cc..7d9e6d6 100644 (file)
@@ -146,7 +146,7 @@ class moodle_course_external extends external_api {
                             'summary' => new external_value(PARAM_RAW, 'summary'),
                             'summaryformat' => new external_value(PARAM_INT,
                                     'the summary text Moodle format'),
-                            'format' => new external_value(PARAM_ALPHANUMEXT,
+                            'format' => new external_value(PARAM_PLUGIN,
                                     'course format: weeks, topics, social, site,..'),
                             'showgrades' => new external_value(PARAM_INT,
                                     '1 if grades are shown, otherwise 0', VALUE_OPTIONAL),
@@ -185,9 +185,9 @@ class moodle_course_external extends external_api {
                                     VALUE_OPTIONAL),
                             'completionnotify' => new external_value(PARAM_INT,
                                     '1: yes 0: no', VALUE_OPTIONAL),
-                            'lang' => new external_value(PARAM_ALPHANUMEXT,
+                            'lang' => new external_value(PARAM_SAFEDIR,
                                     'forced course language', VALUE_OPTIONAL),
-                            'forcetheme' => new external_value(PARAM_ALPHANUMEXT,
+                            'forcetheme' => new external_value(PARAM_PLUGIN,
                                     'name of the force theme', VALUE_OPTIONAL),
                         ), 'course'
                 )
@@ -212,7 +212,7 @@ class moodle_course_external extends external_api {
                             'summary' => new external_value(PARAM_RAW, 'summary', VALUE_OPTIONAL),
                             'summaryformat' => new external_value(PARAM_INT,
                                     'the summary text Moodle format', VALUE_DEFAULT, FORMAT_MOODLE),
-                            'format' => new external_value(PARAM_ALPHANUMEXT,
+                            'format' => new external_value(PARAM_PLUGIN,
                                     'course format: weeks, topics, social, site,..',
                                     VALUE_DEFAULT, $courseconfig->format),
                             'showgrades' => new external_value(PARAM_INT,
@@ -252,9 +252,9 @@ class moodle_course_external extends external_api {
                                     VALUE_OPTIONAL),
                             'completionnotify' => new external_value(PARAM_INT,
                                     '1: yes 0: no', VALUE_OPTIONAL),
-                            'lang' => new external_value(PARAM_ALPHANUMEXT,
+                            'lang' => new external_value(PARAM_SAFEDIR,
                                     'forced course language', VALUE_OPTIONAL),
-                            'forcetheme' => new external_value(PARAM_ALPHANUMEXT,
+                            'forcetheme' => new external_value(PARAM_PLUGIN,
                                     'name of the force theme', VALUE_OPTIONAL),
                         )
                     ), 'courses to create'
index 0650de3..a68ddcc 100644 (file)
@@ -248,7 +248,7 @@ if ($mform->is_cancelled()) {
     }
 
     $fromform->course = $course->id;
-    $fromform->modulename = clean_param($fromform->modulename, PARAM_SAFEDIR);  // For safety
+    $fromform->modulename = clean_param($fromform->modulename, PARAM_PLUGIN);  // For safety
 
     $addinstancefunction    = $fromform->modulename."_add_instance";
     $updateinstancefunction = $fromform->modulename."_update_instance";
@@ -342,7 +342,7 @@ if ($mform->is_cancelled()) {
             set_coursemodule_idnumber($fromform->coursemodule, $fromform->cmidnumber);
         }
 
-        // Now that module is fully updated, also update completion data if 
+        // Now that module is fully updated, also update completion data if
         // required (this will wipe all user completion data and recalculate it)
         if ($completion->is_enabled() && !empty($fromform->completionunlocked)) {
             $completion->reset_all_state($cm);
index 20988b4..ce5666b 100644 (file)
@@ -623,7 +623,7 @@ abstract class moodleform_mod extends moodleform {
         $mform->setType('module', PARAM_INT);
 
         $mform->addElement('hidden', 'modulename', '');
-        $mform->setType('modulename', PARAM_SAFEDIR);
+        $mform->setType('modulename', PARAM_PLUGIN);
 
         $mform->addElement('hidden', 'instance', 0);
         $mform->setType('instance', PARAM_INT);
index df325b8..015d17d 100644 (file)
@@ -23,7 +23,7 @@
     $group       = optional_param('group', 0, PARAM_INT); // Group to display
     $user        = optional_param('user', 0, PARAM_INT); // User to display
     $date        = optional_param('date', 0, PARAM_FILE); // Date to display - number or some string
-    $modname     = optional_param('modname', '', PARAM_SAFEDIR); // course_module->id
+    $modname     = optional_param('modname', '', PARAM_PLUGIN); // course_module->id
     $modid       = optional_param('modid', 0, PARAM_FILE); // number or 'site_errors'
     $modaction   = optional_param('modaction', '', PARAM_PATH); // an action as recorded in the logs
     $page        = optional_param('page', '0', PARAM_INT);     // which page to show
index faf3258..4433d03 100644 (file)
@@ -13,7 +13,7 @@
     $hide      = optional_param('hide', 0, PARAM_INT);
     $show      = optional_param('show', 0, PARAM_INT);
     $blocklist = optional_param('blocklist', 0, PARAM_INT);
-    $modulelist= optional_param('modulelist', '', PARAM_ALPHAEXT);
+    $modulelist= optional_param('modulelist', '', PARAM_PLUGIN);
 
     $PAGE->set_url('/course/search.php', compact('search', 'page', 'perpage', 'blocklist', 'modulelist', 'edit'));
     $PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
index 85b9098..d71cb72 100644 (file)
@@ -142,8 +142,8 @@ class moodle_file_external extends external_api {
                     new external_single_structure(
                         array(
                             'contextid' => new external_value(PARAM_INT, ''),
-                            'component' => new external_value(PARAM_ALPHAEXT, ''),
-                            'filearea'  => new external_value(PARAM_ALPHAEXT, ''),
+                            'component' => new external_value(PARAM_COMPONENT, ''),
+                            'filearea'  => new external_value(PARAM_AREA, ''),
                             'itemid'    => new external_value(PARAM_INT, ''),
                             'filepath'  => new external_value(PARAM_TEXT, ''),
                             'filename'  => new external_value(PARAM_TEXT, ''),
@@ -154,8 +154,8 @@ class moodle_file_external extends external_api {
                     new external_single_structure(
                         array(
                             'contextid' => new external_value(PARAM_INT, ''),
-                            'component' => new external_value(PARAM_ALPHAEXT, ''),
-                            'filearea'  => new external_value(PARAM_ALPHAEXT, ''),
+                            'component' => new external_value(PARAM_COMPONENT, ''),
+                            'filearea'  => new external_value(PARAM_AREA, ''),
                             'itemid'   => new external_value(PARAM_INT, ''),
                             'filepath' => new external_value(PARAM_TEXT, ''),
                             'filename' => new external_value(PARAM_FILE, ''),
@@ -176,8 +176,8 @@ class moodle_file_external extends external_api {
         return new external_function_parameters(
             array(
                 'contextid' => new external_value(PARAM_INT, 'context id'),
-                'component' => new external_value(PARAM_ALPHAEXT, 'component'),
-                'filearea'  => new external_value(PARAM_ALPHAEXT, 'file area'),
+                'component' => new external_value(PARAM_COMPONENT, 'component'),
+                'filearea'  => new external_value(PARAM_AREA, 'file area'),
                 'itemid'    => new external_value(PARAM_INT, 'associated id'),
                 'filepath'  => new external_value(PARAM_PATH, 'file path'),
                 'filename'  => new external_value(PARAM_FILE, 'file name'),
@@ -286,8 +286,8 @@ class moodle_file_external extends external_api {
         return new external_single_structure(
              array(
                  'contextid' => new external_value(PARAM_INT, ''),
-                 'component' => new external_value(PARAM_ALPHAEXT, ''),
-                 'filearea'  => new external_value(PARAM_ALPHAEXT, ''),
+                 'component' => new external_value(PARAM_COMPONENT, ''),
+                 'filearea'  => new external_value(PARAM_AREA, ''),
                  'itemid'   => new external_value(PARAM_INT, ''),
                  'filepath' => new external_value(PARAM_TEXT, ''),
                  'filename' => new external_value(PARAM_FILE, ''),
index 9609986..2d651e9 100644 (file)
@@ -46,8 +46,8 @@ switch ($action) {
     // used by course file tree viewer
     case 'getfiletree':
         $contextid  = required_param('contextid', PARAM_INT);
-        $component  = required_param('component', PARAM_ALPHAEXT);
-        $filearea   = required_param('filearea', PARAM_ALPHAEXT);
+        $component  = required_param('component', PARAM_COMPONENT);
+        $filearea   = required_param('filearea', PARAM_AREA);
         $itemid     = required_param('itemid', PARAM_INT);
         $filepath   = required_param('filepath', PARAM_PATH);
 
index f1d59bc..cc616cc 100644 (file)
@@ -53,7 +53,7 @@ abstract class filter_local_settings_form extends moodleform {
         $mform->setDefault('contextid', $this->context->id);
 
         $mform->addElement('hidden', 'filter');
-        $mform->setType('filter', PARAM_ALPHAEXT);
+        $mform->setType('filter', PARAM_PLUGIN);
         $mform->setDefault('filter', $this->filter);
 
         $this->add_action_buttons();
index 392eed0..b558e0f 100644 (file)
@@ -706,7 +706,7 @@ class grade_plugin_return {
     public function grade_plugin_return($params = null) {
         if (empty($params)) {
             $this->type     = optional_param('gpr_type', null, PARAM_SAFEDIR);
-            $this->plugin   = optional_param('gpr_plugin', null, PARAM_SAFEDIR);
+            $this->plugin   = optional_param('gpr_plugin', null, PARAM_PLUGIN);
             $this->courseid = optional_param('gpr_courseid', null, PARAM_INT);
             $this->userid   = optional_param('gpr_userid', null, PARAM_INT);
             $this->page     = optional_param('gpr_page', null, PARAM_INT);
@@ -838,7 +838,7 @@ class grade_plugin_return {
 
         if (!empty($this->plugin)) {
             $mform->addElement('hidden', 'gpr_plugin', $this->plugin);
-            $mform->setType('gpr_plugin', PARAM_SAFEDIR);
+            $mform->setType('gpr_plugin', PARAM_PLUGIN);
         }
 
         if (!empty($this->courseid)) {
index 2659812..197c984 100644 (file)
--- a/help.php
+++ b/help.php
@@ -31,7 +31,7 @@ define('NO_MOODLE_COOKIES', true);
 require_once(dirname(__FILE__) . '/config.php');
 
 $identifier = required_param('identifier', PARAM_STRINGID);
-$component  = required_param('component', PARAM_SAFEDIR);
+$component  = required_param('component', PARAM_COMPONENT);
 $lang       = required_param('lang', PARAM_LANG); // TODO: maybe split into separate scripts
 $ajax       = optional_param('ajax', 0, PARAM_BOOL);
 
index 3802199..d4adbe6 100644 (file)
@@ -3506,9 +3506,9 @@ class admin_setting_emoticons extends admin_setting {
             $emoticon                   = new stdClass();
             $emoticon->text             = clean_param(trim($form['text'.$i]), PARAM_NOTAGS);
             $emoticon->imagename        = clean_param(trim($form['imagename'.$i]), PARAM_PATH);
-            $emoticon->imagecomponent   = clean_param(trim($form['imagecomponent'.$i]), PARAM_SAFEDIR);
+            $emoticon->imagecomponent   = clean_param(trim($form['imagecomponent'.$i]), PARAM_COMPONENT);
             $emoticon->altidentifier    = clean_param(trim($form['altidentifier'.$i]), PARAM_STRINGID);
-            $emoticon->altcomponent     = clean_param(trim($form['altcomponent'.$i]), PARAM_SAFEDIR);
+            $emoticon->altcomponent     = clean_param(trim($form['altcomponent'.$i]), PARAM_COMPONENT);
 
             if (strpos($emoticon->text, ':/') !== false or strpos($emoticon->text, '//') !== false) {
                 // prevent from breaking http://url.addresses by accident
index 5586b3c..d91fa51 100644 (file)
@@ -1078,7 +1078,7 @@ class block_manager {
      * @return boolean true if anything was done. False if not.
      */
     public function process_url_add() {
-        $blocktype = optional_param('bui_addblock', null, PARAM_SAFEDIR);
+        $blocktype = optional_param('bui_addblock', null, PARAM_PLUGIN);
         if (!$blocktype) {
             return false;
         }
index a2003ab..9ff51be 100644 (file)
@@ -117,8 +117,10 @@ function enrol_get_plugins($enabled) {
 function enrol_get_plugin($name) {
     global $CFG;
 
-    if ($name !== clean_param($name, PARAM_SAFEDIR)) {
-        // ignore malformed plugin names completely
+    $name = clean_param($name, PARAM_PLUGIN);
+
+    if (empty($name)) {
+        // ignore malformed or missing plugin names completely
         return null;
     }
 
index 4c97d64..06718b5 100644 (file)
@@ -519,11 +519,13 @@ class file_storage {
             throw new file_exception('storedfileproblem', 'Invalid contextid');
         }
 
-        if ($component === '' or $component !== clean_param($component, PARAM_ALPHAEXT)) {
+        $component = clean_param($component, PARAM_COMPONENT);
+        if (empty($component)) {
             throw new file_exception('storedfileproblem', 'Invalid component');
         }
 
-        if ($filearea === '' or $filearea !== clean_param($filearea, PARAM_ALPHAEXT)) {
+        $filearea = clean_param($filearea, PARAM_AREA);
+        if (empty($filearea)) {
             throw new file_exception('storedfileproblem', 'Invalid filearea');
         }
 
@@ -620,13 +622,15 @@ class file_storage {
             }
 
             if ($key == 'component') {
-                if ($value === '' or $value !== clean_param($value, PARAM_ALPHAEXT)) {
+                $value = clean_param($value, PARAM_COMPONENT);
+                if (empty($value)) {
                     throw new file_exception('storedfileproblem', 'Invalid component');
                 }
             }
 
             if ($key == 'filearea') {
-                if ($value === '' or $value !== clean_param($value, PARAM_ALPHAEXT)) {
+                $value = clean_param($value, PARAM_AREA);
+                if (empty($value)) {
                     throw new file_exception('storedfileproblem', 'Invalid filearea');
                 }
             }
@@ -755,11 +759,13 @@ class file_storage {
             throw new file_exception('storedfileproblem', 'Invalid contextid');
         }
 
-        if ($file_record->component === '' or $file_record->component !== clean_param($file_record->component, PARAM_ALPHAEXT)) {
+        $file_record->component = clean_param($file_record->component, PARAM_COMPONENT);
+        if (empty($file_record->component)) {
             throw new file_exception('storedfileproblem', 'Invalid component');
         }
 
-        if ($file_record->filearea === '' or $file_record->filearea !== clean_param($file_record->filearea, PARAM_ALPHAEXT)) {
+        $file_record->filearea = clean_param($file_record->filearea, PARAM_AREA);
+        if (empty($file_record->filearea)) {
             throw new file_exception('storedfileproblem', 'Invalid filearea');
         }
 
@@ -848,11 +854,13 @@ class file_storage {
             throw new file_exception('storedfileproblem', 'Invalid contextid');
         }
 
-        if ($file_record->component === '' or $file_record->component !== clean_param($file_record->component, PARAM_ALPHAEXT)) {
+        $file_record->component = clean_param($file_record->component, PARAM_COMPONENT);
+        if (empty($file_record->component)) {
             throw new file_exception('storedfileproblem', 'Invalid component');
         }
 
-        if ($file_record->filearea === '' or $file_record->filearea !== clean_param($file_record->filearea, PARAM_ALPHAEXT)) {
+        $file_record->filearea = clean_param($file_record->filearea, PARAM_ALPHAEXT);
+        if (empty($file_record->filearea)) {
             throw new file_exception('storedfileproblem', 'Invalid filearea');
         }
 
index dd68928..e2cde0b 100644 (file)
@@ -284,6 +284,29 @@ define('PARAM_TIMEZONE', 'timezone');
  */
 define('PARAM_CLEANFILE', 'file');
 
+/**
+ * PARAM_COMPONENT is used for full component names (aka frankenstyle) such as 'mod_forum', 'core_rating', 'auth_ldap'.
+ * Short legacy subsystem names and module names are accepted too ex: 'forum', 'rating', 'user'.
+ * Only lowercase ascii letters, numbers and underscores are allowed, it has to start with a letter.
+ * NOTE: numbers and underscores are strongly discouraged in plugin names!
+ */
+define('PARAM_COMPONENT', 'component');
+
+/**
+ * PARAM_AREA is a name of area used when addressing files, comments, ratings, etc.
+ * It is usually used together with context id and component.
+ * Only lowercase ascii letters, numbers and underscores are allowed, it has to start with a letter.
+ */
+define('PARAM_AREA', 'area');
+
+/**
+ * PARAM_PLUGIN is used for plugin names such as 'forum', 'glossary', 'ldap', 'radius', 'paypal', 'completionstatus'.
+ * Only lowercase ascii letters, numbers and underscores are allowed, it has to start with a letter.
+ * NOTE: numbers and underscores are strongly discouraged in plugin names! Underscores are forbidden in module names.
+ */
+define('PARAM_PLUGIN', 'plugin');
+
+
 /// Web Services ///
 
 /**
@@ -821,6 +844,34 @@ function clean_param($param, $type) {
             // easy, just strip all tags, if we ever want to fix orphaned '&' we have to do that in format_string()
             return strip_tags($param);
 
+        case PARAM_COMPONENT:
+            // we do not want any guessing here, either the name is correct or not
+            // please note only normalised component names are accepted
+            if (!preg_match('/^[a-z]+(_[a-z][a-z0-9_]*)?[a-z0-9]$/', $param)) {
+                return '';
+            }
+            if (strpos($param, '__') !== false) {
+                return '';
+            }
+            if (strpos($param, 'mod_') === 0) {
+                // module names must not contain underscores because we need to differentiate them from invalid plugin types
+                if (substr_count($param, '_') != 1) {
+                    return '';
+                }
+            }
+            return $param;
+
+        case PARAM_PLUGIN:
+        case PARAM_AREA:
+            // we do not want any guessing here, either the name is correct or not
+            if (!preg_match('/^[a-z][a-z0-9_]*[a-z0-9]$/', $param)) {
+                return '';
+            }
+            if (strpos($param, '__') !== false) {
+                return '';
+            }
+            return $param;
+
         case PARAM_SAFEDIR:      // Remove everything not a-zA-Z0-9_-
             return preg_replace('/[^a-zA-Z0-9_-]/i', '', $param);
 
@@ -988,8 +1039,10 @@ function clean_param($param, $type) {
             }
 
         case PARAM_AUTH:
-            $param = clean_param($param, PARAM_SAFEDIR);
-            if (exists_auth_plugin($param)) {
+            $param = clean_param($param, PARAM_PLUGIN);
+            if (empty($param)) {
+                return '';
+            } else if (exists_auth_plugin($param)) {
                 return $param;
             } else {
                 return '';
@@ -1004,8 +1057,10 @@ function clean_param($param, $type) {
             }
 
         case PARAM_THEME:
-            $param = clean_param($param, PARAM_SAFEDIR);
-            if (file_exists("$CFG->dirroot/theme/$param/config.php")) {
+            $param = clean_param($param, PARAM_PLUGIN);
+            if (empty($param)) {
+                return '';
+            } else if (file_exists("$CFG->dirroot/theme/$param/config.php")) {
                 return $param;
             } else if (!empty($CFG->themedir) and file_exists("$CFG->themedir/$param/config.php")) {
                 return $param;
@@ -7381,7 +7436,8 @@ function get_plugin_list($plugintype) {
             if (in_array($pluginname, $ignored)) {
                 continue;
             }
-            if ($pluginname !== clean_param($pluginname, PARAM_SAFEDIR)) {
+            $pluginname = clean_param($pluginname, PARAM_PLUGIN);
+            if (empty($pluginname)) {
                 // better ignore plugins with problematic names here
                 continue;
             }
@@ -7489,23 +7545,30 @@ function get_list_of_plugins($directory='mod', $exclude='', $basedir='') {
  *
  * @param string $type Plugin type e.g. 'mod'
  * @param string $name Plugin name
- * @param string $feature Feature code (FEATURE_xx constant)
+ * @param string $feature Feature name
  * @param string $action Feature's action
  * @param string $options parameters of callback function, should be an array
  * @param mixed $default default value if callback function hasn't been defined
  * @return mixed
  */
 function plugin_callback($type, $name, $feature, $action, $options = null, $default=null) {
-    global $CFG;
+    $component = clean_param($type . '_' . $name, PARAM_COMPONENT);
+    if (empty($component)) {
+        throw coding_exception('Invalid component used in plugin_callback():' . $type . '_' . $name);
+    }
 
-    $name = clean_param($name, PARAM_SAFEDIR);
     $function = $name.'_'.$feature.'_'.$action;
-    $file = get_component_directory($type . '_' . $name) . '/lib.php';
+
+    $dir = get_component_directory($component);
+    if (empty($dir)) {
+        throw coding_exception('Invalid component used in plugin_callback():' . $type . '_' . $name);
+    }
 
     // Load library and look for function
-    if (file_exists($file)) {
-        require_once($file);
+    if (file_exists($dir.'/lib.php')) {
+        require_once($dir.'/lib.php');
     }
+
     if (function_exists($function)) {
         // Function exists, so just return function result
         $ret = call_user_func_array($function, (array)$options);
@@ -7531,24 +7594,30 @@ function plugin_callback($type, $name, $feature, $action, $options = null, $defa
 function plugin_supports($type, $name, $feature, $default = NULL) {
     global $CFG;
 
-    $name = clean_param($name, PARAM_SAFEDIR); //bit of extra security
+    if ($type === 'mod' and $name === 'NEWMODULE') {
+        //somebody forgot to rename the module template
+        return false;
+    }
+
+    $component = clean_param($type . '_' . $name, PARAM_COMPONENT);
+    if (empty($component)) {
+        throw coding_exception('Invalid component used in plugin_supports():' . $type . '_' . $name);
+    }
 
     $function = null;
 
     if ($type === 'mod') {
         // we need this special case because we support subplugins in modules,
         // otherwise it would end up in infinite loop
-        if ($name === 'NEWMODULE') {
-            //somebody forgot to rename the module template
-            return false;
-        }
         if (file_exists("$CFG->dirroot/mod/$name/lib.php")) {
             include_once("$CFG->dirroot/mod/$name/lib.php");
-            $function = $type.'_'.$name.'_supports';
+            $function = $component.'_supports';
             if (!function_exists($function)) {
                 // legacy non-frankenstyle function name
                 $function = $name.'_supports';
             }
+        } else {
+            // invalid module
         }
 
     } else {
@@ -7558,7 +7627,7 @@ function plugin_supports($type, $name, $feature, $default = NULL) {
         }
         if (file_exists("$path/lib.php")) {
             include_once("$path/lib.php");
-            $function = $type.'_'.$name.'_supports';
+            $function = $component.'_supports';
         }
     }
 
index c0ecaae..db7880c 100644 (file)
@@ -151,7 +151,7 @@ final class portfolio_admin_form extends moodleform {
         $mform->addElement('hidden', 'visible', $this->visible);
         $mform->setType('visible', PARAM_INT);
         $mform->addElement('hidden', 'plugin', $this->plugin);
-        $mform->setType('plugin', PARAM_SAFEDIR);
+        $mform->setType('plugin', PARAM_PLUGIN);
 
         if (!$this->instance) {
             $insane = portfolio_instance_sanity_check($this->instance);
index d2d3bfc..316b506 100644 (file)
@@ -712,7 +712,7 @@ if (!empty($CFG->profilingenabled)) {
 // Process theme change in the URL.
 if (!empty($CFG->allowthemechangeonurl) and !empty($_GET['theme'])) {
     // we have to use _GET directly because we do not want this to interfere with _POST
-    $urlthemename = optional_param('theme', '', PARAM_SAFEDIR);
+    $urlthemename = optional_param('theme', '', PARAM_PLUGIN);
     try {
         $themeconfig = theme_config::load($urlthemename);
         // Makes sure the theme can be loaded without errors.
index 34c547a..d08515b 100644 (file)
@@ -693,6 +693,59 @@ class moodlelib_test extends UnitTestCase {
                 ',9789,42897');
     }
 
+    function test_clean_param_component() {
+        // please note the cleaning of component names is very strict, no guessing here
+        $this->assertIdentical(clean_param('mod_forum', PARAM_COMPONENT), 'mod_forum');
+        $this->assertIdentical(clean_param('block_online_users', PARAM_COMPONENT), 'block_online_users');
+        $this->assertIdentical(clean_param('mod_something2', PARAM_COMPONENT), 'mod_something2');
+        $this->assertIdentical(clean_param('forum', PARAM_COMPONENT), 'forum');
+        $this->assertIdentical(clean_param('user', PARAM_COMPONENT), 'user');
+        $this->assertIdentical(clean_param('rating', PARAM_COMPONENT), 'rating');
+        $this->assertIdentical(clean_param('mod_2something', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('2mod_something', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('mod_something_xx', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('auth_something__xx', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('mod_Something', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('mod_somethíng', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('auth_xx-yy', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('_auth_xx', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('a2uth_xx', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('auth_xx_', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('auth_xx.old', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('_user', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('2rating', PARAM_COMPONENT), '');
+        $this->assertIdentical(clean_param('user_', PARAM_COMPONENT), '');
+    }
+
+    function test_clean_param_plugin() {
+        // please note the cleaning of plugin names is very strict, no guessing here
+        $this->assertIdentical(clean_param('forum', PARAM_PLUGIN), 'forum');
+        $this->assertIdentical(clean_param('forum2', PARAM_PLUGIN), 'forum2');
+        $this->assertIdentical(clean_param('online_users', PARAM_PLUGIN), 'online_users');
+        $this->assertIdentical(clean_param('online__users', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('forum ', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('forum.old', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('xx-yy', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('2xx', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('Xx', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('_xx', PARAM_PLUGIN), '');
+        $this->assertIdentical(clean_param('xx_', PARAM_PLUGIN), '');
+    }
+
+    function test_clean_param_area() {
+        // please note the cleaning of area names is very strict, no guessing here
+        $this->assertIdentical(clean_param('something', PARAM_AREA), 'something');
+        $this->assertIdentical(clean_param('something2', PARAM_AREA), 'something2');
+        $this->assertIdentical(clean_param('some_thing', PARAM_AREA), 'some_thing');
+        $this->assertIdentical(clean_param('_something', PARAM_AREA), '');
+        $this->assertIdentical(clean_param('something_', PARAM_AREA), '');
+        $this->assertIdentical(clean_param('2something', PARAM_AREA), '');
+        $this->assertIdentical(clean_param('Something', PARAM_AREA), '');
+        $this->assertIdentical(clean_param('some-thing', PARAM_AREA), '');
+        $this->assertIdentical(clean_param('somethííng', PARAM_AREA), '');
+        $this->assertIdentical(clean_param('something.x', PARAM_AREA), '');
+    }
+
     function test_clean_param_text() {
         $this->assertEqual(PARAM_TEXT, PARAM_MULTILANG);
         //standard
index 06693c4..8ea6abd 100644 (file)
@@ -276,14 +276,11 @@ function upgrade_plugins($type, $startcallback, $endcallback, $verbose) {
     $plugs = get_plugin_list($type);
 
     foreach ($plugs as $plug=>$fullplug) {
-        $component = $type.'_'.$plug; // standardised plugin name
+        $component = clean_param($type.'_'.$plug, PARAM_COMPONENT); // standardised plugin name
 
         // check plugin dir is valid name
-        $cplug = strtolower($plug);
-        $cplug = clean_param($cplug, PARAM_SAFEDIR);
-        $cplug = str_replace('-', '', $cplug);
-        if ($plug !== $cplug) {
-            throw new plugin_defective_exception($component, 'Invalid plugin directory name.');
+        if (empty($component)) {
+            throw new plugin_defective_exception($type.'_'.$plug, 'Invalid plugin directory name.');
         }
 
         if (!is_readable($fullplug.'/version.php')) {
@@ -430,15 +427,11 @@ function upgrade_plugins_modules($startcallback, $endcallback, $verbose) {
             continue;
         }
 
-        $component = 'mod_'.$mod;
+        $component = clean_param('mod_'.$mod, PARAM_COMPONENT);
 
         // check module dir is valid name
-        $cmod = strtolower($mod);
-        $cmod = clean_param($cmod, PARAM_SAFEDIR);
-        $cmod = str_replace('-', '', $cmod);
-        $cmod = str_replace('_', '', $cmod); // modules MUST not have '_' in name and never will, sorry
-        if ($mod !== $cmod) {
-            throw new plugin_defective_exception($component, 'Invalid plugin directory name.');
+        if (empty($component)) {
+            throw new plugin_defective_exception('mod_'.$mod, 'Invalid plugin directory name.');
         }
 
         if (!is_readable($fullmod.'/version.php')) {
@@ -593,18 +586,15 @@ function upgrade_plugins_blocks($startcallback, $endcallback, $verbose) {
             $first_install = ($DB->count_records('block_instances') == 0);
         }
 
-        if ($blockname == 'NEWBLOCK') {   // Someone has unzipped the template, ignore it
+        if ($blockname === 'NEWBLOCK') {   // Someone has unzipped the template, ignore it
             continue;
         }
 
-        $component = 'block_'.$blockname;
+        $component = clean_param('block_'.$blockname, PARAM_COMPONENT);
 
         // check block dir is valid name
-        $cblockname = strtolower($blockname);
-        $cblockname = clean_param($cblockname, PARAM_SAFEDIR);
-        $cblockname = str_replace('-', '', $cblockname);
-        if ($blockname !== $cblockname) {
-            throw new plugin_defective_exception($component, 'Invalid plugin directory name.');
+        if (empty($component)) {
+            throw new plugin_defective_exception('block_'.$blockname, 'Invalid plugin directory name.');
         }
 
         if (!is_readable($fullblock.'/version.php')) {
index e1c3d73..d247b31 100644 (file)
@@ -2473,7 +2473,7 @@ function assignment_delete_instance($id){
 function assignment_update_instance($assignment){
     global $CFG;
 
-    $assignment->assignmenttype = clean_param($assignment->assignmenttype, PARAM_SAFEDIR);
+    $assignment->assignmenttype = clean_param($assignment->assignmenttype, PARAM_PLUGIN);
 
     require_once("$CFG->dirroot/mod/assignment/type/$assignment->assignmenttype/assignment.class.php");
     $assignmentclass = "assignment_$assignment->assignmenttype";
@@ -2490,7 +2490,7 @@ function assignment_update_instance($assignment){
 function assignment_add_instance($assignment) {
     global $CFG;
 
-    $assignment->assignmenttype = clean_param($assignment->assignmenttype, PARAM_SAFEDIR);
+    $assignment->assignmenttype = clean_param($assignment->assignmenttype, PARAM_PLUGIN);
 
     require_once("$CFG->dirroot/mod/assignment/type/$assignment->assignmenttype/assignment.class.php");
     $assignmentclass = "assignment_$assignment->assignmenttype";
index f26f1be..40023e6 100644 (file)
@@ -723,7 +723,7 @@ abstract class lesson_add_page_form_base extends moodleform {
 
         if ($this->standard === true) {
             $mform->addElement('hidden', 'qtype');
-            $mform->setType('qtype', PARAM_SAFEDIR);
+            $mform->setType('qtype', PARAM_PLUGIN);
 
             $mform->addElement('text', 'title', get_string('pagetitle', 'lesson'), array('size'=>70));
             $mform->setType('title', PARAM_TEXT);
index 6ec50d0..f6e5e03 100644 (file)
@@ -63,7 +63,7 @@ class workshop_assessment_form extends moodleform {
 
         // add the data common for all subplugins
         $mform->addElement('hidden', 'strategy', $this->workshop->strategy);
-        $mform->setType('strategy', PARAM_SAFEDIR);
+        $mform->setType('strategy', PARAM_PLUGIN);
 
         if (!empty($this->options['editableweight']) and !$mform->isFrozen()) {
             $mform->addElement('header', 'assessmentsettings', get_string('assessmentweight', 'workshop'));
index 12ecaa7..e70056d 100644 (file)
@@ -63,7 +63,7 @@ class workshop_edit_strategy_form extends moodleform {
         $mform->setType('workshopid', PARAM_INT);
 
         $mform->addElement('hidden', 'strategy', $this->workshop->strategy);    // strategy name
-        $mform->setType('strategy', PARAM_SAFEDIR);
+        $mform->setType('strategy', PARAM_PLUGIN);
 
         $this->definition_inner($mform);
 
index 635273f..7636365 100644 (file)
@@ -49,8 +49,8 @@ if (count($args) < 3) { // always at least context, component and filearea
 }
 
 $contextid = (int)array_shift($args);
-$component = clean_param(array_shift($args), PARAM_SAFEDIR);
-$filearea  = clean_param(array_shift($args), PARAM_SAFEDIR);
+$component = clean_param(array_shift($args), PARAM_COMPONENT);
+$filearea  = clean_param(array_shift($args), PARAM_AREA);
 
 list($context, $course, $cm) = get_context_info_array($contextid);
 
index 38c2f5c..2667947 100644 (file)
@@ -28,8 +28,8 @@ require_once("../config.php");
 require_once("lib.php");
 
 $contextid  = required_param('contextid', PARAM_INT);
-$component  = required_param('component', PARAM_ALPHAEXT);
-$ratingarea = optional_param('ratingarea', null, PARAM_ALPHANUMEXT);
+$component  = required_param('component', PARAM_COMPONENT);
+$ratingarea = optional_param('ratingarea', null, PARAM_AREA);
 $itemid     = required_param('itemid', PARAM_INT);
 $scaleid    = required_param('scaleid', PARAM_INT);
 $sort       = optional_param('sort', '', PARAM_ALPHA);
index ad6f66c..ab05b47 100644 (file)
@@ -30,8 +30,8 @@ require_once('../config.php');
 require_once($CFG->dirroot.'/rating/lib.php');
 
 $contextid   = required_param('contextid', PARAM_INT);
-$component   = required_param('component', PARAM_ALPHAEXT);
-$ratingarea  = required_param('ratingarea', PARAM_ALPHANUMEXT);
+$component   = required_param('component', PARAM_COMPONENT);
+$ratingarea  = required_param('ratingarea', PARAM_AREA);
 $itemid      = required_param('itemid', PARAM_INT);
 $scaleid     = required_param('scaleid', PARAM_INT);
 $userrating  = required_param('rating', PARAM_INT);
index c3e5bf8..98a81a8 100644 (file)
@@ -32,8 +32,8 @@ require_once('../config.php');
 require_once($CFG->dirroot.'/rating/lib.php');
 
 $contextid         = required_param('contextid', PARAM_INT);
-$component         = required_param('component', PARAM_ALPHAEXT);
-$ratingarea        = required_param('ratingarea', PARAM_ALPHANUMEXT);
+$component         = required_param('component', PARAM_COMPONENT);
+$ratingarea        = required_param('ratingarea', PARAM_AREA);
 $itemid            = required_param('itemid', PARAM_INT);
 $scaleid           = required_param('scaleid', PARAM_INT);
 $userrating        = required_param('rating', PARAM_INT);
index 093e806..8b0fa15 100644 (file)
@@ -134,8 +134,8 @@ class repository_coursefiles extends repository {
         $fileitemid = clean_param($params['itemid'], PARAM_INT);
         $filename = clean_param($params['filename'], PARAM_FILE);
         $filepath = clean_param($params['filepath'], PARAM_PATH);;
-        $filearea = clean_param($params['filearea'], PARAM_ALPHAEXT);
-        $component = clean_param($params['component'], PARAM_ALPHAEXT);
+        $filearea = clean_param($params['filearea'], PARAM_AREA);
+        $component = clean_param($params['component'], PARAM_COMPONENT);
         $context = get_context_instance_by_id($contextid);
 
         $file_info = $browser->get_file_info($context, $component, $filearea, $fileitemid, $filepath, $filename);
index 4418218..fbdcd7d 100644 (file)
@@ -640,8 +640,8 @@ abstract class repository {
         $fileitemid = clean_param($params['itemid'],    PARAM_INT);
         $filename   = clean_param($params['filename'],  PARAM_FILE);
         $filepath   = clean_param($params['filepath'],  PARAM_PATH);;
-        $filearea   = clean_param($params['filearea'],  PARAM_ALPHAEXT);
-        $component  = clean_param($params['component'], PARAM_ALPHAEXT);
+        $filearea   = clean_param($params['filearea'],  PARAM_AREA);
+        $component  = clean_param($params['component'], PARAM_COMPONENT);
 
         $context    = get_context_instance_by_id($contextid);
         // the file needs to copied to draft area
@@ -1369,8 +1369,8 @@ abstract class repository {
         $fileitemid = clean_param($params['itemid'], PARAM_INT);
         $filename   = clean_param($params['filename'], PARAM_FILE);
         $filepath   = clean_param($params['filepath'], PARAM_PATH);
-        $filearea   = clean_param($params['filearea'], PARAM_SAFEDIR);
-        $component  = clean_param($params['component'], PARAM_ALPHAEXT);
+        $filearea   = clean_param($params['filearea'], PARAM_AREA);
+        $component  = clean_param($params['component'], PARAM_COMPONENT);
         $context    = get_context_instance_by_id($contextid);
         $file_info  = $browser->get_file_info($context, $component, $filearea, $fileitemid, $filepath, $filename);
         if (!empty($file_info)) {
@@ -1887,7 +1887,7 @@ final class repository_instance_form extends moodleform {
         $mform->addElement('hidden', 'new',   $this->plugin);
         $mform->setType('new', PARAM_FORMAT);
         $mform->addElement('hidden', 'plugin', $this->plugin);
-        $mform->setType('plugin', PARAM_SAFEDIR);
+        $mform->setType('plugin', PARAM_PLUGIN);
         $mform->addElement('hidden', 'typeid', $this->typeid);
         $mform->setType('typeid', PARAM_INT);
         $mform->addElement('hidden', 'contextid', $this->contextid);
@@ -2001,7 +2001,7 @@ final class repository_type_form extends moodleform {
         $mform->addElement('hidden', 'action', $this->action);
         $mform->setType('action', PARAM_TEXT);
         $mform->addElement('hidden', 'repos', $this->plugin);
-        $mform->setType('repos', PARAM_SAFEDIR);
+        $mform->setType('repos', PARAM_PLUGIN);
 
         // let the plugin add its specific fields
         $classname = 'repository_' . $this->plugin;
index 4f36475..14a1948 100644 (file)
@@ -52,8 +52,8 @@ class repository_local extends repository {
         if (!empty($encodedpath)) {
             $params = unserialize(base64_decode($encodedpath));
             if (is_array($params)) {
-                $component = is_null($params['component']) ? NULL : clean_param($params['component'], PARAM_ALPHAEXT);
-                $filearea  = is_null($params['filearea']) ? NULL : clean_param($params['filearea'], PARAM_ALPHAEXT);
+                $component = is_null($params['component']) ? NULL : clean_param($params['component'], PARAM_COMPONENT);
+                $filearea  = is_null($params['filearea']) ? NULL : clean_param($params['filearea'], PARAM_AREA);
                 $itemid    = is_null($params['itemid']) ? NULL : clean_param($params['itemid'], PARAM_INT);
                 $filepath  = is_null($params['filepath']) ? NULL : clean_param($params['filepath'], PARAM_PATH);;
                 $filename  = is_null($params['filename']) ? NULL : clean_param($params['filename'], PARAM_FILE);
index 758face..da4e61f 100644 (file)
@@ -170,8 +170,8 @@ class repository_recent extends repository {
         $fileitemid = clean_param($params['itemid'],    PARAM_INT);
         $filename   = clean_param($params['filename'],  PARAM_FILE);
         $filepath   = clean_param($params['filepath'],  PARAM_PATH);;
-        $filearea   = clean_param($params['filearea'],  PARAM_ALPHAEXT);
-        $component  = clean_param($params['component'], PARAM_ALPHAEXT);
+        $filearea   = clean_param($params['filearea'],  PARAM_AREA);
+        $component  = clean_param($params['component'], PARAM_COMPONENT);
 
         // XXX:
         // When user try to pick a file from other filearea, normally file api will use file browse to
index 2a40a92..60cd1e6 100644 (file)
@@ -22,7 +22,7 @@
 require_once(dirname(__FILE__) . '/../config.php');
 require_once($CFG->libdir . '/adminlib.php');
 
-$choose = optional_param('choose', '', PARAM_SAFEDIR);
+$choose = optional_param('choose', '', PARAM_PLUGIN);
 $reset  = optional_param('reset', 0, PARAM_BOOL);
 $device = optional_param('device', '', PARAM_TEXT);
 
@@ -43,7 +43,7 @@ if ($reset and confirm_sesskey()) {
     theme_reset_all_caches();
 
 } else if ($choose && $device && confirm_sesskey()) {
+
     // Load the theme to make sure it is valid.
     $theme = theme_config::load($choose);
     // Get the config argument for the chosen device.
index ac8cd74..039ea3f 100644 (file)
@@ -45,10 +45,10 @@ class moodle_user_external extends external_api {
                             'firstname'   => new external_value(PARAM_NOTAGS, 'The first name(s) of the user'),
                             'lastname'    => new external_value(PARAM_NOTAGS, 'The family name of the user'),
                             'email'       => new external_value(PARAM_EMAIL, 'A valid and unique email address'),
-                            'auth'        => new external_value(PARAM_SAFEDIR, 'Auth plugins include manual, ldap, imap, etc', VALUE_DEFAULT, 'manual', NULL_NOT_ALLOWED),
+                            'auth'        => new external_value(PARAM_PLUGIN, 'Auth plugins include manual, ldap, imap, etc', VALUE_DEFAULT, 'manual', NULL_NOT_ALLOWED),
                             'idnumber'    => new external_value(PARAM_RAW, 'An arbitrary ID code number perhaps from the institution', VALUE_DEFAULT, ''),
                             'lang'        => new external_value(PARAM_SAFEDIR, 'Language code such as "en", must exist on server', VALUE_DEFAULT, $CFG->lang, NULL_NOT_ALLOWED),
-                            'theme'       => new external_value(PARAM_SAFEDIR, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL),
+                            'theme'       => new external_value(PARAM_PLUGIN, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL),
                             'timezone'    => new external_value(PARAM_TIMEZONE, 'Timezone code such as Australia/Perth, or 99 for default', VALUE_OPTIONAL),
                             'mailformat'  => new external_value(PARAM_INTEGER, 'Mail format code is 0 for plain text, 1 for HTML etc', VALUE_OPTIONAL),
                             'description' => new external_value(PARAM_TEXT, 'User profile description, no HTML', VALUE_OPTIONAL),
@@ -252,10 +252,10 @@ class moodle_user_external extends external_api {
                             'firstname'   => new external_value(PARAM_NOTAGS, 'The first name(s) of the user', VALUE_OPTIONAL, '',NULL_NOT_ALLOWED),
                             'lastname'    => new external_value(PARAM_NOTAGS, 'The family name of the user', VALUE_OPTIONAL),
                             'email'       => new external_value(PARAM_EMAIL, 'A valid and unique email address', VALUE_OPTIONAL, '',NULL_NOT_ALLOWED),
-                            'auth'        => new external_value(PARAM_SAFEDIR, 'Auth plugins include manual, ldap, imap, etc', VALUE_OPTIONAL, '', NULL_NOT_ALLOWED),
+                            'auth'        => new external_value(PARAM_PLUGIN, 'Auth plugins include manual, ldap, imap, etc', VALUE_OPTIONAL, '', NULL_NOT_ALLOWED),
                             'idnumber'    => new external_value(PARAM_RAW, 'An arbitrary ID code number perhaps from the institution', VALUE_OPTIONAL),
                             'lang'        => new external_value(PARAM_SAFEDIR, 'Language code such as "en", must exist on server', VALUE_OPTIONAL, '', NULL_NOT_ALLOWED),
-                            'theme'       => new external_value(PARAM_SAFEDIR, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL),
+                            'theme'       => new external_value(PARAM_PLUGIN, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL),
                             'timezone'    => new external_value(PARAM_TIMEZONE, 'Timezone code such as Australia/Perth, or 99 for default', VALUE_OPTIONAL),
                             'mailformat'  => new external_value(PARAM_INTEGER, 'Mail format code is 0 for plain text, 1 for HTML etc', VALUE_OPTIONAL),
                             'description' => new external_value(PARAM_TEXT, 'User profile description, no HTML', VALUE_OPTIONAL),
@@ -423,11 +423,11 @@ class moodle_user_external extends external_api {
                     'interests'   => new external_value(PARAM_TEXT, 'user interests (separated by commas)', VALUE_OPTIONAL),
                     'firstaccess' => new external_value(PARAM_INT, 'first access to the site (0 if never)', VALUE_OPTIONAL),
                     'lastaccess'  => new external_value(PARAM_INT, 'last access to the site (0 if never)', VALUE_OPTIONAL),
-                    'auth'        => new external_value(PARAM_SAFEDIR, 'Auth plugins include manual, ldap, imap, etc', VALUE_OPTIONAL),
+                    'auth'        => new external_value(PARAM_PLUGIN, 'Auth plugins include manual, ldap, imap, etc', VALUE_OPTIONAL),
                     'confirmed'   => new external_value(PARAM_NUMBER, 'Active user: 1 if confirmed, 0 otherwise', VALUE_OPTIONAL),
                     'idnumber'    => new external_value(PARAM_RAW, 'An arbitrary ID code number perhaps from the institution', VALUE_OPTIONAL),
                     'lang'        => new external_value(PARAM_SAFEDIR, 'Language code such as "en", must exist on server', VALUE_OPTIONAL),
-                    'theme'       => new external_value(PARAM_SAFEDIR, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL),
+                    'theme'       => new external_value(PARAM_PLUGIN, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL),
                     'timezone'    => new external_value(PARAM_TIMEZONE, 'Timezone code such as Australia/Perth, or 99 for default', VALUE_OPTIONAL),
                     'mailformat'  => new external_value(PARAM_INTEGER, 'Mail format code is 0 for plain text, 1 for HTML etc', VALUE_OPTIONAL),
                     'description' => new external_value(PARAM_RAW, 'User profile description', VALUE_OPTIONAL),