canvas-lms/app/models/lti/tool_consumer_profile.rb

116 lines
4.0 KiB
Ruby

#
# Copyright (C) 2017 - present Instructure, Inc.
#
# 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/>.
module Lti
class ToolConsumerProfile < ActiveRecord::Base
belongs_to :developer_key
before_validation {self.uuid ||= SecureRandom.uuid}
after_update :clear_cache
serialize :services
serialize :capabilities
DEFAULT_TCP_UUID = "339b6700-e4cb-47c5-a54f-3ee0064921a9".freeze
WEBHOOK_GRANT_ALL_CAPABILITY = 'vnd.instructure.webhooks.root_account.all'.freeze
WEBHOOK_SUBSCRIPTION_CAPABILITIES = {
all: [WEBHOOK_GRANT_ALL_CAPABILITY].freeze,
quiz_submitted: %w(vnd.instructure.webhooks.root_account.quiz_submitted
vnd.instructure.webhooks.assignment.quiz_submitted).freeze,
grade_change: %w(vnd.instructure.webhooks.root_account.grade_change).freeze,
attachment_created: %w(vnd.instructure.webhooks.root_account.attachment_created
vnd.instructure.webhooks.assignment.attachment_created).freeze,
submission_created: %w(vnd.instructure.webhooks.root_account.submission_created
vnd.instructure.webhooks.assignment.submission_created).freeze,
plagiarism_resubmit: %w(vnd.instructure.webhooks.root_account.plagiarism_resubmit
vnd.instructure.webhooks.assignment.plagiarism_resubmit).freeze,
submission_updated: %w(vnd.instructure.webhooks.root_account.submission_updated
vnd.instructure.webhooks.assignment.submission_updated).freeze,
}.freeze
DEFAULT_CAPABILITIES = %w(
basic-lti-launch-request
ToolProxyRegistrationRequest
Canvas.placements.accountNavigation
Canvas.placements.courseNavigation
Canvas.placements.assignmentSelection
Canvas.placements.linkSelection
Canvas.placements.postGrades
Security.splitSecret
Context.sourcedId
).concat(
Lti::VariableExpander.expansion_keys
).freeze
RESTRICTED_CAPABILITIES = [
'Canvas.placements.similarityDetection',
"#{Lti::OriginalityReportsApiController::ORIGINALITY_REPORT_SERVICE}.url",
*WEBHOOK_SUBSCRIPTION_CAPABILITIES.values.flatten
].freeze
DEFAULT_SERVICES = [
*Lti::Ims::ToolProxyController::SERVICE_DEFINITIONS,
*Lti::Ims::AuthorizationController::SERVICE_DEFINITIONS,
*Lti::Ims::ToolSettingController::SERVICE_DEFINITIONS
].freeze
RESTRICTED_SERVICES = [
*Lti::OriginalityReportsApiController::SERVICE_DEFINITIONS,
*Lti::SubscriptionsApiController::SERVICE_DEFINITIONS,
*Lti::SubmissionsApiController::SERVICE_DEFINITIONS,
*Lti::UsersApiController::SERVICE_DEFINITIONS,
*Lti::AssignmentsApiController::SERVICE_DEFINITIONS
].freeze
class << self
def cached_find_by_developer_key(dev_key_id)
MultiCache.fetch(cache_key(dev_key_id)) do
Shackles.activate(:slave) do
dev_key = DeveloperKey.find_cached(dev_key_id)
dev_key.present? && dev_key.tool_consumer_profile
end
end
end
def cache_key(dev_key_id)
global_dev_key_id = Shard.global_id_for(dev_key_id)
"tool_consumer_profile/dev_key/#{global_dev_key_id}"
end
end
def self.webhook_subscription_capabilities
WEBHOOK_SUBSCRIPTION_CAPABILITIES
end
def self.webhook_grant_all_capability
WEBHOOK_GRANT_ALL_CAPABILITY
end
private
def clear_cache
MultiCache.delete(self.class.cache_key(developer_key_id))
end
end
end