Merge branch 'MDL-66118-master-byebyemoodlenet' of git://github.com/mudrd8mz/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Tue, 8 Oct 2019 23:43:33 +0000 (07:43 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Tue, 8 Oct 2019 23:43:33 +0000 (07:43 +0800)
1  2 
lang/en/admin.php
lib/classes/hub/api.php
lib/classes/hub/registration.php
lib/classes/hub/site_registration_form.php
lib/db/upgrade.php
version.php

diff --combined lang/en/admin.php
@@@ -822,8 -822,6 +822,8 @@@ $string['navshowallcourses'] = 'Show al
  $string['navshowcategories'] = 'Show course categories';
  $string['navshowmycoursecategories'] = 'Show my course categories';
  $string['navshowmycoursecategories_help'] = 'If enabled courses in the users my courses branch will be shown in categories.';
 +$string['navsortmycourseshiddenlast'] = 'Sort my hidden courses last';
 +$string['navsortmycourseshiddenlast_help'] = 'If enabled, any hidden courses will be listed after visible courses (for users who can view hidden courses). Otherwise, all courses, regardless of their visibility, will be listed according to the \'Sort my courses\' setting.';
  $string['navsortmycoursessort'] = 'Sort my courses';
  $string['navsortmycoursessort_help'] = 'This determines whether courses are listed under My courses according to the sort order (i.e. the order set in Site administration > Courses > Manage courses and categories) or alphabetically by course setting.';
  $string['never'] = 'Never';
@@@ -1013,11 -1011,6 +1013,6 @@@ $string['quizattemptsupgradedmessage'] 
  $string['recaptchaprivatekey'] = 'ReCAPTCHA secret key';
  $string['recaptchapublickey'] = 'ReCAPTCHA site key';
  $string['register'] = 'Register your site';
- $string['registermoodlenet'] = '<p>We\'d love to stay in touch and provide you with important things for your Moodle site!</p><p>By registering:</p><ul><li>You can subscribe to receive notifications of new Moodle releases, security alerts and other important news.</li><li>You can access and activate mobile push notifications from your Moodle site through our free <a href="https://download.moodle.org/mobile/">Moodle app</a>.</li><li>You are contributing to our <a href="https://moodle.net/stats/">Moodle statistics</a> of the worldwide community, which help us improve Moodle and our community sites.</li><li>If you wish, your site can be included in the <a href="https://moodle.net/sites/">list of registered Moodle sites</a> in your country.</li></ul>';
- $string['registermoodleorg'] = 'When you register your site';
- $string['registermoodleorgli1'] = 'You are added to a low-volume mailing list for important notifications such as security alerts and new releases of Moodle.';
- $string['registermoodleorgli2'] = 'Statistics about your site will be added to the {$a} of the worldwide Moodle community.';
- $string['registerwithmoodleorg'] = 'Register your site';
  $string['registration'] = 'Registration';
  $string['registration_help'] = 'By registering:
  
@@@ -1434,3 -1427,8 +1429,8 @@@ $string['allowblockstodock'] = 'Allow b
  $string['configallowblockstodock'] = 'If enabled and supported by the selected theme users can choose to move blocks to a special dock.';
  // Deprecated since Moodle 3.8.
  $string['configuserquota'] = 'The maximum number of bytes that a user can store in their own private file area. {$a->bytes} bytes == {$a->displaysize}';
