diff --git a/admin/mnet/peer_forms.php b/admin/mnet/peer_forms.php index ce1c1c086ee..a9339b05104 100644 --- a/admin/mnet/peer_forms.php +++ b/admin/mnet/peer_forms.php @@ -94,6 +94,15 @@ class mnet_review_host_form extends moodleform { $mform->setType('wwwroot', PARAM_URL); $mform->addRule('wwwroot', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); + $options = array( + mnet_peer::SSL_NONE => get_string('none'), + mnet_peer::SSL_HOST => get_string('verifyhostonly', 'core_mnet'), + mnet_peer::SSL_HOST_AND_PEER => get_string('verifyhostandpeer', 'core_mnet') + ); + $mform->addElement('select', 'sslverification', get_string('sslverification', 'core_mnet'), $options); + $mform->setDefault('sslverification', mnet_peer::SSL_HOST_AND_PEER); + $mform->addHelpButton('sslverification', 'sslverification', 'core_mnet'); + $themes = array('' => get_string('forceno')); foreach (array_keys(core_component::get_plugin_list('theme')) as $themename) { $themes[$themename] = get_string('pluginname', 'theme_'.$themename); diff --git a/admin/mnet/peers.php b/admin/mnet/peers.php index 40759dbc0ed..24ef9b6af9a 100644 --- a/admin/mnet/peers.php +++ b/admin/mnet/peers.php @@ -172,6 +172,7 @@ if ($formdata = $reviewform->get_data()) { $mnet_peer->public_key = $formdata->public_key; $credentials = $mnet_peer->check_credentials($mnet_peer->public_key); $mnet_peer->public_key_expires = $credentials['validTo_time_t']; + $mnet_peer->sslverification = $formdata->sslverification; if ($mnet_peer->commit()) { redirect(new moodle_url('/admin/mnet/peers.php', array('hostid' => $mnet_peer->id)), get_string('changessaved')); diff --git a/admin/mnet/testclient.php b/admin/mnet/testclient.php index 89734e39b14..f43225c631e 100644 --- a/admin/mnet/testclient.php +++ b/admin/mnet/testclient.php @@ -66,12 +66,19 @@ if (!empty($hostid) && array_key_exists($hostid, $hosts)) { $mnet_request->set_method('system/listServices'); $mnet_request->send($mnet_peer); + $services = $mnet_request->response; $yesno = array('No', 'Yes'); $servicenames = array(); echo $OUTPUT->heading(get_string('servicesavailableonhost', 'mnet', $host->wwwroot)); + if (!empty($mnet_request->error)) { + echo $OUTPUT->heading(get_string('error'), 3); + echo html_writer::alist($mnet_request->error); + $services = array(); + } + $table = new html_table(); $table->head = array( get_string('serviceid', 'mnet'), @@ -127,6 +134,7 @@ if (!empty($hostid) && array_key_exists($hostid, $hosts)) { echo html_writer::table($table); + $mnet_request = new mnet_xmlrpc_client(); $mnet_request->set_method('system/listMethods'); if (isset($servicename) && array_key_exists($servicename, $serviceinfo)) { echo $OUTPUT->heading(get_string('methodsavailableonhostinservice', 'mnet', (object)array('host' => $host->wwwroot, 'service' => $servicename))); @@ -139,6 +147,11 @@ if (!empty($hostid) && array_key_exists($hostid, $hosts)) { $mnet_request->send($mnet_peer); $methods = $mnet_request->response; + if (!empty($mnet_request->error)) { + echo $OUTPUT->heading(get_string('error'), 3); + echo html_writer::alist($mnet_request->error); + $methods = array(); + } $table = new html_table(); $table->head = array( @@ -171,6 +184,12 @@ if (!empty($hostid) && array_key_exists($hostid, $hosts)) { echo $OUTPUT->heading(get_string('methodsignature', 'mnet', $method)); + if (!empty($mnet_request->error)) { + echo $OUTPUT->heading(get_string('error'), 3); + echo html_writer::alist($mnet_request->error); + $signature = array(); + } + $table = new html_table(); $table->head = array( get_string('position', 'mnet'), diff --git a/lang/en/mnet.php b/lang/en/mnet.php index d2469c8ca76..041eb48d8cc 100644 --- a/lang/en/mnet.php +++ b/lang/en/mnet.php @@ -216,6 +216,12 @@ $string['showlocal'] = 'Show local users'; $string['showremote'] = 'Show remote users'; $string['ssl_acl_allow'] = 'SSO ACL: Allow user \'{$a->user}\' from \'{$a->host}\''; $string['ssl_acl_deny'] = 'SSO ACL: Deny user \'{$a->user}\' from \'{$a->host}\''; +$string['sslverification'] = 'SSL verification'; +$string['sslverification_help'] = 'This option allows you to configure the level of security when connecting to a peer using HTTPS. + +* None: no level of security +* Verify host only: validates the domain of the SSL certificate +* Verify host and peer (recommended): validates the domain and issuer of the SSL certificate'; $string['ssoaccesscontrol'] = 'SSO access control'; $string['ssoacldescr'] = 'Use this page to grant/deny access to specific users from remote MNet hosts. This is functional when you are offering SSO services to remote users. To control your <em>local</em> users\' ability to roam to other MNet hosts, use the roles system to grant them the <em>mnetlogintoremote</em> capability.'; $string['ssoaclneeds'] = 'For this functionality to work, you must have Networking on, plus the MNet authentication plugin enabled.'; @@ -244,6 +250,8 @@ $string['userchangepasswordlink'] = '<br /> You may be able to change your passw $string['usernotfullysetup'] = 'Your user account is incomplete. You need to go <a href="{$a}">back to your provider</a> and ensure your profile is completed there. You may need to log out and in again for this to take effect.'; $string['usersareonline'] = 'Warning: {$a} users from that server are currently logged on to your site.'; $string['validated_by'] = 'It is validated by the network: <code>{$a}</code>'; +$string['verifyhostandpeer'] = 'Verify host and peer'; +$string['verifyhostonly'] = 'Verify host only'; $string['verifysignature-error'] = 'The signature verification failed. An error has occurred.'; $string['verifysignature-invalid'] = 'The signature verification failed. It appears that this payload was not signed by you.'; $string['version'] = 'Version'; diff --git a/lib/db/install.xml b/lib/db/install.xml index 6a6c9e41b1f..59a8a7dc135 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<XMLDB PATH="lib/db" VERSION="20141017" COMMENT="XMLDB file for core Moodle tables" +<XMLDB PATH="lib/db" VERSION="20141117" COMMENT="XMLDB file for core Moodle tables" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd" > @@ -1442,6 +1442,7 @@ <FIELD NAME="force_theme" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> <FIELD NAME="theme" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false"/> <FIELD NAME="applicationid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="1" SEQUENCE="false"/> + <FIELD NAME="sslverification" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> </FIELDS> <KEYS> <KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="primary key of the mnet_host table"/> @@ -3081,4 +3082,4 @@ </KEYS> </TABLE> </TABLES> -</XMLDB> +</XMLDB> \ No newline at end of file diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index c9728de26b4..9c80f57e221 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -4058,5 +4058,21 @@ function xmldb_main_upgrade($oldversion) { // Moodle v2.8.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2014112001.00) { + + // Define field sslverification to be added to mnet_host. + $table = new xmldb_table('mnet_host'); + $field = new xmldb_field('sslverification', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'applicationid'); + + // Conditionally launch add field sslverification. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Main savepoint reached. + upgrade_main_savepoint(true, 2014112001.00); + } + + return true; } diff --git a/mnet/peer.php b/mnet/peer.php index 5d8936b04cb..9f72e179853 100644 --- a/mnet/peer.php +++ b/mnet/peer.php @@ -12,6 +12,15 @@ require_once($CFG->libdir . '/filelib.php'); // download_file_content() used her class mnet_peer { + /** No SSL verification. */ + const SSL_NONE = 0; + + /** SSL verification for host. */ + const SSL_HOST = 1; + + /** SSL verification for host and peer. */ + const SSL_HOST_AND_PEER = 2; + var $id = 0; var $wwwroot = ''; var $ip_address = ''; @@ -27,6 +36,9 @@ class mnet_peer { var $error = array(); var $bootstrapped = false; // set when the object is populated + /** @var int $sslverification The level of SSL verification to apply. */ + public $sslverification = self::SSL_HOST_AND_PEER; + function mnet_peer() { return true; } @@ -192,6 +204,7 @@ class mnet_peer { $obj->force_theme = $this->force_theme; $obj->theme = $this->theme; $obj->applicationid = $this->applicationid; + $obj->sslverification = $this->sslverification; if (isset($this->id) && $this->id > 0) { $obj->id = $this->id; @@ -286,6 +299,7 @@ class mnet_peer { $this->force_theme = $hostinfo->force_theme; $this->theme = $hostinfo->theme; $this->applicationid = $hostinfo->applicationid; + $this->sslverification = $hostinfo->sslverification; $this->application = $DB->get_record('mnet_application', array('id'=>$this->applicationid)); $this->bootstrapped = true; } diff --git a/mnet/xmlrpc/client.php b/mnet/xmlrpc/client.php index 39078d25be7..08414cf3153 100644 --- a/mnet/xmlrpc/client.php +++ b/mnet/xmlrpc/client.php @@ -368,8 +368,17 @@ class mnet_xmlrpc_client { curl_setopt($httprequest, CURLOPT_POST, true); curl_setopt($httprequest, CURLOPT_USERAGENT, 'Moodle'); curl_setopt($httprequest, CURLOPT_HTTPHEADER, array("Content-Type: text/xml charset=UTF-8")); - curl_setopt($httprequest, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($httprequest, CURLOPT_SSL_VERIFYHOST, 0); + + $verifyhost = 0; + $verifypeer = false; + if ($mnet_peer->sslverification == mnet_peer::SSL_HOST_AND_PEER) { + $verifyhost = 2; + $verifypeer = true; + } else if ($mnet_peer->sslverification == mnet_peer::SSL_HOST) { + $verifyhost = 2; + } + curl_setopt($httprequest, CURLOPT_SSL_VERIFYHOST, $verifyhost); + curl_setopt($httprequest, CURLOPT_SSL_VERIFYPEER, $verifypeer); return $httprequest; } } diff --git a/version.php b/version.php index bc99b638e3b..e9bc7245ada 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2014112000.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2014112001.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes.