osso 0.0.5.pre.theta → 0.0.7

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/.buildkite/pipeline.yml +6 -4
  3. data/.github/dependabot.yml +8 -0
  4. data/.github/workflows/automerge.yml +19 -0
  5. data/.rubocop.yml +4 -1
  6. data/Gemfile +2 -2
  7. data/Gemfile.lock +58 -37
  8. data/LICENSE +21 -23
  9. data/Rakefile +2 -0
  10. data/bin/annotate +3 -1
  11. data/db/schema.rb +41 -3
  12. data/lib/osso.rb +0 -1
  13. data/lib/osso/db/migrate/20200929154117_add_users_count_to_identity_providers_and_enterprise_accounts.rb +6 -0
  14. data/lib/osso/db/migrate/20201023142158_add_rodauth_tables.rb +47 -0
  15. data/lib/osso/db/migrate/20201105122026_add_token_index_to_access_tokens.rb +5 -0
  16. data/lib/osso/db/migrate/20201106154936_add_requested_to_authorization_codes_and_access_tokens.rb +6 -0
  17. data/lib/osso/db/migrate/20201109160851_add_sso_issuer_to_identity_providers.rb +12 -0
  18. data/lib/osso/db/migrate/20201110190754_remove_oauth_client_id_from_enterprise_accounts.rb +9 -0
  19. data/lib/osso/db/migrate/20201112160120_add_ping_to_identity_provider_service_enum.rb +28 -0
  20. data/lib/osso/db/migrate/20201125143501_add_salesforce_to_provider_service_enum.rb +28 -0
  21. data/lib/osso/error/account_configuration_error.rb +1 -0
  22. data/lib/osso/error/oauth_error.rb +6 -3
  23. data/lib/osso/graphql/mutation.rb +2 -0
  24. data/lib/osso/graphql/mutations.rb +2 -0
  25. data/lib/osso/graphql/mutations/create_enterprise_account.rb +0 -7
  26. data/lib/osso/graphql/mutations/create_identity_provider.rb +7 -6
  27. data/lib/osso/graphql/mutations/delete_identity_provider.rb +24 -0
  28. data/lib/osso/graphql/mutations/invite_admin_user.rb +43 -0
  29. data/lib/osso/graphql/query.rb +8 -0
  30. data/lib/osso/graphql/resolvers/enterprise_accounts.rb +3 -3
  31. data/lib/osso/graphql/types.rb +2 -2
  32. data/lib/osso/graphql/types/admin_user.rb +9 -0
  33. data/lib/osso/graphql/types/base_object.rb +1 -1
  34. data/lib/osso/graphql/types/enterprise_account.rb +1 -0
  35. data/lib/osso/graphql/types/identity_provider.rb +2 -0
  36. data/lib/osso/graphql/types/identity_provider_service.rb +3 -1
  37. data/lib/osso/lib/app_config.rb +1 -1
  38. data/lib/osso/lib/route_map.rb +0 -16
  39. data/lib/osso/lib/saml_handler.rb +5 -0
  40. data/lib/osso/models/access_token.rb +4 -2
  41. data/lib/osso/models/account.rb +34 -0
  42. data/lib/osso/models/authorization_code.rb +2 -1
  43. data/lib/osso/models/enterprise_account.rb +3 -1
  44. data/lib/osso/models/identity_provider.rb +19 -5
  45. data/lib/osso/models/models.rb +1 -0
  46. data/lib/osso/models/oauth_client.rb +0 -1
  47. data/lib/osso/models/user.rb +2 -2
  48. data/lib/osso/routes/admin.rb +39 -33
  49. data/lib/osso/routes/auth.rb +9 -9
  50. data/lib/osso/routes/oauth.rb +35 -17
  51. data/lib/osso/version.rb +1 -1
  52. data/lib/osso/views/admin.erb +5 -0
  53. data/lib/osso/views/error.erb +1 -0
  54. data/lib/osso/views/layout.erb +0 -0
  55. data/lib/osso/views/multiple_providers.erb +1 -0
  56. data/lib/osso/views/welcome.erb +0 -0
  57. data/lib/tasks/bootstrap.rake +25 -4
  58. data/osso-rb.gemspec +5 -0
  59. data/spec/factories/account.rb +24 -0
  60. data/spec/factories/enterprise_account.rb +11 -3
  61. data/spec/factories/identity_providers.rb +10 -2
  62. data/spec/factories/user.rb +4 -0
  63. data/spec/graphql/mutations/configure_identity_provider_spec.rb +1 -1
  64. data/spec/graphql/mutations/create_enterprise_account_spec.rb +0 -14
  65. data/spec/graphql/mutations/create_identity_provider_spec.rb +59 -8
  66. data/spec/graphql/query/identity_provider_spec.rb +2 -2
  67. data/spec/models/enterprise_account_spec.rb +18 -0
  68. data/spec/models/identity_provider_spec.rb +24 -3
  69. data/spec/routes/admin_spec.rb +7 -41
  70. data/spec/routes/auth_spec.rb +17 -18
  71. data/spec/routes/oauth_spec.rb +88 -5
  72. data/spec/spec_helper.rb +3 -3
  73. data/spec/support/views/layout.erb +1 -0
  74. data/spec/support/views/multiple_providers.erb +1 -0
  75. metadata +107 -7
  76. data/lib/osso/helpers/auth.rb +0 -94
  77. data/lib/osso/helpers/helpers.rb +0 -8
  78. data/spec/helpers/auth_spec.rb +0 -269