+ $string['registermoodlenet'] = '<p>We\'d love to stay in touch and provide you with important things for your Moodle site!</p><p>By registering:</p><ul><li>You can subscribe to receive notifications of new Moodle releases, security alerts and other important news.</li><li>You can access and activate mobile push notifications from your Moodle site through our free <a href="https://download.moodle.org/mobile/">Moodle app</a>.</li><li>You are contributing to our <a href="https://stats.moodle.org">Moodle statistics</a> of the worldwide community, which help us improve Moodle and our community sites.</li><li>If you wish, your site can be included in the <a href="https://stats.moodle.org/sites/">list of registered Moodle sites</a> in your country.</li></ul>';
+ $string['registermoodleorg'] = 'When you register your site';
+ $string['registermoodleorgli1'] = 'You are added to a low-volume mailing list for important notifications such as security alerts and new releases of Moodle.';
+ $string['registermoodleorgli2'] = 'Statistics about your site will be added to the {$a} of the worldwide Moodle community.';
+ $string['registerwithmoodleorg'] = 'Register your site';
diff --combined lib/classes/hub/api.php
@@@ -33,7 -33,7 +33,7 @@@ use coding_exception
  use moodle_url;
  
  /**
-  * Methods to communicate with moodle.net web services
+  * Provides methods to communicate with the hub (sites directory) web services.
   *
   * @package    core
   * @copyright  2017 Marina Glancy
@@@ -51,11 -51,11 +51,11 @@@ class api 
      const HUB_BACKUP_FILE_TYPE = 'backup';
  
      /**
-      * Calls moodle.net WS
+      * Calls a remote function exposed via web services on the hub.
       *
       * @param string $function name of WS function
       * @param array $data parameters of WS function
-      * @param bool $allowpublic allow request without moodle.net registration
+      * @param bool $allowpublic allow request without registration on the hub
       * @return mixed depends on the function
       * @throws moodle_exception
       */
