main
1# frozen_string_literal: true
2
3module Saml
4 module Kit
5 module Builders
6 # {include:file:lib/saml/kit/builders/templates/response.builder}
7 # {include:file:spec/saml/kit/builders/response_spec.rb}
8 class Response
9 include XmlTemplatable
10 attr_reader :user, :request, :issuer, :destination, :now, :configuration
11 attr_accessor :id, :version, :status_code, :status_message
12
13 def initialize(
14 user, request = nil, configuration: Saml::Kit.configuration
15 )
16 @user = user
17 @request = request
18 @id = ::Xml::Kit::Id.generate
19 @now = Time.now.utc
20 @version = '2.0'
21 @status_code = Namespaces::SUCCESS
22 @status_message = nil
23 @issuer = configuration.entity_id
24 @encryption_certificate = request.try(:provider)
25 .try(:encryption_certificates).try(:last)
26 @encrypt = encryption_certificate.present?
27 @configuration = configuration
28 end
29
30 def build
31 Saml::Kit::Response.new(
32 to_xml,
33 request_id: request.try(:id),
34 configuration: configuration
35 )
36 end
37
38 def assertion=(value)
39 @assertion = value || Null.new
40 end
41
42 def assertion
43 @assertion ||=
44 begin
45 assertion = Assertion.new(user, request, configuration: configuration)
46 assertion.sign_with(@signing_key_pair) if @signing_key_pair
47 assertion.embed_signature = embed_signature unless embed_signature.nil?
48 assertion.now = now
49 assertion.destination = destination
50 assertion.issuer = issuer
51 encrypt ? EncryptedAssertion.new(self, assertion) : assertion
52 end
53 end
54
55 def encrypt=(value)
56 super(value)
57 return if @assertion.nil?
58
59 if value
60 @assertion = EncryptedAssertion.new(self, assertion) if assertion.is_a?(Assertion)
61 elsif assertion.is_a?(EncryptedAssertion)
62 @assertion = assertion.assertion if assertion.is_a?(EncryptedAssertion)
63 end
64 end
65
66 def destination=(value)
67 @destination = value
68 assertion.destination = value
69 end
70
71 def issuer=(value)
72 @issuer = value
73 assertion.issuer = value
74 end
75
76 def now=(value)
77 @now = value
78 assertion.now = value
79 end
80
81 def embed_signature=(value)
82 @embed_signature = value
83 assertion.embed_signature = value
84 end
85
86 private
87
88 def response_options
89 options = {
90 ID: id,
91 Version: version,
92 IssueInstant: now.iso8601,
93 Consent: Namespaces::UNSPECIFIED,
94 xmlns: Namespaces::PROTOCOL,
95 }
96 options[:Destination] = destination if destination.present?
97 options[:InResponseTo] = request.try(:id) if request.present?
98 options
99 end
100 end
101 end
102 end
103end