ruby-saml-nechotech 0.7.21

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.
Files changed (51) hide show
  1. data/.document +5 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +13 -0
  5. data/LICENSE +19 -0
  6. data/README.md +128 -0
  7. data/Rakefile +41 -0
  8. data/lib/onelogin/ruby-saml/authrequest.rb +84 -0
  9. data/lib/onelogin/ruby-saml/logging.rb +26 -0
  10. data/lib/onelogin/ruby-saml/logoutrequest.rb +82 -0
  11. data/lib/onelogin/ruby-saml/logoutresponse.rb +154 -0
  12. data/lib/onelogin/ruby-saml/metadata.rb +66 -0
  13. data/lib/onelogin/ruby-saml/response.rb +186 -0
  14. data/lib/onelogin/ruby-saml/settings.rb +27 -0
  15. data/lib/onelogin/ruby-saml/validation_error.rb +7 -0
  16. data/lib/onelogin/ruby-saml/version.rb +5 -0
  17. data/lib/ruby-saml.rb +9 -0
  18. data/lib/schemas/saml20assertion_schema.xsd +283 -0
  19. data/lib/schemas/saml20protocol_schema.xsd +302 -0
  20. data/lib/schemas/xenc_schema.xsd +146 -0
  21. data/lib/schemas/xmldsig_schema.xsd +318 -0
  22. data/lib/xml_security.rb +169 -0
  23. data/ruby-saml-nechotech.gemspec +29 -0
  24. data/test/certificates/certificate1 +12 -0
  25. data/test/certificates/r1_certificate2_base64 +1 -0
  26. data/test/logoutrequest_test.rb +111 -0
  27. data/test/logoutresponse_test.rb +116 -0
  28. data/test/request_test.rb +97 -0
  29. data/test/response_test.rb +247 -0
  30. data/test/responses/adfs_response_sha1.xml +46 -0
  31. data/test/responses/adfs_response_sha256.xml +46 -0
  32. data/test/responses/adfs_response_sha384.xml +46 -0
  33. data/test/responses/adfs_response_sha512.xml +46 -0
  34. data/test/responses/logoutresponse_fixtures.rb +67 -0
  35. data/test/responses/no_signature_ns.xml +48 -0
  36. data/test/responses/open_saml_response.xml +56 -0
  37. data/test/responses/r1_response6.xml.base64 +1 -0
  38. data/test/responses/response1.xml.base64 +1 -0
  39. data/test/responses/response2.xml.base64 +79 -0
  40. data/test/responses/response3.xml.base64 +66 -0
  41. data/test/responses/response4.xml.base64 +93 -0
  42. data/test/responses/response5.xml.base64 +102 -0
  43. data/test/responses/response_with_ampersands.xml +139 -0
  44. data/test/responses/response_with_ampersands.xml.base64 +93 -0
  45. data/test/responses/simple_saml_php.xml +71 -0
  46. data/test/responses/starfield_response.xml.base64 +1 -0
  47. data/test/responses/wrapped_response_2.xml.base64 +150 -0
  48. data/test/settings_test.rb +46 -0
  49. data/test/test_helper.rb +75 -0
  50. data/test/xml_security_test.rb +160 -0
  51. metadata +189 -0