@@@ -71,7 -71,7 +71,7 @@@
      }
  
      /**
-      * Performs REST request to moodle.net (using GET method)
+      * Performs a REST request to the hub site (using the GET method).
       *
       * @param string $token
       * @param string $function
  
          $curl = new curl();
          $serverurl = HUB_MOODLEORGHUBURL . "/local/hub/webservice/webservices.php";
 -        $curloutput = @json_decode($curl->get($serverurl, $params), true);
 +        $query = http_build_query($params, '', '&');
 +        $curloutput = @json_decode($curl->post($serverurl, $query), true);
          $info = $curl->get_info();
          if ($curl->get_errno()) {
              // Connection error.
              throw new moodle_exception('errorconnect', 'hub', '', $curl->error);
          } else if (isset($curloutput['exception'])) {
-             // Exception occurred on moodle.net .
+             // Exception occurred on the remote side.
              self::process_curl_exception($token, $curloutput);
          } else if ($info['http_code'] != 200) {
              throw new moodle_exception('errorconnect', 'hub', '', $info['http_code']);
      }
  
      /**
-      * Analyses exception received from moodle.net
+      * Analyses exception received from the hub server.
       *
       * @param string $token token used for CURL request
       * @param array $curloutput output from CURL request
      }
  
      /**
-      * Update site registration on moodle.net
+      * Update site registration on the hub.
       *
       * @param array $siteinfo
       * @throws moodle_exception
      }
  
      /**
-      * Returns information about moodle.net
+      * Returns information about the hub.
       *
       * Example of the return array:
       * {
       *     "courses": 384,
-      *     "description": "Moodle.net connects you with free content and courses shared by Moodle ...",
-      *     "downloadablecourses": 190,
-      *     "enrollablecourses": 194,
+      *     "description": "Official Moodle sites directory.",
+      *     "downloadablecourses": 0,
+      *     "enrollablecourses": 0,
       *     "hublogo": 1,
       *     "language": "en",
-      *     "name": "Moodle.net",
+      *     "name": "moodle",
       *     "sites": 274175,
-      *     "url": "https://moodle.net",
-      *     "imgurl": "https://moodle.net/local/hub/webservice/download.php?filetype=hubscreenshot"
+      *     "url": "https://stats.moodle.org",
+      *     "imgurl": "https://stats.moodle.org/local/hub/webservice/download.php?filetype=hubscreenshot"
       * }
       *
       * @return array
       *
       * @param array|\stdClass $courseinfo
       * @return int id of the published course on the hub
-      * @throws moodle_exception if communication to moodle.net failed or course could not be published
+      * @throws moodle_exception if the communication with the hub failed or the course could not be published
       */
      public static function register_course($courseinfo) {
          debugging("This function has been deprecated as part of the Moodle.net sunsetting process.");
       *
       * @deprecated since Moodle 3.8. Moodle.net has been sunsetted making this function useless.
       *
-      * @param int $hubcourseid id of the published course on moodle.net, it must be published from this site
+      * @param int $hubcourseid id of the published course on the hub, it must be published from this site
       * @param \stored_file $file
       * @param int $screenshotnumber ordinal number of the screenshot
       */
       *
       * @deprecated since Moodle 3.8. Moodle.net has been sunsetted making this function useless.
       *
-      * @param int $hubcourseid id of the course on moodle.net
+      * @param int $hubcourseid id of the course on the hub
       * @param string $path local path (in tempdir) to save the downloaded backup to.
       */
      public static function download_course_backup($hubcourseid, $path) {
       *
       * @deprecated since Moodle 3.8. Moodle.net has been sunsetted making this function useless.
       *
-      * @param int $hubcourseid id of the published course on moodle.net, it must be published from this site
+      * @param int $hubcourseid id of the published course on the hub, it must be published from this site
       * @param \stored_file $backupfile
       */
      public static function upload_course_backup($hubcourseid, \stored_file $backupfile) {
@@@ -32,7 -32,7 +32,7 @@@ use stdClass
  use html_writer;
  
  /**
-  * Methods to use when publishing and searching courses on moodle.net
+  * Methods to use when registering the site at the moodle sites directory.
   *
   * @package    core
   * @copyright  2017 Marina Glancy
   */
  class registration {
  
 -    /** @var Fields used in a site registration form.
 +    /** @var array Fields used in a site registration form.
       * IMPORTANT: any new fields with non-empty defaults have to be added to CONFIRM_NEW_FIELDS */
 -    const FORM_FIELDS = ['name', 'description', 'contactname', 'contactemail', 'contactphone', 'imageurl', 'privacy', 'street',
 -        'regioncode', 'countrycode', 'geolocation', 'contactable', 'emailalert', 'emailalertemail', 'commnews', 'commnewsemail',
 -        'language', 'policyagreed'];
 +    const FORM_FIELDS = ['policyagreed', 'language', 'countrycode', 'privacy',
 +        'contactemail', 'contactable', 'emailalert', 'emailalertemail', 'commnews', 'commnewsemail',
 +        'contactname', 'name', 'description', 'imageurl', 'contactphone', 'regioncode', 'geolocation', 'street'];
  
      /** @var List of new FORM_FIELDS or siteinfo fields added indexed by the version when they were added.
       * If site was already registered, admin will be promted to confirm new registration data manually. Until registration is manually confirmed,
      }
  
      /**
-      * Calculates and prepares site information to send to moodle.net as part of registration or update
+      * Calculates and prepares site information to send to the sites directory as a part of registration.
       *
       * @param array $defaults default values for inputs in the registration form (if site was never registered before)
       * @return array site info
          require_once($CFG->dirroot . "/course/lib.php");
  
          $siteinfo = array();
-         $cleanhuburl = clean_param(HUB_MOODLEORGHUBURL, PARAM_ALPHANUMEXT);
          foreach (self::FORM_FIELDS as $field) {
-             $siteinfo[$field] = get_config('hub', 'site_'.$field.'_' . $cleanhuburl);
+             $siteinfo[$field] = get_config('hub', 'site_'.$field);
              if ($siteinfo[$field] === false) {
                  $siteinfo[$field] = array_key_exists($field, $defaults) ? $defaults[$field] : null;
              }
      }
  
      /**
-      * Human-readable summary of data that will be sent to moodle.net
+      * Human-readable summary of data that will be sent to the sites directory.
       *
       * @param array $siteinfo result of get_site_info()
       * @return string
       * @param stdClass $formdata data from {@link site_registration_form}
       */
      public static function save_site_info($formdata) {
-         $cleanhuburl = clean_param(HUB_MOODLEORGHUBURL, PARAM_ALPHANUMEXT);
          foreach (self::FORM_FIELDS as $field) {
-             set_config('site_' . $field . '_' . $cleanhuburl, $formdata->$field, 'hub');
+             set_config('site_' . $field, $formdata->$field, 'hub');
          }
-         // Even if the the connection with moodle.net fails, admin has manually submitted the form which means they don't need
+         // Even if the connection with the sites directory fails, admin has manually submitted the form which means they don't need
          // to be redirected to the site registration page any more.
-         set_config('site_regupdateversion_' . $cleanhuburl, max(array_keys(self::CONFIRM_NEW_FIELDS)), 'hub');
+         set_config('site_regupdateversion', max(array_keys(self::CONFIRM_NEW_FIELDS)), 'hub');
      }
  
      /**
      }
  
      /**
-      * Confirms registration by moodle.net
+      * Confirms registration by the sites directory.
       *
       * @param string $token
       * @param string $newtoken
          $record['timemodified'] = time();
          $DB->update_record('registration_hubs', $record);
          self::$registration = null;
 +
 +        $siteinfo = self::get_site_info();
 +        if (strlen(http_build_query($siteinfo)) > 1800) {
 +            // Update registration again because the initial request was too long and could have been truncated.
 +            api::update_registration($siteinfo);
 +            self::$registration = null;
 +        }
      }
  
      /**
       * Registers a site
       *
       * This method will make sure that unconfirmed registration record is created and then redirect to
-      * registration script on https://moodle.net
-      * Moodle.net will check that the site is accessible, register it and redirect back
+      * registration script on the sites directory.
+      * The sites directory will check that the site is accessible, register it and redirect back
       * to /admin/registration/confirmregistration.php
       *
       * @param string $returnurl
              $hub->token = get_site_identifier();
              $hub->secret = $hub->token;
              $hub->huburl = HUB_MOODLEORGHUBURL;
-             $hub->hubname = 'Moodle.net';
+             $hub->hubname = 'moodle';
              $hub->confirmed = 0;
              $hub->timemodified = time();
              $hub->id = $DB->insert_record('registration_hubs', $hub);
          }
  
          $params = self::get_site_info();
 -        $params['token'] = $hub->token;
 +
 +        // The most conservative limit for the redirect URL length is 2000 characters. Only pass parameters before
 +        // we reach this limit. The next registration update will update all fields.
 +        // We will also update registration after we receive confirmation from moodle.net.
 +        $url = new moodle_url(HUB_MOODLEORGHUBURL . '/local/hub/siteregistration.php',
 +            ['token' => $hub->token, 'url' => $params['url']]);
 +        foreach ($params as $key => $value) {
 +            if (strlen($url->out(false, [$key => $value])) > 2000) {
 +                break;
 +            }
 +            $url->param($key, $value);
 +        }
  
          $SESSION->registrationredirect = $returnurl;
 -        redirect(new moodle_url(HUB_MOODLEORGHUBURL . '/local/hub/siteregistration.php', $params));
 +        redirect($url);
      }
  
      /**
      }
  
      /**
-      * Returns information about moodle.net
+      * Returns information about the sites directory.
       *
       * Example of the return array:
       * {
       *     "courses": 384,
-      *     "description": "Moodle.net connects you with free content and courses shared by Moodle ...",
-      *     "downloadablecourses": 190,
-      *     "enrollablecourses": 194,
+      *     "description": "Official moodle sites directory",
+      *     "downloadablecourses": 0,
+      *     "enrollablecourses": 0,
       *     "hublogo": 1,
       *     "language": "en",
-      *     "name": "Moodle.net",
+      *     "name": "moodle",
       *     "sites": 274175,
-      *     "url": "https://moodle.net",
-      *     "imgurl": moodle_url : "https://moodle.net/local/hub/webservice/download.php?filetype=hubscreenshot"
+      *     "url": "https://stats.moodle.org",
+      *     "imgurl": "https://stats.moodle.org/local/hub/webservice/download.php?filetype=hubscreenshot"
       * }
       *
       * @return array|null
          try {
              return api::get_hub_info();
          } catch (moodle_exception $e) {
-             // Ignore error, we only need it for displaying information about moodle.net, if this request
-             // fails, it's not a big deal.
+             // Ignore error, we only need it for displaying information about the sites directory.
+             // If this request fails, it's not a big deal.
              return null;
          }
      }
              return $fieldsneedconfirm;
          }
  
-         $cleanhuburl = clean_param(HUB_MOODLEORGHUBURL, PARAM_ALPHANUMEXT);
-         $lastupdated = (int)get_config('hub', 'site_regupdateversion_' . $cleanhuburl);
+         $lastupdated = (int)get_config('hub', 'site_regupdateversion');
          foreach (self::CONFIRM_NEW_FIELDS as $version => $fields) {
              if ($version > $lastupdated) {
                  $fieldsneedconfirm = array_merge($fieldsneedconfirm, $fields);
@@@ -32,7 -32,7 +32,7 @@@ global $CFG
  require_once($CFG->libdir . '/formslib.php');
  
  /**
-  * The site registration form. Information will be sent to moodle.net
+  * The site registration form. Information will be sent to the sites directory.
   *
   * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
   * @package    core
@@@ -75,7 -75,7 +75,7 @@@ class site_registration_form extends \m
          $mform->addElement('header', 'moodle', get_string('registrationinfo', 'hub'));
  
          $mform->addElement('text', 'name', get_string('sitename', 'hub'),
 -            array('class' => 'registration_textfield'));
 +            array('class' => 'registration_textfield', 'maxlength' => 255));
          $mform->setType('name', PARAM_TEXT);
          $mform->addHelpButton('name', 'sitename', 'hub');
  
          $mform->addElement('static', 'urlstring', get_string('siteurl', 'hub'), $siteinfo['url']);
          $mform->addHelpButton('urlstring', 'siteurl', 'hub');
  
-         // Display statistic that are going to be retrieve by moodle.net.
+         // Display statistic that are going to be retrieve by the sites directory.
          $mform->addElement('static', 'siteinfosummary', get_string('sendfollowinginfo', 'hub'), registration::get_stats_summary($siteinfo));
  
          // Check if it's a first registration or update.
          if (registration::is_registered()) {
-             $buttonlabel = get_string('updatesite', 'hub', 'Moodle.net');
+             $buttonlabel = get_string('updatesiteregistration', 'core_hub');
              $mform->addElement('hidden', 'update', true);
              $mform->setType('update', PARAM_BOOL);
          } else {
-             $buttonlabel = get_string('registersite', 'hub', 'Moodle.net');
+             $buttonlabel = get_string('register', 'core_admin');
          }
  
          $this->add_action_buttons(false, $buttonlabel);
diff --combined lib/db/upgrade.php
@@@ -3556,5 -3556,23 +3556,23 @@@ function xmldb_main_upgrade($oldversion
          upgrade_main_savepoint(true, 2019092700.01);
      }
  
 -    if ($oldversion < 2019100400.01) {
++    if ($oldversion < 2019100800.02) {
+         // Rename the official moodle sites directory the site is registered with.
+         $DB->execute("UPDATE {registration_hubs}
+                          SET hubname = ?, huburl = ?
+                        WHERE huburl = ?", ['moodle', 'https://stats.moodle.org', 'https://moodle.net']);
+         // Convert the hub site specific settings to the new naming format without the hub URL in the name.
+         $hubconfig = get_config('hub');
+         if (!empty($hubconfig)) {
+             foreach (upgrade_convert_hub_config_site_param_names($hubconfig, 'https://moodle.net') as $name => $value) {
+                 set_config($name, $value, 'hub');
+             }
+         }
 -        upgrade_main_savepoint(true, 2019100400.01);
++        upgrade_main_savepoint(true, 2019100800.02);
+     }
      return true;
  }
diff --combined version.php
  
  defined('MOODLE_INTERNAL') || die();
  
- $version  = 2019100800.01;              // YYYYMMDD      = weekly release date of this DEV branch.
 -$version  = 2019100400.01;              // YYYYMMDD      = weekly release date of this DEV branch.
++$version  = 2019100800.02;              // YYYYMMDD      = weekly release date of this DEV branch.
                                          //         RR    = release increments - 00 in DEV branches.
                                          //           .XX = incremental changes.
  
 -$release  = '3.8dev+ (Build: 20191004)'; // Human-friendly version name
 +$release  = '3.8dev+ (Build: 20191008)'; // Human-friendly version name
  
  $branch   = '38';                       // This version's branch.
  $maturity = MATURITY_ALPHA;             // This version's maturity level.