@@ -3,56 +3,22 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Osso::Admin do
6
- let(:jwt_url) { 'https://foo.com/jwt' }
7
- let(:jwt_hmac_secret) { SecureRandom.hex(32) }
8
-
9
- before do
10
- ENV['JWT_URL'] = jwt_url
11
- ENV['JWT_HMAC_SECRET'] = jwt_hmac_secret
12
- described_class.set(:views, spec_views)
13
- end
14
-
15
6
  describe 'get /admin' do
16
- it 'redirects to JWT_URL without a session or token' do
7
+ it 'redirects to /login without a session' do
17
8
  get('/admin')
18
9
 
19
10
  expect(last_response).to be_redirect
20
11
  follow_redirect!
21
- expect(last_request.url).to eq(jwt_url)
22
- end
23
-
24
- it 'redirects to JWT_URL with an invalid token' do
25
- get('/admin', token: SecureRandom.hex(32))
26
-
27
- expect(last_response).to be_redirect
28
-
29
- follow_redirect!
30
-
31
- expect(last_request.url).to eq(jwt_url)
12
+ expect(last_request.url).to match('/login')
32
13
  end
33
14
 
34
- it 'chomps the token and redirects to request path with valid token' do
35
- token = JWT.encode(
36
- { email: 'admin@saas.com', scope: 'admin' },
37
- jwt_hmac_secret,
38
- 'HS256',
39
- )
40
-
41
- get('/admin', { admin_token: token })
42
-
43
- expect(last_response).to be_redirect
44
- follow_redirect!
45
- expect(last_request.url).to match('/admin')
46
- end
15
+ xit 'renders the admin page for a valid session token' do
16
+ password = SecureRandom.urlsafe_base64(16)
17
+ account = create(:verified_account, password: password)
47
18
 
48
- it 'renders the admin page for a valid session token' do
49
- token = JWT.encode(
50
- { email: 'admin@saas.com', scope: 'admin' },
51
- jwt_hmac_secret,
52
- 'HS256',
53
- )
19
+ post('/login', { email: account.email, password: password })
54
20
 
55
- get('/admin', {}, 'rack.session' => { admin_token: token })
21
+ get('/admin')
56
22
 
57
23
  expect(last_response).to be_ok
58
24
  end
@@ -182,29 +182,28 @@ describe Osso::Auth do
182
182
  it 'raises an error when email is missing' do
183
183
  mock_saml_omniauth(email: nil, id: SecureRandom.uuid)
184
184
 
185
-
186
- response = post(
187
- "/auth/saml/#{azure_provider.id}/callback",
188
- nil,
189
- {
190
- 'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
191
- },
192
- )
193
-
194
- expect(response.body).to eq('Osso::Error::MissingSamlEmailAttributeError')
195
- end
185
+ response = post(
186
+ "/auth/saml/#{azure_provider.id}/callback",
187
+ nil,
188
+ {
189
+ 'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
190
+ },
191
+ )
192
+
193
+ expect(response.body).to eq('Osso::Error::MissingSamlEmailAttributeError')
194
+ end
196
195
 
197
196
  it 'raises an error when id is missing' do
198
197
  mock_saml_omniauth(email: Faker::Internet.email, id: nil)
199
198
 
