Skip to content

Commit 9da1ad4

Browse files
authored
Merge pull request #576 from alxckn/support_idp_cert_multi_with_string_keys
Support idp cert multi with string keys
2 parents ca2acbf + 01c95db commit 9da1ad4

File tree

3 files changed

+58
-9
lines changed

3 files changed

+58
-9
lines changed

lib/onelogin/ruby-saml/settings.rb

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,13 @@ def get_idp_cert_multi
195195

196196
certs = {:signing => [], :encryption => [] }
197197

198-
if idp_cert_multi.key?(:signing) and not idp_cert_multi[:signing].empty?
199-
idp_cert_multi[:signing].each do |idp_cert|
200-
formatted_cert = OneLogin::RubySaml::Utils.format_cert(idp_cert)
201-
certs[:signing].push(OpenSSL::X509::Certificate.new(formatted_cert))
202-
end
203-
end
198+
[:signing, :encryption].each do |type|
199+
certs_for_type = idp_cert_multi[type] || idp_cert_multi[type.to_s]
200+
next if !certs_for_type || certs_for_type.empty?
204201

205-
if idp_cert_multi.key?(:encryption) and not idp_cert_multi[:encryption].empty?
206-
idp_cert_multi[:encryption].each do |idp_cert|
202+
certs_for_type.each do |idp_cert|
207203
formatted_cert = OneLogin::RubySaml::Utils.format_cert(idp_cert)
208-
certs[:encryption].push(OpenSSL::X509::Certificate.new(formatted_cert))
204+
certs[type].push(OpenSSL::X509::Certificate.new(formatted_cert))
209205
end
210206
end
211207

test/response_test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,16 @@ def generate_audience_error(expected, actual)
980980
assert_empty response_valid_signed.errors
981981
end
982982

983+
it "return true when at least a cert on idp_cert_multi is valid and keys are strings" do
984+
settings.idp_cert_multi = {
985+
"signing" => [ruby_saml_cert_text2, ruby_saml_cert_text],
986+
"encryption" => []
987+
}
988+
response_valid_signed.settings = settings
989+
res = response_valid_signed.send(:validate_signature)
990+
assert_empty response_valid_signed.errors
991+
end
992+
983993
it "return false when none cert on idp_cert_multi is valid" do
984994
settings.idp_cert_fingerprint = ruby_saml_cert_fingerprint
985995
settings.idp_cert_multi = {

test/settings_test.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,35 @@ class SettingsTest < Minitest::Test
257257
assert_equal empty_multi, @settings.get_idp_cert_multi
258258
end
259259

260+
it "returns partial hash when contains some values with string keys" do
261+
empty_multi = {
262+
:signing => [],
263+
:encryption => []
264+
}
265+
266+
@settings.idp_cert_multi = {
267+
"signing" => []
268+
}
269+
assert_equal empty_multi, @settings.get_idp_cert_multi
270+
271+
@settings.idp_cert_multi = {
272+
"encryption" => []
273+
}
274+
assert_equal empty_multi, @settings.get_idp_cert_multi
275+
276+
@settings.idp_cert_multi = {
277+
"signing" => [],
278+
"encryption" => []
279+
}
280+
assert_equal empty_multi, @settings.get_idp_cert_multi
281+
282+
@settings.idp_cert_multi = {
283+
"yyy" => [],
284+
"zzz" => []
285+
}
286+
assert_equal empty_multi, @settings.get_idp_cert_multi
287+
end
288+
260289
it "returns the hash with certificates when values were valid" do
261290
certificates = [ruby_saml_cert_text]
262291
@settings.idp_cert_multi = {
@@ -271,6 +300,20 @@ class SettingsTest < Minitest::Test
271300
assert @settings.get_idp_cert_multi[:encryption][0].kind_of? OpenSSL::X509::Certificate
272301
end
273302

303+
it "returns the hash with certificates when values were valid and with string keys" do
304+
certificates = ruby_saml_cert_text
305+
@settings.idp_cert_multi = {
306+
"signing" => [ruby_saml_cert_text],
307+
"encryption" => [ruby_saml_cert_text],
308+
}
309+
310+
assert @settings.get_idp_cert_multi.kind_of? Hash
311+
assert @settings.get_idp_cert_multi[:signing].kind_of? Array
312+
assert @settings.get_idp_cert_multi[:encryption].kind_of? Array
313+
assert @settings.get_idp_cert_multi[:signing][0].kind_of? OpenSSL::X509::Certificate
314+
assert @settings.get_idp_cert_multi[:encryption][0].kind_of? OpenSSL::X509::Certificate
315+
end
316+
274317
it "raises when there is a cert in idp_cert_multi not valid" do
275318
certificate = read_certificate("formatted_certificate")
276319

0 commit comments

Comments
 (0)