@@ -0,0 +1,160 @@
1
+ require 'test_helper'
2
+ require 'xml_security'
3
+
4
+ class XmlSecurityTest < Test::Unit::TestCase
5
+ include XMLSecurity
6
+
7
+ context "XmlSecurity" do
8
+ setup do
9
+ @document = XMLSecurity::SignedDocument.new(Base64.decode64(response_document))
10
+ @base64cert = @document.elements["//ds:X509Certificate"].text
11
+ end
12
+
13
+ should "should run validate without throwing NS related exceptions" do
14
+ assert !@document.validate_doc(@base64cert, true)
15
+ end
16
+
17
+ should "should run validate with throwing NS related exceptions" do
18
+ assert_raise(Onelogin::Saml::ValidationError) do
19
+ @document.validate_doc(@base64cert, false)
20
+ end
21
+ end
22
+
23
+ should "not raise an error when softly validating the document multiple times" do
24
+ assert_nothing_raised do
25
+ 2.times { @document.validate_doc(@base64cert, true) }
26
+ end
27
+ end
28
+
29
+ should "should raise Fingerprint mismatch" do
30
+ exception = assert_raise(Onelogin::Saml::ValidationError) do
31
+ @document.validate("no:fi:ng:er:pr:in:t", false)
32
+ end
33
+ assert_equal("Fingerprint mismatch", exception.message)
34
+ end
35
+
36
+ should "should raise Digest mismatch" do
37
+ exception = assert_raise(Onelogin::Saml::ValidationError) do
38
+ @document.validate_doc(@base64cert, false)
39
+ end
40
+ assert_equal("Digest mismatch", exception.message)
41
+ end
42
+
43
+ should "should raise Key validation error" do
44
+ response = Base64.decode64(response_document)
45
+ response.sub!("<ds:DigestValue>pJQ7MS/ek4KRRWGmv/H43ReHYMs=</ds:DigestValue>",
46
+ "<ds:DigestValue>b9xsAXLsynugg3Wc1CI3kpWku+0=</ds:DigestValue>")
47
+ document = XMLSecurity::SignedDocument.new(response)
48
+ base64cert = document.elements["//ds:X509Certificate"].text
49
+ exception = assert_raise(Onelogin::Saml::ValidationError) do
50
+ document.validate_doc(base64cert, false)
51
+ end
52
+ assert_equal("Key validation error", exception.message)
53
+ end
54
+
55
+ should "raise validation error when the X509Certificate is missing" do
56
+ response = Base64.decode64(response_document)
57
+ response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
58
+ document = XMLSecurity::SignedDocument.new(response)
59
+ exception = assert_raise(Onelogin::Saml::ValidationError) do
60
+ document.validate("a fingerprint", false) # The fingerprint isn't relevant to this test
61
+ end
62
+ assert_equal("Certificate element missing in response (ds:X509Certificate)", exception.message)
63
+ end
64
+ end
65
+
66
+ context "Algorithms" do
67
+ should "validate using SHA1" do
68
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha1, false))
69
+ assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
70
+ end
71
+
72
+ should "validate using SHA256" do
73
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha256, false))
74
+ assert @document.validate("28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA")
75
+ end
76
+
77
+ should "validate using SHA384" do
78
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha384, false))
79
+ assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
80
+ end
81
+
82
+ should "validate using SHA512" do
83
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha512, false))
84
+ assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
85
+ end
86
+ end
87
+
88
+ context "XmlSecurity::SignedDocument" do
89
+
90
+ context "#extract_inclusive_namespaces" do
91
+ should "support explicit namespace resolution for exclusive canonicalization" do
92
+ response = fixture(:open_saml_response, false)
93
+ document = XMLSecurity::SignedDocument.new(response)
94
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
95
+
96
+ assert_equal %w[ xs ], inclusive_namespaces
97
+ end
98
+
99
+ should "support implicit namespace resolution for exclusive canonicalization" do
100
+ response = fixture(:no_signature_ns, false)
101
+ document = XMLSecurity::SignedDocument.new(response)
102
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
103
+
104
+ assert_equal %w[ #default saml ds xs xsi ], inclusive_namespaces
105
+ end
106
+
107
+ should_eventually 'support inclusive canonicalization' do
108
+
109
+ response = Onelogin::Saml::Response.new(fixture("tdnf_response.xml"))
110
+ response.stubs(:conditions).returns(nil)
111
+ assert !response.is_valid?
112
+ settings = Onelogin::Saml::Settings.new
113
+ assert !response.is_valid?
114
+ response.settings = settings
115
+ assert !response.is_valid?
116
+ 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(" ", ":")
117
+ assert response.validate!
118
+ end
119
+
120
+ should "return an empty list when inclusive namespace element is missing" do
121
+ response = fixture(:no_signature_ns, false)
122
+ response.slice! %r{<InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default saml ds xs xsi"/>}
123
+
124
+ document = XMLSecurity::SignedDocument.new(response)
125
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
126
+
127
+ assert inclusive_namespaces.empty?
128
+ end
129
+ end
130
+
131
+ context "StarfieldTMS" do
132
+ setup do
133
+ @response = Onelogin::Saml::Response.new(fixture(:starfield_response))
134
+ @response.settings = Onelogin::Saml::Settings.new(
135
+ :idp_cert_fingerprint => "8D:BA:53:8E:A3:B6:F9:F1:69:6C:BB:D9:D8:BD:41:B3:AC:4F:9D:4D"
136
+ )
137
+ end
138
+
139
+ should "be able to validate a good response" do
140
+ Timecop.freeze Time.parse('2012-11-28 17:55:00 UTC') do
141
+ assert @response.validate!
142
+ end
143
+ end
144
+
145
+ should "fail before response is valid" do
146
+ Timecop.freeze Time.parse('2012-11-20 17:55:00 UTC') do
147
+ assert ! @response.is_valid?
148
+ end
149
+ end
150
+
151
+ should "fail after response expires" do
152
+ Timecop.freeze Time.parse('2012-11-30 17:55:00 UTC') do
153
+ assert ! @response.is_valid?
154
+ end
155
+ end
156
+ end
157
+
158
+ end
159
+
160
+ end
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-saml-nechotech
3
+ version: !ruby/object:Gem::Version
4
+ hash: 41
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 7
9
+ - 21
10
+ version: 0.7.21
11
+ platform: ruby
12
+ authors:
13
+ - OneLogin LLC, beekermememe
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-04-05 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: canonix
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 25
30
+ segments:
31
+ - 0
32
+ - 1
33
+ - 1
34
+ version: 0.1.1
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: uuid
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 5
46
+ segments:
47
+ - 2
48
+ - 3
49
+ version: "2.3"
50
+ type: :runtime
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: nokogiri
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 1
63
+ - 5
64
+ - 0
65
+ version: 1.5.0
66
+ type: :runtime
67
+ version_requirements: *id003
68
+ description: SAML toolkit for Ruby on Rails forked and modified by beekermememe
69
+ email: nechotech@gmail.com
70
+ executables: []
71
+
72
+ extensions: []
73
+
74
+ extra_rdoc_files:
75
+ - LICENSE
76
+ - README.md
77
+ files:
78
+ - .document
79
+ - .gitignore
80
+ - .travis.yml
81
+ - Gemfile
82
+ - LICENSE
83
+ - README.md
84
+ - Rakefile
85
+ - lib/onelogin/ruby-saml/authrequest.rb
86
+ - lib/onelogin/ruby-saml/logging.rb
87
+ - lib/onelogin/ruby-saml/logoutrequest.rb
88
+ - lib/onelogin/ruby-saml/logoutresponse.rb
89
+ - lib/onelogin/ruby-saml/metadata.rb
90
+ - lib/onelogin/ruby-saml/response.rb
91
+ - lib/onelogin/ruby-saml/settings.rb
92
+ - lib/onelogin/ruby-saml/validation_error.rb
93
+ - lib/onelogin/ruby-saml/version.rb
94
+ - lib/ruby-saml.rb
95
+ - lib/schemas/saml20assertion_schema.xsd
96
+ - lib/schemas/saml20protocol_schema.xsd
97
+ - lib/schemas/xenc_schema.xsd
98
+ - lib/schemas/xmldsig_schema.xsd
99
+ - lib/xml_security.rb
100
+ - ruby-saml-nechotech.gemspec
101
+ - test/certificates/certificate1
102
+ - test/certificates/r1_certificate2_base64
103
+ - test/logoutrequest_test.rb
104
+ - test/logoutresponse_test.rb
105
+ - test/request_test.rb
106
+ - test/response_test.rb
107
+ - test/responses/adfs_response_sha1.xml
108
+ - test/responses/adfs_response_sha256.xml
109
+ - test/responses/adfs_response_sha384.xml
110
+ - test/responses/adfs_response_sha512.xml
111
+ - test/responses/logoutresponse_fixtures.rb
112
+ - test/responses/no_signature_ns.xml
113
+ - test/responses/open_saml_response.xml
114
+ - test/responses/r1_response6.xml.base64
115
+ - test/responses/response1.xml.base64
116
+ - test/responses/response2.xml.base64
117
+ - test/responses/response3.xml.base64
118
+ - test/responses/response4.xml.base64
119
+ - test/responses/response5.xml.base64
120
+ - test/responses/response_with_ampersands.xml
121
+ - test/responses/response_with_ampersands.xml.base64
122
+ - test/responses/simple_saml_php.xml
123
+ - test/responses/starfield_response.xml.base64
124
+ - test/responses/wrapped_response_2.xml.base64
125
+ - test/settings_test.rb
126
+ - test/test_helper.rb
127
+ - test/xml_security_test.rb
128
+ has_rdoc: true
129
+ homepage: http://github.com/onelogin/ruby-saml
130
+ licenses: []
131
+
132
+ post_install_message:
133
+ rdoc_options:
134
+ - --charset=UTF-8
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ hash: 3
143
+ segments:
144
+ - 0
145
+ version: "0"
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ hash: 3
152
+ segments:
153
+ - 0
154
+ version: "0"
155
+ requirements: []
156
+
157
+ rubyforge_project: http://www.rubygems.org/gems/ruby-saml-nechotech
158
+ rubygems_version: 1.3.7
159
+ signing_key:
160
+ specification_version: 3
161
+ summary: SAML Ruby Tookit
162
+ test_files:
163
+ - test/certificates/certificate1
164
+ - test/certificates/r1_certificate2_base64
165
+ - test/logoutrequest_test.rb
166
+ - test/logoutresponse_test.rb
167
+ - test/request_test.rb
168
+ - test/response_test.rb
169
+ - test/responses/adfs_response_sha1.xml
170
+ - test/responses/adfs_response_sha256.xml
171
+ - test/responses/adfs_response_sha384.xml
172
+ - test/responses/adfs_response_sha512.xml
173
+ - test/responses/logoutresponse_fixtures.rb
174
+ - test/responses/no_signature_ns.xml
175
+ - test/responses/open_saml_response.xml
176
+ - test/responses/r1_response6.xml.base64
177
+ - test/responses/response1.xml.base64
178
+ - test/responses/response2.xml.base64
179
+ - test/responses/response3.xml.base64
180
+ - test/responses/response4.xml.base64
181
+ - test/responses/response5.xml.base64
182
+ - test/responses/response_with_ampersands.xml
183
+ - test/responses/response_with_ampersands.xml.base64
184
+ - test/responses/simple_saml_php.xml
185
+ - test/responses/starfield_response.xml.base64
186
+ - test/responses/wrapped_response_2.xml.base64
187
+ - test/settings_test.rb
188
+ - test/test_helper.rb
189
+ - test/xml_security_test.rb