200
199
  response = post(
201
- "/auth/saml/#{azure_provider.id}/callback",
202
- nil,
203
- {
204
- 'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
205
- },
206
- )
207
-
200
+ "/auth/saml/#{azure_provider.id}/callback",
201
+ nil,
202
+ {
203
+ 'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
204
+ },
205
+ )
206
+
208
207
  expect(response.body).to eq('Osso::Error::MissingSamlIdAttributeError')
209
208
  end
210
209
  end
@@ -3,15 +3,16 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Osso::Oauth do
6
+ before do
7
+ described_class.set(:views, spec_views)
8
+ end
9
+
6
10
  let(:client) { create(:oauth_client) }
7
11
 
8
12
  describe 'get /oauth/authorize' do
9
13
  describe 'with a valid client ID and redirect URI' do
10
14
  describe 'for a domain that does not belong to an enterprise' do
11
- # TODO: better error handling and test
12
15
  it 'renders an error page' do
13
- described_class.set(:views, spec_views)
14
-
15
16
  create(:enterprise_with_okta, domain: 'foo.com')
16
17
 
17
18
  get(
@@ -48,7 +49,7 @@ describe Osso::Oauth do
48
49
 
49
50
  describe 'for an enterprise domain with multiple SAML providers' do
50
51
  it 'renders the multiple providers screen' do
51
- enterprise = create(:enterprise_with_multiple_providers)
52
+ enterprise = create(:enterprise_with_multiple_providers, oauth_client: client)
52
53
 
53
54
  get(
54
55
  '/oauth/authorize',
@@ -59,6 +60,64 @@ describe Osso::Oauth do
59
60
  )
60
61
 
61
62
  expect(last_response).to be_ok
63
+ expect(last_response.body).to eq('MULITPLE PROVIDERS')
64
+ end
65
+ end
66
+
67
+ describe "for an existing user's email address" do
68
+ it 'redirects to /auth/saml/:provider_id' do
69
+ enterprise = create(:enterprise_with_okta, oauth_client: client)
70
+ provider_id = enterprise.identity_providers.first.id
71
+ user = create(:user, email: "user@#{enterprise.domain}", identity_provider_id: provider_id)
72
+
73
+ get(
74
+ '/oauth/authorize',
75
+ email: user.email,
76
+ client_id: client.identifier,
77
+ response_type: 'code',
78
+ redirect_uri: client.redirect_uri_values.sample,
79
+ )
80
+
81
+ expect(last_response).to be_redirect
82
+ follow_redirect!
83
+ expect(last_request.url).to match("auth/saml/#{provider_id}")
84
+ end
85
+ end
86
+
87
+ describe "for a new user's email address belonging to an enterprise with one SAML provider" do
88
+ it 'redirects to /auth/saml/:provider_id' do
89
+ enterprise = create(:enterprise_with_okta, oauth_client: client)
90
+
91
+ get(
92
+ '/oauth/authorize',
93
+ email: "user@#{enterprise.domain}",
94
+ client_id: client.identifier,
95
+ response_type: 'code',
96
+ redirect_uri: client.redirect_uri_values.sample,
97
+ )
98
+
99
+ provider_id = enterprise.identity_providers.first.id
100
+
101
+ expect(last_response).to be_redirect
102
+ follow_redirect!
103
+ expect(last_request.url).to match("auth/saml/#{provider_id}")
104
+ end
105
+ end
106
+
107
+ describe "for a new user's email address belonging to an enterprise with multiple SAML providers" do
108
+ it 'renders the multiple providers screen' do
109
+ enterprise = create(:enterprise_with_multiple_providers, oauth_client: client)
110
+
111
+ get(
112
+ '/oauth/authorize',
113
+ email: "user@#{enterprise.domain}",
114
+ client_id: client.identifier,
115
+ response_type: 'code',
116
+ redirect_uri: client.redirect_uri_values.sample,
117
+ )
118
+
119
+ expect(last_response).to be_ok
120
+ expect(last_response.body).to eq('MULITPLE PROVIDERS')
62
121
  end
63
122
  end
64
123
  end
@@ -90,7 +149,7 @@ describe Osso::Oauth do
90
149
  end
91
150
 
92
151
  describe 'get /oauth/me' do
93
- describe 'with a valid unexpired access token' do
152
+ describe 'with a valid unexpired access token in params' do
94
153
  it 'returns the user' do
95
154
  user = create(:user)
96
155
  code = user.authorization_codes.valid.first
@@ -105,6 +164,30 @@ describe Osso::Oauth do
105
164
  email: user.email,
106
165
  id: user.id,
107
166
  idp: 'Okta',
167
+ requested: code.requested.symbolize_keys,
168
+ )
169
+ end
170
+ end
171
+
172
+ describe 'with a valid unexpired access token in headers' do
173
+ it 'returns the user' do
174
+ user = create(:user)
175
+ code = user.authorization_codes.valid.first
176
+
177
+ get(
178
+ '/oauth/me',
179
+ nil,
180
+ {
181
+ 'HTTP_AUTHORIZATION' => "Bearer: #{code.access_token.to_bearer_token}",
182
+ },
183
+ )
184
+
185
+ expect(last_response.status).to eq(200)
186
+ expect(last_json_response).to eq(
187
+ email: user.email,
188
+ id: user.id,
189
+ idp: 'Okta',
190
+ requested: code.requested.symbolize_keys,
108
191
  )
