16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/atomic_tenant/deployment_manager/abstract_auto_create_platform_guid_strategy.rb', line 16
def call(decoded_id_token:)
issuer = decoded_id_token["iss"]
platform_guid = decoded_id_token.dig(AtomicLti::Definitions::TOOL_PLATFORM_CLAIM, "guid")
target_link_uri = decoded_id_token[AtomicLti::Definitions::TARGET_LINK_URI_CLAIM]
if !platform_guid.present? || !target_link_uri.present?
return AtomicTenant::DeploymentManager::DeploymentStrategyResult.new()
end
uri = URI.parse(target_link_uri)
application_key = uri.host&.split('.')&.first
return AtomicTenant::DeploymentManager::DeploymentStrategyResult.new() if !application_key.present?
app = Application.find_by(key: application_key)
return AtomicTenant::DeploymentManager::DeploymentStrategyResult.new() if app.nil?
if !TRUSTED_ISSUERS.any? { |pattern| issuer.match?(pattern) }
existing_app_instance_count = AtomicTenant::LtiDeployment
.joins(:application_instance)
.where(
iss: issuer,
application_instances: { application_id: app.id },
).distinct.count(:application_instance_id)
if existing_app_instance_count >= AtomicTenant.untrusted_iss_tenant_limit
raise AtomicTenant::Exceptions::OnboardingException, "The issuer #{issuer} has reached the limit of #{AtomicTenant.untrusted_iss_tenant_limit} unique tenants for the application #{application_key}."
end
end
site_url = (decoded_id_token)
app_inst = find_application_instance(app, site_url, issuer, platform_guid)
app_inst ||= maybe_create_application_instance(app, site_url, issuer, platform_guid)
pin = pin_platform_guid(issuer, platform_guid, app.id, app_inst.id)
AtomicTenant::DeploymentManager::DeploymentStrategyResult.new(application_instance_id: pin.application_instance_id)
end
|