ruby-saml 1.11.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ruby-saml might be problematic. Click here for more details.

Files changed (158) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +14 -12
  3. data/README.md +76 -22
  4. data/changelog.md +27 -0
  5. data/lib/onelogin/ruby-saml/attributes.rb +24 -1
  6. data/lib/onelogin/ruby-saml/authrequest.rb +9 -4
  7. data/lib/onelogin/ruby-saml/idp_metadata_parser.rb +62 -24
  8. data/lib/onelogin/ruby-saml/logoutrequest.rb +7 -1
  9. data/lib/onelogin/ruby-saml/logoutresponse.rb +4 -0
  10. data/lib/onelogin/ruby-saml/metadata.rb +9 -1
  11. data/lib/onelogin/ruby-saml/response.rb +38 -16
  12. data/lib/onelogin/ruby-saml/saml_message.rb +6 -0
  13. data/lib/onelogin/ruby-saml/setting_error.rb +6 -0
  14. data/lib/onelogin/ruby-saml/settings.rb +34 -2
  15. data/lib/onelogin/ruby-saml/slo_logoutrequest.rb +4 -0
  16. data/lib/onelogin/ruby-saml/slo_logoutresponse.rb +27 -14
  17. data/lib/onelogin/ruby-saml/utils.rb +56 -0
  18. data/lib/onelogin/ruby-saml/version.rb +1 -1
  19. data/lib/xml_security.rb +34 -6
  20. data/ruby-saml.gemspec +8 -4
  21. metadata +22 -282
  22. data/test/certificates/certificate.der +0 -0
  23. data/test/certificates/certificate1 +0 -12
  24. data/test/certificates/certificate_without_head_foot +0 -1
  25. data/test/certificates/formatted_certificate +0 -14
  26. data/test/certificates/formatted_chained_certificate +0 -42
  27. data/test/certificates/formatted_private_key +0 -12
  28. data/test/certificates/formatted_rsa_private_key +0 -12
  29. data/test/certificates/invalid_certificate1 +0 -1
  30. data/test/certificates/invalid_certificate2 +0 -1
  31. data/test/certificates/invalid_certificate3 +0 -12
  32. data/test/certificates/invalid_chained_certificate1 +0 -1
  33. data/test/certificates/invalid_private_key1 +0 -1
  34. data/test/certificates/invalid_private_key2 +0 -1
  35. data/test/certificates/invalid_private_key3 +0 -10
  36. data/test/certificates/invalid_rsa_private_key1 +0 -1
  37. data/test/certificates/invalid_rsa_private_key2 +0 -1
  38. data/test/certificates/invalid_rsa_private_key3 +0 -10
  39. data/test/certificates/ruby-saml-2.crt +0 -15
  40. data/test/certificates/ruby-saml.crt +0 -14
  41. data/test/certificates/ruby-saml.key +0 -15
  42. data/test/idp_metadata_parser_test.rb +0 -594
  43. data/test/logging_test.rb +0 -62
  44. data/test/logout_requests/invalid_slo_request.xml +0 -6
  45. data/test/logout_requests/slo_request.xml +0 -4
  46. data/test/logout_requests/slo_request.xml.base64 +0 -1
  47. data/test/logout_requests/slo_request_deflated.xml.base64 +0 -1
  48. data/test/logout_requests/slo_request_with_name_id_format.xml +0 -4
  49. data/test/logout_requests/slo_request_with_session_index.xml +0 -5
  50. data/test/logout_responses/logoutresponse_fixtures.rb +0 -86
  51. data/test/logoutrequest_test.rb +0 -260
  52. data/test/logoutresponse_test.rb +0 -427
  53. data/test/metadata/idp_descriptor.xml +0 -26
  54. data/test/metadata/idp_descriptor_2.xml +0 -56
  55. data/test/metadata/idp_descriptor_3.xml +0 -14
  56. data/test/metadata/idp_descriptor_4.xml +0 -72
  57. data/test/metadata/idp_metadata_different_sign_and_encrypt_cert.xml +0 -72
  58. data/test/metadata/idp_metadata_multi_certs.xml +0 -75
  59. data/test/metadata/idp_metadata_multi_signing_certs.xml +0 -52
  60. data/test/metadata/idp_metadata_same_sign_and_encrypt_cert.xml +0 -71
  61. data/test/metadata/idp_multiple_descriptors.xml +0 -59
  62. data/test/metadata/idp_multiple_descriptors_2.xml +0 -59
  63. data/test/metadata/no_idp_descriptor.xml +0 -21
  64. data/test/metadata_test.rb +0 -331
  65. data/test/request_test.rb +0 -340
  66. data/test/response_test.rb +0 -1629
  67. data/test/responses/adfs_response_sha1.xml +0 -46
  68. data/test/responses/adfs_response_sha256.xml +0 -46
  69. data/test/responses/adfs_response_sha384.xml +0 -46
  70. data/test/responses/adfs_response_sha512.xml +0 -46
  71. data/test/responses/adfs_response_xmlns.xml +0 -45
  72. data/test/responses/attackxee.xml +0 -13
  73. data/test/responses/invalids/duplicated_attributes.xml.base64 +0 -1
  74. data/test/responses/invalids/empty_destination.xml.base64 +0 -1
  75. data/test/responses/invalids/empty_nameid.xml.base64 +0 -1
  76. data/test/responses/invalids/encrypted_new_attack.xml.base64 +0 -1
  77. data/test/responses/invalids/invalid_audience.xml.base64 +0 -1
  78. data/test/responses/invalids/invalid_issuer_assertion.xml.base64 +0 -1
  79. data/test/responses/invalids/invalid_issuer_message.xml.base64 +0 -1
  80. data/test/responses/invalids/invalid_signature_position.xml.base64 +0 -1
  81. data/test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 +0 -1
  82. data/test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 +0 -1
  83. data/test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 +0 -1
  84. data/test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 +0 -1
  85. data/test/responses/invalids/multiple_assertions.xml.base64 +0 -2
  86. data/test/responses/invalids/multiple_signed.xml.base64 +0 -1
  87. data/test/responses/invalids/no_authnstatement.xml.base64 +0 -1
  88. data/test/responses/invalids/no_conditions.xml.base64 +0 -1
  89. data/test/responses/invalids/no_id.xml.base64 +0 -1
  90. data/test/responses/invalids/no_issuer_assertion.xml.base64 +0 -1
  91. data/test/responses/invalids/no_issuer_response.xml.base64 +0 -1
  92. data/test/responses/invalids/no_nameid.xml.base64 +0 -1
  93. data/test/responses/invalids/no_saml2.xml.base64 +0 -1
  94. data/test/responses/invalids/no_signature.xml.base64 +0 -1
  95. data/test/responses/invalids/no_status.xml.base64 +0 -1
  96. data/test/responses/invalids/no_status_code.xml.base64 +0 -1
  97. data/test/responses/invalids/no_subjectconfirmation_data.xml.base64 +0 -1
  98. data/test/responses/invalids/no_subjectconfirmation_method.xml.base64 +0 -1
  99. data/test/responses/invalids/response_invalid_signed_element.xml.base64 +0 -1
  100. data/test/responses/invalids/response_with_concealed_signed_assertion.xml +0 -51
  101. data/test/responses/invalids/response_with_doubled_signed_assertion.xml +0 -49
  102. data/test/responses/invalids/signature_wrapping_attack.xml.base64 +0 -1
  103. data/test/responses/invalids/status_code_responder.xml.base64 +0 -1
  104. data/test/responses/invalids/status_code_responer_and_msg.xml.base64 +0 -1
  105. data/test/responses/invalids/wrong_spnamequalifier.xml.base64 +0 -1
  106. data/test/responses/no_signature_ns.xml +0 -48
  107. data/test/responses/open_saml_response.xml +0 -56
  108. data/test/responses/response_assertion_wrapped.xml.base64 +0 -93
  109. data/test/responses/response_audience_self_closed_tag.xml.base64 +0 -1
  110. data/test/responses/response_double_status_code.xml.base64 +0 -1
  111. data/test/responses/response_encrypted_attrs.xml.base64 +0 -1
  112. data/test/responses/response_encrypted_nameid.xml.base64 +0 -1
  113. data/test/responses/response_eval.xml +0 -7
  114. data/test/responses/response_no_cert_and_encrypted_attrs.xml +0 -29
  115. data/test/responses/response_node_text_attack.xml.base64 +0 -1
  116. data/test/responses/response_node_text_attack2.xml.base64 +0 -1
  117. data/test/responses/response_node_text_attack3.xml.base64 +0 -1
  118. data/test/responses/response_unsigned_xml_base64 +0 -1
  119. data/test/responses/response_with_ampersands.xml +0 -139
  120. data/test/responses/response_with_ampersands.xml.base64 +0 -93
  121. data/test/responses/response_with_ds_namespace_at_the_root.xml.base64 +0 -1
  122. data/test/responses/response_with_multiple_attribute_statements.xml +0 -72
  123. data/test/responses/response_with_multiple_attribute_values.xml +0 -67
  124. data/test/responses/response_with_retrieval_method.xml +0 -26
  125. data/test/responses/response_with_saml2_namespace.xml.base64 +0 -102
  126. data/test/responses/response_with_signed_assertion.xml.base64 +0 -66
  127. data/test/responses/response_with_signed_assertion_2.xml.base64 +0 -1
  128. data/test/responses/response_with_signed_assertion_3.xml +0 -30
  129. data/test/responses/response_with_signed_message_and_assertion.xml +0 -34
  130. data/test/responses/response_with_undefined_recipient.xml.base64 +0 -1
  131. data/test/responses/response_without_attributes.xml.base64 +0 -79
  132. data/test/responses/response_without_reference_uri.xml.base64 +0 -1
  133. data/test/responses/response_wrapped.xml.base64 +0 -150
  134. data/test/responses/signed_message_encrypted_signed_assertion.xml.base64 +0 -1
  135. data/test/responses/signed_message_encrypted_unsigned_assertion.xml.base64 +0 -1
  136. data/test/responses/signed_nameid_in_atts.xml +0 -47
  137. data/test/responses/signed_unqual_nameid_in_atts.xml +0 -47
  138. data/test/responses/simple_saml_php.xml +0 -71
  139. data/test/responses/starfield_response.xml.base64 +0 -1
  140. data/test/responses/test_sign.xml +0 -43
  141. data/test/responses/unsigned_encrypted_adfs.xml +0 -23
  142. data/test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64 +0 -1
  143. data/test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64 +0 -1
  144. data/test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64 +0 -1
  145. data/test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64 +0 -1
  146. data/test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64 +0 -1
  147. data/test/responses/unsigned_message_encrypted_signed_assertion.xml.base64 +0 -1
  148. data/test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64 +0 -1
  149. data/test/responses/valid_response.xml.base64 +0 -1
  150. data/test/responses/valid_response_with_formatted_x509certificate.xml.base64 +0 -1
  151. data/test/responses/valid_response_without_x509certificate.xml.base64 +0 -1
  152. data/test/saml_message_test.rb +0 -56
  153. data/test/settings_test.rb +0 -338
  154. data/test/slo_logoutrequest_test.rb +0 -467
  155. data/test/slo_logoutresponse_test.rb +0 -233
  156. data/test/test_helper.rb +0 -333
  157. data/test/utils_test.rb +0 -259
  158. data/test/xml_security_test.rb +0 -421