109
192
  end
110
193
  end
@@ -15,9 +15,9 @@ require 'webmock/rspec'
15
15
  ENV['RACK_ENV'] = 'test'
16
16
  ENV['SESSION_SECRET'] = 'supersecret'
17
17
  ENV['BASE_URL'] = 'https://example.com'
18
+ ENV['RODAUTH_VIEWS'] = "#{File.dirname(__FILE__)}/support/views"
18
19
 
19
20
  require File.expand_path '../lib/osso.rb', __dir__
20
-
21
21
  require File.expand_path 'support/spec_app', __dir__
22
22
 
23
23
  module RSpecMixin
@@ -47,11 +47,11 @@ module RSpecMixin
47
47
  end
48
48
 
49
49
  def spec_views
50
- File.dirname(__FILE__) + '/support/views'
50
+ "#{File.dirname(__FILE__)}/support/views"
51
51
  end
52
52
 
53
53
  def valid_x509_pem
54
- raw = File.read(File.dirname(__FILE__) + '/support/fixtures/test.pem')
54
+ raw = File.read("#{File.dirname(__FILE__)}/support/fixtures/test.pem")
55
55
  OpenSSL::X509::Certificate.new(raw).to_pem
56
56
  end
57
57
 
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1 @@
1
+ MULITPLE PROVIDERS
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osso
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5.pre.theta
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Bauch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-25 00:00:00.000000000 Z
11
+ date: 2020-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 6.0.3.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: bcrypt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.1.13
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.1.13
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: graphql
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mail
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.7.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.7.1
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: omniauth-multi-provider
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +164,60 @@ dependencies:
136
164
  - - ">="
137
165
  - !ruby/object:Gem::Version
138
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rodauth
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 2.6.0
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 2.6.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: sequel
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '5.37'
188
+ - - "<"
189
+ - !ruby/object:Gem::Version
190
+ version: '5.40'
191
+ type: :runtime
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '5.37'
198
+ - - "<"
199
+ - !ruby/object:Gem::Version
200
+ version: '5.40'
201
+ - !ruby/object:Gem::Dependency
202
+ name: sequel-activerecord_connection
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0.3'
208
+ - - "<"
209
+ - !ruby/object:Gem::Version
210
+ version: '2.0'
211
+ type: :runtime
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0.3'
218
+ - - "<"
219
+ - !ruby/object:Gem::Version
220
+ version: '2.0'
139
221
  - !ruby/object:Gem::Dependency
140
222
  name: sinatra
141
223
  requirement: !ruby/object:Gem::Requirement
@@ -235,6 +317,8 @@ files:
235
317
  - ".buildkite/hooks/pre-command"
236
318
  - ".buildkite/pipeline.yml"
237
319
  - ".buildkite/template.yml"
320
+ - ".github/dependabot.yml"
321
+ - ".github/workflows/automerge.yml"
238
322
  - ".gitignore"
239
323
  - ".rspec"
240
324
  - ".rubocop.yml"
@@ -273,6 +357,14 @@ files:
273
357
  - lib/osso/db/migrate/20200826201852_create_app_config.rb
274
358
  - lib/osso/db/migrate/20200913154919_add_one_login_to_identity_provider_service_enum.rb
275
359
  - lib/osso/db/migrate/20200916125543_add_google_to_identity_provider_service_enum.rb
