Skip to content

Commit 93e1e7d

Browse files
author
Dan Woolley
committed
Add settings.protocol_binding attribute with tests. Allows setting of ProtocolBinding attribute in AuthnRequest root node of xml doc.
1 parent 805428c commit 93e1e7d

4 files changed

Lines changed: 29 additions & 10 deletions

File tree

lib/onelogin/ruby-saml/authrequest.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def create(settings, params = {})
3636
def create_authentication_xml_doc(settings)
3737
uuid = "_" + UUID.new.generate
3838
time = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
39-
# Create AuthnRequest root element using REXML
39+
# Create AuthnRequest root element using REXML
4040
request_doc = REXML::Document.new
4141

4242
root = request_doc.add_element "samlp:AuthnRequest", { "xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol" }
@@ -45,6 +45,7 @@ def create_authentication_xml_doc(settings)
4545
root.attributes['Version'] = "2.0"
4646
root.attributes['Destination'] = settings.idp_sso_target_url unless settings.idp_sso_target_url.nil?
4747
root.attributes['IsPassive'] = settings.passive unless settings.passive.nil?
48+
root.attributes['ProtocolBinding'] = settings.protocol_binding unless settings.protocol_binding.nil?
4849

4950
# Conditionally defined elements based on settings
5051
if settings.assertion_consumer_service_url != nil
@@ -55,7 +56,7 @@ def create_authentication_xml_doc(settings)
5556
issuer.text = settings.issuer
5657
end
5758
if settings.name_identifier_format != nil
58-
root.add_element "samlp:NameIDPolicy", {
59+
root.add_element "samlp:NameIDPolicy", {
5960
"xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol",
6061
# Might want to make AllowCreate a setting?
6162
"AllowCreate" => "true",
@@ -64,14 +65,14 @@ def create_authentication_xml_doc(settings)
6465
end
6566

6667
# BUG fix here -- if an authn_context is defined, add the tags with an "exact"
67-
# match required for authentication to succeed. If this is not defined,
68+
# match required for authentication to succeed. If this is not defined,
6869
# the IdP will choose default rules for authentication. (Shibboleth IdP)
6970
if settings.authn_context != nil
70-
requested_context = root.add_element "samlp:RequestedAuthnContext", {
71+
requested_context = root.add_element "samlp:RequestedAuthnContext", {
7172
"xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol",
7273
"Comparison" => "exact",
7374
}
74-
class_ref = requested_context.add_element "saml:AuthnContextClassRef", {
75+
class_ref = requested_context.add_element "saml:AuthnContextClassRef", {
7576
"xmlns:saml" => "urn:oasis:names:tc:SAML:2.0:assertion",
7677
}
7778
class_ref.text = settings.authn_context

lib/onelogin/ruby-saml/settings.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ def initialize(overrides = {})
1818
attr_accessor :compress_request
1919
attr_accessor :double_quote_xml_attribute_values
2020
attr_accessor :passive
21+
attr_accessor :protocol_binding
2122

2223
private
23-
24+
2425
DEFAULTS = {:compress_request => true, :double_quote_xml_attribute_values => false}
2526
end
2627
end

test/request_test.rb

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,23 @@ class RequestTest < Test::Unit::TestCase
6363
assert_match /<samlp:AuthnRequest[^<]* IsPassive='true'/, inflated
6464
end
6565

66+
should "create the SAMLRequest URL parameter with ProtocolBinding" do
67+
settings = Onelogin::Saml::Settings.new
68+
settings.idp_sso_target_url = "http://example.com"
69+
settings.protocol_binding = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
70+
auth_url = Onelogin::Saml::Authrequest.new.create(settings)
71+
assert auth_url =~ /^http:\/\/example\.com\?SAMLRequest=/
72+
payload = CGI.unescape(auth_url.split("=").last)
73+
decoded = Base64.decode64(payload)
74+
75+
zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
76+
inflated = zstream.inflate(decoded)
77+
zstream.finish
78+
zstream.close
79+
80+
assert_match /<samlp:AuthnRequest[^<]* ProtocolBinding='urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'/, inflated
81+
end
82+
6683
should "accept extra parameters" do
6784
settings = Onelogin::Saml::Settings.new
6885
settings.idp_sso_target_url = "http://example.com"
@@ -78,7 +95,7 @@ class RequestTest < Test::Unit::TestCase
7895
should "create the SAMLRequest parameter correctly" do
7996
settings = Onelogin::Saml::Settings.new
8097
settings.idp_sso_target_url = "http://example.com"
81-
98+
8299
auth_url = Onelogin::Saml::Authrequest.new.create(settings)
83100
assert auth_url =~ /^http:\/\/example.com\?SAMLRequest/
84101
end
@@ -88,7 +105,7 @@ class RequestTest < Test::Unit::TestCase
88105
should "create the SAMLRequest parameter correctly" do
89106
settings = Onelogin::Saml::Settings.new
90107
settings.idp_sso_target_url = "http://example.com?field=value"
91-
108+
92109
auth_url = Onelogin::Saml::Authrequest.new.create(settings)
93110
assert auth_url =~ /^http:\/\/example.com\?field=value&SAMLRequest/
94111
end

test/settings_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ class SettingsTest < Test::Unit::TestCase
1111
:assertion_consumer_service_url, :issuer, :sp_name_qualifier,
1212
:idp_sso_target_url, :idp_cert_fingerprint, :name_identifier_format,
1313
:idp_slo_target_url, :name_identifier_value, :sessionindex,
14-
:assertion_consumer_logout_service_url,
15-
:passive
14+
:assertion_consumer_logout_service_url, :passive, :protocol_binding
1615
]
1716

1817
accessors.each do |accessor|
@@ -33,6 +32,7 @@ class SettingsTest < Test::Unit::TestCase
3332
:idp_cert_fingerprint => "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00",
3433
:name_identifier_format => "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
3534
:passive => true,
35+
:protocol_binding => "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
3636
}
3737
@settings = Onelogin::Saml::Settings.new(config)
3838

0 commit comments

Comments
 (0)