Skip to content

Commit e9c7f97

Browse files
Remove the deprecated settings.security[:embed_sign] parameter. It can be migrated to idp_sso/slo_service_binding. (#690)
1 parent 38d41fe commit e9c7f97

File tree

8 files changed

+24
-200
lines changed

8 files changed

+24
-200
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* [#685](https://github.com/SAML-Toolkits/ruby-saml/pull/685) Move schema files from `lib/onelogin/schemas` to `lib/ruby_saml/schemas`.
88
* [#692](https://github.com/SAML-Toolkits/ruby-saml/pull/692) Remove `XMLSecurity` namespace and replace with `RubySaml::XML`.
99
* [#686](https://github.com/SAML-Toolkits/ruby-saml/pull/686) Use SHA-256 as the default hashing algorithm everywhere instead of SHA-1, including signatures, fingerprints, and digests.
10+
* [#690](https://github.com/SAML-Toolkits/ruby-saml/pull/690) Remove deprecated `settings.security[:embed_sign]` parameter.
1011

1112
### 1.17.0
1213
* [#673](https://github.com/SAML-Toolkits/ruby-saml/pull/673) Add `Settings#sp_cert_multi` paramter to facilitate SP certificate and key rotation.

UPGRADING.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Updating from 1.17.x to 2.0.0
44

5+
**IMPORTANT: Please read this section carefully as it contains breaking changes!**
6+
57
### Before upgrading
68

79
Before attempting to upgrade to `2.0.0`:
@@ -48,6 +50,24 @@ settings.security[:digest_method] = RubySaml::XML::Document::SHA1
4850
settings.security[:signature_method] = RubySaml::XML::Document::RSA_SHA1
4951
```
5052

53+
### Removal of embed_sign Setting
54+
55+
The deprecated `settings.security[:embed_sign]` parameter has been removed. If you were using it, please instead switch
56+
to using both the `settings.idp_sso_service_binding` and `settings.idp_slo_service_binding` parameters as show below.
57+
(This new syntax is supported on version 1.13.0 and later.)
58+
59+
```ruby
60+
# Replace settings.security[:embed_sign] = true with
61+
settings.idp_sso_service_binding = :post
62+
settings.idp_slo_service_binding = :post
63+
64+
# Replace settings.security[:embed_sign] = false with
65+
settings.idp_sso_service_binding = :redirect
66+
settings.idp_slo_service_binding = :redirect
67+
```
68+
69+
For clarity, the default value of both parameters is `:redirect` if they are not set.
70+
5171
## Updating from 1.12.x to 1.13.0
5272

5373
Version `1.13.0` adds `settings.idp_sso_service_binding` and `settings.idp_slo_service_binding`, and

lib/ruby_saml/settings.rb

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def idp_slo_service_url
9393
# @return [String] IdP Single Sign On Service Binding
9494
#
9595
def idp_sso_service_binding
96-
@idp_sso_service_binding || idp_binding_from_embed_sign
96+
@idp_sso_service_binding || Utils::BINDINGS[:redirect]
9797
end
9898

9999
# Setter for IdP Single Sign On Service Binding
@@ -106,7 +106,7 @@ def idp_sso_service_binding=(value)
106106
# @return [String] IdP Single Logout Service Binding
107107
#
108108
def idp_slo_service_binding
109-
@idp_slo_service_binding || idp_binding_from_embed_sign
109+
@idp_slo_service_binding || Utils::BINDINGS[:redirect]
110110
end
111111

112112
# Setter for IdP Single Logout Service Binding
@@ -264,10 +264,6 @@ def get_sp_cert_new
264264
node[0] if node
265265
end
266266

267-
def idp_binding_from_embed_sign
268-
security[:embed_sign] ? Utils::BINDINGS[:post] : Utils::BINDINGS[:redirect]
269-
end
270-
271267
def get_binding(value)
272268
return unless value
273269

@@ -291,7 +287,6 @@ def get_binding(value)
291287
want_assertions_encrypted: false,
292288
want_name_id: false,
293289
metadata_signed: false,
294-
embed_sign: false, # Deprecated
295290
digest_method: RubySaml::XML::Document::SHA256,
296291
signature_method: RubySaml::XML::Document::RSA_SHA256,
297292
check_idp_cert_expiration: false,

test/idp_metadata_parser_test.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -654,8 +654,8 @@ def initialize; end
654654
assert_equal("https://app.onelogin.com/saml/metadata/383123", @settings.idp_entity_id)
655655
assert_equal("urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", @settings.name_identifier_format)
656656
assert_equal("https://app.onelogin.com/trust/saml2/http-post/sso/383123", @settings.idp_sso_service_url)
657+
assert_equal("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect", @settings.idp_sso_service_binding)
657658
assert_nil(@settings.idp_slo_service_url)
658-
# TODO: next line can be changed to `assert_nil @settings.idp_slo_service_binding` after :embed_sign is removed.
659659
assert_nil(@settings.instance_variable_get('@idp_slo_service_binding'))
660660
end
661661
end
@@ -726,7 +726,6 @@ def initialize; end
726726
assert_equal "https://app.onelogin.com/trust/saml2/http-post/sso/383123", @settings.idp_sso_service_url
727727
assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect", @settings.idp_sso_service_binding
728728
assert_nil @settings.idp_slo_service_url
729-
# TODO: next line can be changed to `assert_nil @settings.idp_slo_service_binding` after :embed_sign is removed.
730729
assert_nil @settings.instance_variable_get('@idp_slo_service_binding')
731730
end
732731
end

test/logoutrequest_test.rb

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -362,59 +362,6 @@ class RequestTest < Minitest::Test
362362
end
363363
end
364364

365-
describe "DEPRECATED: signing with HTTP-POST binding via :embed_sign" do
366-
367-
before do
368-
# sign the logout request
369-
settings.security[:logout_requests_signed] = true
370-
settings.security[:embed_sign] = true
371-
settings.certificate = ruby_saml_cert_text
372-
settings.private_key = ruby_saml_key_text
373-
end
374-
375-
it "created a signed logout request" do
376-
settings.compress_request = true
377-
378-
unauth_req = RubySaml::Logoutrequest.new
379-
unauth_url = unauth_req.create(settings)
380-
381-
inflated = decode_saml_request_payload(unauth_url)
382-
assert_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>], inflated
383-
assert_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'/>], inflated
384-
assert_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2001/04/xmlenc#sha256'/>], inflated
385-
end
386-
end
387-
388-
describe "DEPRECATED: signing with HTTP-Redirect binding via :embed_sign" do
389-
390-
let(:cert) { OpenSSL::X509::Certificate.new(ruby_saml_cert_text) }
391-
392-
before do
393-
settings.security[:logout_requests_signed] = true
394-
settings.security[:embed_sign] = false
395-
settings.certificate = ruby_saml_cert_text
396-
settings.private_key = ruby_saml_key_text
397-
end
398-
399-
it "create a signature parameter with RSA_SHA1 / SHA1 and validate it" do
400-
settings.security[:signature_method] = RubySaml::XML::Document::RSA_SHA1
401-
402-
params = RubySaml::Logoutrequest.new.create_params(settings, :RelayState => 'http://example.com')
403-
assert params['SAMLRequest']
404-
assert params[:RelayState]
405-
assert params['Signature']
406-
assert_equal params['SigAlg'], RubySaml::XML::Document::RSA_SHA1
407-
408-
query_string = "SAMLRequest=#{CGI.escape(params['SAMLRequest'])}"
409-
query_string << "&RelayState=#{CGI.escape(params[:RelayState])}"
410-
query_string << "&SigAlg=#{CGI.escape(params['SigAlg'])}"
411-
412-
signature_algorithm = RubySaml::XML::BaseDocument.new.algorithm(params['SigAlg'])
413-
assert_equal signature_algorithm, OpenSSL::Digest::SHA1
414-
assert cert.public_key.verify(signature_algorithm.new, Base64.decode64(params['Signature']), query_string)
415-
end
416-
end
417-
418365
describe "#manipulate request_id" do
419366
it "be able to modify the request id" do
420367
logoutrequest = RubySaml::Logoutrequest.new

test/request_test.rb

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -430,57 +430,6 @@ class RequestTest < Minitest::Test
430430
assert auth_doc.to_s =~ /<saml:AuthnContextDeclRef>example\/decl\/ref<\/saml:AuthnContextDeclRef>/
431431
end
432432

433-
describe "DEPRECATED: #create_params signing with HTTP-POST binding via :embed_sign" do
434-
before do
435-
settings.compress_request = false
436-
settings.idp_sso_service_url = "http://example.com?field=value"
437-
settings.security[:authn_requests_signed] = true
438-
settings.security[:embed_sign] = true
439-
settings.certificate = ruby_saml_cert_text
440-
settings.private_key = ruby_saml_key_text
441-
end
442-
443-
it "create a signed request" do
444-
params = RubySaml::Authrequest.new.create_params(settings)
445-
request_xml = Base64.decode64(params["SAMLRequest"])
446-
assert_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>], request_xml
447-
assert_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'/>], request_xml
448-
end
449-
end
450-
451-
describe "DEPRECATED: #create_params signing with HTTP-Redirect binding via :embed_sign" do
452-
let(:cert) { OpenSSL::X509::Certificate.new(ruby_saml_cert_text) }
453-
454-
before do
455-
settings.compress_request = false
456-
settings.idp_sso_service_url = "http://example.com?field=value"
457-
settings.assertion_consumer_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
458-
settings.security[:authn_requests_signed] = true
459-
settings.security[:embed_sign] = false
460-
settings.certificate = ruby_saml_cert_text
461-
settings.private_key = ruby_saml_key_text
462-
end
463-
464-
it "create a signature parameter with RSA_SHA1 and validate it" do
465-
settings.security[:signature_method] = RubySaml::XML::Document::RSA_SHA1
466-
467-
params = RubySaml::Authrequest.new.create_params(settings, :RelayState => 'http://example.com')
468-
assert params['SAMLRequest']
469-
assert params[:RelayState]
470-
assert params['Signature']
471-
assert_equal params['SigAlg'], RubySaml::XML::Document::RSA_SHA1
472-
473-
query_string = "SAMLRequest=#{CGI.escape(params['SAMLRequest'])}"
474-
query_string << "&RelayState=#{CGI.escape(params[:RelayState])}"
475-
query_string << "&SigAlg=#{CGI.escape(params['SigAlg'])}"
476-
477-
signature_algorithm = RubySaml::XML::BaseDocument.new.algorithm(params['SigAlg'])
478-
assert_equal signature_algorithm, OpenSSL::Digest::SHA1
479-
480-
assert cert.public_key.verify(signature_algorithm.new, Base64.decode64(params['Signature']), query_string)
481-
end
482-
end
483-
484433
describe "#manipulate request_id" do
485434
it "be able to modify the request id" do
486435
authnrequest = RubySaml::Authrequest.new

test/settings_test.rb

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -55,30 +55,6 @@ class SettingsTest < Minitest::Test
5555
end
5656
end
5757

58-
it "idp_sso/slo_service_binding should fallback to :embed_sign inferred value" do
59-
accessors = [:idp_sso_service_binding, :idp_slo_service_binding]
60-
61-
accessors.each do |accessor|
62-
@settings.security[:embed_sign] = true
63-
64-
value = Kernel.rand.to_s
65-
@settings.send("#{accessor}=".to_sym, value)
66-
assert_equal value, @settings.send(accessor)
67-
68-
@settings.send("#{accessor}=".to_sym, :redirect)
69-
assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect", @settings.send(accessor)
70-
71-
@settings.send("#{accessor}=".to_sym, :post)
72-
assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", @settings.send(accessor)
73-
74-
@settings.send("#{accessor}=".to_sym, nil)
75-
assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", @settings.send(accessor)
76-
77-
@settings.security[:embed_sign] = false
78-
assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect", @settings.send(accessor)
79-
end
80-
end
81-
8258
it "create settings from hash" do
8359
config = {
8460
:assertion_consumer_service_url => "http://app.muda.no/sso",
@@ -117,13 +93,11 @@ class SettingsTest < Minitest::Test
11793
it "does not modify default security settings" do
11894
settings = RubySaml::Settings.new
11995
settings.security[:authn_requests_signed] = true
120-
settings.security[:embed_sign] = true
12196
settings.security[:digest_method] = RubySaml::XML::Document::SHA512
12297
settings.security[:signature_method] = RubySaml::XML::Document::RSA_SHA512
12398

12499
new_settings = RubySaml::Settings.new
125100
assert_equal new_settings.security[:authn_requests_signed], false
126-
assert_equal new_settings.security[:embed_sign], false
127101
assert_equal new_settings.security[:digest_method], RubySaml::XML::Document::SHA256
128102
assert_equal new_settings.security[:signature_method], RubySaml::XML::Document::RSA_SHA256
129103
end

test/slo_logoutresponse_test.rb

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -347,67 +347,6 @@ class SloLogoutresponseTest < Minitest::Test
347347
end
348348
end
349349

350-
describe "DEPRECATED: signing with HTTP-POST binding via :embed_sign" do
351-
before do
352-
settings.compress_response = false
353-
settings.security[:logout_responses_signed] = true
354-
settings.security[:embed_sign] = true
355-
end
356-
357-
it "doesn't sign through create_xml_document" do
358-
unauth_res = RubySaml::SloLogoutresponse.new
359-
inflated = unauth_res.create_xml_document(settings).to_s
360-
361-
refute_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>], inflated
362-
refute_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'/>], inflated
363-
refute_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2001/04/xmlenc#sha256'/>], inflated
364-
end
365-
366-
it "sign unsigned request" do
367-
unauth_res = RubySaml::SloLogoutresponse.new
368-
unauth_res_doc = unauth_res.create_xml_document(settings)
369-
inflated = unauth_res_doc.to_s
370-
371-
refute_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>], inflated
372-
refute_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'/>], inflated
373-
refute_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2001/04/xmlenc#sha256'/>], inflated
374-
375-
inflated = unauth_res.sign_document(unauth_res_doc, settings).to_s
376-
377-
assert_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>], inflated
378-
assert_match %r[<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'/>], inflated
379-
assert_match %r[<ds:DigestMethod Algorithm='http://www.w3.org/2001/04/xmlenc#sha256'/>], inflated
380-
end
381-
end
382-
383-
describe "DEPRECATED: signing with HTTP-Redirect binding via :embed_sign" do
384-
let(:cert) { OpenSSL::X509::Certificate.new(ruby_saml_cert_text) }
385-
386-
before do
387-
settings.compress_response = false
388-
settings.security[:logout_responses_signed] = true
389-
settings.security[:embed_sign] = false
390-
end
391-
392-
it "create a signature parameter with RSA_SHA1 and validate it" do
393-
settings.security[:signature_method] = RubySaml::XML::Document::RSA_SHA1
394-
395-
params = RubySaml::SloLogoutresponse.new.create_params(settings, logout_request.id, "Custom Logout Message", :RelayState => 'http://example.com')
396-
assert params['SAMLResponse']
397-
assert params[:RelayState]
398-
assert params['Signature']
399-
assert_equal params['SigAlg'], RubySaml::XML::Document::RSA_SHA1
400-
401-
query_string = "SAMLResponse=#{CGI.escape(params['SAMLResponse'])}"
402-
query_string << "&RelayState=#{CGI.escape(params[:RelayState])}"
403-
query_string << "&SigAlg=#{CGI.escape(params['SigAlg'])}"
404-
405-
signature_algorithm = RubySaml::XML::BaseDocument.new.algorithm(params['SigAlg'])
406-
assert_equal signature_algorithm, OpenSSL::Digest::SHA1
407-
assert cert.public_key.verify(signature_algorithm.new, Base64.decode64(params['Signature']), query_string)
408-
end
409-
end
410-
411350
describe "#manipulate response_id" do
412351
it "be able to modify the response id" do
413352
logoutresponse = RubySaml::SloLogoutresponse.new

0 commit comments

Comments
 (0)