Commit b667cc2
Changed files (7)
lib/saml/kit/buildable.rb
@@ -0,0 +1,16 @@
+module Saml
+ module Kit
+ module Buildable
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def build
+ puts builder_class.inspect
+ builder = builder_class.new
+ yield builder
+ builder.build
+ end
+ end
+ end
+ end
+end
lib/saml/kit/document.rb
@@ -5,6 +5,7 @@ module Saml
include XsdValidatable
include ActiveModel::Validations
include Trustable
+ include Buildable
validates_presence_of :content
validates_presence_of :id
validate :must_match_xsd
@@ -76,6 +77,21 @@ module Saml
Saml::Kit.logger.error(error)
InvalidDocument.new(xml)
end
+
+ def builder_class
+ case name
+ when Saml::Kit::Builders::Response.to_s
+ Saml::Kit::Builders::Response
+ when Saml::Kit::Builders::LogoutResponse.to_s
+ Saml::Kit::Builders::LogoutResponse
+ when Saml::Kit::AuthenticationRequest.to_s
+ Saml::Kit::Builders::AuthenticationRequest
+ when Saml::Kit::Builders::LogoutRequest.to_s
+ Saml::Kit::Builders::LogoutRequest
+ else
+ raise ArgumentError.new("Unknown SAML Document")
+ end
+ end
end
private
lib/saml/kit/metadata.rb
@@ -3,6 +3,7 @@ module Saml
class Metadata
include ActiveModel::Validations
include XsdValidatable
+ include Buildable
METADATA_XSD = File.expand_path("./xsd/saml-schema-metadata-2.0.xsd", File.dirname(__FILE__)).freeze
validates_presence_of :metadata
@@ -97,12 +98,6 @@ module Saml
end
end
- def self.build
- builder = builder_class.new
- yield builder
- builder.build
- end
-
private
def document
lib/saml/kit.rb
@@ -13,6 +13,7 @@ require "nokogiri"
require "securerandom"
require "xmldsig"
+require "saml/kit/buildable"
require "saml/kit/namespaces"
require "saml/kit/serializable"
require "saml/kit/xsd_validatable"
spec/saml/authentication_request_spec.rb
@@ -149,4 +149,20 @@ XML
expect(subject.acs_url).to be_nil
end
end
+
+ describe ".build" do
+ let(:url) { FFaker::Internet.uri("https") }
+ let(:entity_id) { FFaker::Internet.uri("https") }
+
+ it 'provides a nice API for building metadata' do
+ result = described_class.build do |builder|
+ builder.issuer = entity_id
+ builder.acs_url = url
+ end
+
+ expect(result).to be_instance_of(described_class)
+ expect(result.issuer).to eql(entity_id)
+ expect(result.acs_url).to eql(url)
+ end
+ end
end
spec/saml/identity_provider_metadata_spec.rb
@@ -198,7 +198,7 @@ RSpec.describe Saml::Kit::IdentityProviderMetadata do
builder.add_single_sign_on_service(url, binding: :http_post)
end
- expect(result).to be_instance_of(Saml::Kit::IdentityProviderMetadata)
+ expect(result).to be_instance_of(described_class)
expect(result.entity_id).to eql(entity_id)
expect(result.single_sign_on_service_for(binding: :http_post).location).to eql(url)
end
spec/saml/service_provider_metadata_spec.rb
@@ -137,7 +137,7 @@ RSpec.describe Saml::Kit::ServiceProviderMetadata do
builder.add_assertion_consumer_service(acs_url, binding: :http_post)
end
- expect(result).to be_instance_of(Saml::Kit::ServiceProviderMetadata)
+ expect(result).to be_instance_of(described_class)
expect(result.entity_id).to eql(entity_id)
expect(result.assertion_consumer_service_for(binding: :http_post).location).to eql(acs_url)
end