data/test/utils_test.rb DELETED
@@ -1,259 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
-
3
- class UtilsTest < Minitest::Test
4
- describe ".format_cert" do
5
- let(:formatted_certificate) {read_certificate("formatted_certificate")}
6
- let(:formatted_chained_certificate) {read_certificate("formatted_chained_certificate")}
7
-
8
- it "returns empty string when the cert is an empty string" do
9
- cert = ""
10
- assert_equal "", OneLogin::RubySaml::Utils.format_cert(cert)
11
- end
12
-
13
- it "returns nil when the cert is nil" do
14
- cert = nil
15
- assert_nil OneLogin::RubySaml::Utils.format_cert(cert)
16
- end
17
-
18
- it "returns the certificate when it is valid" do
19
- assert_equal formatted_certificate, OneLogin::RubySaml::Utils.format_cert(formatted_certificate)
20
- end
21
-
22
- it "reformats the certificate when there are spaces and no line breaks" do
23
- invalid_certificate1 = read_certificate("invalid_certificate1")
24
- assert_equal formatted_certificate, OneLogin::RubySaml::Utils.format_cert(invalid_certificate1)
25
- end
26
-
27
- it "reformats the certificate when there are spaces and no headers" do
28
- invalid_certificate2 = read_certificate("invalid_certificate2")
29
- assert_equal formatted_certificate, OneLogin::RubySaml::Utils.format_cert(invalid_certificate2)
30
- end
31
-
32
- it "returns the cert when it's encoded" do
33
- encoded_certificate = read_certificate("certificate.der")
34
- assert_equal encoded_certificate, OneLogin::RubySaml::Utils.format_cert(encoded_certificate)
35
- end
36
-
37
- it "reformats the certificate when there line breaks and no headers" do
38
- invalid_certificate3 = read_certificate("invalid_certificate3")
39
- assert_equal formatted_certificate, OneLogin::RubySaml::Utils.format_cert(invalid_certificate3)
40
- end
41
-
42
- it "returns the chained certificate when it is a valid chained certificate" do
43
- assert_equal formatted_chained_certificate, OneLogin::RubySaml::Utils.format_cert(formatted_chained_certificate)
44
- end
45
-
46
- it "reformats the chained certificate when there are spaces and no line breaks" do
47
- invalid_chained_certificate1 = read_certificate("invalid_chained_certificate1")
48
- assert_equal formatted_chained_certificate, OneLogin::RubySaml::Utils.format_cert(invalid_chained_certificate1)
49
- end
50
-
51
- end
52
-
53
- describe ".format_private_key" do
54
- let(:formatted_private_key) do
55
- read_certificate("formatted_private_key")
56
- end
57
-
58
- it "returns empty string when the private key is an empty string" do
59
- private_key = ""
60
- assert_equal "", OneLogin::RubySaml::Utils.format_private_key(private_key)
61
- end
62
-
63
- it "returns nil when the private key is nil" do
64
- private_key = nil
65
- assert_nil OneLogin::RubySaml::Utils.format_private_key(private_key)
66
- end
67
-
68
- it "returns the private key when it is valid" do
69
- assert_equal formatted_private_key, OneLogin::RubySaml::Utils.format_private_key(formatted_private_key)
70
- end
71
-
72
- it "reformats the private key when there are spaces and no line breaks" do
73
- invalid_private_key1 = read_certificate("invalid_private_key1")
74
- assert_equal formatted_private_key, OneLogin::RubySaml::Utils.format_private_key(invalid_private_key1)
75
- end
76
-
77
- it "reformats the private key when there are spaces and no headers" do
78
- invalid_private_key2 = read_certificate("invalid_private_key2")
79
- assert_equal formatted_private_key, OneLogin::RubySaml::Utils.format_private_key(invalid_private_key2)
80
- end
81
-
82
- it "reformats the private key when there line breaks and no headers" do
83
- invalid_private_key3 = read_certificate("invalid_private_key3")
84
- assert_equal formatted_private_key, OneLogin::RubySaml::Utils.format_private_key(invalid_private_key3)
85
- end
86
-
87
- describe "an RSA public key" do
88
- let(:formatted_rsa_private_key) do
89
- read_certificate("formatted_rsa_private_key")
90
- end
91
-
92
- it "returns the private key when it is valid" do
93
- assert_equal formatted_rsa_private_key, OneLogin::RubySaml::Utils.format_private_key(formatted_rsa_private_key)
94
- end
95
-
96
- it "reformats the private key when there are spaces and no line breaks" do
97
- invalid_rsa_private_key1 = read_certificate("invalid_rsa_private_key1")
98
- assert_equal formatted_rsa_private_key, OneLogin::RubySaml::Utils.format_private_key(invalid_rsa_private_key1)
99
- end
100
-
101
- it "reformats the private key when there are spaces and no headers" do
102
- invalid_rsa_private_key2 = read_certificate("invalid_rsa_private_key2")
103
- assert_equal formatted_private_key, OneLogin::RubySaml::Utils.format_private_key(invalid_rsa_private_key2)
104
- end
105
-
106
- it "reformats the private key when there line breaks and no headers" do
107
- invalid_rsa_private_key3 = read_certificate("invalid_rsa_private_key3")
108
- assert_equal formatted_private_key, OneLogin::RubySaml::Utils.format_private_key(invalid_rsa_private_key3)
109
- end
110
- end
111
- end
112
-
113
- describe "build_query" do
114
- it "returns the query string" do
115
- params = {}
116
- params[:type] = "SAMLRequest"
117
- params[:data] = "PHNhbWxwOkF1dGhuUmVxdWVzdCBEZXN0aW5hdGlvbj0naHR0cDovL2V4YW1wbGUuY29tP2ZpZWxkPXZhbHVlJyBJRD0nXzk4NmUxZDEwLWVhY2ItMDEzMi01MGRkLTAwOTBmNWRlZGQ3NycgSXNzdWVJbnN0YW50PScyMDE1LTA2LTAxVDIwOjM0OjU5WicgVmVyc2lvbj0nMi4wJyB4bWxuczpzYW1sPSd1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uJyB4bWxuczpzYW1scD0ndXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sJy8+"
118
- params[:relay_state] = "http://example.com"
119
- params[:sig_alg] = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
120
- query_string = OneLogin::RubySaml::Utils.build_query(params)
121
- assert_equal "SAMLRequest=PHNhbWxwOkF1dGhuUmVxdWVzdCBEZXN0aW5hdGlvbj0naHR0cDovL2V4YW1wbGUuY29tP2ZpZWxkPXZhbHVlJyBJRD0nXzk4NmUxZDEwLWVhY2ItMDEzMi01MGRkLTAwOTBmNWRlZGQ3NycgSXNzdWVJbnN0YW50PScyMDE1LTA2LTAxVDIwOjM0OjU5WicgVmVyc2lvbj0nMi4wJyB4bWxuczpzYW1sPSd1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uJyB4bWxuczpzYW1scD0ndXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sJy8%2B&RelayState=http%3A%2F%2Fexample.com&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1", query_string
122
- end
123
- end
124
-
125
- describe "#verify_signature" do
126
- before do
127
- @params = {}
128
- @params[:cert] = ruby_saml_cert
129
- @params[:sig_alg] = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
130
- @params[:query_string] = "SAMLRequest=PHNhbWxwOkF1dGhuUmVxdWVzdCBEZXN0aW5hdGlvbj0naHR0cDovL2V4YW1wbGUuY29tP2ZpZWxkPXZhbHVlJyBJRD0nXzk4NmUxZDEwLWVhY2ItMDEzMi01MGRkLTAwOTBmNWRlZGQ3NycgSXNzdWVJbnN0YW50PScyMDE1LTA2LTAxVDIwOjM0OjU5WicgVmVyc2lvbj0nMi4wJyB4bWxuczpzYW1sPSd1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uJyB4bWxuczpzYW1scD0ndXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sJy8%2B&RelayState=http%3A%2F%2Fexample.com&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1"
131
- end
132
-
133
- it "returns true when the signature is valid" do
134
- @params[:signature] = "uWJm/T4gKLYEsVu1j/ZmjDeHp9zYPXPXWTXHFJZf2KKnWg57fUw3x2l6KTyRQ+Xjigb+sfYdGnnwmIz6KngXYRnh7nO6inspRLWOwkqQFy9iR9LDlMcfpXV/0g3oAxBxO6tX8MUHqR2R62SYZRGd1rxC9apg4vQiP97+atOI8t4="
135
- assert OneLogin::RubySaml::Utils.verify_signature(@params)
136
- end
137
-
138
- it "returns false when the signature is invalid" do
139
- @params[:signature] = "uWJm/InVaLiDsVu1j/ZmjDeHp9zYPXPXWTXHFJZf2KKnWg57fUw3x2l6KTyRQ+Xjigb+sfYdGnnwmIz6KngXYRnh7nO6inspRLWOwkqQFy9iR9LDlMcfpXV/0g3oAxBxO6tX8MUHqR2R62SYZRGd1rxC9apg4vQiP97+atOI8t4="
140
- assert !OneLogin::RubySaml::Utils.verify_signature(@params)
141
- end
142
- end
143
-
144
- describe "#status_error_msg" do
145
- it "returns a error msg with a status message" do
146
- error_msg = "The status code of the Logout Response was not Success"
147
- status_code = "urn:oasis:names:tc:SAML:2.0:status:Requester"
148
- status_message = "The request could not be performed due to an error on the part of the requester."
149
- status_error_msg = OneLogin::RubySaml::Utils.status_error_msg(error_msg, status_code, status_message)
150
- assert_equal = "The status code of the Logout Response was not Success, was Requester -> The request could not be performed due to an error on the part of the requester.", status_error_msg
151
-
152
- status_error_msg2 = OneLogin::RubySaml::Utils.status_error_msg(error_msg, status_code)
153
- assert_equal = "The status code of the Logout Response was not Success, was Requester", status_error_msg2
154
-
155
- status_error_msg3 = OneLogin::RubySaml::Utils.status_error_msg(error_msg)
156
- assert_equal = "The status code of the Logout Response was not Success", status_error_msg3
157
- end
158
- end
159
-
160
- describe "Utils" do
161
-
162
- describe ".uuid" do
163
- it "returns a uuid starting with an underscore" do
164
- assert_match /^_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/, OneLogin::RubySaml::Utils.uuid
165
- end
166
-
167
- it "doesn't return the same value twice" do
168
- refute_equal OneLogin::RubySaml::Utils.uuid, OneLogin::RubySaml::Utils.uuid
169
- end
170
- end
171
-
172
- describe 'uri_match' do
173
- it 'matches two urls' do
174
- destination = 'http://www.example.com/test?var=stuff'
175
- settings = 'http://www.example.com/test?var=stuff'
176
- assert OneLogin::RubySaml::Utils.uri_match?(destination, settings)
177
- end
178
-
179
- it 'fails to match two urls' do
180
- destination = 'http://www.example.com/test?var=stuff'
181
- settings = 'http://www.example.com/othertest?var=stuff'
182
- assert !OneLogin::RubySaml::Utils.uri_match?(destination, settings)
183
- end
184
-
185
- it "matches two URLs if the scheme case doesn't match" do
186
- destination = 'http://www.example.com/test?var=stuff'
187
- settings = 'HTTP://www.example.com/test?var=stuff'
188
- assert OneLogin::RubySaml::Utils.uri_match?(destination, settings)
189
- end
190
-
191
- it "matches two URLs if the host case doesn't match" do
192
- destination = 'http://www.EXAMPLE.com/test?var=stuff'
193
- settings = 'http://www.example.com/test?var=stuff'
194
- assert OneLogin::RubySaml::Utils.uri_match?(destination, settings)
195
- end
196
-
197
- it "fails to match two URLs if the path case doesn't match" do
198
- destination = 'http://www.example.com/TEST?var=stuff'
199
- settings = 'http://www.example.com/test?var=stuff'
200
- assert !OneLogin::RubySaml::Utils.uri_match?(destination, settings)
201
- end
202
-
203
- it "fails to match two URLs if the query case doesn't match" do
204
- destination = 'http://www.example.com/test?var=stuff'
205
- settings = 'http://www.example.com/test?var=STUFF'
206
- assert !OneLogin::RubySaml::Utils.uri_match?(destination, settings)
207
- end
208
-
209
- it 'matches two non urls' do
210
- destination = 'stuff'
211
- settings = 'stuff'
212
- assert OneLogin::RubySaml::Utils.uri_match?(destination, settings)
213
- end
214
-
215
- it "fails to match two non urls" do
216
- destination = 'stuff'
217
- settings = 'not stuff'
218
- assert !OneLogin::RubySaml::Utils.uri_match?(destination, settings)
219
- end
220
- end
221
-
222
- describe 'element_text' do
223
- it 'returns the element text' do
224
- element = REXML::Document.new('<element>element text</element>').elements.first
225
- assert_equal 'element text', OneLogin::RubySaml::Utils.element_text(element)
226
- end
227
-
228
- it 'returns all segments of the element text' do
229
- element = REXML::Document.new('<element>element <!-- comment -->text</element>').elements.first
230
- assert_equal 'element text', OneLogin::RubySaml::Utils.element_text(element)
231
- end
232
-
233
- it 'returns normalized element text' do
234
- element = REXML::Document.new('<element>element &amp; text</element>').elements.first
235
- assert_equal 'element & text', OneLogin::RubySaml::Utils.element_text(element)
236
- end
237
-
238
- it 'returns the CDATA element text' do
239
- element = REXML::Document.new('<element><![CDATA[element & text]]></element>').elements.first
240
- assert_equal 'element & text', OneLogin::RubySaml::Utils.element_text(element)
241
- end
242
-
243
- it 'returns the element text with newlines and additional whitespace' do
244
- element = REXML::Document.new("<element> element \n text </element>").elements.first
245
- assert_equal " element \n text ", OneLogin::RubySaml::Utils.element_text(element)
246
- end
247
-
248
- it 'returns nil when element is nil' do
249
- assert_nil OneLogin::RubySaml::Utils.element_text(nil)
250
- end
251
-
252
- it 'returns empty string when element has no text' do
253
- element = REXML::Document.new('<element></element>').elements.first
254
- assert_equal '', OneLogin::RubySaml::Utils.element_text(element)
255
- end
256
-
257
- end
258
- end
259
- end
@@ -1,421 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
- require 'xml_security'
3
-
4
- class XmlSecurityTest < Minitest::Test
5
- include XMLSecurity
6
-
7
- describe "XmlSecurity" do
8
-
9
- let(:decoded_response) { Base64.decode64(response_document_without_recipient) }
10
- let(:document) { XMLSecurity::SignedDocument.new(decoded_response) }
11
- let(:settings) { OneLogin::RubySaml::Settings.new() }
12
-
13
- before do
14
- @base64cert = document.elements["//ds:X509Certificate"].text
15
- end
16
-
17
- it "should run validate without throwing NS related exceptions" do
18
- assert !document.validate_signature(@base64cert, true)
19
- end
20
-
21
- it "should run validate with throwing NS related exceptions" do
22
- assert_raises(OneLogin::RubySaml::ValidationError) do
23
- document.validate_signature(@base64cert, false)
24
- end
25
- end
26
-
27
- it "not raise an error when softly validating the document multiple times" do
28
- 2.times { assert_equal document.validate_signature(@base64cert, true), false }
29
- end
30
-
31
- it "not raise an error when softly validating the document and the X509Certificate is missing" do
32
- decoded_response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
33
- mod_document = XMLSecurity::SignedDocument.new(decoded_response)
34
- assert !mod_document.validate_document("a fingerprint", true) # The fingerprint isn't relevant to this test
35
- end
36
-
37
- it "should raise Fingerprint mismatch" do
38
- exception = assert_raises(OneLogin::RubySaml::ValidationError) do
39
- document.validate_document("no:fi:ng:er:pr:in:t", false)
40
- end
41
- assert_equal("Fingerprint mismatch", exception.message)
42
- assert_includes document.errors, "Fingerprint mismatch"
43
- end
44
-
45
- it "should raise Digest mismatch" do
46
- exception = assert_raises(OneLogin::RubySaml::ValidationError) do
47
- document.validate_signature(@base64cert, false)
48
- end
49
- assert_equal("Digest mismatch", exception.message)
50
- assert_includes document.errors, "Digest mismatch"
51
- end
52
-
53
- it "should raise Key validation error" do
54
- decoded_response.sub!("<ds:DigestValue>pJQ7MS/ek4KRRWGmv/H43ReHYMs=</ds:DigestValue>",
55
- "<ds:DigestValue>b9xsAXLsynugg3Wc1CI3kpWku+0=</ds:DigestValue>")
56
- mod_document = XMLSecurity::SignedDocument.new(decoded_response)
57
- base64cert = mod_document.elements["//ds:X509Certificate"].text
58
- exception = assert_raises(OneLogin::RubySaml::ValidationError) do
59
- mod_document.validate_signature(base64cert, false)
60
- end
61
- assert_equal("Key validation error", exception.message)
62
- assert_includes mod_document.errors, "Key validation error"
63
- end
64
-
65
- it "correctly obtain the digest method with alternate namespace declaration" do
66
- adfs_document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_xmlns, false))
67
- base64cert = adfs_document.elements["//X509Certificate"].text
68
- assert adfs_document.validate_signature(base64cert, false)
69
- end
70
-
71
- it "raise validation error when the X509Certificate is missing and no cert provided" do
72
- decoded_response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
73
- mod_document = XMLSecurity::SignedDocument.new(decoded_response)
74
- exception = assert_raises(OneLogin::RubySaml::ValidationError) do
75
- mod_document.validate_document("a fingerprint", false) # The fingerprint isn't relevant to this test
76
- end
77
- assert_equal("Certificate element missing in response (ds:X509Certificate) and not cert provided at settings", exception.message)
78
- end
79
-
80
- it "invalidaties when the X509Certificate is missing and the cert is provided but mismatches" do
81
- decoded_response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
82
- mod_document = XMLSecurity::SignedDocument.new(decoded_response)
83
- cert = OpenSSL::X509::Certificate.new(ruby_saml_cert)
84
- assert !mod_document.validate_document("a fingerprint", true, :cert => cert) # The fingerprint isn't relevant to this test
85
- end
86
- end
87
-
88
- describe "#canon_algorithm" do
89
- it "C14N_EXCLUSIVE_1_0" do
90
- canon_algorithm = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0
91
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2001/10/xml-exc-c14n#")
92
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2001/10/xml-exc-c14n#WithComments")
93
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("other")
94
- end
95
-
96
- it "C14N_1_0" do
97
- canon_algorithm = Nokogiri::XML::XML_C14N_1_0
98
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/TR/2001/REC-xml-c14n-20010315")
99
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments")
100
- end
101
-
102
- it "XML_C14N_1_1" do
103
- canon_algorithm = Nokogiri::XML::XML_C14N_1_1
104
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2006/12/xml-c14n11")
105
- assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2006/12/xml-c14n11#WithComments")
106
- end
107
- end
108
-
109
- describe "#algorithm" do
110
- it "SHA1" do
111
- alg = OpenSSL::Digest::SHA1
112
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2000/09/xmldsig#rsa-sha1")
113
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2000/09/xmldsig#sha1")
114
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("other")
115
- end
116
-
117
- it "SHA256" do
118
- alg = OpenSSL::Digest::SHA256
119
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256")
120
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#sha256")
121
- end
122
-
123
- it "SHA384" do
124
- alg = OpenSSL::Digest::SHA384
125
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha384")
126
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#sha384")
127
- end
128
-
129
- it "SHA512" do
130
- alg = OpenSSL::Digest::SHA512
131
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha512")
132
- assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#sha512")
133
- end
134
- end
135
-
136
- describe "Fingerprint Algorithms" do
137
- let(:response_fingerprint_test) { OneLogin::RubySaml::Response.new(fixture(:adfs_response_sha1, false)) }
138
-
139
- it "validate using SHA1" do
140
- sha1_fingerprint = "F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72"
141
- sha1_fingerprint_downcase = "f13c6b80905a030e6c913e5d15faddb016454872"
142
-
143
- assert response_fingerprint_test.document.validate_document(sha1_fingerprint)
144
- assert response_fingerprint_test.document.validate_document(sha1_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA1)
145
-
146
- assert response_fingerprint_test.document.validate_document(sha1_fingerprint_downcase)
147
- assert response_fingerprint_test.document.validate_document(sha1_fingerprint_downcase, true, :fingerprint_alg => XMLSecurity::Document::SHA1)
148
- end
149
-
150
- it "validate using SHA256" do
151
- sha256_fingerprint = "C4:C6:BD:41:EC:AD:57:97:CE:7B:7D:80:06:C3:E4:30:53:29:02:0B:DD:2D:47:02:9E:BD:85:AD:93:02:45:21"
152
-
153
- assert !response_fingerprint_test.document.validate_document(sha256_fingerprint)
154
- assert response_fingerprint_test.document.validate_document(sha256_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA256)
155
- end
156
-
157
- it "validate using SHA384" do
158
- sha384_fingerprint = "98:FE:17:90:31:E7:68:18:8A:65:4D:DA:F5:76:E2:09:97:BE:8B:E3:7E:AA:8D:63:64:7C:0C:38:23:9A:AC:A2:EC:CE:48:A6:74:4D:E0:4C:50:80:40:B4:8D:55:14:14"
159
-
160
- assert !response_fingerprint_test.document.validate_document(sha384_fingerprint)
161
- assert response_fingerprint_test.document.validate_document(sha384_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA384)
162
- end
163
-
164
- it "validate using SHA512" do
165
- sha512_fingerprint = "5A:AE:BA:D0:BA:9D:1E:25:05:01:1E:1A:C9:E9:FF:DB:ED:FA:6E:F7:52:EB:45:49:BD:DB:06:D8:A3:7E:CC:63:3A:04:A2:DD:DF:EE:61:05:D9:58:95:2A:77:17:30:4B:EB:4A:9F:48:4A:44:1C:D0:9E:0B:1E:04:77:FD:A3:D2"
166
-
167
- assert !response_fingerprint_test.document.validate_document(sha512_fingerprint)
168
- assert response_fingerprint_test.document.validate_document(sha512_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA512)
169
- end
170
-
171
- end
172
-
173
- describe "Signature Algorithms" do
174
- it "validate using SHA1" do
175
- document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha1, false))
176
- assert document.validate_document("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
177
- end
178
-
179
- it "validate using SHA256" do
180
- document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha256, false))
181
- assert document.validate_document("28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA")
182
- end
183
-
184
- it "validate using SHA384" do
185
- document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha384, false))
186
- assert document.validate_document("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
187
- end
188
-
189
- it "validate using SHA512" do
190
- document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha512, false))
191
- assert document.validate_document("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
192
- end
193
- end
194
-
195
- describe "XmlSecurity::SignedDocument" do
196
-
197
- describe "#extract_inclusive_namespaces" do
198
- it "support explicit namespace resolution for exclusive canonicalization" do
199
- response = fixture(:open_saml_response, false)
200
- document = XMLSecurity::SignedDocument.new(response)
201
- inclusive_namespaces = document.send(:extract_inclusive_namespaces)
202
-
203
- assert_equal %w[ xs ], inclusive_namespaces
204
- end
205
-
206
- it "support implicit namespace resolution for exclusive canonicalization" do
207
- response = fixture(:no_signature_ns, false)
208
- document = XMLSecurity::SignedDocument.new(response)
209
- inclusive_namespaces = document.send(:extract_inclusive_namespaces)
210
-
211
- assert_equal %w[ #default saml ds xs xsi ], inclusive_namespaces
212
- end
213
-
214
- it 'support inclusive canonicalization' do
215
- skip('test not yet implemented')
216
- response = OneLogin::RubySaml::Response.new(fixture("tdnf_response.xml"))
217
- response.stubs(:conditions).returns(nil)
218
- assert !response.is_valid?
219
- assert !response.is_valid?
220
- response.settings = settings
221
- assert !response.is_valid?
222
- settings.idp_cert_fingerprint = "e6 38 9a 20 b7 4f 13 db 6a bc b1 42 6a e7 52 1d d6 56 d4 1b".upcase.gsub(" ", ":")
223
- assert response.is_valid?
224
- end
225
-
226
- it "return nil when inclusive namespace element is missing" do
227
- response = fixture(:no_signature_ns, false)
228
- response.slice! %r{<InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default saml ds xs xsi"/>}
229
-
230
- document = XMLSecurity::SignedDocument.new(response)
231
- inclusive_namespaces = document.send(:extract_inclusive_namespaces)
232
-
233
- assert inclusive_namespaces.nil?
234
- end
235
- end
236
-
237
- describe "XMLSecurity::DSIG" do
238
- before do
239
- settings.idp_sso_target_url = "https://idp.example.com/sso"
240
- settings.protocol_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
241
- settings.idp_slo_target_url = "https://idp.example.com/slo",
242
- settings.sp_entity_id = "https://sp.example.com/saml2"
243
- settings.assertion_consumer_service_url = "https://sp.example.com/acs"
244
- settings.single_logout_service_url = "https://sp.example.com/sls"
245
- end
246
-
247
- it "sign an AuthNRequest" do
248
- request = OneLogin::RubySaml::Authrequest.new.create_authentication_xml_doc(settings)
249
- request.sign_document(ruby_saml_key, ruby_saml_cert)
250
- # verify our signature
251
- signed_doc = XMLSecurity::SignedDocument.new(request.to_s)
252
- assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
253
-
254
- request2 = OneLogin::RubySaml::Authrequest.new.create_authentication_xml_doc(settings)
255
- request2.sign_document(ruby_saml_key, ruby_saml_cert_text)
256
- # verify our signature
257
- signed_doc2 = XMLSecurity::SignedDocument.new(request2.to_s)
258
- assert signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
259
- end
260
-
261
- it "sign an AuthNRequest with certificate as text" do
262
- request = OneLogin::RubySaml::Authrequest.new.create_authentication_xml_doc(settings)
263
- request.sign_document(ruby_saml_key, ruby_saml_cert_text)
264
-
265
- # verify our signature
266
- signed_doc = XMLSecurity::SignedDocument.new(request.to_s)
267
- assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
268
- end
269
-
270
- it "sign a LogoutRequest" do
271
- logout_request = OneLogin::RubySaml::Logoutrequest.new.create_logout_request_xml_doc(settings)
272
- logout_request.sign_document(ruby_saml_key, ruby_saml_cert)
273
- # verify our signature
274
- signed_doc = XMLSecurity::SignedDocument.new(logout_request.to_s)
275
- assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
276
-
277
- logout_request2 = OneLogin::RubySaml::Logoutrequest.new.create_logout_request_xml_doc(settings)
278
- logout_request2.sign_document(ruby_saml_key, ruby_saml_cert_text)
279
- # verify our signature
280
- signed_doc2 = XMLSecurity::SignedDocument.new(logout_request2.to_s)
281
- signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
282
- assert signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
283
- end
284
-
285
- it "sign a LogoutResponse" do
286
- logout_response = OneLogin::RubySaml::SloLogoutresponse.new.create_logout_response_xml_doc(settings, 'request_id_example', "Custom Logout Message")
287
- logout_response.sign_document(ruby_saml_key, ruby_saml_cert)
288
- # verify our signature
289
- signed_doc = XMLSecurity::SignedDocument.new(logout_response.to_s)
290
- assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
291
-
292
- logout_response2 = OneLogin::RubySaml::SloLogoutresponse.new.create_logout_response_xml_doc(settings, 'request_id_example', "Custom Logout Message")
293
- logout_response2.sign_document(ruby_saml_key, ruby_saml_cert_text)
294
- # verify our signature
295
- signed_doc2 = XMLSecurity::SignedDocument.new(logout_response2.to_s)
296
- signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
297
- assert signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
298
- end
299
- end
300
-
301
- describe "StarfieldTMS" do
302
- let (:response) { OneLogin::RubySaml::Response.new(fixture(:starfield_response)) }
303
-
304
- before do
305
- response.settings = OneLogin::RubySaml::Settings.new( :idp_cert_fingerprint => "8D:BA:53:8E:A3:B6:F9:F1:69:6C:BB:D9:D8:BD:41:B3:AC:4F:9D:4D")
306
- end
307
-
308
- it "be able to validate a good response" do
309
- Timecop.freeze Time.parse('2012-11-28 17:55:00 UTC') do
310
- response.stubs(:validate_subject_confirmation).returns(true)
311
- assert response.is_valid?
312
- end
313
- end
314
-
315
- it "fail before response is valid" do
316
- Timecop.freeze Time.parse('2012-11-20 17:55:00 UTC') do
317
- assert !response.is_valid?
318
-
319
- time_1 = '2012-11-20 17:55:00 UTC < 2012-11-28 17:53:45 UTC'
320
- time_2 = 'Tue Nov 20 17:55:00 UTC 2012 < Wed Nov 28 17:53:45 UTC 2012'
321
-
322
- errors = [time_1, time_2].map do |time|
323
- "Current time is earlier than NotBefore condition (#{time})"
324
- end
325
-
326
- assert_predicate response.errors & errors, :any?
327
- end
328
- end
329
-
330
- it "fail after response expires" do
331
- Timecop.freeze Time.parse('2012-11-30 17:55:00 UTC') do
332
- assert !response.is_valid?
333
-
334
- contains_expected_error = response.errors.include? "Current time is on or after NotOnOrAfter condition (2012-11-30 17:55:00 UTC >= 2012-11-28 18:33:45 UTC)"
335
- contains_expected_error ||= response.errors.include? "Current time is on or after NotOnOrAfter condition (Fri Nov 30 17:55:00 UTC 2012 >= Wed Nov 28 18:33:45 UTC 2012)"
336
- assert contains_expected_error
337
- end
338
- end
339
- end
340
-
341
- describe '#validate_document' do
342
- describe 'with valid document' do
343
- describe 'when response has signed message and assertion' do
344
- let(:document_data) { read_response('response_with_signed_message_and_assertion.xml') }
345
- let(:document) { OneLogin::RubySaml::Response.new(document_data).document }
346
- let(:fingerprint) { '4b68c453c7d994aad9025c99d5efcf566287fe8d' }
347
-
348
- it 'is valid' do
349
- assert document.validate_document(fingerprint, true), 'Document should be valid'
350
- end
351
- end
352
-
353
- describe 'when response has signed assertion' do
354
- let(:document_data) { read_response('response_with_signed_assertion_3.xml') }
355
- let(:document) { OneLogin::RubySaml::Response.new(document_data).document }
356
- let(:fingerprint) { '4b68c453c7d994aad9025c99d5efcf566287fe8d' }
357
-
358
- it 'is valid' do
359
- assert document.validate_document(fingerprint, true), 'Document should be valid'
360
- end
361
- end
362
- end
363
-
364
- describe 'signature_wrapping_attack' do
365
- let(:document_data) { read_invalid_response("signature_wrapping_attack.xml.base64") }
366
- let(:document) { OneLogin::RubySaml::Response.new(document_data).document }
367
- let(:fingerprint) { 'afe71c28ef740bc87425be13a2263d37971da1f9' }
368
-
369
- it 'is invalid' do
370
- assert !document.validate_document(fingerprint, true), 'Document should be invalid'
371
- end
372
- end
373
-
374
- describe 'signature wrapping attack - doubled SAML response body' do
375
- let(:document_data) { read_invalid_response("response_with_doubled_signed_assertion.xml") }
376
- let(:document) { OneLogin::RubySaml::Response.new(document_data) }
377
- let(:fingerprint) { '4b68c453c7d994aad9025c99d5efcf566287fe8d' }
378
-
379
- it 'is valid, but the unsigned information is ignored in favour of the signed information' do
380
- assert document.document.validate_document(fingerprint, true), 'Document should be valid'
381
- assert_equal 'someone@example.org', document.name_id, 'Document should expose only signed, valid details'
382
- end
383
- end
384
-
385
- describe 'signature wrapping attack - concealed SAML response body' do
386
- let(:document_data) { read_invalid_response("response_with_concealed_signed_assertion.xml") }
387
- let(:document) { OneLogin::RubySaml::Response.new(document_data) }
388
- let(:fingerprint) { '4b68c453c7d994aad9025c99d5efcf566287fe8d' }
389
-
390
- it 'is valid, but fails to retrieve information' do
391
- assert document.document.validate_document(fingerprint, true), 'Document should be valid'
392
- assert document.name_id.nil?, 'Document should expose only signed, valid details'
393
- end
394
- end
395
- end
396
-
397
- describe '#validate_document_with_cert' do
398
- describe 'with valid document ' do
399
- describe 'when response has cert' do
400
- let(:document_data) { read_response('response_with_signed_message_and_assertion.xml') }
401
- let(:document) { OneLogin::RubySaml::Response.new(document_data).document }
402
- let(:idp_cert) { OpenSSL::X509::Certificate.new(ruby_saml_cert_text) }
403
- let(:fingerprint) { '4b68c453c7d994aad9025c99d5efcf566287fe8d' }
404
-
405
- it 'is valid' do
406
- assert document.validate_document_with_cert(idp_cert), 'Document should be valid'
407
- end
408
- end
409
-
410
- describe 'when response has no cert but you have local cert' do
411
- let(:document) { OneLogin::RubySaml::Response.new(response_document_valid_signed_without_x509certificate).document }
412
- let(:idp_cert) { OpenSSL::X509::Certificate.new(ruby_saml_cert_text) }
413
-
414
- it 'is valid' do
415
- assert document.validate_document_with_cert(idp_cert), 'Document should be valid'
416
- end
417
- end
418
- end
419
- end
420
- end
421
- end