Updating SSL settings & configuration for the LTI plugin.
authorChris Scribner <scriby@gmail.com>
Wed, 19 Oct 2011 18:06:15 +0000 (14:06 -0400)
committerChris Scribner <scriby@gmail.com>
Mon, 7 Nov 2011 01:42:03 +0000 (20:42 -0500)
mod/lti/edit_form.php
mod/lti/lang/en/lti.php
mod/lti/lib.php
mod/lti/locallib.php
mod/lti/mod_form.js
mod/lti/mod_form.php
mod/lti/typessettings.php

index 9fa2d86..a47908f 100644 (file)
@@ -68,7 +68,6 @@ class mod_lti_edit_types_form extends moodleform{
         $mform->addElement('text', 'lti_toolurl', get_string('toolurl', 'lti'), array('size'=>'64'));
         $mform->setType('lti_toolurl', PARAM_TEXT);
         $mform->addHelpButton('lti_toolurl', 'toolurl', 'lti');
-        
         $mform->addRule('lti_toolurl', null, 'required', null, 'client');
 
         $mform->addElement('text', 'lti_resourcekey', get_string('resourcekey_admin', 'lti'));
@@ -130,6 +129,10 @@ class mod_lti_edit_types_form extends moodleform{
         $mform->setDefault('lti_allowroster', '2');
         $mform->addHelpButton('lti_allowroster', 'share_roster_admin', 'lti');
 
+        $mform->addElement('checkbox', 'lti_forcessl','&nbsp;', ' ' . get_string('force_ssl', 'lti'), $options);
+        $mform->setDefault('lti_forcessl', '0');
+        
+        $mform->addHelpButton('lti_forcessl', 'force_ssl', 'lti');
           
         if(!empty($this->_customdata->isadmin)){
             //-------------------------------------------------------------------------------
@@ -143,11 +146,11 @@ class mod_lti_edit_types_form extends moodleform{
 
             $mform->addElement('text', 'lti_organizationid', get_string('organizationid', 'lti'));
             $mform->setType('lti_organizationid', PARAM_TEXT);
-    //        $mform->addHelpButton('lti_organizationid', 'organizationid', 'lti');
+            $mform->addHelpButton('lti_organizationid', 'organizationid', 'lti');
 
             $mform->addElement('text', 'lti_organizationurl', get_string('organizationurl', 'lti'));
             $mform->setType('lti_organizationurl', PARAM_TEXT);
-    //        $mform->addHelpButton('lti_organizationurl', 'organizationurl', 'lti');
+            $mform->addHelpButton('lti_organizationurl', 'organizationurl', 'lti');
         }
         
         /* Suppress this for now - Chuck
index bfc91f7..65f22a7 100644 (file)
@@ -189,12 +189,15 @@ $string['no_lti_configured'] = 'There are no active External Tools configured.';
 $string['no_lti_pending'] = 'There are no pending External Tools.';
 $string['no_lti_rejected'] = 'There are no rejected External Tools.';
 $string['accept_grades_admin'] = 'Accept grades from the tool';
+$string['force_ssl'] = 'Force SSL';
+$string['lti_administration'] = 'LTI Administration';
 
 //New instructor strings
 $string['display_name'] = 'Display activity name when launched';
 $string['display_description'] = 'Display activity description when launched';
 $string['external_tool_type'] = 'External tool type';
 $string['launch_url'] = 'Launch URL';
+$string['secure_launch_url'] = 'Secure Launch URL';
 $string['share_name'] = 'Share launcher\'s name with the tool';
 $string['share_email'] = 'Share launcher\'s email with the tool';
 $string['accept_grades'] = 'Accept grades from the tool';
@@ -216,6 +219,7 @@ $string['custom_config'] = 'Using custom tool configuration.';
 $string['tool_config_not_found'] = 'Tool configuration not found for this URL.';
 
 $string['icon_url'] = 'Icon URL';
+$string['secure_icon_url'] = 'Secure Icon URL';
 
 $string['return_to_course'] = 'Click <a href="{$a->link}" target="_top">here</a> to return to the course.';
 
@@ -293,6 +297,24 @@ If you have selected a specific tool type, you may not need to enter a Launch UR
 into the tool provider's system, and not go to a specific resource, this will likely be the case.
 HTML;
 
+$string['secure_launch_url_help'] = <<<HTML
+Similar to Launch URL, but used instead of the launch url if high security is required. Moodle will use the
+secure launch URL instead of the launch URL if the Moodle site is accessed through SSL, or if the tool configuration
+is set to always launch through SSL.
+    
+The Launch URL may also be set to an https address to force launching through SSL, and this field may be left blank.
+HTML;
+
+$string['icon_url_help'] = <<<HTML
+The icon URL allows the icon that shows up in the course listing for this activity to be modified. Instead of using the default
+LTI icon, an icon which conveys the type of activity may be specified.
+HTML;
+
+$string['secure_icon_url_help'] = <<<HTML
+Similar to the icon URL, but used if the user accessing Moodle securely through SSL. The main purpose for this field is to prevent
+the browser from warning the user if the underlying page was accessed over SSL, but requesting to show an unsecure image.
+HTML;
+
 $string['launchinpopup_help'] = <<<HTML
 The launch container affects the display of the tool when launched from the course. Some launch containers provide more screen
 real estate to the tool, and others provide a more integrated feel with the Moodle environemnt.
@@ -579,3 +601,23 @@ External tools differ from URL resources in a few ways:
     </li>
 </ul>
 HTML;
+
+$string['force_ssl_help'] = <<<HTML
+Selecting this option forces all launches to this tool provider to use SSL.
+
+In addition, all web service requests from the tool provider will use SSL.
+
+If using this option, confirm that this Moodle site and the tool provider support SSL.
+HTML;
+
+$string['organizationid_help'] = <<<HTML
+A unique identifier for this Moodle instance. Typically, the DNS name of the organization is used.
+
+If this field is left blank, the host name of this Moodle site will be used as the default value.
+HTML;
+
+$string['organizationurl_help'] = <<<HTML
+The base URL of this Moodle instance.
+    
+If this field is left blank, a default value will be used based on the site configuration.
+HTML;
index a807614..9c24fd1 100644 (file)
@@ -166,12 +166,18 @@ function lti_delete_instance($id) {
 function lti_get_coursemodule_info($coursemodule){
     global $DB;
     
-    $lti = $DB->get_record('lti', array('id' => $coursemodule->instance), 'icon');
+    $lti = $DB->get_record('lti', array('id' => $coursemodule->instance), 'icon, secureicon');
 
     $info = new stdClass();
     
-    if(!empty($lti->icon)){
-        $info->icon = $lti->icon;
+    //We want to use the right icon based on whether the current page is being requested over http or https.
+    //There's a potential problem here as the icon URLs are cached in the modinfo field and won't be updated for each request.
+    if(lti_request_is_using_ssl() && !empty($lti->secureicon)){
+        $info->icon = $lti->secureicon;
+    } else {
+        if(!empty($lti->icon)){
+            $info->icon = $lti->icon;
+        }
     }
     
     return $info;
index b77a15b..d3e182d 100644 (file)
@@ -98,6 +98,7 @@ function lti_view($instance) {
         $typeconfig['customparameters'] = $instance->instructorcustomparameters;
         $typeconfig['acceptgrades'] = $instance->instructorchoiceacceptgrades;
         $typeconfig['allowroster'] = $instance->instructorchoiceallowroster;
+        $typeconfig['forcessl'] = '0';
     }
     
     //Default the organizationid if not specified
@@ -124,17 +125,28 @@ function lti_view($instance) {
     }
     
     $endpoint = !empty($instance->toolurl) ? $instance->toolurl : $typeconfig['toolurl'];
-    $endpiont = trim($endpoint);
+    $endpoint = trim($endpoint);
     
-    $orgid = $typeconfig['organizationid'];
-    /* Suppress this for now - Chuck
-    $orgdesc = $typeconfig['organizationdescr'];
-    */
-
-    if(!strstr($endpoint, '://')){
-        $endpoint = 'http://' . $endpoint;
+    //If the current request is using SSL and a secure tool URL is specified, use it
+    if(lti_request_is_using_ssl() && !empty($instance->securetoolurl)){
+        $endpoint = trim($instance->securetoolurl);
+    }
+    
+    //If SSL is forced, use the secure tool url if specified. Otherwise, make sure https is on the normal launch URL.
+    if($typeconfig['forcessl'] == '1'){
+        if(!empty($instance->securetoolurl)){
+            $endpoint = trim($instance->securetoolurl);
+        }
+        
+        $endpoint = lti_ensure_url_is_https($endpoint);
+    } else {
+        if(!strstr($endpoint, '://')){
+            $endpoint = 'http://' . $endpoint;
+        }
     }
     
+    $orgid = $typeconfig['organizationid'];
+
     $course = $PAGE->course;
     $requestparams = lti_build_request($instance, $typeconfig, $course);
 
@@ -150,7 +162,13 @@ function lti_view($instance) {
         
         //Add the return URL. We send the launch container along to help us avoid frames-within-frames when the user returns
         $url = new moodle_url('/mod/lti/return.php', $returnurlparams);
-        $requestparams['launch_presentation_return_url'] = $url->out(false);    
+        $returnurl = $url->out(false);
+        
+        if($typeconfig['forcessl'] == '1'){
+            $returnurl = lti_ensure_url_is_https($returnurl);
+        }
+        
+        $requestparams['launch_presentation_return_url'] = $returnurl;
     }
     
     if(!empty($key) && !empty($secret)){
@@ -234,7 +252,13 @@ function lti_build_request($instance, $typeconfig, $course) {
          ( $typeconfig['acceptgrades'] == LTI_SETTING_ALWAYS ||
          ( $typeconfig['acceptgrades'] == LTI_SETTING_DELEGATE && $instance->instructorchoiceacceptgrades == LTI_SETTING_ALWAYS ) ) ) {
         $requestparams["lis_result_sourcedid"] = $sourcedid;
-        $requestparams["ext_ims_lis_basic_outcome_url"] = $CFG->wwwroot.'/mod/lti/service.php';
+        
+        $serviceurl = $CFG->wwwroot . '/mod/lti/service.php';
+        if($typeconfig['forcessl'] == '1'){
+            $serviceurl = lti_ensure_url_is_https($serviceurl);
+        }
+        
+        $requestparams["ext_ims_lis_basic_outcome_url"] = $serviceurl;
     }
 
     /*if ( isset($placementsecret) &&
@@ -605,8 +629,12 @@ function lti_get_url_thumbprint($url){
         $urlparts['path'] = '';
     }
     
-    if(substr($urlparts['host'], 0, 3) === 'www'){
-        $urllparts['host'] = substr($urlparts['host'], 3);
+    if(!isset($urlparts['host'])){
+        $urlparts['host'] = '';
+    }
+    
+    if(substr($urlparts['host'], 0, 4) === 'www.'){
+        $urlparts['host'] = substr($urlparts['host'], 4);
     }
     
     return $urllower = $urlparts['host'] . '/' . $urlparts['path'];
@@ -859,6 +887,10 @@ function lti_get_type_type_config($id) {
         $type->lti_customparameters = $config['customparameters'];
     }
 
+    if(isset($config['forcessl'])){
+        $type->lti_forcessl = $config['forcessl'];
+    }
+    
     if (isset($config['organizationid'])) {
         $type->lti_organizationid = $config['organizationid'];
     }
@@ -895,6 +927,9 @@ function lti_prepare_type_for_save($type, $config){
     $type->coursevisible = !empty($config->lti_coursevisible) ? $config->lti_coursevisible : 0;
     $config->lti_coursevisible = $type->coursevisible;
     
+    $type->forcessl = !empty($config->lti_forcessl) ? $config->lti_forcessl : 0;
+    $config->lti_forcessl = $type->forcessl;
+    
     $type->timemodified = time();
     
     unset ($config->lti_typename);
@@ -1138,4 +1173,22 @@ function lti_get_launch_container($lti, $toolconfig){
     }
     
     return $launchcontainer;
+}
+
+function lti_request_is_using_ssl() {
+    global $ME;
+    return (stripos($ME, 'https://') === 0);
+}
+
+function lti_ensure_url_is_https($url){
+    if(!strstr($url, '://')){
+        $url = 'https://' . $url;
+    } else {
+        //If the URL starts with http, replace with https
+        if(stripos($url, 'http://') === 0){
+            $url = 'https://' . substr($url, 8);
+        }
+    }
+    
+    return $url;
 }
\ No newline at end of file
index edd394d..aa80cae 100644 (file)
 
             this.addOptGroups();
 
+            var updateToolMatches = function(){
+                self.updateAutomaticToolMatch(Y.one('#id_toolurl'));
+                self.updateAutomaticToolMatch(Y.one('#id_securetoolurl'));
+            };
+
             var typeSelector = Y.one('#id_typeid');
             typeSelector.on('change', function(e){
-                self.updateAutomaticToolMatch();
+                updateToolMatches();
                 
                 self.toggleEditButtons();
             });
@@ -29,6 +34,7 @@
             
             var textAreas = new Y.NodeList([
                 Y.one('#id_toolurl'),
+                Y.one('#id_securetoolurl'),
                 Y.one('#id_resourcekey'),
                 Y.one('#id_password')
             ]);
 
                 //If no more changes within 2 seconds, look up the matching tool URL
                 debounce = setTimeout(function(){
-                    self.updateAutomaticToolMatch();
+                    updateToolMatches();
                 }, 2000);
             });
             
-            self.updateAutomaticToolMatch();
+            updateToolMatches();
         },
 
         clearToolCache: function(){
             this.urlCache = {};
         },
 
-        updateAutomaticToolMatch: function(){
+        updateAutomaticToolMatch: function(field){
             var self = this;
             
-            var toolurl = Y.one('#id_toolurl');
+            var toolurl = field;
             var typeSelector = Y.one('#id_typeid');
-            var automatchToolDisplay = Y.one('#lti_automatch_tool');
+            
+            var id = field.get('id') + '_lti_automatch_tool';
+            var automatchToolDisplay = Y.one('#' + id);
 
             if(!automatchToolDisplay){
                 automatchToolDisplay = Y.Node.create('<span />')
-                                        .set('id', 'lti_automatch_tool')
+                                        .set('id', id)
                                         .setStyle('padding-left', '1em');
                                         
                 toolurl.insert(automatchToolDisplay, 'after');
index 09bd969..cb640b8 100644 (file)
@@ -97,6 +97,11 @@ class mod_lti_mod_form extends moodleform_mod {
         $mform->setType('toolurl', PARAM_TEXT);
         $mform->addHelpButton('toolurl', 'launch_url', 'lti');
         
+        $mform->addElement('text', 'securetoolurl', get_string('secure_launch_url', 'lti'), array('size'=>'64'));
+        $mform->setType('securetoolurl', PARAM_TEXT);
+        $mform->setAdvanced('securetoolurl');
+        $mform->addHelpButton('securetoolurl', 'secure_launch_url', 'lti');
+        
         $launchoptions=array();
         $launchoptions[LTI_LAUNCH_CONTAINER_DEFAULT] = get_string('default', 'lti');
         $launchoptions[LTI_LAUNCH_CONTAINER_EMBED] = get_string('embed', 'lti');
@@ -125,7 +130,12 @@ class mod_lti_mod_form extends moodleform_mod {
         $mform->addElement('text', 'icon', get_string('icon_url', 'lti'), array('size'=>'64'));
         $mform->setType('icon', PARAM_TEXT);
         $mform->setAdvanced('icon');
-        //$mform->addHelpButton('icon', 'icon', 'lti');
+        $mform->addHelpButton('icon', 'icon_url', 'lti');
+        
+        $mform->addElement('text', 'secureicon', get_string('secure_icon_url', 'lti'), array('size'=>'64'));
+        $mform->setType('secureicon', PARAM_TEXT);
+        $mform->setAdvanced('secureicon');
+        $mform->addHelpButton('secureicon', 'secure_icon_url', 'lti');
         
 //-------------------------------------------------------------------------------
         // Add privacy preferences fieldset where users choose whether to send their data
@@ -217,6 +227,7 @@ class mod_lti_mod_form extends moodleform_mod {
     function definition_after_data() {
         parent::definition_after_data();
        
+        //$mform =& $this->_form;
     }
 
     /**
index 8e5e49a..1683422 100644 (file)
@@ -125,7 +125,7 @@ if (empty($SITE->fullname)) {
     $PAGE->set_title($settingspage->visiblename);
     $PAGE->set_heading($settingspage->visiblename);
 
-    $PAGE->navbar->add('Basic LTI Administration', $CFG->wwwroot.'/admin/settings.php?section=modsettinglti');
+    $PAGE->navbar->add(get_string('lti_administration', 'lti'), $CFG->wwwroot.'/admin/settings.php?section=modsettinglti');
 
     echo $OUTPUT->header();
 
@@ -168,7 +168,7 @@ if (empty($SITE->fullname)) {
 
     $PAGE->set_title("$SITE->shortname: " . get_string('toolsetup', 'lti'));
 
-    $PAGE->navbar->add('Basic LTI Administration', $CFG->wwwroot.'/admin/settings.php?section=modsettinglti');
+    $PAGE->navbar->add(get_string('lti_administration', 'lti'), $CFG->wwwroot.'/admin/settings.php?section=modsettinglti');
 
     echo $OUTPUT->header();