2015-01-08 01:54:38 +08:00
#
2017-04-28 04:04:26 +08:00
# Copyright (C) 2015 - present Instructure, Inc.
2015-01-08 01:54:38 +08:00
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
2017-02-15 07:17:07 +08:00
# NOTE: To update the VariableExpansion docs run `script/generate_lti_variable_substitution_markdown`
2015-01-08 01:54:38 +08:00
module Lti
class VariableExpander
2015-05-14 01:00:18 +08:00
SUBSTRING_REGEX = / (?<= \ ${).*?(?=}) / . freeze #matches only the stuff inside `${}`
2015-01-08 01:54:38 +08:00
attr_reader :context , :root_account , :controller , :current_user
attr_accessor :current_pseudonym , :content_tag , :assignment ,
2016-06-25 00:21:16 +08:00
:tool_setting_link_id , :tool_setting_binding_id , :tool_setting_proxy_id , :tool , :attachment ,
:collaboration
2015-01-08 01:54:38 +08:00
2016-10-28 03:57:01 +08:00
def self . register_expansion ( name , permission_groups , expansion_proc , * guards )
2015-01-08 01:54:38 +08:00
@expansions || = { }
2016-10-28 03:57:01 +08:00
@expansions [ " $ #{ name } " . to_sym ] = VariableExpansion . new ( name , permission_groups , expansion_proc , * guards )
2015-01-08 01:54:38 +08:00
end
def self . expansions
2016-10-28 03:57:01 +08:00
@expansions || { }
2015-01-08 01:54:38 +08:00
end
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD = - > { ! ! @controller }
2015-01-08 01:54:38 +08:00
COURSE_GUARD = - > { @context . is_a? Course }
2015-04-23 23:08:26 +08:00
TERM_START_DATE_GUARD = - > { @context . is_a? ( Course ) && @context . enrollment_term &&
@context . enrollment_term . start_at }
2015-01-08 01:54:38 +08:00
USER_GUARD = - > { @current_user }
2017-01-13 06:22:26 +08:00
SIS_USER_GUARD = - > { @current_user && @current_user . pseudonym && @current_user . pseudonym . sis_user_id }
2015-01-08 01:54:38 +08:00
PSEUDONYM_GUARD = - > { sis_pseudonym }
ENROLLMENT_GUARD = - > { @current_user && @context . is_a? ( Course ) }
2015-08-04 03:46:13 +08:00
ROLES_GUARD = - > { @current_user && ( @context . is_a? ( Course ) || @context . is_a? ( Account ) ) }
2015-01-08 01:54:38 +08:00
CONTENT_TAG_GUARD = - > { @content_tag }
ASSIGNMENT_GUARD = - > { @assignment }
2016-06-25 00:21:16 +08:00
COLLABORATION_GUARD = - > { @collaboration }
2015-02-11 07:40:06 +08:00
MEDIA_OBJECT_GUARD = - > { @attachment && @attachment . media_object }
USAGE_RIGHTS_GUARD = - > { @attachment && @attachment . usage_rights }
MEDIA_OBJECT_ID_GUARD = - > { @attachment && ( @attachment . media_object || @attachment . media_entry_id ) }
2016-10-28 03:57:01 +08:00
LTI1_GUARD = - > { @tool . is_a? ( ContextExternalTool ) }
MASQUERADING_GUARD = - > { ! ! @controller && @controller . logged_in_user != @current_user }
2015-01-08 01:54:38 +08:00
def initialize ( root_account , context , controller , opts = { } )
@root_account = root_account
@context = context
@controller = controller
2016-10-28 03:57:01 +08:00
@request = controller . request if controller
2015-01-08 01:54:38 +08:00
opts . each { | opt , val | instance_variable_set ( " @ #{ opt } " , val ) }
end
def lti_helper
2017-02-25 04:02:00 +08:00
@lti_helper || = Lti :: SubstitutionsHelper . new ( @context , @root_account , @current_user , @tool )
2015-01-08 01:54:38 +08:00
end
def current_user = ( current_user )
@lti_helper = nil
@current_user = current_user
end
def [] ( key )
k = ( key [ 0 ] == '$' && key ) || " $ #{ key } "
2015-05-14 01:00:18 +08:00
if ( expansion = self . class . expansions [ k . respond_to? ( :to_sym ) && k . to_sym ] )
2015-01-08 01:54:38 +08:00
expansion . expand ( self )
end
end
def expand_variables! ( var_hash )
var_hash . update ( var_hash ) do | _ , v |
2015-05-14 01:00:18 +08:00
if ( expansion = v . respond_to? ( :to_sym ) && self . class . expansions [ v . to_sym ] )
2015-01-08 01:54:38 +08:00
expansion . expand ( self )
2015-05-14 01:00:18 +08:00
elsif v . respond_to? ( :to_s ) && v . to_s =~ SUBSTRING_REGEX
expand_substring_variables ( v )
2015-01-08 01:54:38 +08:00
else
v
end
end
end
2017-02-08 04:51:01 +08:00
def enabled_capability_params ( enabled_capabilities )
enabled_capabilities . each_with_object ( { } ) do | capability , hash |
if ( expansion = capability . respond_to? ( :to_sym ) && self . class . expansions [ " $ #{ capability } " . to_sym ] )
hash [ expansion . default_name ] = expansion . expand ( self ) if expansion . default_name . present?
end
end
end
2017-02-15 07:17:07 +08:00
# an opaque identifier that uniquely identifies the context of the tool launch
# @launch_parameter context_id
2017-02-09 06:35:31 +08:00
# @example
# ```
# cdca1fe2c392a208bd8a657f8865ddb9ca359534
# ```
register_expansion 'Context.id' , [ ] ,
- > { Lti :: Asset . opaque_identifier_for ( @context ) } ,
default_name : 'context_id'
2017-02-08 04:51:01 +08:00
# communicates the kind of browser window/frame where the Canvas has launched a tool
2017-02-15 07:17:07 +08:00
# @launch_parameter launch_presentation_document_target
2017-02-08 04:51:01 +08:00
# @example
# ```
2017-02-15 07:17:07 +08:00
# iframe
2017-02-08 04:51:01 +08:00
# ```
register_expansion 'Message.documentTarget' , [ ] ,
- > { IMS :: LTI :: Models :: Messages :: Message :: LAUNCH_TARGET_IFRAME } ,
default_name : 'launch_presentation_document_target'
# returns the current locale
2017-02-15 07:17:07 +08:00
# @launch_parameter launch_presentation_locale
2017-02-08 04:51:01 +08:00
# @example
# ```
# de
# ```
register_expansion 'Message.locale' , [ ] ,
- > { I18n . locale || I18n . default_locale } ,
default_name : 'launch_presentation_locale'
# returns a unique identifier for the Tool Consumer (Canvas)
2017-02-15 07:17:07 +08:00
# @launch_parameter tool_consumer_instance_guid
2017-02-08 04:51:01 +08:00
# @example
# ```
# 0dWtgJjjFWRNT41WdQMvrleejGgv7AynCVm3lmZ2:canvas-lms
# ```
register_expansion 'ToolConsumerInstance.guid' , [ ] ,
- > { @root_account . lti_guid } ,
default_name : 'tool_consumer_instance_guid'
2016-03-11 12:49:32 +08:00
# returns the canvas domain for the current context.
# @example
# ```
# canvas.instructure.com
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.api.domain' , [ ] ,
2016-10-28 03:57:01 +08:00
- > { HostUrl . context_host ( @root_account , @request . host ) } ,
CONTROLLER_GUARD
2015-01-08 01:54:38 +08:00
2016-06-25 00:21:16 +08:00
# returns the api url for the members of the collaboration
# @example
# ```
# https://canvas.instructure.com/api/v1/collaborations/1/members
# ```
register_expansion 'Canvas.api.collaborationMembers.url' , [ ] ,
- > { @controller . api_v1_collaboration_members_url ( @collaboration ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2016-06-25 00:21:16 +08:00
COLLABORATION_GUARD
2016-03-11 12:49:32 +08:00
# returns the base URL for the current context.
# @example
# ```
# https://canvas.instructure.com
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.api.baseUrl' , [ ] ,
2016-10-28 03:57:01 +08:00
- > { " #{ @request . scheme } :// #{ HostUrl . context_host ( @root_account , @request . host ) } " } ,
CONTROLLER_GUARD
2015-01-08 01:54:38 +08:00
2017-03-29 05:03:07 +08:00
# returns the URL for the membership service associated with the current context.
#
# This variable is for future use only. Complete support for the IMS Membership Service has not been added to Canvas. This will be updated when we fully support and certify the IMS Membership Service.
2016-06-16 02:10:32 +08:00
# @example
# ```
# https://canvas.instructure.com/api/lti/courses/1/membership_service
# ```
register_expansion 'ToolProxyBinding.memberships.url' , [ ] ,
2016-04-29 03:29:56 +08:00
- > { @controller . polymorphic_url ( [ @context , :membership_service ] ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2016-04-29 03:29:56 +08:00
- > { @context . is_a? ( Course ) || @context . is_a? ( Group ) }
2016-03-31 06:59:58 +08:00
2016-03-11 12:49:32 +08:00
# returns the account id for the current context.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.account.id' , [ ] ,
- > { lti_helper . account . id }
2016-03-11 12:49:32 +08:00
# returns the account name for the current context.
# @example
# ```
# School Name
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.account.name' , [ ] ,
- > { lti_helper . account . name }
2017-02-15 07:17:07 +08:00
# returns the account's sis source id for the current context.
2016-12-06 06:06:35 +08:00
# @example
# ```
# sis_account_id_1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.account.sisSourceId' , [ ] ,
- > { lti_helper . account . sis_source_id }
2016-03-11 12:49:32 +08:00
# returns the Root Account ID for the current context.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.rootAccount.id' , [ ] ,
- > { @root_account . id }
2017-02-15 07:17:07 +08:00
# returns the root account's sis source id for the current context.
2016-12-06 06:06:35 +08:00
# @example
# ```
# sis_account_id_1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.rootAccount.sisSourceId' , [ ] ,
- > { @root_account . sis_source_id }
2017-02-15 07:17:07 +08:00
# returns the URL for the external tool that was launched. Only available for LTI 1.
2016-03-11 12:49:32 +08:00
# @example
# ```
# http://example.url/path
# ```
2015-04-25 00:14:02 +08:00
register_expansion 'Canvas.externalTool.url' , [ ] ,
2016-08-24 03:22:00 +08:00
- > { @controller . named_context_url ( @tool . context , :api_v1_context_external_tools_update_url ,
2015-04-25 00:14:02 +08:00
@tool . id , include_host : true ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-04-25 00:14:02 +08:00
LTI1_GUARD
2017-02-15 07:17:07 +08:00
# returns the URL for the common css file.
2016-03-11 12:49:32 +08:00
# @example
# ```
# http://example.url/path.css
# ```
2015-07-11 00:28:43 +08:00
register_expansion 'Canvas.css.common' , [ ] ,
- > { URI . parse ( @request . url )
2016-10-28 03:57:01 +08:00
. merge ( @controller . view_context . stylesheet_path ( @controller . css_url_for ( :common ) ) ) . to_s } ,
CONTROLLER_GUARD
2015-04-25 00:14:02 +08:00
2016-03-11 12:49:32 +08:00
# returns the shard id for the current context.
# @example
# ```
# 1234
# ```
2015-08-04 07:01:36 +08:00
register_expansion 'Canvas.shard.id' , [ ] ,
- > { Shard . current . id }
2016-03-11 12:49:32 +08:00
# returns the root account's global id for the current context.
2017-02-15 07:17:07 +08:00
# @duplicates Canvas.user.globalId
2016-03-11 12:49:32 +08:00
# @example
# ```
# 123400000000123
# ```
2015-08-04 07:01:36 +08:00
register_expansion 'Canvas.root_account.global_id' , [ ] ,
- > { @root_account . global_id }
2015-01-08 01:54:38 +08:00
2016-03-11 12:49:32 +08:00
# returns the root account id for the current context.
# @deprecated
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.root_account.id' , [ ] ,
- > { @root_account . id }
2017-02-15 04:24:04 +08:00
# returns the account uuid for the current context.
# @example
# ```
# Ioe3sJPt0KZp9Pw6xAvcHuLCl0z4TvPKP0iIOLbo
# ```
register_expansion 'vnd.Canvas.root_account.uuid' , [ ] ,
- > { @root_account . uuid } ,
default_name : 'vnd_canvas_root_account_uuid'
2016-03-11 12:49:32 +08:00
# returns the root account sis source id for the current context.
# @deprecated
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.root_account.sisSourceId' , [ ] ,
- > { @root_account . sis_source_id }
2016-03-11 12:49:32 +08:00
# returns the current course id.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.id' , [ ] ,
- > { @context . id } ,
COURSE_GUARD
2017-01-31 06:36:37 +08:00
# returns the current course name.
# @example
# ```
# Course Name
# ```
register_expansion 'Canvas.course.name' , [ ] ,
- > { @context . name } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course sis source id.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.sisSourceId' , [ ] ,
- > { @context . sis_source_id } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course start date.
# @example
# ```
2016-12-06 06:06:35 +08:00
# YYY-MM-DD HH:MM:SS -0700
2016-03-11 12:49:32 +08:00
# ```
2015-04-23 23:08:26 +08:00
register_expansion 'Canvas.course.startAt' , [ ] ,
- > { @context . start_at } ,
COURSE_GUARD
2016-11-11 06:56:37 +08:00
# returns the current course workflow state. Workflow states of "claimed" or "created"
# indicate an unpublished course.
# @example
# ```
# active
# ```
register_expansion 'Canvas.course.workflowState' , [ ] ,
- > { @context . workflow_state } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course's term start date.
# @example
# ```
2016-12-06 06:06:35 +08:00
# YYY-MM-DD HH:MM:SS -0700
2016-03-11 12:49:32 +08:00
# ```
2015-04-23 23:08:26 +08:00
register_expansion 'Canvas.term.startAt' , [ ] ,
- > { @context . enrollment_term . start_at } ,
TERM_START_DATE_GUARD
2016-12-06 06:06:35 +08:00
# returns the current course sis source id
# to return the section source id use Canvas.course.sectionIds
2017-02-15 07:17:07 +08:00
# @launch_parameter lis_course_section_sourcedid
2016-03-11 12:49:32 +08:00
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'CourseSection.sourcedId' , [ ] ,
- > { @context . sis_source_id } ,
2017-02-08 04:51:01 +08:00
COURSE_GUARD ,
default_name : 'lis_course_section_sourcedid'
2015-01-08 01:54:38 +08:00
2016-03-11 12:49:32 +08:00
# returns the current course enrollment state
# @example
# ```
2016-12-06 06:06:35 +08:00
# active
2016-03-11 12:49:32 +08:00
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.enrollment.enrollmentState' , [ ] ,
- > { lti_helper . enrollment_state } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course membership roles
# @example
# ```
2016-12-06 06:06:35 +08:00
# StudentEnrollment
2016-03-11 12:49:32 +08:00
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.membership.roles' , [ ] ,
- > { lti_helper . current_canvas_roles } ,
2015-08-04 03:46:13 +08:00
ROLES_GUARD
2015-01-08 01:54:38 +08:00
2016-03-11 12:49:32 +08:00
# This is a list of IMS LIS roles should have a different key
2016-12-06 06:06:35 +08:00
# @example
# ```
# urn:lti:sysrole:ims/lis/None
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.membership.concludedRoles' , [ ] ,
- > { lti_helper . concluded_lis_roles } ,
COURSE_GUARD
2017-02-15 07:17:07 +08:00
# Returns the context ids from the course that the current course was copied from (excludes cartridge imports).
#
2016-03-11 12:49:32 +08:00
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.previousContextIds' , [ ] ,
- > { lti_helper . previous_lti_context_ids } ,
COURSE_GUARD
2017-02-15 07:17:07 +08:00
# Returns the course ids of the course that the current course was copied from (excludes cartridge imports).
#
2016-03-11 12:49:32 +08:00
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.previousCourseIds' , [ ] ,
- > { lti_helper . previous_course_ids } ,
COURSE_GUARD
2017-02-15 07:17:07 +08:00
# Returns the full name of the launching user.
# @launch_parameter lis_person_name_full
2016-12-06 06:06:35 +08:00
# @example
# ```
# John Doe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.name.full' , [ ] ,
- > { @current_user . name } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_name_full'
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns the last name of the launching user.
# @launch_parameter lis_person_name_family
2016-12-06 06:06:35 +08:00
# @example
# ```
# Doe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.name.family' , [ ] ,
- > { @current_user . last_name } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_name_family'
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns the first name of the launching user.
# @launch_parameter lis_person_name_given
2016-12-06 06:06:35 +08:00
# @example
# ```
# John
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.name.given' , [ ] ,
- > { @current_user . first_name } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_name_given'
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns the primary email of the launching user.
# @launch_parameter lis_person_contact_email_primary
2016-12-06 06:06:35 +08:00
# @example
# ```
# john.doe@example.com
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.email.primary' , [ ] ,
2017-02-25 04:02:00 +08:00
- > { lti_helper . email } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_contact_email_primary'
2015-01-08 01:54:38 +08:00
2017-01-13 06:22:26 +08:00
2017-02-15 07:17:07 +08:00
# Returns the institution assigned email of the launching user.
2017-01-13 06:22:26 +08:00
# @example
# ```
# john.doe@example.com
# ```
register_expansion 'vnd.Canvas.Person.email.sis' , [ ] ,
2017-02-25 04:02:00 +08:00
- > { lti_helper . sis_email } , SIS_USER_GUARD
2017-01-13 06:22:26 +08:00
2017-02-15 07:17:07 +08:00
# Returns the name of the timezone of the launching user.
2016-12-06 06:06:35 +08:00
# @example
# ```
# America/Denver
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.address.timezone' , [ ] ,
- > { Time . zone . tzinfo . name } ,
USER_GUARD
2017-02-15 07:17:07 +08:00
# Returns the profile picture URL of the launching user.
# @launch_parameter user_image
2016-12-06 06:06:35 +08:00
# @example
# ```
# https://example.com/picture.jpg
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'User.image' , [ ] ,
- > { @current_user . avatar_url } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'user_image'
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns the Canvas user_id of the launching user.
# @duplicates Canvas.user.id
# @launch_parameter user_id
2016-12-06 06:06:35 +08:00
# @example
# ```
# 420000000000042
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'User.id' , [ ] ,
- > { @current_user . id } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'user_id'
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns the Canvas user_id of the launching user.
# @duplicates User.id
2016-12-06 06:06:35 +08:00
# @example
# ```
# 420000000000042
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.id' , [ ] ,
- > { @current_user . id } ,
USER_GUARD
2017-02-15 07:17:07 +08:00
# Returns the users preference for high contrast colors (an accessibility feature).
2016-12-06 06:06:35 +08:00
# @example
# ```
# false
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.prefersHighContrast' , [ ] ,
- > { @current_user . prefers_high_contrast? ? 'true' : 'false' } ,
USER_GUARD
2016-06-16 02:10:32 +08:00
# returns the context ids for the groups the user belongs to in the course.
# @example
# ```
# 1c16f0de65a080803785ecb3097da99872616f0d,d4d8d6ae1611e2c7581ce1b2f5c58019d928b79d,...
# ```
register_expansion 'Canvas.group.contextIds' , [ ] ,
- > { @current_user . groups . active . where ( context_type : 'Course' , context_id : @context . id ) . map do | g |
Lti :: Asset . opaque_identifier_for ( g )
end . join ( ',' ) } ,
- > { @current_user && @context . is_a? ( Course ) }
2017-02-15 07:17:07 +08:00
# Returns the [IMS LTI membership service](https://www.imsglobal.org/specs/ltimemv1p0/specification-3) roles for filtering via query parameters.
# @launch_parameter roles
2016-12-06 06:06:35 +08:00
# @example
# ```
# http://purl.imsglobal.org/vocab/lis/v2/institution/person#Administrator
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Membership.role' , [ ] ,
- > { lti_helper . all_roles ( 'lis2' ) } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'roles'
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns list of [LIS role full URNs](https://www.imsglobal.org/specs/ltiv1p0/implementation-guide#toc-16).
# @duplicates ext_roles which is sent by default
2016-12-06 06:06:35 +08:00
# @example
# ```
2017-02-15 07:17:07 +08:00
# urn:lti:instrole:ims/lis/Administrator,urn:lti:instrole:ims/lis/Instructor,urn:lti:sysrole:ims/lis/SysAdmin,urn:lti:sysrole:ims/lis/User
2016-12-06 06:06:35 +08:00
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.xuser.allRoles' , [ ] ,
- > { lti_helper . all_roles }
2017-02-15 07:17:07 +08:00
# Returns the Canvas global user_id of the launching user.
# @duplicates Canvas.root_account.global_id
2016-12-06 06:06:35 +08:00
# @example
# ```
# 420000000000042
# ```
2015-10-22 05:03:34 +08:00
register_expansion 'Canvas.user.globalId' , [ ] ,
- > { @current_user . global_id } ,
USER_GUARD
2017-02-15 07:17:07 +08:00
# Returns true for root account admins and false for all other roles.
2016-12-06 06:06:35 +08:00
# @example
# ```
# true
# ```
2016-11-17 23:36:15 +08:00
register_expansion 'Canvas.user.isRootAccountAdmin' , [ ] ,
- > { @current_user . roles ( @root_account ) . include? 'root_admin' } ,
USER_GUARD
2017-02-15 07:17:07 +08:00
# Username/Login ID for the primary pseudonym for the user for the account.
# This may not be the pseudonym the user is actually logged in with.
# @duplicates Canvas.user.loginId
# @example
2016-12-06 06:06:35 +08:00
# ```
# jdoe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'User.username' , [ ] ,
- > { sis_pseudonym . unique_id } ,
PSEUDONYM_GUARD
2017-02-15 07:17:07 +08:00
# Username/Login ID for the primary pseudonym for the user for the account.
# This may not be the pseudonym the user is actually logged in with.
# @duplicates User.username
# @example
2016-12-06 06:06:35 +08:00
# ```
# jdoe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.loginId' , [ ] ,
- > { sis_pseudonym . unique_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the sis source id for the primary pseudonym for the user for the account
2017-02-15 07:17:07 +08:00
# This may not be the pseudonym the user is actually logged in with.
# @duplicates Person.sourcedId
# @example
2016-12-06 06:06:35 +08:00
# ```
# sis_user_42
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.sisSourceId' , [ ] ,
- > { sis_pseudonym . sis_user_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the integration id for the primary pseudonym for the user for the account
2017-02-15 07:17:07 +08:00
# This may not be the pseudonym the user is actually logged in with.
# @example
2016-12-06 06:06:35 +08:00
# ```
# integration_user_42
# ```
2016-01-23 05:43:11 +08:00
register_expansion 'Canvas.user.sisIntegrationId' , [ ] ,
- > { sis_pseudonym . integration_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the sis source id for the primary pseudonym for the user for the account
2017-02-15 07:17:07 +08:00
# This may not be the pseudonym the user is actually logged in with.
# @duplicates Canvas.user.sisSourceId
# @example
2016-12-06 06:06:35 +08:00
# ```
# sis_user_42
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.sourcedId' , [ ] ,
- > { sis_pseudonym . sis_user_id } ,
2017-02-08 04:51:01 +08:00
PSEUDONYM_GUARD ,
default_name : 'lis_person_sourcedid'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the logout service url for the user.
# This is the pseudonym the user is actually logged in as.
# It may not hold all the sis info needed in other launch substitutions.
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
2017-02-15 07:17:07 +08:00
# https://<domain>.instructure.com/api/lti/v1/logout_service/<external_tool_id>-<user_id>-<current_unix_timestamp>-<opaque_string>
2016-12-06 06:06:35 +08:00
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.logoutService.url' , [ ] ,
- > { @controller . lti_logout_service_url ( Lti :: LogoutService . create_token ( @tool , @current_pseudonym ) ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @current_pseudonym && @tool }
2016-12-06 06:06:35 +08:00
# Returns the Canvas user_id for the masquerading user.
# This is the pseudonym the user is actually logged in as.
# It may not hold all the sis info needed in other launch substitutions.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# 420000000000042
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.masqueradingUser.id' , [ ] ,
2015-05-12 01:05:45 +08:00
- > { @controller . logged_in_user . id } ,
MASQUERADING_GUARD
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the 40 character opaque user_id for masquerading user.
# This is the pseudonym the user is actually logged in as.
# It may not hold all the sis info needed in other launch substitutions.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# da12345678cb37ba1e522fc7c5ef086b7704eff9
# ```
2015-04-28 03:41:05 +08:00
register_expansion 'Canvas.masqueradingUser.userId' , [ ] ,
- > { @tool . opaque_identifier_for ( @controller . logged_in_user ) } ,
2015-05-12 01:05:45 +08:00
MASQUERADING_GUARD
2015-04-28 03:41:05 +08:00
2016-12-06 06:06:35 +08:00
# Returns the xapi url for the user.
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# https://<domain>.instructure.com/api/lti/v1/xapi/<external_tool_id>-<user_id>-<course_id>-<current_unix_timestamp>-<opaque_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.xapi.url' , [ ] ,
2015-01-28 04:33:11 +08:00
- > { @controller . lti_xapi_url ( Lti :: AnalyticsService . create_token ( @tool , @current_user , @context ) ) } ,
- > { @current_user && @context . is_a? ( Course ) && @tool }
2016-12-06 06:06:35 +08:00
# Returns the caliper url for the user.
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# https://<domain>.instructure.com/api/lti/v1/caliper/<external_tool_id>-<user_id>-<course_id>-<current_unix_timestamp>-<opaque_id>
# ```
2015-02-24 06:49:19 +08:00
register_expansion 'Caliper.url' , [ ] ,
2015-01-28 04:33:11 +08:00
- > { @controller . lti_caliper_url ( Lti :: AnalyticsService . create_token ( @tool , @current_user , @context ) ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @current_user && @context . is_a? ( Course ) && @tool }
2016-12-06 06:06:35 +08:00
# Returns a comma separated list of section_id's that the user is enrolled in.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# 42, 43
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.sectionIds' , [ ] ,
- > { lti_helper . section_ids } ,
ENROLLMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns a comma separated list of section sis_id's that the user is enrolled in.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# section_sis_id_1, section_sis_id_2
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.sectionSisSourceIds' , [ ] ,
- > { lti_helper . section_sis_ids } ,
ENROLLMENT_GUARD
2017-05-04 02:27:39 +08:00
# Returns the course code
#
# @example
# ```
# section_sis_id_1, section_sis_id_2
# ```
register_expansion 'com.instructure.contextLabel' , [ ] ,
- > { @context . course_code } ,
COURSE_GUARD ,
default_name : 'context_label'
2016-12-06 06:06:35 +08:00
# Returns the module_id that the module item was launched from.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.module.id' , [ ] ,
2015-06-26 04:56:13 +08:00
- > {
@content_tag . context_module_id
} ,
2015-01-08 01:54:38 +08:00
CONTENT_TAG_GUARD
2016-12-06 06:06:35 +08:00
# Returns the module_item_id of the module item that was launched.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.moduleItem.id' , [ ] ,
2015-06-26 04:56:13 +08:00
- > {
@content_tag . id
} ,
2015-01-08 01:54:38 +08:00
CONTENT_TAG_GUARD
2016-12-06 06:06:35 +08:00
# Returns the assignment_id of the assignment that was launched.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.assignment.id' , [ ] ,
- > { @assignment . id } ,
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the title of the assignment that was launched.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# Deep thought experiment
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.assignment.title' , [ ] ,
- > { @assignment . title } ,
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the points possible of the assignment that was launched.
2017-02-15 07:17:07 +08:00
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# 100
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.assignment.pointsPossible' , [ ] ,
2016-05-11 22:03:11 +08:00
- > { TextHelper . round_if_whole ( @assignment . points_possible ) } ,
2015-01-08 01:54:38 +08:00
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
2016-03-11 12:49:32 +08:00
# @deprecated in favor of ISO8601
2015-03-13 06:29:38 +08:00
register_expansion 'Canvas.assignment.unlockAt' , [ ] ,
- > { @assignment . unlock_at } ,
ASSIGNMENT_GUARD
2016-03-11 12:49:32 +08:00
# @deprecated in favor of ISO8601
2015-03-13 06:29:38 +08:00
register_expansion 'Canvas.assignment.lockAt' , [ ] ,
- > { @assignment . lock_at } ,
ASSIGNMENT_GUARD
2016-03-11 12:49:32 +08:00
# @deprecated in favor of ISO8601
2015-03-13 06:29:38 +08:00
register_expansion 'Canvas.assignment.dueAt' , [ ] ,
- > { @assignment . due_at } ,
ASSIGNMENT_GUARD
2017-02-15 07:17:07 +08:00
# Returns the `unlock_at` date of the assignment that was launched.
# Only available when launched as an assignment with an `unlock_at` set.
# @example
2016-12-06 06:06:35 +08:00
# ```
# YYYY-MM-DDT07:00:00Z
# ```
2015-08-26 05:07:33 +08:00
register_expansion 'Canvas.assignment.unlockAt.iso8601' , [ ] ,
- > { @assignment . unlock_at . utc . iso8601 } ,
2015-10-20 01:05:17 +08:00
- > { @assignment && @assignment . unlock_at . present? }
2015-08-26 05:07:33 +08:00
2017-02-15 07:17:07 +08:00
# Returns the `lock_at` date of the assignment that was launched.
# Only available when launched as an assignment with a `lock_at` set.
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# YYYY-MM-DDT07:00:00Z
# ```
2015-08-26 05:07:33 +08:00
register_expansion 'Canvas.assignment.lockAt.iso8601' , [ ] ,
- > { @assignment . lock_at . utc . iso8601 } ,
2015-10-20 01:05:17 +08:00
- > { @assignment && @assignment . lock_at . present? }
2015-08-26 05:07:33 +08:00
2017-02-15 07:17:07 +08:00
# Returns the `due_at` date of the assignment that was launched.
# Only available when launched as an assignment with a `due_at` set.
#
# @example
2016-12-06 06:06:35 +08:00
# ```
# YYYY-MM-DDT07:00:00Z
# ```
2015-08-26 05:07:33 +08:00
register_expansion 'Canvas.assignment.dueAt.iso8601' , [ ] ,
- > { @assignment . due_at . utc . iso8601 } ,
2015-10-20 01:05:17 +08:00
- > { @assignment && @assignment . due_at . present? }
2015-08-26 05:07:33 +08:00
2017-02-15 07:17:07 +08:00
# Returns true if the assignment that was launched is published.
2016-12-06 06:06:35 +08:00
# Only available when launched as an assignment.
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# true
# ```
2016-06-21 11:51:25 +08:00
register_expansion 'Canvas.assignment.published' , [ ] ,
- > { @assignment . workflow_state == 'published' } ,
2016-06-17 01:30:26 +08:00
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the endpoint url for accessing link-level tool settings
# Only available for LTI 2.0
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# https://<domain>.instructure.com/api/lti/tool_settings/<link_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'LtiLink.custom.url' , [ ] ,
- > { @controller . show_lti_tool_settings_url ( @tool_setting_link_id ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @tool_setting_link_id }
2016-12-06 06:06:35 +08:00
# Returns the endpoint url for accessing context-level tool settings
# Only available for LTI 2.0
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# https://<domain>.instructure.com/api/lti/tool_settings/<binding_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'ToolProxyBinding.custom.url' , [ ] ,
- > { @controller . show_lti_tool_settings_url ( @tool_setting_binding_id ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @tool_setting_binding_id }
2016-12-06 06:06:35 +08:00
# Returns the endpoint url for accessing system-wide tool settings
# Only available for LTI 2.0
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# https://<domain>.instructure.com/api/lti/tool_settings/<proxy_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'ToolProxy.custom.url' , [ ] ,
- > { @controller . show_lti_tool_settings_url ( @tool_setting_proxy_id ) } ,
2016-10-28 03:57:01 +08:00
- > { ! ! @controller && @tool_setting_proxy_id }
2015-01-08 01:54:38 +08:00
2017-02-15 07:17:07 +08:00
# Returns the [Tool Consumer Profile](https://www.imsglobal.org/specs/ltiv2p0/implementation-guide#toc-46) url for the tool.
2016-12-06 06:06:35 +08:00
# Only available for LTI 2.0
2017-02-15 07:17:07 +08:00
# @example
2016-12-06 06:06:35 +08:00
# ```
# https://<domain>.instructure.com/api/lti/courses/<course_id>/tool_consumer_profile/<opaque_id>
# https://<domain>.instructure.com/api/lti/accounts/<account_id>/tool_consumer_profile/<opaque_id>
# ```
2015-01-16 02:47:16 +08:00
register_expansion 'ToolConsumerProfile.url' , [ ] ,
2017-02-10 09:43:04 +08:00
- > { @controller . polymorphic_url ( [ @tool . context , :tool_consumer_profile ] , tool_consumer_profile_id : Lti :: ToolConsumerProfile :: DEFAULT_TCP_UUID ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2016-06-08 02:45:50 +08:00
- > { @tool && @tool . is_a? ( Lti :: ToolProxy ) }
2015-01-16 02:47:16 +08:00
2015-02-11 07:40:06 +08:00
register_expansion 'Canvas.file.media.id' , [ ] ,
- > { ( @attachment . media_object && @attachment . media_object . media_id ) || @attachment . media_entry_id } ,
MEDIA_OBJECT_ID_GUARD
register_expansion 'Canvas.file.media.type' , [ ] ,
- > { @attachment . media_object . media_type } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.media.duration' , [ ] ,
- > { @attachment . media_object . duration } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.media.size' , [ ] ,
- > { @attachment . media_object . total_size } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.media.title' , [ ] ,
- > { @attachment . media_object . user_entered_title || @attachment . media_object . title } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.usageRights.name' , [ ] ,
- > { @attachment . usage_rights . license_name } ,
USAGE_RIGHTS_GUARD
register_expansion 'Canvas.file.usageRights.url' , [ ] ,
- > { @attachment . usage_rights . license_url } ,
USAGE_RIGHTS_GUARD
register_expansion 'Canvas.file.usageRights.copyrightText' , [ ] ,
- > { @attachment . usage_rights . legal_copyright } ,
USAGE_RIGHTS_GUARD
2015-01-08 01:54:38 +08:00
private
def sis_pseudonym
2017-04-07 05:00:25 +08:00
@sis_pseudonym || = SisPseudonym . for ( @current_user , @root_account , type : :trusted , require_sis : false ) if @current_user
2015-01-08 01:54:38 +08:00
end
2015-05-14 01:00:18 +08:00
def expand_substring_variables ( value )
value . to_s . scan ( SUBSTRING_REGEX ) . inject ( value ) do | v , match |
substring = " ${ #{ match } } "
v . gsub ( substring , ( self [ match ] || substring ) . to_s )
end
end
2015-01-08 01:54:38 +08:00
end
2015-05-14 01:00:18 +08:00
end