Commit 9211bd4
Changed files (11)
lib
saml
lib/saml/kit/builders/authentication_request.rb
@@ -2,7 +2,7 @@ module Saml
module Kit
module Builders
class AuthenticationRequest
- attr_accessor :id, :now, :issuer, :acs_url, :name_id_format, :sign, :destination
+ attr_accessor :id, :now, :issuer, :assertion_consumer_service_url, :name_id_format, :sign, :destination
attr_accessor :version
def initialize(configuration: Saml::Kit.configuration, sign: true)
@@ -39,7 +39,7 @@ module Saml
IssueInstant: now.utc.iso8601,
Destination: destination,
}
- options[:AssertionConsumerServiceURL] = acs_url if acs_url.present?
+ options[:AssertionConsumerServiceURL] = assertion_consumer_service_url if assertion_consumer_service_url.present?
options
end
end
lib/saml/kit/builders/response.rb
@@ -123,7 +123,7 @@ module Saml
def destination_for(request)
if request.signed? && request.trusted?
- request.acs_url || request.provider.assertion_consumer_service_for(binding: :http_post).try(:location)
+ request.assertion_consumer_service_url || request.provider.assertion_consumer_service_for(binding: :http_post).try(:location)
else
request.provider.assertion_consumer_service_for(binding: :http_post).try(:location)
end
@@ -158,7 +158,7 @@ module Saml
{
InResponseTo: request.id,
NotOnOrAfter: 3.hours.since(now).utc.iso8601,
- Recipient: request.acs_url,
+ Recipient: request.assertion_consumer_service_url,
}
end
lib/saml/kit/authentication_request.rb
@@ -7,7 +7,7 @@ module Saml
super(xml, name: "AuthnRequest")
end
- def acs_url
+ def assertion_consumer_service_url
to_h[name]['AssertionConsumerServiceURL']
end
spec/saml/bindings/http_post_spec.rb
@@ -76,7 +76,7 @@ RSpec.describe Saml::Kit::Bindings::HttpPost do
it 'deserializes to a Response' do
user = double(:user, name_id_for: SecureRandom.uuid, assertion_attributes_for: [])
- request = double(:request, id: SecureRandom.uuid, provider: nil, acs_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, issuer: FFaker::Internet.http_url, signed?: true, trusted?: true)
+ request = double(:request, id: SecureRandom.uuid, provider: nil, assertion_consumer_service_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, issuer: FFaker::Internet.http_url, signed?: true, trusted?: true)
builder = Saml::Kit::Response.builder_class.new(user, request)
_, params = subject.serialize(builder)
result = subject.deserialize(params)
spec/saml/bindings/http_redirect_spec.rb
@@ -47,7 +47,7 @@ RSpec.describe Saml::Kit::Bindings::HttpRedirect do
it 'deserializes the SAMLResponse to a Response' do
user = double(:user, name_id_for: SecureRandom.uuid, assertion_attributes_for: [])
- request = double(:request, id: SecureRandom.uuid, provider: nil, acs_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, issuer: issuer, signed?: true, trusted?: true)
+ request = double(:request, id: SecureRandom.uuid, provider: nil, assertion_consumer_service_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, issuer: issuer, signed?: true, trusted?: true)
url, _ = subject.serialize(Saml::Kit::Response.builder_class.new(user, request))
result = subject.deserialize(query_params_from(url))
expect(result).to be_instance_of(Saml::Kit::Response)
@@ -55,7 +55,7 @@ RSpec.describe Saml::Kit::Bindings::HttpRedirect do
it 'deserializes the SAMLResponse to a LogoutResponse' do
user = double(:user, name_id_for: SecureRandom.uuid, assertion_attributes_for: [])
- request = double(:request, id: SecureRandom.uuid, provider: provider, acs_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, issuer: FFaker::Internet.http_url)
+ request = double(:request, id: SecureRandom.uuid, provider: provider, assertion_consumer_service_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, issuer: FFaker::Internet.http_url)
url, _ = subject.serialize(Saml::Kit::LogoutResponse.builder_class.new(user, request))
result = subject.deserialize(query_params_from(url))
expect(result).to be_instance_of(Saml::Kit::LogoutResponse)
spec/saml/builders/authentication_request_spec.rb
@@ -10,17 +10,17 @@ RSpec.describe Saml::Kit::Builders::AuthenticationRequest do
describe "#to_xml" do
let(:issuer) { FFaker::Movie.title }
- let(:acs_url) { "https://airport.dev/session/acs" }
+ let(:assertion_consumer_service_url) { "https://airport.dev/session/acs" }
it 'returns a valid authentication request' do
travel_to 1.second.from_now
- subject.acs_url = acs_url
+ subject.assertion_consumer_service_url = assertion_consumer_service_url
result = Hash.from_xml(subject.to_xml)
expect(result['AuthnRequest']['ID']).to be_present
expect(result['AuthnRequest']['Version']).to eql('2.0')
expect(result['AuthnRequest']['IssueInstant']).to eql(Time.now.utc.iso8601)
- expect(result['AuthnRequest']['AssertionConsumerServiceURL']).to eql(acs_url)
+ expect(result['AuthnRequest']['AssertionConsumerServiceURL']).to eql(assertion_consumer_service_url)
expect(result['AuthnRequest']['Issuer']).to eql(issuer)
expect(result['AuthnRequest']['NameIDPolicy']['Format']).to eql(Saml::Kit::Namespaces::PERSISTENT)
end
spec/saml/builders/response_spec.rb
@@ -3,9 +3,9 @@ require 'spec_helper'
RSpec.describe Saml::Kit::Builders::Response do
subject { described_class.new(user, request) }
let(:email) { FFaker::Internet.email }
- let(:acs_url) { FFaker::Internet.uri("https") }
+ let(:assertion_consumer_service_url) { FFaker::Internet.uri("https") }
let(:user) { double(:user, name_id_for: SecureRandom.uuid, assertion_attributes_for: { email: email, created_at: Time.now.utc.iso8601 }) }
- let(:request) { double(:request, id: "_#{SecureRandom.uuid}", acs_url: acs_url, issuer: issuer, name_id_format: Saml::Kit::Namespaces::EMAIL_ADDRESS, provider: provider, trusted?: true, signed?: true) }
+ let(:request) { double(:request, id: "_#{SecureRandom.uuid}", 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) { double(want_assertions_signed: false, encryption_certificates: [Saml::Kit::Certificate.new(encryption_pem, use: :encryption)]) }
let(:encryption_pem) { Saml::Kit.configuration.stripped_encryption_certificate }
let(:issuer) { FFaker::Internet.uri("https") }
@@ -39,7 +39,7 @@ RSpec.describe Saml::Kit::Builders::Response do
expect(hash['Response']['ID']).to be_present
expect(hash['Response']['Version']).to eql('2.0')
expect(hash['Response']['IssueInstant']).to eql(Time.now.utc.iso8601)
- expect(hash['Response']['Destination']).to eql(acs_url)
+ expect(hash['Response']['Destination']).to eql(assertion_consumer_service_url)
expect(hash['Response']['InResponseTo']).to eql(request.id)
expect(hash['Response']['Issuer']).to eql(issuer)
expect(hash['Response']['Status']['StatusCode']['Value']).to eql("urn:oasis:names:tc:SAML:2.0:status:Success")
@@ -52,7 +52,7 @@ RSpec.describe Saml::Kit::Builders::Response do
expect(hash['Response']['Assertion']['Subject']['NameID']).to eql(user.name_id_for)
expect(hash['Response']['Assertion']['Subject']['SubjectConfirmation']['Method']).to eql("urn:oasis:names:tc:SAML:2.0:cm:bearer")
expect(hash['Response']['Assertion']['Subject']['SubjectConfirmation']['SubjectConfirmationData']['NotOnOrAfter']).to eql(3.hours.from_now.utc.iso8601)
- expect(hash['Response']['Assertion']['Subject']['SubjectConfirmation']['SubjectConfirmationData']['Recipient']).to eql(acs_url)
+ expect(hash['Response']['Assertion']['Subject']['SubjectConfirmation']['SubjectConfirmationData']['Recipient']).to eql(assertion_consumer_service_url)
expect(hash['Response']['Assertion']['Subject']['SubjectConfirmation']['SubjectConfirmationData']['InResponseTo']).to eql(request.id)
expect(hash['Response']['Assertion']['Conditions']['NotBefore']).to eql(0.seconds.ago.utc.iso8601)
@@ -106,21 +106,21 @@ RSpec.describe Saml::Kit::Builders::Response do
end
describe "#destination" do
- let(:acs_url) { "https://#{FFaker::Internet.domain_name}/acs" }
+ let(:assertion_consumer_service_url) { "https://#{FFaker::Internet.domain_name}/acs" }
let(:user) { double(:user, name_id_for: SecureRandom.uuid, assertion_attributes_for: []) }
subject { described_class.new(user, request).build }
describe "when the request is signed and trusted" do
- let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: SecureRandom.uuid, acs_url: acs_url, issuer: FFaker::Movie.title, name_id_format: Saml::Kit::Namespaces::EMAIL_ADDRESS, provider: nil, signed?: true, trusted?: true) }
+ let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: SecureRandom.uuid, assertion_consumer_service_url: assertion_consumer_service_url, issuer: FFaker::Movie.title, name_id_format: Saml::Kit::Namespaces::EMAIL_ADDRESS, provider: nil, signed?: true, trusted?: true) }
it 'returns the ACS embedded in the request' do
- expect(subject.destination).to eql(acs_url)
+ expect(subject.destination).to eql(assertion_consumer_service_url)
end
end
describe "when the request is not trusted" do
let(:registered_acs_url) { FFaker::Internet.uri("https") }
- let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: SecureRandom.uuid, acs_url: acs_url, issuer: FFaker::Movie.title, name_id_format: Saml::Kit::Namespaces::EMAIL_ADDRESS, provider: provider, signed?: true, trusted?: false) }
+ let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: SecureRandom.uuid, assertion_consumer_service_url: assertion_consumer_service_url, issuer: FFaker::Movie.title, name_id_format: Saml::Kit::Namespaces::EMAIL_ADDRESS, provider: provider, signed?: true, trusted?: false) }
let(:provider) { instance_double(Saml::Kit::ServiceProviderMetadata, want_assertions_signed: false) }
it 'returns the registered ACS embedded in the metadata' do
spec/saml/builders/service_provider_metadata_spec.rb
@@ -1,12 +1,12 @@
require 'spec_helper'
RSpec.describe Saml::Kit::Builders::ServiceProviderMetadata do
- let(:acs_url) { FFaker::Internet.http_url }
+ let(:assertion_consumer_service_url) { FFaker::Internet.http_url }
let(:entity_id) { FFaker::Internet.uri("https") }
it 'builds the service provider metadata' do
subject.entity_id = entity_id
- subject.add_assertion_consumer_service(acs_url, binding: :http_post)
+ subject.add_assertion_consumer_service(assertion_consumer_service_url, binding: :http_post)
subject.name_id_formats = [
Saml::Kit::Namespaces::PERSISTENT,
Saml::Kit::Namespaces::TRANSIENT,
@@ -26,7 +26,7 @@ RSpec.describe Saml::Kit::Builders::ServiceProviderMetadata do
Saml::Kit::Namespaces::EMAIL_ADDRESS,
])
expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['Binding']).to eql("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST")
- expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['Location']).to eql(acs_url)
+ expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['Location']).to eql(assertion_consumer_service_url)
expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['isDefault']).to eql('true')
expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['index']).to eql('0')
expect(result['EntityDescriptor']['Signature']).to be_present
spec/saml/authentication_request_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
RSpec.describe Saml::Kit::AuthenticationRequest do
subject { described_class.new(raw_xml) }
let(:id) { SecureRandom.uuid }
- let(:acs_url) { "https://#{FFaker::Internet.domain_name}/acs" }
+ let(:assertion_consumer_service_url) { "https://#{FFaker::Internet.domain_name}/acs" }
let(:issuer) { FFaker::Movie.title }
let(:destination) { FFaker::Internet.http_url }
let(:name_id_format) { Saml::Kit::Namespaces::EMAIL_ADDRESS }
@@ -12,7 +12,7 @@ RSpec.describe Saml::Kit::AuthenticationRequest do
builder.id = id
builder.now = Time.now.utc
builder.issuer = issuer
- builder.acs_url = acs_url
+ builder.assertion_consumer_service_url = assertion_consumer_service_url
builder.name_id_format = name_id_format
builder.destination = destination
end.to_xml
@@ -20,7 +20,7 @@ RSpec.describe Saml::Kit::AuthenticationRequest do
it { expect(subject.issuer).to eql(issuer) }
it { expect(subject.id).to eql("_#{id}") }
- it { expect(subject.acs_url).to eql(acs_url) }
+ it { expect(subject.assertion_consumer_service_url).to eql(assertion_consumer_service_url) }
it { expect(subject.name_id_format).to eql(name_id_format) }
it { expect(subject.destination).to eql(destination) }
@@ -62,7 +62,7 @@ RSpec.describe Saml::Kit::AuthenticationRequest do
allow(metadata).to receive(:matches?).and_return(false)
subject = described_class.build do |builder|
builder.issuer = issuer
- builder.acs_url = acs_url
+ builder.assertion_consumer_service_url = assertion_consumer_service_url
end
expect(subject).to be_invalid
@@ -79,7 +79,7 @@ RSpec.describe Saml::Kit::AuthenticationRequest do
it 'validates the schema of the request' do
id = SecureRandom.uuid
signed_xml = Saml::Kit::Signature.sign(sign: true) do |xml, signature|
- xml.tag!('samlp:AuthnRequest', "xmlns:samlp" => Saml::Kit::Namespaces::PROTOCOL, AssertionConsumerServiceURL: acs_url, ID: "_#{id}") do
+ xml.tag!('samlp:AuthnRequest', "xmlns:samlp" => Saml::Kit::Namespaces::PROTOCOL, AssertionConsumerServiceURL: assertion_consumer_service_url, ID: "_#{id}") do
signature.template(id)
xml.Fake do
xml.NotAllowed "Huh?"
@@ -92,7 +92,7 @@ RSpec.describe Saml::Kit::AuthenticationRequest do
it 'validates a request without a signature' do
now = Time.now.utc
raw_xml = <<-XML
-<samlp:AuthnRequest AssertionConsumerServiceURL='#{acs_url}' ID='_#{SecureRandom.uuid}' IssueInstant='#{now.iso8601}' Version='2.0' xmlns:saml='#{Saml::Kit::Namespaces::ASSERTION}' xmlns:samlp='#{Saml::Kit::Namespaces::PROTOCOL}'>
+<samlp:AuthnRequest AssertionConsumerServiceURL='#{assertion_consumer_service_url}' ID='_#{SecureRandom.uuid}' IssueInstant='#{now.iso8601}' Version='2.0' xmlns:saml='#{Saml::Kit::Namespaces::ASSERTION}' xmlns:samlp='#{Saml::Kit::Namespaces::PROTOCOL}'>
<saml:Issuer>#{issuer}</saml:Issuer>
<samlp:NameIDPolicy AllowCreate='true' Format='#{Saml::Kit::Namespaces::EMAIL_ADDRESS}'/>
</samlp:AuthnRequest>
@@ -104,23 +104,23 @@ XML
end
end
- describe "#acs_url" do
+ describe "#assertion_consumer_service_url" do
let(:registry) { instance_double(Saml::Kit::DefaultRegistry) }
let(:metadata) { instance_double(Saml::Kit::ServiceProviderMetadata) }
it 'returns the ACS in the request' do
subject = described_class.build do |builder|
- builder.acs_url = acs_url
+ builder.assertion_consumer_service_url = assertion_consumer_service_url
end
- expect(subject.acs_url).to eql(acs_url)
+ expect(subject.assertion_consumer_service_url).to eql(assertion_consumer_service_url)
end
it 'returns nil' do
subject = described_class.build do |builder|
- builder.acs_url = nil
+ builder.assertion_consumer_service_url = nil
end
- expect(subject.acs_url).to be_nil
+ expect(subject.assertion_consumer_service_url).to be_nil
end
end
@@ -131,12 +131,12 @@ XML
it 'provides a nice API for building metadata' do
result = described_class.build do |builder|
builder.issuer = entity_id
- builder.acs_url = url
+ builder.assertion_consumer_service_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)
+ expect(result.assertion_consumer_service_url).to eql(url)
end
end
end
spec/saml/response_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
RSpec.describe Saml::Kit::Response do
describe "#valid?" do
- let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: "_#{SecureRandom.uuid}", issuer: FFaker::Internet.http_url, acs_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, provider: nil, signed?: true, trusted?: true) }
+ let(:request) { instance_double(Saml::Kit::AuthenticationRequest, id: "_#{SecureRandom.uuid}", issuer: FFaker::Internet.http_url, assertion_consumer_service_url: FFaker::Internet.http_url, name_id_format: Saml::Kit::Namespaces::PERSISTENT, provider: nil, signed?: true, trusted?: true) }
let(:user) { double(:user, name_id_for: SecureRandom.uuid, assertion_attributes_for: { id: SecureRandom.uuid }) }
let(:registry) { instance_double(Saml::Kit::DefaultRegistry) }
let(:metadata) { instance_double(Saml::Kit::IdentityProviderMetadata) }
@@ -322,7 +322,7 @@ RSpec.describe Saml::Kit::Response do
describe "encrypted assertion" do
let(:id) { SecureRandom.uuid }
let(:now) { Time.now.utc }
- let(:acs_url) { FFaker::Internet.uri("https") }
+ let(:assertion_consumer_service_url) { FFaker::Internet.uri("https") }
let(:password) { FFaker::Movie.title }
let(:assertion) do
FFaker::Movie.title
@@ -371,7 +371,7 @@ XML
encrypted = cipher.update(assertion) + cipher.final
xml = <<-XML
-<samlp:Response xmlns:samlp="#{Saml::Kit::Namespaces::PROTOCOL}" xmlns:saml="#{Saml::Kit::Namespaces::ASSERTION}" ID="_#{id}" Version="2.0" IssueInstant="#{now.iso8601}" Destination="#{acs_url}" InResponseTo="_#{SecureRandom.uuid}">
+<samlp:Response xmlns:samlp="#{Saml::Kit::Namespaces::PROTOCOL}" xmlns:saml="#{Saml::Kit::Namespaces::ASSERTION}" ID="_#{id}" Version="2.0" IssueInstant="#{now.iso8601}" Destination="#{assertion_consumer_service_url}" InResponseTo="_#{SecureRandom.uuid}">
<saml:Issuer>#{FFaker::Internet.uri("https")}</saml:Issuer>
<samlp:Status>
<samlp:StatusCode Value="#{Saml::Kit::Namespaces::SUCCESS}"/>
spec/saml/service_provider_metadata_spec.rb
@@ -129,17 +129,17 @@ RSpec.describe Saml::Kit::ServiceProviderMetadata do
end
describe ".build" do
- let(:acs_url) { FFaker::Internet.uri("https") }
+ let(:assertion_consumer_service_url) { FFaker::Internet.uri("https") }
it 'provides a nice API for building metadata' do
result = described_class.build do |builder|
builder.entity_id = entity_id
- builder.add_assertion_consumer_service(acs_url, binding: :http_post)
+ builder.add_assertion_consumer_service(assertion_consumer_service_url, binding: :http_post)
end
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)
+ expect(result.assertion_consumer_service_for(binding: :http_post).location).to eql(assertion_consumer_service_url)
end
end