osso 0.0.11 → 0.1.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -16
- data/Gemfile +1 -1
- data/Gemfile.lock +44 -41
- data/lib/osso/graphql/mutations/configure_identity_provider.rb +1 -1
- data/lib/osso/graphql/mutations/create_enterprise_account.rb +1 -1
- data/lib/osso/graphql/mutations/create_identity_provider.rb +3 -3
- data/lib/osso/graphql/mutations/create_oauth_client.rb +1 -1
- data/lib/osso/graphql/mutations/delete_enterprise_account.rb +1 -2
- data/lib/osso/graphql/mutations/delete_identity_provider.rb +1 -1
- data/lib/osso/graphql/mutations/regenerate_oauth_credentials.rb +7 -1
- data/lib/osso/graphql/query.rb +26 -31
- data/lib/osso/graphql/schema.rb +0 -1
- data/lib/osso/lib/analytics.rb +4 -4
- data/lib/osso/lib/route_map.rb +2 -0
- data/lib/osso/models/account.rb +1 -1
- data/lib/osso/models/identity_provider.rb +3 -3
- data/lib/osso/routes/admin.rb +2 -2
- data/lib/osso/routes/auth.rb +2 -0
- data/lib/osso/routes/oauth.rb +1 -1
- data/lib/osso/version.rb +1 -1
- data/lib/tasks/bootstrap.rake +6 -4
- data/osso-rb.gemspec +4 -3
- data/spec/graphql/mutations/create_identity_provider_spec.rb +1 -1
- data/spec/models/identity_provider_spec.rb +1 -1
- data/spec/routes/admin_spec.rb +6 -6
- data/spec/routes/auth_spec.rb +5 -3
- data/spec/routes/oauth_spec.rb +7 -13
- data/spec/spec_helper.rb +2 -0
- data/spec/support/views/saml_login_form.erb +1 -0
- metadata +27 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c263ca76f08c31c90de62d7b81c1d1d8b93817dba65f9424b81223ae2c003418
|
|
4
|
+
data.tar.gz: 6e869dff216866735060d0cae9a478a3bdbc76a59b0a5b2b06ad419dca0c09c3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e8d2b6df9b9520d209cdda204d8a69d8d072277bbb5d2ec3a961bbdf2710712d07fc6a9b2cfd1683f6e53450b54e61706a4e49418286d9cce161ebc03690bbe
|
|
7
|
+
data.tar.gz: a9d71e8fc6fe531c48b51c8534a8dfedbb94d265f97ae6b1365ad47485a34ee8cf0ffc5ad4e426f0dc4e1d818f57b425a1fa6c697a8e638a76d80627ee5d728e
|
data/.rubocop.yml
CHANGED
|
@@ -1,25 +1,10 @@
|
|
|
1
1
|
AllCops:
|
|
2
|
+
NewCops: enable
|
|
2
3
|
TargetRubyVersion: 2.6.0
|
|
3
4
|
Exclude:
|
|
4
5
|
- db/**/*
|
|
5
6
|
- lib/osso/db/**/*
|
|
6
7
|
|
|
7
|
-
# New rules must be explicitly opted into / out of
|
|
8
|
-
Lint/RaiseException:
|
|
9
|
-
Enabled: true
|
|
10
|
-
Lint/StructNewOverride:
|
|
11
|
-
Enabled: true
|
|
12
|
-
Style/HashEachMethods:
|
|
13
|
-
Enabled: true
|
|
14
|
-
Style/HashTransformKeys:
|
|
15
|
-
Enabled: true
|
|
16
|
-
Style/HashTransformValues:
|
|
17
|
-
Enabled: true
|
|
18
|
-
Layout/SpaceAroundMethodCallOperator:
|
|
19
|
-
Enabled: true
|
|
20
|
-
Style/ExponentialNotation:
|
|
21
|
-
Enabled: true
|
|
22
|
-
|
|
23
8
|
Style/TrailingCommaInArguments:
|
|
24
9
|
Description: "Checks for trailing comma in argument lists."
|
|
25
10
|
StyleGuide: "https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas"
|
|
@@ -50,6 +35,9 @@ Style/TrailingCommaInHashLiteral:
|
|
|
50
35
|
- no_comma
|
|
51
36
|
Enabled: true
|
|
52
37
|
|
|
38
|
+
Layout/FirstHashElementIndentation:
|
|
39
|
+
EnforcedStyle: consistent
|
|
40
|
+
|
|
53
41
|
Layout/MultilineMethodCallIndentation:
|
|
54
42
|
EnforcedStyle: indented
|
|
55
43
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
osso (0.0
|
|
4
|
+
osso (0.1.0)
|
|
5
5
|
activesupport (>= 6.0.3.2)
|
|
6
6
|
bcrypt (~> 3.1.13)
|
|
7
7
|
graphql
|
|
@@ -13,23 +13,24 @@ PATH
|
|
|
13
13
|
rack (>= 2.1.4)
|
|
14
14
|
rack-contrib
|
|
15
15
|
rack-oauth2
|
|
16
|
+
rack-protection (~> 2.1.0)
|
|
16
17
|
rake
|
|
17
|
-
rodauth (
|
|
18
|
-
sequel (
|
|
18
|
+
rodauth (~> 2.9)
|
|
19
|
+
sequel (~> 5.40)
|
|
19
20
|
sequel-activerecord_connection (>= 0.3, < 2.0)
|
|
20
21
|
sinatra
|
|
21
|
-
sinatra-activerecord
|
|
22
|
+
sinatra-activerecord (>= 2.0.22)
|
|
22
23
|
sinatra-contrib
|
|
23
24
|
|
|
24
25
|
GEM
|
|
25
26
|
remote: https://rubygems.org/
|
|
26
27
|
specs:
|
|
27
|
-
activemodel (6.1.
|
|
28
|
-
activesupport (= 6.1.
|
|
29
|
-
activerecord (6.1.
|
|
30
|
-
activemodel (= 6.1.
|
|
31
|
-
activesupport (= 6.1.
|
|
32
|
-
activesupport (6.1.
|
|
28
|
+
activemodel (6.1.1)
|
|
29
|
+
activesupport (= 6.1.1)
|
|
30
|
+
activerecord (6.1.1)
|
|
31
|
+
activemodel (= 6.1.1)
|
|
32
|
+
activesupport (= 6.1.1)
|
|
33
|
+
activesupport (6.1.1)
|
|
33
34
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
34
35
|
i18n (>= 1.6, < 2)
|
|
35
36
|
minitest (>= 5.1)
|
|
@@ -43,28 +44,29 @@ GEM
|
|
|
43
44
|
annotate (3.1.1)
|
|
44
45
|
activerecord (>= 3.2, < 7.0)
|
|
45
46
|
rake (>= 10.4, < 14.0)
|
|
46
|
-
ast (2.4.
|
|
47
|
+
ast (2.4.2)
|
|
47
48
|
attr_required (1.0.1)
|
|
48
49
|
bcrypt (3.1.16)
|
|
49
50
|
bindata (2.4.8)
|
|
50
51
|
coderay (1.1.3)
|
|
51
|
-
concurrent-ruby (1.1.
|
|
52
|
-
crack (0.4.
|
|
52
|
+
concurrent-ruby (1.1.8)
|
|
53
|
+
crack (0.4.5)
|
|
54
|
+
rexml
|
|
53
55
|
database_cleaner (1.8.5)
|
|
54
56
|
database_cleaner-active_record (1.8.0)
|
|
55
57
|
activerecord
|
|
56
58
|
database_cleaner (~> 1.8.0)
|
|
57
59
|
diff-lcs (1.4.4)
|
|
58
|
-
docile (1.3.
|
|
60
|
+
docile (1.3.5)
|
|
59
61
|
factory_bot (6.1.0)
|
|
60
62
|
activesupport (>= 5.0.0)
|
|
61
63
|
faker (2.15.1)
|
|
62
64
|
i18n (>= 1.6, < 2)
|
|
63
|
-
graphql (1.
|
|
65
|
+
graphql (1.12.2)
|
|
64
66
|
hashdiff (1.0.1)
|
|
65
67
|
hashie (4.1.0)
|
|
66
68
|
httpclient (2.8.3)
|
|
67
|
-
i18n (1.8.
|
|
69
|
+
i18n (1.8.7)
|
|
68
70
|
concurrent-ruby (~> 1.0)
|
|
69
71
|
json-jwt (1.13.0)
|
|
70
72
|
activesupport (>= 4.2)
|
|
@@ -76,20 +78,21 @@ GEM
|
|
|
76
78
|
method_source (1.0.0)
|
|
77
79
|
mini_mime (1.0.2)
|
|
78
80
|
mini_portile2 (2.5.0)
|
|
79
|
-
minitest (5.14.
|
|
81
|
+
minitest (5.14.3)
|
|
80
82
|
multi_json (1.15.0)
|
|
81
83
|
mustermann (1.1.1)
|
|
82
84
|
ruby2_keywords (~> 0.0.1)
|
|
83
85
|
nokogiri (1.11.1)
|
|
84
86
|
mini_portile2 (~> 2.5.0)
|
|
85
87
|
racc (~> 1.4)
|
|
86
|
-
omniauth (
|
|
88
|
+
omniauth (2.0.1)
|
|
87
89
|
hashie (>= 3.4.6)
|
|
88
90
|
rack (>= 1.6.2, < 3)
|
|
91
|
+
rack-protection
|
|
89
92
|
omniauth-multi-provider (0.2.1)
|
|
90
93
|
omniauth
|
|
91
|
-
omniauth-saml (
|
|
92
|
-
omniauth (~>
|
|
94
|
+
omniauth-saml (2.0.0)
|
|
95
|
+
omniauth (~> 2.0)
|
|
93
96
|
ruby-saml (~> 1.9)
|
|
94
97
|
parallel (1.20.1)
|
|
95
98
|
parser (3.0.0.0)
|
|
@@ -116,47 +119,47 @@ GEM
|
|
|
116
119
|
rack (>= 1.0, < 3)
|
|
117
120
|
rainbow (3.0.0)
|
|
118
121
|
rake (13.0.3)
|
|
119
|
-
regexp_parser (2.0.
|
|
122
|
+
regexp_parser (2.0.3)
|
|
120
123
|
rexml (3.2.4)
|
|
121
|
-
roda (3.
|
|
124
|
+
roda (3.40.0)
|
|
122
125
|
rack
|
|
123
|
-
rodauth (2.
|
|
126
|
+
rodauth (2.9.0)
|
|
124
127
|
roda (>= 2.6.0)
|
|
125
128
|
sequel (>= 4)
|
|
126
129
|
rspec (3.10.0)
|
|
127
130
|
rspec-core (~> 3.10.0)
|
|
128
131
|
rspec-expectations (~> 3.10.0)
|
|
129
132
|
rspec-mocks (~> 3.10.0)
|
|
130
|
-
rspec-core (3.10.
|
|
133
|
+
rspec-core (3.10.1)
|
|
131
134
|
rspec-support (~> 3.10.0)
|
|
132
|
-
rspec-expectations (3.10.
|
|
135
|
+
rspec-expectations (3.10.1)
|
|
133
136
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
134
137
|
rspec-support (~> 3.10.0)
|
|
135
|
-
rspec-mocks (3.10.
|
|
138
|
+
rspec-mocks (3.10.1)
|
|
136
139
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
137
140
|
rspec-support (~> 3.10.0)
|
|
138
|
-
rspec-support (3.10.
|
|
139
|
-
rubocop (1.
|
|
141
|
+
rspec-support (3.10.1)
|
|
142
|
+
rubocop (1.8.1)
|
|
140
143
|
parallel (~> 1.10)
|
|
141
|
-
parser (>=
|
|
144
|
+
parser (>= 3.0.0.0)
|
|
142
145
|
rainbow (>= 2.2.2, < 4.0)
|
|
143
146
|
regexp_parser (>= 1.8, < 3.0)
|
|
144
147
|
rexml
|
|
145
148
|
rubocop-ast (>= 1.2.0, < 2.0)
|
|
146
149
|
ruby-progressbar (~> 1.7)
|
|
147
|
-
unicode-display_width (>= 1.4.0, <
|
|
148
|
-
rubocop-ast (1.
|
|
150
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
151
|
+
rubocop-ast (1.4.1)
|
|
149
152
|
parser (>= 2.7.1.5)
|
|
150
|
-
ruby-progressbar (1.
|
|
153
|
+
ruby-progressbar (1.11.0)
|
|
151
154
|
ruby-saml (1.11.0)
|
|
152
155
|
nokogiri (>= 1.5.10)
|
|
153
|
-
ruby2_keywords (0.0.
|
|
154
|
-
sequel (5.
|
|
155
|
-
sequel-activerecord_connection (1.2.
|
|
156
|
+
ruby2_keywords (0.0.4)
|
|
157
|
+
sequel (5.40.0)
|
|
158
|
+
sequel-activerecord_connection (1.2.2)
|
|
156
159
|
activerecord (>= 4.2, < 7)
|
|
157
160
|
after_commit_everywhere (~> 0.1.5)
|
|
158
161
|
sequel (~> 5.16)
|
|
159
|
-
simplecov (0.21.
|
|
162
|
+
simplecov (0.21.2)
|
|
160
163
|
docile (~> 1.1)
|
|
161
164
|
simplecov-html (~> 0.11)
|
|
162
165
|
simplecov_json_formatter (~> 0.1)
|
|
@@ -167,7 +170,7 @@ GEM
|
|
|
167
170
|
rack (~> 2.2)
|
|
168
171
|
rack-protection (= 2.1.0)
|
|
169
172
|
tilt (~> 2.0)
|
|
170
|
-
sinatra-activerecord (2.0.
|
|
173
|
+
sinatra-activerecord (2.0.22)
|
|
171
174
|
activerecord (>= 4.1)
|
|
172
175
|
sinatra (>= 1.0)
|
|
173
176
|
sinatra-contrib (2.1.0)
|
|
@@ -177,10 +180,10 @@ GEM
|
|
|
177
180
|
sinatra (= 2.1.0)
|
|
178
181
|
tilt (~> 2.0)
|
|
179
182
|
tilt (2.0.10)
|
|
180
|
-
tzinfo (2.0.
|
|
183
|
+
tzinfo (2.0.4)
|
|
181
184
|
concurrent-ruby (~> 1.0)
|
|
182
|
-
unicode-display_width (
|
|
183
|
-
webmock (3.11.
|
|
185
|
+
unicode-display_width (2.0.0)
|
|
186
|
+
webmock (3.11.1)
|
|
184
187
|
addressable (>= 2.3.6)
|
|
185
188
|
crack (>= 0.3.2)
|
|
186
189
|
hashdiff (>= 0.4.0, < 2.0.0)
|
|
@@ -201,7 +204,7 @@ DEPENDENCIES
|
|
|
201
204
|
rack-test
|
|
202
205
|
rspec (~> 3.10)
|
|
203
206
|
rubocop
|
|
204
|
-
simplecov (= 0.21.
|
|
207
|
+
simplecov (= 0.21.2)
|
|
205
208
|
webmock (~> 3.11)
|
|
206
209
|
|
|
207
210
|
BUNDLED WITH
|
|
@@ -17,7 +17,7 @@ module Osso
|
|
|
17
17
|
|
|
18
18
|
if provider.update(args)
|
|
19
19
|
Osso::Analytics.capture(email: context[:email], event: self.class.name.demodulize, properties: args)
|
|
20
|
-
return response_data(identity_provider: provider)
|
|
20
|
+
return response_data(identity_provider: provider)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
response_error(provider.errors)
|
|
@@ -17,7 +17,7 @@ module Osso
|
|
|
17
17
|
|
|
18
18
|
if enterprise_account.save
|
|
19
19
|
Osso::Analytics.capture(email: context[:email], event: self.class.name.demodulize, properties: args)
|
|
20
|
-
return response_data(enterprise_account: enterprise_account)
|
|
20
|
+
return response_data(enterprise_account: enterprise_account)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
response_error(enterprise_account.errors)
|
|
@@ -13,7 +13,7 @@ module Osso
|
|
|
13
13
|
field :identity_provider, Types::IdentityProvider, null: false
|
|
14
14
|
field :errors, [String], null: false
|
|
15
15
|
|
|
16
|
-
def resolve(
|
|
16
|
+
def resolve(enterprise_account_id:, oauth_client_id:, service: nil)
|
|
17
17
|
customer = enterprise_account(enterprise_account_id: enterprise_account_id)
|
|
18
18
|
|
|
19
19
|
identity_provider = customer.identity_providers.build(
|
|
@@ -27,12 +27,12 @@ module Osso
|
|
|
27
27
|
service: service, enterprise_account_id: enterprise_account_id, oauth_client_id: oauth_client_id
|
|
28
28
|
})
|
|
29
29
|
return response_data(identity_provider: identity_provider)
|
|
30
|
-
end
|
|
30
|
+
end
|
|
31
31
|
|
|
32
32
|
response_error(identity_provider.errors)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def domain(enterprise_account_id:, **
|
|
35
|
+
def domain(enterprise_account_id:, **_args)
|
|
36
36
|
enterprise_account(enterprise_account_id: enterprise_account_id)&.domain
|
|
37
37
|
end
|
|
38
38
|
|
|
@@ -16,7 +16,7 @@ module Osso
|
|
|
16
16
|
|
|
17
17
|
if oauth_client.save
|
|
18
18
|
Osso::Analytics.capture(email: context[:email], event: self.class.name.demodulize, properties: args)
|
|
19
|
-
return response_data(oauth_client: oauth_client)
|
|
19
|
+
return response_data(oauth_client: oauth_client)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
response_error(oauth_client.errors)
|
|
@@ -20,9 +20,8 @@ module Osso
|
|
|
20
20
|
|
|
21
21
|
if customer.destroy
|
|
22
22
|
Osso::Analytics.capture(email: context[:email], event: self.class.name.demodulize, properties: args)
|
|
23
|
-
return response_data(enterprise_account: nil)
|
|
23
|
+
return response_data(enterprise_account: nil)
|
|
24
24
|
end
|
|
25
|
-
|
|
26
25
|
|
|
27
26
|
response_error(customer.errors)
|
|
28
27
|
end
|
|
@@ -16,7 +16,7 @@ module Osso
|
|
|
16
16
|
|
|
17
17
|
if identity_provider.destroy
|
|
18
18
|
Osso::Analytics.capture(email: context[:email], event: self.class.name.demodulize, properties: { id: id })
|
|
19
|
-
return response_data(identity_provider: nil)
|
|
19
|
+
return response_data(identity_provider: nil)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
response_error(identity_provider.errors)
|
|
@@ -16,7 +16,13 @@ module Osso
|
|
|
16
16
|
oauth_client.regenerate_secrets!
|
|
17
17
|
|
|
18
18
|
if oauth_client.save
|
|
19
|
-
Osso::Analytics.capture(
|
|
19
|
+
Osso::Analytics.capture(
|
|
20
|
+
email: context[:email],
|
|
21
|
+
event: self.class.name.demodulize,
|
|
22
|
+
properties: {
|
|
23
|
+
oauth_client_id: id
|
|
24
|
+
}
|
|
25
|
+
)
|
|
20
26
|
return response_data(oauth_client: oauth_client)
|
|
21
27
|
end
|
|
22
28
|
|
data/lib/osso/graphql/query.rb
CHANGED
|
@@ -16,44 +16,39 @@ module Osso
|
|
|
16
16
|
|
|
17
17
|
field :oauth_clients, null: true, resolver: Resolvers::OAuthClients
|
|
18
18
|
|
|
19
|
-
field
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
field :admin_users, [Types::AdminUser], null: false
|
|
20
|
+
|
|
21
|
+
field :app_config, Types::AppConfig, null: false
|
|
22
|
+
|
|
23
|
+
field :current_user, Types::AdminUser, null: false
|
|
24
|
+
|
|
25
|
+
field :identity_provider, Types::IdentityProvider, null: true do
|
|
25
26
|
argument :id, ID, required: true
|
|
26
27
|
end
|
|
27
28
|
|
|
28
|
-
field
|
|
29
|
-
:app_config,
|
|
30
|
-
Types::AppConfig,
|
|
31
|
-
null: false,
|
|
32
|
-
resolve: ->(_obj, _args, _context) { Osso::Models::AppConfig.find },
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
field(
|
|
36
|
-
:oauth_client,
|
|
37
|
-
Types::OauthClient,
|
|
38
|
-
null: true,
|
|
39
|
-
resolve: ->(_obj, args, _context) { Osso::Models::OauthClient.find(args[:id]) },
|
|
40
|
-
) do
|
|
29
|
+
field :oauth_client, Types::OauthClient, null: true do
|
|
41
30
|
argument :id, ID, required: true
|
|
42
31
|
end
|
|
43
32
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
33
|
+
def admin_users
|
|
34
|
+
Osso::Models::Account.all
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def app_config
|
|
38
|
+
Osso::Models::AppConfig.find
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def current_user
|
|
42
|
+
context.to_h
|
|
43
|
+
end
|
|
50
44
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
def identity_provider(id:)
|
|
46
|
+
Osso::Models::IdentityProvider.find(id)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def oauth_client(id:)
|
|
50
|
+
Osso::Models::OauthClient.find(id)
|
|
51
|
+
end
|
|
57
52
|
end
|
|
58
53
|
end
|
|
59
54
|
end
|
data/lib/osso/graphql/schema.rb
CHANGED
data/lib/osso/lib/analytics.rb
CHANGED
|
@@ -5,9 +5,9 @@ require 'posthog-ruby'
|
|
|
5
5
|
module Osso
|
|
6
6
|
# Osso::Analytics provides an interface to track product analytics for any provider.
|
|
7
7
|
# Osso recommends PostHog as an open source solution for your product analytics needs.
|
|
8
|
-
# If you want to use another product analytics provider, you can patch the Osso::Analytics
|
|
8
|
+
# If you want to use another product analytics provider, you can patch the Osso::Analytics
|
|
9
9
|
# class yourself in your parent application. Be sure to implement the public
|
|
10
|
-
# .identify and .capture class methods with the required method signatures and require
|
|
10
|
+
# .identify and .capture class methods with the required method signatures and require
|
|
11
11
|
# your class after requiring Osso.
|
|
12
12
|
class Analytics
|
|
13
13
|
class << self
|
|
@@ -40,7 +40,7 @@ module Osso
|
|
|
40
40
|
@client ||= PostHog::Client.new({
|
|
41
41
|
api_key: ENV['POSTHOG_API_KEY'],
|
|
42
42
|
api_host: ENV['POSTHOG_HOST'],
|
|
43
|
-
on_error:
|
|
43
|
+
on_error: proc { |_status, msg| print msg },
|
|
44
44
|
})
|
|
45
45
|
end
|
|
46
46
|
|
|
@@ -52,4 +52,4 @@ module Osso
|
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
|
-
end
|
|
55
|
+
end
|
data/lib/osso/lib/route_map.rb
CHANGED
data/lib/osso/models/account.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Osso
|
|
|
18
18
|
|
|
19
19
|
ENTITY_ID_URI_REQUIRED = [
|
|
20
20
|
'PING',
|
|
21
|
-
]
|
|
21
|
+
].freeze
|
|
22
22
|
|
|
23
23
|
def name
|
|
24
24
|
service.titlecase
|
|
@@ -30,7 +30,7 @@ module Osso
|
|
|
30
30
|
idp_sso_target_url: sso_url,
|
|
31
31
|
idp_cert: sso_cert,
|
|
32
32
|
issuer: sso_issuer,
|
|
33
|
-
name_identifier_format:
|
|
33
|
+
name_identifier_format: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
|
|
34
34
|
}
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -56,7 +56,7 @@ module Osso
|
|
|
56
56
|
|
|
57
57
|
def set_sso_issuer
|
|
58
58
|
parts = [domain, oauth_client_id]
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
parts.unshift('https:/') if ENTITY_ID_URI_REQUIRED.any?(service)
|
|
61
61
|
|
|
62
62
|
self.sso_issuer = parts.join('/')
|
data/lib/osso/routes/admin.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Osso
|
|
|
9
9
|
class Admin < Roda
|
|
10
10
|
DB = Sequel.postgres(extensions: :activerecord_connection)
|
|
11
11
|
use Rack::Session::Cookie, secret: ENV.fetch('SESSION_SECRET')
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
plugin :json
|
|
14
14
|
plugin :middleware
|
|
15
15
|
plugin :render, engine: 'erb', views: ENV['RODAUTH_VIEWS'] || DEFAULT_VIEWS_DIR
|
|
@@ -64,7 +64,7 @@ module Osso
|
|
|
64
64
|
rodauth.
|
|
65
65
|
session.
|
|
66
66
|
to_hash.
|
|
67
|
-
stringify_keys['account_id']
|
|
67
|
+
stringify_keys['account_id'],
|
|
68
68
|
).context.
|
|
69
69
|
merge({ rodauth: rodauth })
|
|
70
70
|
end
|
data/lib/osso/routes/auth.rb
CHANGED
|
@@ -14,6 +14,8 @@ module Osso
|
|
|
14
14
|
/[0-9a-f]{8}-[0-9a-f]{3,4}-[0-9a-f]{4}-[0-9a-f]{3,4}-[0-9a-f]{12}/.
|
|
15
15
|
freeze
|
|
16
16
|
|
|
17
|
+
use Rack::Protection, allow_if: ->(env) { Rack::Request.new(env)&.path&.end_with?('callback') }
|
|
18
|
+
|
|
17
19
|
use OmniAuth::Builder do
|
|
18
20
|
OmniAuth::MultiProvider.register(
|
|
19
21
|
self,
|
data/lib/osso/routes/oauth.rb
CHANGED
data/lib/osso/version.rb
CHANGED
data/lib/tasks/bootstrap.rake
CHANGED
|
@@ -8,9 +8,11 @@ namespace :osso do
|
|
|
8
8
|
desc 'Bootstrap Osso data for a deployment'
|
|
9
9
|
task :bootstrap do
|
|
10
10
|
%w[Production Staging Development].each do |environment|
|
|
11
|
+
next if Osso::Models::OauthClient.find_by_name(environment)
|
|
12
|
+
|
|
11
13
|
Osso::Models::OauthClient.create!(
|
|
12
14
|
name: environment,
|
|
13
|
-
)
|
|
15
|
+
)
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
Osso::Models::AppConfig.create
|
|
@@ -18,7 +20,7 @@ namespace :osso do
|
|
|
18
20
|
admin_email = ENV['ADMIN_EMAIL']
|
|
19
21
|
|
|
20
22
|
if admin_email
|
|
21
|
-
|
|
23
|
+
Osso::Models::Account.create(
|
|
22
24
|
email: admin_email,
|
|
23
25
|
status_id: 1,
|
|
24
26
|
role: 'admin',
|
|
@@ -29,10 +31,10 @@ namespace :osso do
|
|
|
29
31
|
rodauth = Osso::Admin.rodauth.new(Osso::Admin.new({
|
|
30
32
|
'HTTP_HOST' => base_uri.host,
|
|
31
33
|
'SERVER_NAME' => base_uri.to_s,
|
|
32
|
-
'rack.url_scheme' => base_uri.scheme
|
|
34
|
+
'rack.url_scheme' => base_uri.scheme,
|
|
33
35
|
}))
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
rodauth.account_from_login(admin_email)
|
|
36
38
|
rodauth.setup_account_verification
|
|
37
39
|
end
|
|
38
40
|
end
|
data/osso-rb.gemspec
CHANGED
|
@@ -26,12 +26,13 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
spec.add_runtime_dependency 'rack', '>= 2.1.4'
|
|
27
27
|
spec.add_runtime_dependency 'rack-contrib'
|
|
28
28
|
spec.add_runtime_dependency 'rack-oauth2'
|
|
29
|
+
spec.add_runtime_dependency 'rack-protection', '~> 2.1.0'
|
|
29
30
|
spec.add_runtime_dependency 'rake'
|
|
30
|
-
spec.add_runtime_dependency 'rodauth', '
|
|
31
|
-
spec.add_runtime_dependency 'sequel', '
|
|
31
|
+
spec.add_runtime_dependency 'rodauth', '~> 2.9'
|
|
32
|
+
spec.add_runtime_dependency 'sequel', '~> 5.40'
|
|
32
33
|
spec.add_runtime_dependency 'sequel-activerecord_connection', '>= 0.3', '< 2.0'
|
|
33
34
|
spec.add_runtime_dependency 'sinatra'
|
|
34
|
-
spec.add_runtime_dependency 'sinatra-activerecord'
|
|
35
|
+
spec.add_runtime_dependency 'sinatra-activerecord', '>= 2.0.22'
|
|
35
36
|
spec.add_runtime_dependency 'sinatra-contrib'
|
|
36
37
|
|
|
37
38
|
spec.add_development_dependency 'annotate', '~> 3.1'
|
|
@@ -91,7 +91,7 @@ describe Osso::GraphQL::Schema do
|
|
|
91
91
|
},
|
|
92
92
|
}
|
|
93
93
|
end
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
it 'creates an identity provider' do
|
|
96
96
|
expect { subject }.to change { enterprise_account.identity_providers.count }.by(1)
|
|
97
97
|
expect(subject.dig('data', 'createIdentityProvider', 'identityProvider', 'domain')).
|
|
@@ -66,7 +66,7 @@ describe Osso::Models::IdentityProvider do
|
|
|
66
66
|
idp_cert: subject.sso_cert,
|
|
67
67
|
idp_sso_target_url: subject.sso_url,
|
|
68
68
|
issuer: subject.sso_issuer,
|
|
69
|
-
name_identifier_format:
|
|
69
|
+
name_identifier_format: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
|
|
70
70
|
)
|
|
71
71
|
end
|
|
72
72
|
end
|
data/spec/routes/admin_spec.rb
CHANGED
|
@@ -17,26 +17,26 @@ describe Osso::Admin do
|
|
|
17
17
|
it 'runs a GraphQL query with a valid jwt' do
|
|
18
18
|
allow_any_instance_of(described_class.rodauth).to receive(:logged_in?).and_return(true)
|
|
19
19
|
allow(Osso::Models::Account).to receive(:find).and_return(account)
|
|
20
|
-
allow(Osso::GraphQL::Schema).to receive(:execute).and_return({graphql: true})
|
|
20
|
+
allow(Osso::GraphQL::Schema).to receive(:execute).and_return({ graphql: true })
|
|
21
21
|
|
|
22
22
|
header 'Content-Type', 'application/json'
|
|
23
|
-
post(
|
|
23
|
+
post('/graphql')
|
|
24
24
|
|
|
25
25
|
expect(last_response).to be_ok
|
|
26
|
-
expect(last_json_response).to eq({graphql: true})
|
|
26
|
+
expect(last_json_response).to eq({ graphql: true })
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
it 'returns a 400 for an invalid jwt' do
|
|
30
30
|
header 'Content-Type', 'application/json'
|
|
31
31
|
header 'Authorization', 'Bearer bad-token'
|
|
32
|
-
post(
|
|
32
|
+
post('/graphql')
|
|
33
33
|
|
|
34
34
|
expect(last_response.status).to eq 400
|
|
35
35
|
end
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
it 'returns a 401 without a jwt' do
|
|
38
38
|
header 'Content-Type', 'application/json'
|
|
39
|
-
post(
|
|
39
|
+
post('/graphql')
|
|
40
40
|
|
|
41
41
|
expect(last_response.status).to eq 401
|
|
42
42
|
end
|
data/spec/routes/auth_spec.rb
CHANGED
|
@@ -6,12 +6,13 @@ describe Osso::Auth do
|
|
|
6
6
|
before do
|
|
7
7
|
described_class.set(:views, spec_views)
|
|
8
8
|
end
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
describe 'post /auth/saml/:uuid' do
|
|
10
11
|
describe 'for an Okta SAML provider' do
|
|
11
12
|
let(:enterprise) { create(:enterprise_with_okta) }
|
|
12
13
|
let(:okta_provider) { enterprise.identity_providers.first }
|
|
13
14
|
it 'uses omniauth saml' do
|
|
14
|
-
|
|
15
|
+
post("/auth/saml/#{okta_provider.id}")
|
|
15
16
|
|
|
16
17
|
expect(last_response).to be_redirect
|
|
17
18
|
follow_redirect!
|
|
@@ -23,7 +24,7 @@ describe Osso::Auth do
|
|
|
23
24
|
let(:enterprise) { create(:enterprise_with_okta) }
|
|
24
25
|
let(:azure_provider) { enterprise.identity_providers.first }
|
|
25
26
|
it 'uses omniauth saml' do
|
|
26
|
-
|
|
27
|
+
post("/auth/saml/#{azure_provider.id}")
|
|
27
28
|
|
|
28
29
|
expect(last_response).to be_redirect
|
|
29
30
|
follow_redirect!
|
|
@@ -31,6 +32,7 @@ describe Osso::Auth do
|
|
|
31
32
|
end
|
|
32
33
|
end
|
|
33
34
|
end
|
|
35
|
+
|
|
34
36
|
describe 'post /auth/saml/:uuid/callback' do
|
|
35
37
|
describe 'for an Okta SAML provider' do
|
|
36
38
|
let(:enterprise) { create(:enterprise_with_okta) }
|
data/spec/routes/oauth_spec.rb
CHANGED
|
@@ -28,7 +28,7 @@ describe Osso::Oauth do
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
describe 'for a request without email or domain' do
|
|
31
|
-
it '
|
|
31
|
+
it 'renders the hosted login page' do
|
|
32
32
|
get(
|
|
33
33
|
'/oauth/authorize',
|
|
34
34
|
client_id: client.identifier,
|
|
@@ -42,7 +42,7 @@ describe Osso::Oauth do
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
describe 'for an enterprise domain with one SAML provider' do
|
|
45
|
-
it '
|
|
45
|
+
it 'renders the saml login form' do
|
|
46
46
|
enterprise = create(:enterprise_with_okta, oauth_client: client)
|
|
47
47
|
|
|
48
48
|
get(
|
|
@@ -55,9 +55,7 @@ describe Osso::Oauth do
|
|
|
55
55
|
|
|
56
56
|
provider_id = enterprise.identity_providers.first.id
|
|
57
57
|
|
|
58
|
-
expect(last_response).to
|
|
59
|
-
follow_redirect!
|
|
60
|
-
expect(last_request.url).to match("auth/saml/#{provider_id}")
|
|
58
|
+
expect(last_response.body).to match(provider_id)
|
|
61
59
|
end
|
|
62
60
|
end
|
|
63
61
|
|
|
@@ -79,7 +77,7 @@ describe Osso::Oauth do
|
|
|
79
77
|
end
|
|
80
78
|
|
|
81
79
|
describe "for an existing user's email address" do
|
|
82
|
-
it '
|
|
80
|
+
it 'renders the saml login form' do
|
|
83
81
|
enterprise = create(:enterprise_with_okta, oauth_client: client)
|
|
84
82
|
provider_id = enterprise.identity_providers.first.id
|
|
85
83
|
user = create(:user, email: "user@#{enterprise.domain}", identity_provider_id: provider_id)
|
|
@@ -92,14 +90,12 @@ describe Osso::Oauth do
|
|
|
92
90
|
redirect_uri: client.redirect_uri_values.sample,
|
|
93
91
|
)
|
|
94
92
|
|
|
95
|
-
expect(last_response).to
|
|
96
|
-
follow_redirect!
|
|
97
|
-
expect(last_request.url).to match("auth/saml/#{provider_id}")
|
|
93
|
+
expect(last_response.body).to match(provider_id)
|
|
98
94
|
end
|
|
99
95
|
end
|
|
100
96
|
|
|
101
97
|
describe "for a new user's email address belonging to an enterprise with one SAML provider" do
|
|
102
|
-
it '
|
|
98
|
+
it 'renders the saml login form' do
|
|
103
99
|
enterprise = create(:enterprise_with_okta, oauth_client: client)
|
|
104
100
|
|
|
105
101
|
get(
|
|
@@ -112,9 +108,7 @@ describe Osso::Oauth do
|
|
|
112
108
|
|
|
113
109
|
provider_id = enterprise.identity_providers.first.id
|
|
114
110
|
|
|
115
|
-
expect(last_response).to
|
|
116
|
-
follow_redirect!
|
|
117
|
-
expect(last_request.url).to match("auth/saml/#{provider_id}")
|
|
111
|
+
expect(last_response.body).to match(provider_id)
|
|
118
112
|
end
|
|
119
113
|
end
|
|
120
114
|
|
data/spec/spec_helper.rb
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= @providers.first.id %>
|
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
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sam Bauch
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-01-
|
|
11
|
+
date: 2021-01-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -164,6 +164,20 @@ dependencies:
|
|
|
164
164
|
- - ">="
|
|
165
165
|
- !ruby/object:Gem::Version
|
|
166
166
|
version: '0'
|
|
167
|
+
- !ruby/object:Gem::Dependency
|
|
168
|
+
name: rack-protection
|
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - "~>"
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: 2.1.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.1.0
|
|
167
181
|
- !ruby/object:Gem::Dependency
|
|
168
182
|
name: rake
|
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -182,42 +196,30 @@ dependencies:
|
|
|
182
196
|
name: rodauth
|
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
|
184
198
|
requirements:
|
|
185
|
-
- - "
|
|
186
|
-
- !ruby/object:Gem::Version
|
|
187
|
-
version: '2.6'
|
|
188
|
-
- - "<"
|
|
199
|
+
- - "~>"
|
|
189
200
|
- !ruby/object:Gem::Version
|
|
190
|
-
version: '2.
|
|
201
|
+
version: '2.9'
|
|
191
202
|
type: :runtime
|
|
192
203
|
prerelease: false
|
|
193
204
|
version_requirements: !ruby/object:Gem::Requirement
|
|
194
205
|
requirements:
|
|
195
|
-
- - "
|
|
196
|
-
- !ruby/object:Gem::Version
|
|
197
|
-
version: '2.6'
|
|
198
|
-
- - "<"
|
|
206
|
+
- - "~>"
|
|
199
207
|
- !ruby/object:Gem::Version
|
|
200
|
-
version: '2.
|
|
208
|
+
version: '2.9'
|
|
201
209
|
- !ruby/object:Gem::Dependency
|
|
202
210
|
name: sequel
|
|
203
211
|
requirement: !ruby/object:Gem::Requirement
|
|
204
212
|
requirements:
|
|
205
|
-
- - "
|
|
206
|
-
- !ruby/object:Gem::Version
|
|
207
|
-
version: '5.37'
|
|
208
|
-
- - "<"
|
|
213
|
+
- - "~>"
|
|
209
214
|
- !ruby/object:Gem::Version
|
|
210
|
-
version: '5.
|
|
215
|
+
version: '5.40'
|
|
211
216
|
type: :runtime
|
|
212
217
|
prerelease: false
|
|
213
218
|
version_requirements: !ruby/object:Gem::Requirement
|
|
214
219
|
requirements:
|
|
215
|
-
- - "
|
|
216
|
-
- !ruby/object:Gem::Version
|
|
217
|
-
version: '5.37'
|
|
218
|
-
- - "<"
|
|
220
|
+
- - "~>"
|
|
219
221
|
- !ruby/object:Gem::Version
|
|
220
|
-
version: '5.
|
|
222
|
+
version: '5.40'
|
|
221
223
|
- !ruby/object:Gem::Dependency
|
|
222
224
|
name: sequel-activerecord_connection
|
|
223
225
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -258,14 +260,14 @@ dependencies:
|
|
|
258
260
|
requirements:
|
|
259
261
|
- - ">="
|
|
260
262
|
- !ruby/object:Gem::Version
|
|
261
|
-
version:
|
|
263
|
+
version: 2.0.22
|
|
262
264
|
type: :runtime
|
|
263
265
|
prerelease: false
|
|
264
266
|
version_requirements: !ruby/object:Gem::Requirement
|
|
265
267
|
requirements:
|
|
266
268
|
- - ">="
|
|
267
269
|
- !ruby/object:Gem::Version
|
|
268
|
-
version:
|
|
270
|
+
version: 2.0.22
|
|
269
271
|
- !ruby/object:Gem::Dependency
|
|
270
272
|
name: sinatra-contrib
|
|
271
273
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -486,6 +488,7 @@ files:
|
|
|
486
488
|
- spec/support/views/hosted_login.erb
|
|
487
489
|
- spec/support/views/layout.erb
|
|
488
490
|
- spec/support/views/multiple_providers.erb
|
|
491
|
+
- spec/support/views/saml_login_form.erb
|
|
489
492
|
homepage: https://github.com/enterprise-oss/osso-rb
|
|
490
493
|
licenses:
|
|
491
494
|
- MIT
|