Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 3.9.x will end* 10 May 2021 (12 months).
  • Bug fixes for security issues in 3.9.x will end* 8 May 2023 (36 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 39 and 311] [Versions 39 and 400] [Versions 39 and 401] [Versions 39 and 402] [Versions 39 and 403]

   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * Web services admin UI forms
  20   *
  21   * @package   webservice
  22   * @copyright 2009 Moodle Pty Ltd (http://moodle.com)
  23   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  require_once $CFG->libdir . '/formslib.php';
  26  
  27  /**
  28   * Display the authorised user settings form
  29   * Including IP Restriction, Valid until and (TODO) capability
  30   */
  31  class external_service_authorised_user_settings_form extends moodleform {
  32  
  33      function definition() {
  34          $mform = $this->_form;
  35          $data = $this->_customdata;
  36  
  37          $mform->addElement('header', 'serviceusersettings',
  38                  get_string('serviceusersettings', 'webservice'));
  39  
  40          $mform->addElement('text', 'iprestriction',
  41                  get_string('iprestriction', 'webservice'));
  42          $mform->addHelpButton('iprestriction', 'iprestriction', 'webservice');
  43          $mform->setType('iprestriction', PARAM_RAW_TRIMMED);
  44  
  45          $mform->addElement('date_selector', 'validuntil',
  46                  get_string('validuntil', 'webservice'), array('optional' => true));
  47          $mform->addHelpButton('validuntil', 'validuntil', 'webservice');
  48          $mform->setType('validuntil', PARAM_INT);
  49  
  50          $this->add_action_buttons(true, get_string('updateusersettings', 'webservice'));
  51  
  52          $this->set_data($data);
  53      }
  54  
  55  }
  56  
  57  class external_service_form extends moodleform {
  58  
  59      function definition() {
  60          $mform = $this->_form;
  61          $service = isset($this->_customdata) ? $this->_customdata : new stdClass();
  62  
  63          $mform->addElement('header', 'extservice',
  64                  get_string('externalservice', 'webservice'));
  65  
  66          $mform->addElement('text', 'name', get_string('name'));
  67          $mform->addRule('name', get_string('required'), 'required', null, 'client');
  68          $mform->setType('name', PARAM_TEXT);
  69  
  70          $mform->addElement('text', 'shortname', get_string('shortname'), 'maxlength="255" size="20"');
  71          $mform->setType('shortname', PARAM_TEXT);
  72          if (!empty($service->id)) {
  73              $mform->hardFreeze('shortname');
  74              $mform->setConstants('shortname', $service->shortname);
  75          }
  76  
  77          $mform->addElement('advcheckbox', 'enabled', get_string('enabled', 'webservice'));
  78          $mform->setType('enabled', PARAM_BOOL);
  79          $mform->addElement('advcheckbox', 'restrictedusers',
  80                  get_string('restrictedusers', 'webservice'));
  81          $mform->addHelpButton('restrictedusers', 'restrictedusers', 'webservice');
  82          $mform->setType('restrictedusers', PARAM_BOOL);
  83  
  84          // Can users download files?
  85          $mform->addElement('advcheckbox', 'downloadfiles', get_string('downloadfiles', 'webservice'));
  86          $mform->setAdvanced('downloadfiles');
  87          $mform->addHelpButton('downloadfiles', 'downloadfiles', 'webservice');
  88          $mform->setType('downloadfiles', PARAM_BOOL);
  89  
  90          // Can users upload files?
  91          $mform->addElement('advcheckbox', 'uploadfiles', get_string('uploadfiles', 'webservice'));
  92          $mform->setAdvanced('uploadfiles');
  93          $mform->addHelpButton('uploadfiles', 'uploadfiles', 'webservice');
  94  
  95          /// needed to select automatically the 'No required capability" option
  96          $currentcapabilityexist = false;
  97          if (empty($service->requiredcapability)) {
  98              $service->requiredcapability = "norequiredcapability";
  99              $currentcapabilityexist = true;
 100          }
 101  
 102          // Prepare the list of capabilities to choose from
 103          $systemcontext = context_system::instance();
 104          $allcapabilities = $systemcontext->get_capabilities();
 105          $capabilitychoices = array();
 106          $capabilitychoices['norequiredcapability'] = get_string('norequiredcapability',
 107                          'webservice');
 108          foreach ($allcapabilities as $cap) {
 109              $capabilitychoices[$cap->name] = $cap->name . ': '
 110                      . get_capability_string($cap->name);
 111              if (!empty($service->requiredcapability)
 112                      && $service->requiredcapability == $cap->name) {
 113                  $currentcapabilityexist = true;
 114              }
 115          }
 116  
 117          $mform->addElement('searchableselector', 'requiredcapability',
 118                  get_string('requiredcapability', 'webservice'), $capabilitychoices);
 119          $mform->addHelpButton('requiredcapability', 'requiredcapability', 'webservice');
 120          $mform->setAdvanced('requiredcapability');
 121          $mform->setType('requiredcapability', PARAM_RAW);
 122  /// display notification error if the current requiredcapability doesn't exist anymore
 123          if (empty($currentcapabilityexist)) {
 124              global $OUTPUT;
 125              $mform->addElement('static', 'capabilityerror', '',
 126                      $OUTPUT->notification(get_string('selectedcapabilitydoesntexit',
 127                                      'webservice', $service->requiredcapability)));
 128              $service->requiredcapability = "norequiredcapability";
 129          }
 130  
 131          $mform->addElement('hidden', 'id');
 132          $mform->setType('id', PARAM_INT);
 133  
 134          if (!empty($service->id)) {
 135              $buttonlabel = get_string('savechanges');
 136          } else {
 137              $buttonlabel = get_string('addaservice', 'webservice');
 138          }
 139  
 140          $this->add_action_buttons(true, $buttonlabel);
 141  
 142          $this->set_data($service);
 143      }
 144  
 145      function definition_after_data() {
 146          $mform = $this->_form;
 147          $service = $this->_customdata;
 148  
 149          if (!empty($service->component)) {
 150              // built-in components must not be modified except the enabled flag!!
 151              $mform->hardFreeze('name,requiredcapability,restrictedusers');
 152          }
 153      }
 154  
 155      function validation($data, $files) {
 156          global $DB;
 157  
 158          $errors = parent::validation($data, $files);
 159  
 160          // Add field validation check for duplicate name.
 161          if ($webservice = $DB->get_record('external_services', array('name' => $data['name']))) {
 162              if (empty($data['id']) || $webservice->id != $data['id']) {
 163                  $errors['name'] = get_string('nameexists', 'webservice');
 164              }
 165          }
 166  
 167          // Add field validation check for duplicate shortname.
 168          // Allow duplicated "empty" shortnames.
 169          if (!empty($data['shortname'])) {
 170              if ($service = $DB->get_record('external_services', array('shortname' => $data['shortname']), '*', IGNORE_MULTIPLE)) {
 171                  if (empty($data['id']) || $service->id != $data['id']) {
 172                      $errors['shortname'] = get_string('shortnametaken', 'webservice', $service->name);
 173                  }
 174              }
 175          }
 176  
 177          return $errors;
 178      }
 179  
 180  }
 181  
 182  class external_service_functions_form extends moodleform {
 183  
 184      function definition() {
 185          global $CFG;
 186  
 187          $mform = $this->_form;
 188          $data = $this->_customdata;
 189  
 190          $mform->addElement('header', 'addfunction', get_string('addfunctions', 'webservice'));
 191  
 192          require_once($CFG->dirroot . "/webservice/lib.php");
 193          $webservicemanager = new webservice();
 194          $functions = $webservicemanager->get_not_associated_external_functions($data['id']);
 195  
 196          //we add the descriptions to the functions
 197          foreach ($functions as $functionid => $functionname) {
 198              //retrieve full function information (including the description)
 199              $function = external_api::external_function_info($functionname);
 200              if (empty($function->deprecated)) {
 201                  $functions[$functionid] = $function->name . ':' . $function->description;
 202              } else {
 203                  // Exclude the deprecated ones.
 204                  unset($functions[$functionid]);
 205              }
 206          }
 207  
 208          $mform->addElement('searchableselector', 'fids', get_string('name'),
 209                  $functions, array('multiple'));
 210          $mform->addRule('fids', get_string('required'), 'required', null, 'client');
 211  
 212          $mform->addElement('hidden', 'id');
 213          $mform->setType('id', PARAM_INT);
 214  
 215          $mform->addElement('hidden', 'action');
 216          $mform->setType('action', PARAM_ALPHANUMEXT);
 217  
 218          $this->add_action_buttons(true, get_string('addfunctions', 'webservice'));
 219  
 220          $this->set_data($data);
 221      }
 222  
 223  }
 224  
 225  class web_service_token_form extends moodleform {
 226  
 227      function definition() {
 228          global $USER, $DB, $CFG;
 229  
 230          $mform = $this->_form;
 231          $data = $this->_customdata;
 232  
 233          $mform->addElement('header', 'token', get_string('token', 'webservice'));
 234  
 235          if (empty($data->nouserselection)) {
 236  
 237              //check if the number of user is reasonable to be displayed in a select box
 238              $usertotal = $DB->count_records('user',
 239                      array('deleted' => 0, 'suspended' => 0, 'confirmed' => 1));
 240  
 241              if ($usertotal < 500) {
 242                  list($sort, $params) = users_order_by_sql('u');
 243                  // User searchable selector - return users who are confirmed, not deleted, not suspended and not a guest.
 244                  $sql = 'SELECT u.id, ' . get_all_user_name_fields(true, 'u') . '
 245                          FROM {user} u
 246                          WHERE u.deleted = 0
 247                          AND u.confirmed = 1
 248                          AND u.suspended = 0
 249                          AND u.id != :siteguestid
 250                          ORDER BY ' . $sort;
 251                  $params['siteguestid'] = $CFG->siteguest;
 252                  $users = $DB->get_records_sql($sql, $params);
 253                  $options = array();
 254                  foreach ($users as $userid => $user) {
 255                      $options[$userid] = fullname($user);
 256                  }
 257                  $mform->addElement('searchableselector', 'user', get_string('user'), $options);
 258                  $mform->setType('user', PARAM_INT);
 259              } else {
 260                  //simple text box for username or user id (if two username exists, a form error is displayed)
 261                  $mform->addElement('text', 'user', get_string('usernameorid', 'webservice'));
 262                  $mform->setType('user', PARAM_RAW_TRIMMED);
 263              }
 264              $mform->addRule('user', get_string('required'), 'required', null, 'client');
 265          }
 266  
 267          //service selector
 268          $services = $DB->get_records('external_services');
 269          $options = array();
 270          $systemcontext = context_system::instance();
 271          foreach ($services as $serviceid => $service) {
 272              //check that the user has the required capability
 273              //(only for generation by the profile page)
 274              if (empty($data->nouserselection)
 275                      || empty($service->requiredcapability)
 276                      || has_capability($service->requiredcapability, $systemcontext, $USER->id)) {
 277                  $options[$serviceid] = $service->name;
 278              }
 279          }
 280          $mform->addElement('select', 'service', get_string('service', 'webservice'), $options);
 281          $mform->addRule('service', get_string('required'), 'required', null, 'client');
 282          $mform->setType('service', PARAM_INT);
 283  
 284          $mform->addElement('text', 'iprestriction', get_string('iprestriction', 'webservice'));
 285          $mform->setType('iprestriction', PARAM_RAW_TRIMMED);
 286  
 287          $mform->addElement('date_selector', 'validuntil',
 288                  get_string('validuntil', 'webservice'), array('optional' => true));
 289          $mform->setType('validuntil', PARAM_INT);
 290  
 291          $mform->addElement('hidden', 'action');
 292          $mform->setType('action', PARAM_ALPHANUMEXT);
 293  
 294          $this->add_action_buttons(true);
 295  
 296          $this->set_data($data);
 297      }
 298  
 299      function get_data() {
 300          global $DB;
 301          $data = parent::get_data();
 302  
 303          if (!empty($data) && !is_numeric($data->user)) {
 304              //retrieve username
 305              $user = $DB->get_record('user', array('username' => $data->user), 'id');
 306              $data->user = $user->id;
 307          }
 308          return $data;
 309      }
 310  
 311      function validation($data, $files) {
 312          global $DB;
 313  
 314          $errors = parent::validation($data, $files);
 315  
 316          if (is_numeric($data['user'])) {
 317              $searchtype = 'id';
 318          } else {
 319              $searchtype = 'username';
 320              //check the username is valid
 321              if (clean_param($data['user'], PARAM_USERNAME) != $data['user']) {
 322                  $errors['user'] = get_string('invalidusername');
 323              }
 324          }
 325  
 326          if (!isset($errors['user'])) {
 327              $users = $DB->get_records('user', array($searchtype => $data['user']), '', 'id');
 328  
 329              //check that the user exists in the database
 330              if (count($users) == 0) {
 331                  $errors['user'] = get_string('usernameoridnousererror', 'webservice');
 332              } else if (count($users) > 1) { //can only be a username search as id are unique
 333                  $errors['user'] = get_string('usernameoridoccurenceerror', 'webservice');
 334              }
 335          }
 336  
 337          return $errors;
 338      }
 339  
 340  }