360
+ - lib/osso/db/migrate/20200929154117_add_users_count_to_identity_providers_and_enterprise_accounts.rb
361
+ - lib/osso/db/migrate/20201023142158_add_rodauth_tables.rb
362
+ - lib/osso/db/migrate/20201105122026_add_token_index_to_access_tokens.rb
363
+ - lib/osso/db/migrate/20201106154936_add_requested_to_authorization_codes_and_access_tokens.rb
364
+ - lib/osso/db/migrate/20201109160851_add_sso_issuer_to_identity_providers.rb
365
+ - lib/osso/db/migrate/20201110190754_remove_oauth_client_id_from_enterprise_accounts.rb
366
+ - lib/osso/db/migrate/20201112160120_add_ping_to_identity_provider_service_enum.rb
367
+ - lib/osso/db/migrate/20201125143501_add_salesforce_to_provider_service_enum.rb
276
368
  - lib/osso/error/account_configuration_error.rb
277
369
  - lib/osso/error/error.rb
278
370
  - lib/osso/error/missing_saml_attribute_error.rb
@@ -287,7 +379,9 @@ files:
287
379
  - lib/osso/graphql/mutations/create_identity_provider.rb
288
380
  - lib/osso/graphql/mutations/create_oauth_client.rb
289
381
  - lib/osso/graphql/mutations/delete_enterprise_account.rb
382
+ - lib/osso/graphql/mutations/delete_identity_provider.rb
290
383
  - lib/osso/graphql/mutations/delete_oauth_client.rb
384
+ - lib/osso/graphql/mutations/invite_admin_user.rb
291
385
  - lib/osso/graphql/mutations/regenerate_oauth_credentials.rb
292
386
  - lib/osso/graphql/mutations/set_redirect_uris.rb
293
387
  - lib/osso/graphql/mutations/update_app_config.rb
@@ -313,13 +407,12 @@ files:
313
407
  - lib/osso/graphql/types/oauth_client.rb
314
408
  - lib/osso/graphql/types/redirect_uri.rb
315
409
  - lib/osso/graphql/types/redirect_uri_input.rb
316
- - lib/osso/helpers/auth.rb
317
- - lib/osso/helpers/helpers.rb
318
410
  - lib/osso/lib/app_config.rb
319
411
  - lib/osso/lib/oauth2_token.rb
320
412
  - lib/osso/lib/route_map.rb
321
413
  - lib/osso/lib/saml_handler.rb
322
414
  - lib/osso/models/access_token.rb
415
+ - lib/osso/models/account.rb
323
416
  - lib/osso/models/app_config.rb
324
417
  - lib/osso/models/authorization_code.rb
325
418
  - lib/osso/models/enterprise_account.rb
@@ -334,8 +427,14 @@ files:
334
427
  - lib/osso/routes/oauth.rb
335
428
  - lib/osso/routes/routes.rb
336
429
  - lib/osso/version.rb
430
+ - lib/osso/views/admin.erb
431
+ - lib/osso/views/error.erb
432
+ - lib/osso/views/layout.erb
433
+ - lib/osso/views/multiple_providers.erb
434
+ - lib/osso/views/welcome.erb
337
435
  - lib/tasks/bootstrap.rake
338
436
  - osso-rb.gemspec
437
+ - spec/factories/account.rb
339
438
  - spec/factories/authorization_code.rb
340
439
  - spec/factories/enterprise_account.rb
341
440
  - spec/factories/identity_providers.rb
@@ -352,8 +451,8 @@ files:
352
451
  - spec/graphql/query/enterprise_accounts_spec.rb
353
452
  - spec/graphql/query/identity_provider_spec.rb
354
453
  - spec/graphql/query/oauth_clients_spec.rb
355
- - spec/helpers/auth_spec.rb
356
454
  - spec/lib/saml_handler_spec.rb
455
+ - spec/models/enterprise_account_spec.rb
357
456
  - spec/models/identity_provider_spec.rb
358
457
  - spec/routes/admin_spec.rb
359
458
  - spec/routes/app_spec.rb
@@ -364,6 +463,7 @@ files:
364
463
  - spec/support/spec_app.rb
365
464
  - spec/support/views/admin.erb
366
465
  - spec/support/views/error.erb
466
+ - spec/support/views/layout.erb
367
467
  - spec/support/views/multiple_providers.erb
368
468
  homepage: https://github.com/enterprise-oss/osso-rb
369
469
  licenses:
@@ -380,9 +480,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
380
480
  version: 2.3.0
381
481
  required_rubygems_version: !ruby/object:Gem::Requirement
382
482
  requirements:
383
- - - ">"
483
+ - - ">="
384
484
  - !ruby/object:Gem::Version
385
- version: 1.3.1
485
+ version: '0'
386
486
  requirements: []
387
487
  rubygems_version: 3.0.3
388
488
  signing_key: