maestrano-ruby-test 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +34 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +45 -0
  5. data/LICENSE +21 -0
  6. data/README.md +794 -0
  7. data/Rakefile +40 -0
  8. data/bin/maestrano-console +9 -0
  9. data/lib/maestrano.rb +271 -0
  10. data/lib/maestrano/account/bill.rb +14 -0
  11. data/lib/maestrano/account/recurring_bill.rb +14 -0
  12. data/lib/maestrano/api/error/authentication_error.rb +8 -0
  13. data/lib/maestrano/api/error/base_error.rb +24 -0
  14. data/lib/maestrano/api/error/connection_error.rb +8 -0
  15. data/lib/maestrano/api/error/invalid_request_error.rb +14 -0
  16. data/lib/maestrano/api/list_object.rb +37 -0
  17. data/lib/maestrano/api/object.rb +187 -0
  18. data/lib/maestrano/api/operation/base.rb +215 -0
  19. data/lib/maestrano/api/operation/create.rb +18 -0
  20. data/lib/maestrano/api/operation/delete.rb +13 -0
  21. data/lib/maestrano/api/operation/list.rb +18 -0
  22. data/lib/maestrano/api/operation/update.rb +59 -0
  23. data/lib/maestrano/api/resource.rb +47 -0
  24. data/lib/maestrano/api/util.rb +122 -0
  25. data/lib/maestrano/open_struct.rb +11 -0
  26. data/lib/maestrano/saml/attribute_value.rb +15 -0
  27. data/lib/maestrano/saml/metadata.rb +64 -0
  28. data/lib/maestrano/saml/request.rb +93 -0
  29. data/lib/maestrano/saml/response.rb +201 -0
  30. data/lib/maestrano/saml/schemas/saml20assertion_schema.xsd +283 -0
  31. data/lib/maestrano/saml/schemas/saml20protocol_schema.xsd +302 -0
  32. data/lib/maestrano/saml/schemas/xenc_schema.xsd +146 -0
  33. data/lib/maestrano/saml/schemas/xmldsig_schema.xsd +318 -0
  34. data/lib/maestrano/saml/settings.rb +37 -0
  35. data/lib/maestrano/saml/validation_error.rb +7 -0
  36. data/lib/maestrano/sso.rb +86 -0
  37. data/lib/maestrano/sso/base_group.rb +31 -0
  38. data/lib/maestrano/sso/base_membership.rb +25 -0
  39. data/lib/maestrano/sso/base_user.rb +75 -0
  40. data/lib/maestrano/sso/group.rb +24 -0
  41. data/lib/maestrano/sso/session.rb +107 -0
  42. data/lib/maestrano/sso/user.rb +34 -0
  43. data/lib/maestrano/version.rb +3 -0
  44. data/lib/maestrano/xml_security/signed_document.rb +170 -0
  45. data/maestrano.gemspec +32 -0
  46. data/maestrano.png +0 -0
  47. data/test/helpers/api_helpers.rb +115 -0
  48. data/test/helpers/saml_helpers.rb +62 -0
  49. data/test/maestrano/account/bill_test.rb +48 -0
  50. data/test/maestrano/account/recurring_bill_test.rb +49 -0
  51. data/test/maestrano/api/list_object_test.rb +20 -0
  52. data/test/maestrano/api/object_test.rb +28 -0
  53. data/test/maestrano/api/resource_test.rb +343 -0
  54. data/test/maestrano/api/util_test.rb +31 -0
  55. data/test/maestrano/maestrano_test.rb +260 -0
  56. data/test/maestrano/open_struct_test.rb +10 -0
  57. data/test/maestrano/saml/request_test.rb +168 -0
  58. data/test/maestrano/saml/response_test.rb +290 -0
  59. data/test/maestrano/saml/settings_test.rb +51 -0
  60. data/test/maestrano/sso/base_group_test.rb +54 -0
  61. data/test/maestrano/sso/base_membership_test.rb +45 -0
  62. data/test/maestrano/sso/base_user_test.rb +114 -0
  63. data/test/maestrano/sso/group_test.rb +47 -0
  64. data/test/maestrano/sso/session_test.rb +161 -0
  65. data/test/maestrano/sso/user_test.rb +65 -0
  66. data/test/maestrano/sso_test.rb +105 -0
  67. data/test/maestrano/xml_security/signed_document.rb +163 -0
  68. data/test/support/saml/certificates/certificate1 +12 -0
  69. data/test/support/saml/certificates/r1_certificate2_base64 +1 -0
  70. data/test/support/saml/responses/adfs_response_sha1.xml +46 -0
  71. data/test/support/saml/responses/adfs_response_sha256.xml +46 -0
  72. data/test/support/saml/responses/adfs_response_sha384.xml +46 -0
  73. data/test/support/saml/responses/adfs_response_sha512.xml +46 -0
  74. data/test/support/saml/responses/no_signature_ns.xml +48 -0
  75. data/test/support/saml/responses/open_saml_response.xml +56 -0
  76. data/test/support/saml/responses/r1_response6.xml.base64 +1 -0
  77. data/test/support/saml/responses/response1.xml.base64 +1 -0
  78. data/test/support/saml/responses/response2.xml.base64 +79 -0
  79. data/test/support/saml/responses/response3.xml.base64 +66 -0
  80. data/test/support/saml/responses/response4.xml.base64 +93 -0
  81. data/test/support/saml/responses/response5.xml.base64 +102 -0
  82. data/test/support/saml/responses/response_with_ampersands.xml +139 -0
  83. data/test/support/saml/responses/response_with_ampersands.xml.base64 +93 -0
  84. data/test/support/saml/responses/response_with_multiple_attribute_values.xml +57 -0
  85. data/test/support/saml/responses/simple_saml_php.xml +71 -0
  86. data/test/support/saml/responses/starfield_response.xml.base64 +1 -0
  87. data/test/support/saml/responses/wrapped_response_2.xml.base64 +150 -0
  88. data/test/test_helper.rb +47 -0
  89. metadata +315 -0
@@ -0,0 +1,290 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Maestrano
4
+ module Saml
5
+ class SamlTest < Test::Unit::TestCase
6
+ include SamlTestHelper
7
+
8
+ context "Response" do
9
+ should "raise an exception when response is initialized with nil" do
10
+ assert_raises(ArgumentError) { Maestrano::Saml::Response.new(nil) }
11
+ end
12
+
13
+ should "be able to parse a document which contains ampersands" do
14
+ Maestrano::XMLSecurity::SignedDocument.any_instance.stubs(:digests_match?).returns(true)
15
+ Maestrano::Saml::Response.any_instance.stubs(:validate_conditions).returns(true)
16
+
17
+ response = Maestrano::Saml::Response.new(ampersands_response)
18
+ settings = Maestrano::Saml::Settings.new
19
+ settings.idp_cert_fingerprint = 'c51985d947f1be57082025050846eb27f6cab783'
20
+ response.settings = settings
21
+ response.validate!
22
+ end
23
+
24
+ should "adapt namespace" do
25
+ response = Maestrano::Saml::Response.new(response_document)
26
+ assert !response.name_id.nil?
27
+ response = Maestrano::Saml::Response.new(response_document_2)
28
+ assert !response.name_id.nil?
29
+ response = Maestrano::Saml::Response.new(response_document_3)
30
+ assert !response.name_id.nil?
31
+ end
32
+
33
+ should "default to raw input when a response is not Base64 encoded" do
34
+ decoded = Base64.decode64(response_document_2)
35
+ response = Maestrano::Saml::Response.new(decoded)
36
+ assert response.document
37
+ end
38
+
39
+ context "Assertion" do
40
+ should "only retreive an assertion with an ID that matches the signature's reference URI" do
41
+ response = Maestrano::Saml::Response.new(wrapped_response_2)
42
+ response.stubs(:conditions).returns(nil)
43
+ settings = Maestrano::Saml::Settings.new
44
+ settings.idp_cert_fingerprint = signature_fingerprint_1
45
+ response.settings = settings
46
+ assert response.name_id.nil?
47
+ end
48
+ end
49
+
50
+ context "#validate!" do
51
+ should "raise when encountering a condition that prevents the document from being valid" do
52
+ response = Maestrano::Saml::Response.new(response_document)
53
+ assert_raise(Maestrano::Saml::ValidationError) do
54
+ response.validate!
55
+ end
56
+ end
57
+ end
58
+
59
+ context "#is_valid?" do
60
+ should "return false when response is initialized with blank data" do
61
+ response = Maestrano::Saml::Response.new('')
62
+ assert !response.is_valid?
63
+ end
64
+
65
+ should "return false if settings have not been set" do
66
+ response = Maestrano::Saml::Response.new(response_document)
67
+ assert !response.is_valid?
68
+ end
69
+
70
+ should "return true when the response is initialized with valid data" do
71
+ response = Maestrano::Saml::Response.new(response_document_4)
72
+ response.stubs(:conditions).returns(nil)
73
+ assert !response.is_valid?
74
+ settings = Maestrano::Saml::Settings.new
75
+ assert !response.is_valid?
76
+ response.settings = settings
77
+ assert !response.is_valid?
78
+ settings.idp_cert_fingerprint = signature_fingerprint_1
79
+ assert response.is_valid?
80
+ end
81
+
82
+ should "should be idempotent when the response is initialized with invalid data" do
83
+ response = Maestrano::Saml::Response.new(response_document_4)
84
+ response.stubs(:conditions).returns(nil)
85
+ settings = Maestrano::Saml::Settings.new
86
+ response.settings = settings
87
+ assert !response.is_valid?
88
+ assert !response.is_valid?
89
+ end
90
+
91
+ should "should be idempotent when the response is initialized with valid data" do
92
+ response = Maestrano::Saml::Response.new(response_document_4)
93
+ response.stubs(:conditions).returns(nil)
94
+ settings = Maestrano::Saml::Settings.new
95
+ response.settings = settings
96
+ settings.idp_cert_fingerprint = signature_fingerprint_1
97
+ assert response.is_valid?
98
+ assert response.is_valid?
99
+ end
100
+
101
+ should "return true when using certificate instead of fingerprint" do
102
+ response = Maestrano::Saml::Response.new(response_document_4)
103
+ response.stubs(:conditions).returns(nil)
104
+ settings = Maestrano::Saml::Settings.new
105
+ response.settings = settings
106
+ settings.idp_cert = signature_1
107
+ assert response.is_valid?
108
+ end
109
+
110
+ should "not allow signature wrapping attack" do
111
+ response = Maestrano::Saml::Response.new(response_document_4)
112
+ response.stubs(:conditions).returns(nil)
113
+ settings = Maestrano::Saml::Settings.new
114
+ settings.idp_cert_fingerprint = signature_fingerprint_1
115
+ response.settings = settings
116
+ assert response.is_valid?
117
+ assert response.name_id == "test@onelogin.com"
118
+ end
119
+
120
+ should "support dynamic namespace resolution on signature elements" do
121
+ response = Maestrano::Saml::Response.new(fixture("no_signature_ns.xml"))
122
+ response.stubs(:conditions).returns(nil)
123
+ settings = Maestrano::Saml::Settings.new
124
+ response.settings = settings
125
+ settings.idp_cert_fingerprint = "28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA"
126
+ Maestrano::XMLSecurity::SignedDocument.any_instance.expects(:validate_signature).returns(true)
127
+ assert response.validate!
128
+ end
129
+
130
+ should "validate ADFS assertions" do
131
+ response = Maestrano::Saml::Response.new(fixture(:adfs_response_sha256))
132
+ response.stubs(:conditions).returns(nil)
133
+ settings = Maestrano::Saml::Settings.new
134
+ settings.idp_cert_fingerprint = "28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA"
135
+ response.settings = settings
136
+ assert response.validate!
137
+ end
138
+
139
+ should "validate the digest" do
140
+ response = Maestrano::Saml::Response.new(r1_response_document_6)
141
+ response.stubs(:conditions).returns(nil)
142
+ settings = Maestrano::Saml::Settings.new
143
+ settings.idp_cert = Base64.decode64(r1_signature_2)
144
+ response.settings = settings
145
+ assert response.validate!
146
+ end
147
+
148
+ should "validate SAML 2.0 XML structure" do
149
+ resp_xml = Base64.decode64(response_document_4).gsub(/emailAddress/,'test')
150
+ response = Maestrano::Saml::Response.new(Base64.encode64(resp_xml))
151
+ response.stubs(:conditions).returns(nil)
152
+ settings = Maestrano::Saml::Settings.new
153
+ settings.idp_cert_fingerprint = signature_fingerprint_1
154
+ response.settings = settings
155
+ assert_raises(Maestrano::Saml::ValidationError, 'Digest mismatch'){ response.validate! }
156
+ end
157
+ end
158
+
159
+ context "#name_id" do
160
+ should "extract the value of the name id element" do
161
+ response = Maestrano::Saml::Response.new(response_document)
162
+ assert_equal "support@onelogin.com", response.name_id
163
+
164
+ response = Maestrano::Saml::Response.new(response_document_3)
165
+ assert_equal "someone@example.com", response.name_id
166
+ end
167
+
168
+ should "be extractable from an OpenSAML response" do
169
+ response = Maestrano::Saml::Response.new(fixture(:open_saml))
170
+ assert_equal "someone@example.org", response.name_id
171
+ end
172
+
173
+ should "be extractable from a Simple SAML PHP response" do
174
+ response = Maestrano::Saml::Response.new(fixture(:simple_saml_php))
175
+ assert_equal "someone@example.com", response.name_id
176
+ end
177
+ end
178
+
179
+ context "#check_conditions" do
180
+ should "check time conditions" do
181
+ response = Maestrano::Saml::Response.new(response_document)
182
+ assert !response.send(:validate_conditions, true)
183
+ response = Maestrano::Saml::Response.new(response_document_6)
184
+ assert response.send(:validate_conditions, true)
185
+ time = Time.parse("2011-06-14T18:25:01.516Z")
186
+ Time.stubs(:now).returns(time)
187
+ response = Maestrano::Saml::Response.new(response_document_5)
188
+ assert response.send(:validate_conditions, true)
189
+ end
190
+
191
+ should "optionally allow for clock drift" do
192
+ # The NotBefore condition in the document is 2011-06-14T18:21:01.516Z
193
+ Time.stubs(:now).returns(Time.parse("2011-06-14T18:21:01Z"))
194
+ response = Maestrano::Saml::Response.new(response_document_5, :allowed_clock_drift => 0.515)
195
+ assert !response.send(:validate_conditions, true)
196
+
197
+ Time.stubs(:now).returns(Time.parse("2011-06-14T18:21:01Z"))
198
+ response = Maestrano::Saml::Response.new(response_document_5, :allowed_clock_drift => 0.516)
199
+ assert response.send(:validate_conditions, true)
200
+ end
201
+ end
202
+
203
+ context "#attributes" do
204
+ should "extract the first attribute in a hash accessed via its symbol" do
205
+ response = Maestrano::Saml::Response.new(response_document)
206
+ assert_equal "demo", response.attributes[:uid]
207
+ end
208
+
209
+ should "extract the first attribute in a hash accessed via its name" do
210
+ response = Maestrano::Saml::Response.new(response_document)
211
+ assert_equal "demo", response.attributes["uid"]
212
+ end
213
+
214
+ should "extract all attributes" do
215
+ response = Maestrano::Saml::Response.new(response_document)
216
+ assert_equal "demo", response.attributes[:uid]
217
+ assert_equal "value", response.attributes[:another_value]
218
+ end
219
+
220
+ should "work for implicit namespaces" do
221
+ response = Maestrano::Saml::Response.new(response_document_3)
222
+ assert_equal "someone@example.com", response.attributes["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]
223
+ end
224
+
225
+ should "not raise on responses without attributes" do
226
+ response = Maestrano::Saml::Response.new(response_document_4)
227
+ assert_equal Hash.new, response.attributes
228
+ end
229
+
230
+ context "#multiple values" do
231
+ should "extract single value as string" do
232
+ response = Maestrano::Saml::Response.new(fixture(:response_with_multiple_attribute_values))
233
+ assert_equal "demo", response.attributes[:uid]
234
+ end
235
+
236
+ should "extract first of multiple values as string for b/w compatibility" do
237
+ response = Maestrano::Saml::Response.new(fixture(:response_with_multiple_attribute_values))
238
+ assert_equal 'value1', response.attributes[:another_value]
239
+ end
240
+
241
+ should "return array with all attributes when asked" do
242
+ response = Maestrano::Saml::Response.new(fixture(:response_with_multiple_attribute_values))
243
+ assert_equal ['value2', 'value1'], response.attributes[:another_value].values
244
+ end
245
+
246
+ should "return last of multiple values when multiple Attribute tags in XML" do
247
+ response = Maestrano::Saml::Response.new(fixture(:response_with_multiple_attribute_values))
248
+ assert_equal 'role2', response.attributes[:role]
249
+ end
250
+
251
+ should "return all of multiple values in reverse order when multiple Attribute tags in XML" do
252
+ response = Maestrano::Saml::Response.new(fixture(:response_with_multiple_attribute_values))
253
+ assert_equal ['role2', 'role1'], response.attributes[:role].values
254
+ end
255
+ end
256
+ end
257
+
258
+ context "#session_expires_at" do
259
+ should "extract the value of the SessionNotOnOrAfter attribute" do
260
+ response = Maestrano::Saml::Response.new(response_document)
261
+ assert response.session_expires_at.is_a?(Time)
262
+
263
+ response = Maestrano::Saml::Response.new(response_document_2)
264
+ assert response.session_expires_at.nil?
265
+ end
266
+ end
267
+
268
+ context "#issuer" do
269
+ should "return the issuer inside the response assertion" do
270
+ response = Maestrano::Saml::Response.new(response_document)
271
+ assert_equal "https://app.onelogin.com/saml/metadata/13590", response.issuer
272
+ end
273
+
274
+ should "return the issuer inside the response" do
275
+ response = Maestrano::Saml::Response.new(response_document_2)
276
+ assert_equal "wibble", response.issuer
277
+ end
278
+ end
279
+
280
+ context "#success" do
281
+ should "find a status code that says success" do
282
+ response = Maestrano::Saml::Response.new(response_document)
283
+ response.success?
284
+ end
285
+ end
286
+
287
+ end
288
+ end
289
+ end
290
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Maestrano
4
+ module Saml
5
+ class SettingsTest < Test::Unit::TestCase
6
+
7
+ context "Settings" do
8
+ setup do
9
+ @settings = Maestrano::Saml::Settings.new
10
+ end
11
+ should "should provide getters and settings" do
12
+ accessors = [
13
+ :assertion_consumer_service_url, :issuer, :sp_name_qualifier,
14
+ :idp_sso_target_url, :idp_cert_fingerprint, :name_identifier_format,
15
+ :idp_slo_target_url, :name_identifier_value, :sessionindex,
16
+ :assertion_consumer_logout_service_url,
17
+ :passive, :protocol_binding
18
+ ]
19
+
20
+ accessors.each do |accessor|
21
+ value = Kernel.rand
22
+ @settings.send("#{accessor}=".to_sym, value)
23
+ assert_equal value, @settings.send(accessor)
24
+ end
25
+ end
26
+
27
+ should "create settings from hash" do
28
+
29
+ config = {
30
+ :assertion_consumer_service_url => "http://app.muda.no/sso",
31
+ :issuer => "http://muda.no",
32
+ :sp_name_qualifier => "http://sso.muda.no",
33
+ :idp_sso_target_url => "http://sso.muda.no/sso",
34
+ :idp_slo_target_url => "http://sso.muda.no/slo",
35
+ :idp_cert_fingerprint => "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00",
36
+ :name_identifier_format => Maestrano::Saml::Settings::NAMEID_TRANSIENT,
37
+ :passive => true,
38
+ :protocol_binding => Maestrano::Saml::Settings::PROTOCOL_BINDING_POST
39
+ }
40
+ @settings = Maestrano::Saml::Settings.new(config)
41
+
42
+ config.each do |k,v|
43
+ assert_equal v, @settings.send(k)
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Maestrano
4
+ module SSO
5
+ class BaseGroupTest < Test::Unit::TestCase
6
+ include SamlTestHelper
7
+
8
+ setup do
9
+ @saml_response = Maestrano::Saml::Response.new(response_document)
10
+ @saml_response.stubs(:attributes).returns({
11
+ 'mno_session' => 'f54sd54fd64fs5df4s3d48gf2',
12
+ 'mno_session_recheck' => Time.now.utc.iso8601,
13
+ 'group_uid' => 'cld-1',
14
+ 'group_end_free_trial' => Time.now.utc.iso8601,
15
+ 'group_role' => 'Admin',
16
+ 'uid' => "usr-1",
17
+ 'virtual_uid' => "usr-1.cld-1",
18
+ 'email' => "j.doe@doecorp.com",
19
+ 'virtual_email' => "usr-1.cld-1@mail.maestrano.com",
20
+ 'name' => "John",
21
+ "surname" => "Doe",
22
+ "country" => "AU",
23
+ "company_name" => "DoeCorp"
24
+ })
25
+ end
26
+
27
+ should "have a local_id accessor" do
28
+ assert Maestrano::SSO::BaseGroup.new(@saml_response).respond_to?(:local_id) == true
29
+ end
30
+
31
+ should "extract the rights attributes from the saml response" do
32
+ group = Maestrano::SSO::BaseGroup.new(@saml_response)
33
+ assert group.uid == @saml_response.attributes['group_uid']
34
+ assert group.free_trial_end_at == Time.iso8601(@saml_response.attributes['group_end_free_trial'])
35
+ assert group.company_name == @saml_response.attributes['company_name']
36
+ assert group.country == @saml_response.attributes['country']
37
+ end
38
+
39
+ should "have the right hash representation" do
40
+ sso_group = Maestrano::SSO::BaseGroup.new(@saml_response)
41
+ assert sso_group.to_hash == {
42
+ provider: 'maestrano',
43
+ uid: sso_group.uid,
44
+ info: {
45
+ free_trial_end_at: sso_group.free_trial_end_at,
46
+ company_name: sso_group.company_name,
47
+ country: sso_group.country,
48
+ },
49
+ extra: {}
50
+ }
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Maestrano
4
+ module SSO
5
+ class BaseMembershipTest < Test::Unit::TestCase
6
+ include SamlTestHelper
7
+
8
+ setup do
9
+ @saml_response = Maestrano::Saml::Response.new(response_document)
10
+ @saml_response.stubs(:attributes).returns({
11
+ 'mno_session' => 'f54sd54fd64fs5df4s3d48gf2',
12
+ 'mno_session_recheck' => Time.now.utc.iso8601,
13
+ 'group_uid' => 'cld-1',
14
+ 'group_end_free_trial' => Time.now.utc.iso8601,
15
+ 'group_role' => 'Admin',
16
+ 'uid' => "usr-1",
17
+ 'virtual_uid' => "usr-1.cld-1",
18
+ 'email' => "j.doe@doecorp.com",
19
+ 'virtual_email' => "usr-1.cld-1@mail.maestrano.com",
20
+ 'name' => "John",
21
+ "surname" => "Doe",
22
+ "country" => "AU",
23
+ "company_name" => "DoeCorp"
24
+ })
25
+ end
26
+
27
+ should "extract the rights attributes from the saml response" do
28
+ membership = Maestrano::SSO::BaseMembership.new(@saml_response)
29
+ assert membership.group_uid == @saml_response.attributes['group_uid']
30
+ assert membership.user_uid == @saml_response.attributes['uid']
31
+ assert membership.role == @saml_response.attributes['group_role']
32
+ end
33
+
34
+ should "have the right hash representation" do
35
+ membership = Maestrano::SSO::BaseMembership.new(@saml_response)
36
+ assert membership.to_hash == {
37
+ provider: 'maestrano',
38
+ group_uid: membership.group_uid,
39
+ user_uid: membership.user_uid,
40
+ role: membership.role,
41
+ }
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,114 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Maestrano
4
+ module SSO
5
+ class BaseUserTest < Test::Unit::TestCase
6
+ include SamlTestHelper
7
+
8
+ setup do
9
+ @saml_response = Maestrano::Saml::Response.new(response_document)
10
+ @saml_response.stubs(:attributes).returns({
11
+ 'mno_session' => 'f54sd54fd64fs5df4s3d48gf2',
12
+ 'mno_session_recheck' => Time.now.utc.iso8601,
13
+ 'group_uid' => 'cld-1',
14
+ 'group_end_free_trial' => Time.now.utc.iso8601,
15
+ 'group_role' => 'Admin',
16
+ 'uid' => "usr-1",
17
+ 'virtual_uid' => "usr-1.cld-1",
18
+ 'email' => "j.doe@doecorp.com",
19
+ 'virtual_email' => "usr-1.cld-1@mail.maestrano.com",
20
+ 'name' => "John",
21
+ "surname" => "Doe",
22
+ "country" => "AU",
23
+ "company_name" => "DoeCorp"
24
+ })
25
+ end
26
+
27
+ should "have a local_id accessor" do
28
+ assert Maestrano::SSO::BaseUser.new(@saml_response).respond_to?(:local_id) == true
29
+ end
30
+
31
+ should "extract the rights attributes from the saml response" do
32
+ user = Maestrano::SSO::BaseUser.new(@saml_response)
33
+ assert user.sso_session == @saml_response.attributes['mno_session']
34
+ assert user.sso_session_recheck == Time.iso8601(@saml_response.attributes['mno_session_recheck'])
35
+ assert user.group_uid == @saml_response.attributes['group_uid']
36
+ assert user.group_role == @saml_response.attributes['group_role']
37
+ assert user.uid == @saml_response.attributes['uid']
38
+ assert user.virtual_uid == @saml_response.attributes['virtual_uid']
39
+ assert user.email == @saml_response.attributes['email']
40
+ assert user.virtual_email == @saml_response.attributes['virtual_email']
41
+ assert user.first_name == @saml_response.attributes['name']
42
+ assert user.last_name == @saml_response.attributes['surname']
43
+ assert user.country == @saml_response.attributes['country']
44
+ assert user.company_name == @saml_response.attributes['company_name']
45
+ end
46
+
47
+ context "to_hash presentation" do
48
+ should "have the right representation when user_creation_mode is virtual" do
49
+ Maestrano.configure { |config| config.user_creation_mode = 'virtual' }
50
+ sso_user = Maestrano::SSO::BaseUser.new(@saml_response)
51
+ assert_equal sso_user.to_hash, {
52
+ provider: 'maestrano',
53
+ uid: sso_user.virtual_uid,
54
+ info: {
55
+ email: sso_user.virtual_email,
56
+ first_name: sso_user.first_name,
57
+ last_name: sso_user.last_name,
58
+ country: sso_user.country,
59
+ company_name: sso_user.company_name,
60
+ },
61
+ extra: {
62
+ uid: sso_user.uid,
63
+ virtual_uid: sso_user.virtual_uid,
64
+ real_email: sso_user.email,
65
+ virtual_email: sso_user.virtual_email,
66
+ group: {
67
+ uid: sso_user.group_uid,
68
+ role: sso_user.group_role
69
+ },
70
+ session: {
71
+ uid: sso_user.uid,
72
+ token: sso_user.sso_session,
73
+ recheck: sso_user.sso_session_recheck,
74
+ group_uid: sso_user.group_uid
75
+ }
76
+ }
77
+ }
78
+ end
79
+
80
+ should "have the right representation when user_creation_mode is real" do
81
+ Maestrano.configure { |config| config.user_creation_mode = 'real' }
82
+ sso_user = Maestrano::SSO::BaseUser.new(@saml_response)
83
+ assert_equal sso_user.to_hash, {
84
+ provider: 'maestrano',
85
+ uid: sso_user.uid,
86
+ info: {
87
+ email: sso_user.email,
88
+ first_name: sso_user.first_name,
89
+ last_name: sso_user.last_name,
90
+ country: sso_user.country,
91
+ company_name: sso_user.company_name,
92
+ },
93
+ extra: {
94
+ uid: sso_user.uid,
95
+ virtual_uid: sso_user.virtual_uid,
96
+ real_email: sso_user.email,
97
+ virtual_email: sso_user.virtual_email,
98
+ group: {
99
+ uid: sso_user.group_uid,
100
+ role: sso_user.group_role,
101
+ },
102
+ session: {
103
+ uid: sso_user.uid,
104
+ token: sso_user.sso_session,
105
+ recheck: sso_user.sso_session_recheck,
106
+ group_uid: sso_user.group_uid
107
+ }
108
+ }
109
+ }
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end