ruby-saml-uppercase 0.5.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.document +5 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE +19 -0
  6. data/README.md +126 -0
  7. data/Rakefile +41 -0
  8. data/lib/onelogin/ruby-saml/authrequest.rb +79 -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 +160 -0
  12. data/lib/onelogin/ruby-saml/metadata.rb +47 -0
  13. data/lib/onelogin/ruby-saml/response.rb +195 -0
  14. data/lib/onelogin/ruby-saml/settings.rb +19 -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 +168 -0
  23. data/ruby-saml.gemspec +29 -0
  24. data/test/certificates/certificate1 +12 -0
  25. data/test/logoutrequest_test.rb +111 -0
  26. data/test/logoutresponse_test.rb +116 -0
  27. data/test/request_test.rb +53 -0
  28. data/test/response_test.rb +219 -0
  29. data/test/responses/adfs_response_sha1.xml +46 -0
  30. data/test/responses/adfs_response_sha256.xml +46 -0
  31. data/test/responses/adfs_response_sha384.xml +46 -0
  32. data/test/responses/adfs_response_sha512.xml +46 -0
  33. data/test/responses/logoutresponse_fixtures.rb +67 -0
  34. data/test/responses/no_signature_ns.xml +48 -0
  35. data/test/responses/open_saml_response.xml +56 -0
  36. data/test/responses/response1.xml.base64 +1 -0
  37. data/test/responses/response2.xml.base64 +79 -0
  38. data/test/responses/response3.xml.base64 +66 -0
  39. data/test/responses/response4.xml.base64 +93 -0
  40. data/test/responses/response5.xml.base64 +102 -0
  41. data/test/responses/response_with_ampersands.xml +139 -0
  42. data/test/responses/response_with_ampersands.xml.base64 +93 -0
  43. data/test/responses/simple_saml_php.xml +71 -0
  44. data/test/responses/wrapped_response_2.xml.base64 +150 -0
  45. data/test/settings_test.rb +44 -0
  46. data/test/test_helper.rb +66 -0
  47. data/test/xml_security_test.rb +123 -0
  48. metadata +166 -0
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
+
3
+ class SettingsTest < Test::Unit::TestCase
4
+
5
+ context "Settings" do
6
+ setup do
7
+ @settings = Onelogin::Saml::Settings.new
8
+ end
9
+ should "should provide getters and settings" do
10
+ accessors = [
11
+ :assertion_consumer_service_url, :issuer, :sp_name_qualifier,
12
+ :idp_sso_target_url, :idp_cert_fingerprint, :name_identifier_format,
13
+ :idp_slo_target_url, :name_identifier_value, :sessionindex,
14
+ :assertion_consumer_logout_service_url
15
+ ]
16
+
17
+ accessors.each do |accessor|
18
+ value = Kernel.rand
19
+ @settings.send("#{accessor}=".to_sym, value)
20
+ assert_equal value, @settings.send(accessor)
21
+ end
22
+ end
23
+
24
+ should "create settings from hash" do
25
+
26
+ config = {
27
+ :assertion_consumer_service_url => "http://app.muda.no/sso",
28
+ :issuer => "http://muda.no",
29
+ :sp_name_qualifier => "http://sso.muda.no",
30
+ :idp_sso_target_url => "http://sso.muda.no/sso",
31
+ :idp_slo_target_url => "http://sso.muda.no/slo",
32
+ :idp_cert_fingerprint => "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00",
33
+ :name_identifier_format => "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
34
+ }
35
+ @settings = Onelogin::Saml::Settings.new(config)
36
+
37
+ config.each do |k,v|
38
+ assert_equal v, @settings.send(k)
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,66 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'mocha'
5
+ require 'ruby-debug'
6
+
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
9
+ require 'ruby-saml'
10
+
11
+ ENV["ruby-saml/testing"] = "1"
12
+
13
+ class Test::Unit::TestCase
14
+ def fixture(document, base64 = true)
15
+ response = Dir.glob(File.join(File.dirname(__FILE__), "responses", "#{document}*")).first
16
+ if base64 && response =~ /\.xml$/
17
+ Base64.encode64(File.read(response))
18
+ else
19
+ File.read(response)
20
+ end
21
+ end
22
+
23
+ def response_document
24
+ @response_document ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response1.xml.base64'))
25
+ end
26
+
27
+ def response_document_2
28
+ @response_document2 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response2.xml.base64'))
29
+ end
30
+
31
+ def response_document_3
32
+ @response_document3 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response3.xml.base64'))
33
+ end
34
+
35
+ def response_document_4
36
+ @response_document4 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response4.xml.base64'))
37
+ end
38
+
39
+ def response_document_5
40
+ @response_document5 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response5.xml.base64'))
41
+ end
42
+
43
+ def ampersands_response
44
+ @ampersands_resposne ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response_with_ampersands.xml.base64'))
45
+ end
46
+
47
+ def response_document_6
48
+ doc = Base64.decode64(response_document)
49
+ doc.gsub!(/NotBefore=\"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z\"/, "NotBefore=\"#{(Time.now-300).getutc.strftime("%Y-%m-%dT%XZ")}\"")
50
+ doc.gsub!(/NotOnOrAfter=\"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z\"/, "NotOnOrAfter=\"#{(Time.now+300).getutc.strftime("%Y-%m-%dT%XZ")}\"")
51
+ Base64.encode64(doc)
52
+ end
53
+
54
+ def wrapped_response_2
55
+ @wrapped_response_2 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'wrapped_response_2.xml.base64'))
56
+ end
57
+
58
+ def signature_fingerprint_1
59
+ @signature_fingerprint1 ||= "C5:19:85:D9:47:F1:BE:57:08:20:25:05:08:46:EB:27:F6:CA:B7:83"
60
+ end
61
+
62
+ def signature_1
63
+ @signature1 ||= File.read(File.join(File.dirname(__FILE__), 'certificates', 'certificate1'))
64
+ end
65
+
66
+ end
@@ -0,0 +1,123 @@
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
+ end
55
+
56
+ context "Algorithms" do
57
+ should "validate using SHA1" do
58
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha1, false))
59
+ assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
60
+ end
61
+
62
+ should "validate using SHA256" do
63
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha256, false))
64
+ assert @document.validate("28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA")
65
+ end
66
+
67
+ should "validate using SHA384" do
68
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha384, 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 SHA512" do
73
+ @document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha512, false))
74
+ assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
75
+ end
76
+ end
77
+
78
+ context "XmlSecurity::SignedDocument" do
79
+
80
+ context "#extract_inclusive_namespaces" do
81
+ should "support explicit namespace resolution for exclusive canonicalization" do
82
+ response = fixture(:open_saml_response, false)
83
+ document = XMLSecurity::SignedDocument.new(response)
84
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
85
+
86
+ assert_equal %w[ xs ], inclusive_namespaces
87
+ end
88
+
89
+ should "support implicit namespace resolution for exclusive canonicalization" do
90
+ response = fixture(:no_signature_ns, false)
91
+ document = XMLSecurity::SignedDocument.new(response)
92
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
93
+
94
+ assert_equal %w[ #default saml ds xs xsi ], inclusive_namespaces
95
+ end
96
+
97
+ should_eventually 'support inclusive canonicalization' do
98
+
99
+ response = Onelogin::Saml::Response.new(fixture("tdnf_response.xml"))
100
+ response.stubs(:conditions).returns(nil)
101
+ assert !response.is_valid?
102
+ settings = Onelogin::Saml::Settings.new
103
+ assert !response.is_valid?
104
+ response.settings = settings
105
+ assert !response.is_valid?
106
+ 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(" ", ":")
107
+ assert response.validate!
108
+ end
109
+
110
+ should "return an empty list when inclusive namespace element is missing" do
111
+ response = fixture(:no_signature_ns, false)
112
+ response.slice! %r{<InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default saml ds xs xsi"/>}
113
+
114
+ document = XMLSecurity::SignedDocument.new(response)
115
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
116
+
117
+ assert inclusive_namespaces.empty?
118
+ end
119
+ end
120
+
121
+ end
122
+
123
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-saml-uppercase
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.3.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - OneLogin LLC
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: canonix
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.1.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.1.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: uuid
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '2.3'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: nokogiri
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: SAML toolkit for Ruby on Rails
63
+ email: support@onelogin.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files:
67
+ - LICENSE
68
+ - README.md
69
+ files:
70
+ - .document
71
+ - .gitignore
72
+ - .travis.yml
73
+ - Gemfile
74
+ - LICENSE
75
+ - README.md
76
+ - Rakefile
77
+ - lib/onelogin/ruby-saml/authrequest.rb
78
+ - lib/onelogin/ruby-saml/logging.rb
79
+ - lib/onelogin/ruby-saml/logoutrequest.rb
80
+ - lib/onelogin/ruby-saml/logoutresponse.rb
81
+ - lib/onelogin/ruby-saml/metadata.rb
82
+ - lib/onelogin/ruby-saml/response.rb
83
+ - lib/onelogin/ruby-saml/settings.rb
84
+ - lib/onelogin/ruby-saml/validation_error.rb
85
+ - lib/onelogin/ruby-saml/version.rb
86
+ - lib/ruby-saml.rb
87
+ - lib/schemas/saml20assertion_schema.xsd
88
+ - lib/schemas/saml20protocol_schema.xsd
89
+ - lib/schemas/xenc_schema.xsd
90
+ - lib/schemas/xmldsig_schema.xsd
91
+ - lib/xml_security.rb
92
+ - ruby-saml.gemspec
93
+ - test/certificates/certificate1
94
+ - test/logoutrequest_test.rb
95
+ - test/logoutresponse_test.rb
96
+ - test/request_test.rb
97
+ - test/response_test.rb
98
+ - test/responses/adfs_response_sha1.xml
99
+ - test/responses/adfs_response_sha256.xml
100
+ - test/responses/adfs_response_sha384.xml
101
+ - test/responses/adfs_response_sha512.xml
102
+ - test/responses/logoutresponse_fixtures.rb
103
+ - test/responses/no_signature_ns.xml
104
+ - test/responses/open_saml_response.xml
105
+ - test/responses/response1.xml.base64
106
+ - test/responses/response2.xml.base64
107
+ - test/responses/response3.xml.base64
108
+ - test/responses/response4.xml.base64
109
+ - test/responses/response5.xml.base64
110
+ - test/responses/response_with_ampersands.xml
111
+ - test/responses/response_with_ampersands.xml.base64
112
+ - test/responses/simple_saml_php.xml
113
+ - test/responses/wrapped_response_2.xml.base64
114
+ - test/settings_test.rb
115
+ - test/test_helper.rb
116
+ - test/xml_security_test.rb
117
+ homepage: http://github.com/onelogin/ruby-saml
118
+ licenses: []
119
+ post_install_message:
120
+ rdoc_options:
121
+ - --charset=UTF-8
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project: http://www.rubygems.org/gems/ruby-saml
138
+ rubygems_version: 1.8.24
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: SAML Ruby Tookit
142
+ test_files:
143
+ - test/certificates/certificate1
144
+ - test/logoutrequest_test.rb
145
+ - test/logoutresponse_test.rb
146
+ - test/request_test.rb
147
+ - test/response_test.rb
148
+ - test/responses/adfs_response_sha1.xml
149
+ - test/responses/adfs_response_sha256.xml
150
+ - test/responses/adfs_response_sha384.xml
151
+ - test/responses/adfs_response_sha512.xml
152
+ - test/responses/logoutresponse_fixtures.rb
153
+ - test/responses/no_signature_ns.xml
154
+ - test/responses/open_saml_response.xml
155
+ - test/responses/response1.xml.base64
156
+ - test/responses/response2.xml.base64
157
+ - test/responses/response3.xml.base64
158
+ - test/responses/response4.xml.base64
159
+ - test/responses/response5.xml.base64
160
+ - test/responses/response_with_ampersands.xml
161
+ - test/responses/response_with_ampersands.xml.base64
162
+ - test/responses/simple_saml_php.xml
163
+ - test/responses/wrapped_response_2.xml.base64
164
+ - test/settings_test.rb
165
+ - test/test_helper.rb
166
+ - test/xml_security_test.rb