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