Commit 10697bd

mo <mo@mokhan.ca>
2018-09-17 17:46:48
refactor assertion builder.
I am working on simplifying the creation of an assertion outside of a Response specifically to support the OAuth SAML 2.0 assertion grant.
1 parent 49a26f4
Changed files (3)
lib
spec
saml
lib/saml/kit/builders/assertion.rb
@@ -7,16 +7,23 @@ module Saml
       # {include:file:lib/saml/kit/builders/templates/assertion.builder}
       class Assertion
         include XmlTemplatable
-        extend Forwardable
-
-        def_delegators :@response_builder,
-          :request, :issuer, :reference_id, :now, :configuration, :user,
-          :version, :destination
 
+        attr_reader :user, :request, :configuration
+        attr_accessor :reference_id
+        attr_accessor :now, :destination
+        attr_accessor :issuer, :version
         attr_accessor :default_name_id_format
 
-        def initialize(response_builder, embed_signature)
-          @response_builder = response_builder
+        def initialize(user, request = nil, embed_signature, configuration: Saml::Kit.configuration, now: Time.now.utc, destination: nil, signing_key_pair: nil, issuer: nil)
+          @user = user
+          @request = request
+          @destination = destination
+          @configuration = configuration
+          @issuer = issuer || configuration.entity_id
+          @reference_id = ::Xml::Kit::Id.generate
+          @version = '2.0'
+          @now = now
+          @signing_key_pair = signing_key_pair
           self.embed_signature = embed_signature
           self.default_name_id_format = Saml::Kit::Namespaces::UNSPECIFIED_NAMEID
         end
@@ -34,8 +41,8 @@ module Saml
           user.assertion_attributes_for(request)
         end
 
-        def signing_key_pair
-          super || @response_builder.signing_key_pair
+        def build
+          Saml::Kit::Assertion.new(to_xml, configuration: configuration)
         end
 
         private
lib/saml/kit/builders/response.rb
@@ -8,7 +8,7 @@ module Saml
       class Response
         include XmlTemplatable
         attr_reader :user, :request
-        attr_accessor :id, :reference_id, :now
+        attr_accessor :id, :now
         attr_accessor :version, :status_code, :status_message
         attr_accessor :issuer, :destination
         attr_reader :configuration
@@ -19,7 +19,6 @@ module Saml
           @user = user
           @request = request
           @id = ::Xml::Kit::Id.generate
-          @reference_id = ::Xml::Kit::Id.generate
           @now = Time.now.utc
           @version = '2.0'
           @status_code = Namespaces::SUCCESS
@@ -47,7 +46,14 @@ module Saml
           @assertion ||=
             begin
               assertion = Saml::Kit::Builders::Assertion.new(
-                self, embed_signature
+                user,
+                request,
+                embed_signature,
+                configuration: configuration,
+                now: now,
+                destination: destination,
+                signing_key_pair: signing_key_pair,
+                issuer: issuer
               )
               if encrypt
                 Saml::Kit::Builders::EncryptedAssertion.new(self, assertion)
spec/saml/kit/builders/assertion_builder_spec.rb
@@ -0,0 +1,23 @@
+require 'spec_helper'
+
+RSpec.describe Saml::Kit::Builders::Assertion do
+  describe "#build" do
+    let(:email) { FFaker::Internet.email }
+    let(:assertion_consumer_service_url) { FFaker::Internet.uri('https') }
+    let(:user) { User.new(attributes: { email: email, created_at: Time.now.utc.iso8601 }) }
+    let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: Xml::Kit::Id.generate, assertion_consumer_service_url: assertion_consumer_service_url, issuer: issuer, name_id_format: Saml::Kit::Namespaces::EMAIL_ADDRESS, provider: provider, trusted?: true, signed?: true) }
+    let(:provider) { instance_double(Saml::Kit::ServiceProviderMetadata, want_assertions_signed: false, encryption_certificates: [configuration.certificates(use: :encryption).last]) }
+    let(:issuer) { FFaker::Internet.uri('https') }
+    let(:configuration) do
+      Saml::Kit::Configuration.new do |config|
+        config.entity_id = issuer
+        config.generate_key_pair_for(use: :signing)
+        config.generate_key_pair_for(use: :encryption)
+      end
+    end
+
+    subject { described_class.new(user, request, configuration: configuration) }
+
+    specify { expect(subject.build).to be_valid }
+  end
+end