/** * This function builds the request that must be sent to the tool producer * * @param object $instance Basic LTI instance object * @param object $typeconfig Basic LTI tool configuration * @param object $course Course object * * @return array $request Request details */ function lti_build_request($instance, $typeconfig, $course) { global $USER, $CFG; if (empty($instance->cmid)) { $instance->cmid = 0; } $role = lti_get_ims_role($USER, $instance->cmid, $instance->course); $locale = $course->lang; if ( strlen($locale) < 1 ) { $locale = $CFG->lang; } $requestparams = array( 'resource_link_id' => $instance->id, 'resource_link_title' => $instance->name, 'resource_link_description' => $instance->intro, 'user_id' => $USER->id, 'roles' => $role, 'context_id' => $course->id, 'context_label' => $course->shortname, 'context_title' => $course->fullname, 'launch_presentation_locale' => $locale, ); $placementsecret = $instance->servicesalt; if ( isset($placementsecret) ) { $sourcedid = json_encode(lti_build_sourcedid($instance->id, $USER->id, null, $placementsecret)); } if ( isset($placementsecret) && ( $typeconfig['acceptgrades'] == LTI_SETTING_ALWAYS || ( $typeconfig['acceptgrades'] == LTI_SETTING_DELEGATE && $instance->instructorchoiceacceptgrades == LTI_SETTING_ALWAYS ) ) ) { $requestparams['lis_result_sourcedid'] = $sourcedid; //Add outcome service URL $serviceurl = new moodle_url('/mod/lti/service.php'); $serviceurl = $serviceurl->out(); if ($typeconfig['forcessl'] == '1') { $serviceurl = lti_ensure_url_is_https($serviceurl); } $requestparams['lis_outcome_service_url'] = $serviceurl; } // Send user's name and email data if appropriate if ( $typeconfig['sendname'] == LTI_SETTING_ALWAYS || ( $typeconfig['sendname'] == LTI_SETTING_DELEGATE && $instance->instructorchoicesendname == LTI_SETTING_ALWAYS ) ) { $requestparams['lis_person_name_given'] = $USER->firstname; $requestparams['lis_person_name_family'] = $USER->lastname; $requestparams['lis_person_name_full'] = $USER->firstname." ".$USER->lastname; } if ( $typeconfig['sendemailaddr'] == LTI_SETTING_ALWAYS || ( $typeconfig['sendemailaddr'] == LTI_SETTING_DELEGATE && $instance->instructorchoicesendemailaddr == LTI_SETTING_ALWAYS ) ) { $requestparams['lis_person_contact_email_primary'] = $USER->email; } // Concatenate the custom parameters from the administrator and the instructor // Instructor parameters are only taken into consideration if the administrator // has giver permission $customstr = $typeconfig['customparameters']; $instructorcustomstr = $instance->instructorcustomparameters; $custom = array(); $instructorcustom = array(); if ($customstr) { $custom = lti_split_custom_parameters($customstr); } if (!isset($typeconfig['allowinstructorcustom']) || $typeconfig['allowinstructorcustom'] == LTI_SETTING_NEVER) { $requestparams = array_merge($custom, $requestparams); } else { if ($instructorcustomstr) { $instructorcustom = lti_split_custom_parameters($instructorcustomstr); } foreach ($instructorcustom as $key => $val) { // Ignore the instructor's parameter if (!array_key_exists($key, $custom)) { $custom[$key] = $val; } } $requestparams = array_merge($custom, $requestparams); } // Make sure we let the tool know what LMS they are being called from $requestparams["ext_lms"] = "moodle-2"; $requestparams['tool_consumer_info_product_family_code'] = 'moodle'; $requestparams['tool_consumer_info_version'] = strval($CFG->version); // Add oauth_callback to be compliant with the 1.0A spec $requestparams['oauth_callback'] = 'about:blank'; //The submit button needs to be part of the signature as it gets posted with the form. //This needs to be here to support launching without javascript. $submittext = get_string('press_to_submit', 'lti'); $requestparams['ext_submit'] = $submittext; $requestparams['lti_version'] = 'LTI-1p0'; $requestparams['lti_message_type'] = 'basic-lti-launch-request'; return $requestparams; }
/** * This function builds the request that must be sent to the tool producer * * @param object $instance Basic LTI instance object * @param array $typeconfig Basic LTI tool configuration * @param object $course Course object * @param int|null $typeid Basic LTI tool ID * @param boolean $islti2 True if an LTI 2 tool is being launched * * @return array Request details */ function lti_build_request($instance, $typeconfig, $course, $typeid = null, $islti2 = false) { global $USER, $CFG; if (empty($instance->cmid)) { $instance->cmid = 0; } $role = lti_get_ims_role($USER, $instance->cmid, $instance->course, $islti2); $intro = ''; if (!empty($instance->cmid)) { $intro = format_module_intro('lti', $instance, $instance->cmid); $intro = html_to_text($intro, 0, false); // This may look weird, but this is required for new lines // so we generate the same OAuth signature as the tool provider. $intro = str_replace("\n", "\r\n", $intro); } $requestparams = array('resource_link_title' => $instance->name, 'resource_link_description' => $intro, 'user_id' => $USER->id, 'lis_person_sourcedid' => $USER->idnumber, 'roles' => $role, 'context_id' => $course->id, 'context_label' => $course->shortname, 'context_title' => $course->fullname); if (!empty($instance->id)) { $requestparams['resource_link_id'] = $instance->id; } if (!empty($instance->resource_link_id)) { $requestparams['resource_link_id'] = $instance->resource_link_id; } if ($course->format == 'site') { $requestparams['context_type'] = 'Group'; } else { $requestparams['context_type'] = 'CourseSection'; $requestparams['lis_course_section_sourcedid'] = $course->idnumber; } $placementsecret = $instance->servicesalt; if (!empty($instance->id) && isset($placementsecret) && ($islti2 || $typeconfig['acceptgrades'] == LTI_SETTING_ALWAYS || $typeconfig['acceptgrades'] == LTI_SETTING_DELEGATE && $instance->instructorchoiceacceptgrades == LTI_SETTING_ALWAYS)) { $sourcedid = json_encode(lti_build_sourcedid($instance->id, $USER->id, $placementsecret, $typeid)); $requestparams['lis_result_sourcedid'] = $sourcedid; // Add outcome service URL. $serviceurl = new \moodle_url('/mod/lti/service.php'); $serviceurl = $serviceurl->out(); $forcessl = false; if (!empty($CFG->mod_lti_forcessl)) { $forcessl = true; } if (isset($typeconfig['forcessl']) && $typeconfig['forcessl'] == '1' or $forcessl) { $serviceurl = lti_ensure_url_is_https($serviceurl); } $requestparams['lis_outcome_service_url'] = $serviceurl; } // Send user's name and email data if appropriate. if ($islti2 || $typeconfig['sendname'] == LTI_SETTING_ALWAYS || $typeconfig['sendname'] == LTI_SETTING_DELEGATE && $instance->instructorchoicesendname == LTI_SETTING_ALWAYS) { $requestparams['lis_person_name_given'] = $USER->firstname; $requestparams['lis_person_name_family'] = $USER->lastname; $requestparams['lis_person_name_full'] = $USER->firstname . ' ' . $USER->lastname; $requestparams['ext_user_username'] = $USER->username; } if ($islti2 || $typeconfig['sendemailaddr'] == LTI_SETTING_ALWAYS || $typeconfig['sendemailaddr'] == LTI_SETTING_DELEGATE && $instance->instructorchoicesendemailaddr == LTI_SETTING_ALWAYS) { $requestparams['lis_person_contact_email_primary'] = $USER->email; } return $requestparams; }
function pearsondirect_is_student($USER, $courseid) { global $USER, $CFG; $student = false; require_once $CFG->dirroot . '/mod/lti/locallib.php'; $role = lti_get_ims_role($USER, '', $courseid); if (strcasecmp($role, 'learner') == 0) { $student = true; } return $student; }
/** * Get the base lti request params * * @param object $course * @return array */ public function get_lti_params($course) { global $USER, $CFG; $user_given = isset($USER->firstname) ? $USER->firstname : ''; $user_family = isset($USER->lastname) ? $USER->lastname : ''; $user_full = trim($user_given . ' ' . $user_family); $user_email = isset($USER->email) ? $USER->email : ''; $roles = lti_get_ims_role($USER, 0, $course->id, false); $params = array('context_id' => $course->id, 'context_label' => $course->shortname, 'context_title' => $course->fullname, 'ext_lms' => 'moodle-2', 'lis_person_name_family' => $user_family, 'lis_person_name_full' => $user_full, 'lis_person_name_given' => $user_given, 'lis_person_contact_email_primary' => $user_email, 'lti_message_type' => 'basic-lti-launch-request', 'lti_version' => 'LTI-1p0', 'roles' => $roles, 'tool_consumer_info_product_family_code' => 'moodle', 'tool_consumer_info_version' => (string) $CFG->version, 'user_id' => $USER->id, 'custom_context_id' => $course->idnumber, 'custom_plugin_info' => $this->_config->get_plugin_info(), 'resource_link_id' => ''); // NOTE: For LTI launches we use a custom_use_trusted_embed // param. For non-LTI launches we append use_trusted_embed // as a query param. See `get_signed_chooser_url` if ($this->_config->get_use_trusted_embeds()) { $params['custom_use_trusted_embed'] = 'true'; } // Add debug flag for local testing. if ((bool) $CFG->debugdisplay) { $params['debug'] = 'true'; } return $params; }
/** * Get the JSON representation of the users. * * Note that when a limit is set and the exclude array is not empty, then the number of memberships * returned may be less than the limit. * * @param \mod_lti\local\ltiservice\resource_base $resource Resource handling the request * @param array $users Array of user records * @param string $id Course ID * @param object $tool Tool instance object * @param array $exclude Array of user records to be excluded from the response * @param int $limitfrom Position of first record to be returned * @param int $limitnum Maximum number of records to be returned * @param object $lti LTI instance record * @param \core_availability\info_module $info Conditional availability information for LTI instance * * @return string */ private static function users_to_json($resource, $users, $id, $tool, $exclude, $limitfrom, $limitnum, $lti, $info) { $nextpage = 'null'; if ($limitnum > 0) { $limitfrom += $limitnum; $nextpage = "\"{$resource->get_endpoint()}?limit={$limitnum}&from={$limitfrom}\""; } $json = <<<EOD { "@context" : "http://purl.imsglobal.org/ctx/lis/v2/MembershipContainer", "@type" : "Page", "@id" : "{$resource->get_endpoint()}", "nextPage" : {$nextpage}, "pageOf" : { "@type" : "LISMembershipContainer", "membershipSubject" : { "@type" : "Context", "contextId" : "{$id}", "membership" : [ EOD; $enabledcapabilities = lti_get_enabled_capabilities($tool); $sep = ' '; foreach ($users as $user) { $include = !in_array($user->id, $exclude); if ($include && !empty($info)) { $include = $info->is_user_visible($info->get_course_module(), $user->id); } if ($include) { $member = new \stdClass(); if (in_array('User.id', $enabledcapabilities)) { $member->userId = $user->id; } if (in_array('Person.sourcedId', $enabledcapabilities)) { $member->sourcedId = format_string($user->idnumber); } if (in_array('Person.name.full', $enabledcapabilities)) { $member->name = format_string("{$user->firstname} {$user->lastname}"); } if (in_array('Person.name.given', $enabledcapabilities)) { $member->givenName = format_string($user->firstname); } if (in_array('Person.name.family', $enabledcapabilities)) { $member->familyName = format_string($user->lastname); } if (in_array('Person.email.primary', $enabledcapabilities)) { $member->email = format_string($user->email); } if (in_array('Result.sourcedId', $enabledcapabilities) && !empty($lti) && !empty($lti->servicesalt)) { $member->resultSourcedId = json_encode(lti_build_sourcedid($lti->id, $user->id, $lti->servicesalt, $lti->typeid)); } $roles = explode(',', lti_get_ims_role($user->id, null, $id, true)); $membership = new \stdClass(); $membership->status = 'Active'; $membership->member = $member; $membership->role = $roles; $json .= $sep . json_encode($membership); $sep = ",\n "; } } $json .= <<<EOD ] } } } EOD; return $json; }