osso 0.0.3.11 → 0.0.3.12
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/Gemfile.lock +1 -1
- data/lib/osso/graphql/mutation.rb +4 -0
- data/lib/osso/graphql/mutations.rb +4 -0
- data/lib/osso/graphql/mutations/add_redirect_uris_to_oauth_client.rb +39 -0
- data/lib/osso/graphql/mutations/delete_redirect_uri.rb +38 -0
- data/lib/osso/graphql/mutations/mark_redirect_uri_primary.rb +34 -0
- data/lib/osso/graphql/mutations/regenerate_oauth_credentials.rb +31 -0
- data/lib/osso/graphql/query.rb +11 -1
- data/lib/osso/graphql/types.rb +1 -0
- data/lib/osso/graphql/types/oauth_client.rb +1 -0
- data/lib/osso/graphql/types/redirect_uri.rb +23 -0
- data/lib/osso/helpers/auth.rb +2 -0
- data/lib/osso/models/oauth_client.rb +3 -9
- data/lib/osso/routes/admin.rb +6 -0
- data/lib/osso/routes/auth.rb +1 -1
- data/lib/osso/version.rb +1 -1
- data/spec/routes/auth_spec.rb +25 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ad3a661abfa7e2251cf7244221ad6e28899c490b732e6c9098f5bf91c903c4e
|
4
|
+
data.tar.gz: 3a691f8537a801d2b7302ac3f34e5ea5b74aae9a60fea18470ac50ec5569ec96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35d25337aff8ad4fd8b6d49d34e20226f61725c8a437da30f70cb393a9078b988a4d10847911d0da10ba34f4940488c059829448c006723a5bafc6187a8c5576
|
7
|
+
data.tar.gz: 8011819d4ac2c59f0b8fc37470cfd9b2357f9bfeda12e6e4ea1f07c691beba99c2d409b8a2356eb7917edd02c7ae7beaf72860fa70bd3bf31ea5fc4eb6aded79
|
data/Gemfile.lock
CHANGED
@@ -6,12 +6,16 @@ module Osso
|
|
6
6
|
module GraphQL
|
7
7
|
module Types
|
8
8
|
class MutationType < BaseObject
|
9
|
+
field :add_redirect_uris_to_oauth_client, mutation: Mutations::AddRedirectUrisToOauthClient, null: false
|
9
10
|
field :configure_identity_provider, mutation: Mutations::ConfigureIdentityProvider, null: true
|
10
11
|
field :create_identity_provider, mutation: Mutations::CreateIdentityProvider
|
11
12
|
field :create_enterprise_account, mutation: Mutations::CreateEnterpriseAccount
|
12
13
|
field :create_oauth_client, mutation: Mutations::CreateOauthClient
|
13
14
|
field :delete_enterprise_account, mutation: Mutations::DeleteEnterpriseAccount
|
14
15
|
field :delete_oauth_client, mutation: Mutations::DeleteOauthClient
|
16
|
+
field :delete_redirect_uri, mutation: Mutations::DeleteRedirectUri
|
17
|
+
field :mark_redirect_uri_primary, mutation: Mutations::MarkRedirectUriPrimary
|
18
|
+
field :regenerate_oauth_credentials, mutation: Mutations::RegenerateOauthCredentials
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
@@ -6,9 +6,13 @@ module Osso
|
|
6
6
|
end
|
7
7
|
|
8
8
|
require_relative 'mutations/base_mutation'
|
9
|
+
require_relative 'mutations/add_redirect_uris_to_oauth_client'
|
9
10
|
require_relative 'mutations/configure_identity_provider'
|
10
11
|
require_relative 'mutations/create_identity_provider'
|
11
12
|
require_relative 'mutations/create_enterprise_account'
|
12
13
|
require_relative 'mutations/create_oauth_client'
|
13
14
|
require_relative 'mutations/delete_enterprise_account'
|
14
15
|
require_relative 'mutations/delete_oauth_client'
|
16
|
+
require_relative 'mutations/delete_redirect_uri'
|
17
|
+
require_relative 'mutations/mark_redirect_uri_primary'
|
18
|
+
require_relative 'mutations/regenerate_oauth_credentials'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Osso
|
4
|
+
module GraphQL
|
5
|
+
module Mutations
|
6
|
+
class AddRedirectUrisToOauthClient < BaseMutation
|
7
|
+
null false
|
8
|
+
|
9
|
+
argument :oauth_client_id, ID, required: true
|
10
|
+
argument :uris, [String], required: true
|
11
|
+
|
12
|
+
field :oauth_client, Types::OauthClient, null: true
|
13
|
+
field :errors, [String], null: false
|
14
|
+
|
15
|
+
def resolve(oauth_client_id:, uris:)
|
16
|
+
oauth_client = Osso::Models::OauthClient.find(oauth_client_id)
|
17
|
+
|
18
|
+
uris.each do |uri|
|
19
|
+
oauth_client.redirect_uris.create(uri: uri)
|
20
|
+
end
|
21
|
+
|
22
|
+
unless oauth_client.primary_redirect_uri
|
23
|
+
oauth_client.reload.redirect_uris.first.update(primary: true)
|
24
|
+
end
|
25
|
+
|
26
|
+
response_data(oauth_client: oauth_client.reload)
|
27
|
+
rescue StandardError => e
|
28
|
+
response_error(errors: e.message)
|
29
|
+
end
|
30
|
+
|
31
|
+
def ready?(*)
|
32
|
+
return true if context[:scope] == :admin
|
33
|
+
|
34
|
+
raise ::GraphQL::ExecutionError, 'Only admin users may mutate OauthClients'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Osso
|
4
|
+
module GraphQL
|
5
|
+
module Mutations
|
6
|
+
class DeleteRedirectUri < BaseMutation
|
7
|
+
null false
|
8
|
+
|
9
|
+
argument :id, ID, required: true
|
10
|
+
|
11
|
+
field :oauth_client, Types::OauthClient, null: true
|
12
|
+
field :errors, [String], null: false
|
13
|
+
|
14
|
+
def resolve(id:)
|
15
|
+
redirect_uri = Osso::Models::RedirectUri.find(id)
|
16
|
+
|
17
|
+
oauth_client = redirect_uri.oauth_client
|
18
|
+
|
19
|
+
redirect_uri.destroy
|
20
|
+
|
21
|
+
if redirect_uri.primary
|
22
|
+
oauth_client.redirect_uris.first&.update(primary: true)
|
23
|
+
end
|
24
|
+
|
25
|
+
return response_data(oauth_client: oauth_client.reload) if redirect_uri.destroy
|
26
|
+
|
27
|
+
response_error(errors: redirect_uri.errors.full_messages)
|
28
|
+
end
|
29
|
+
|
30
|
+
def ready?(*)
|
31
|
+
return true if context[:scope] == :admin
|
32
|
+
|
33
|
+
raise ::GraphQL::ExecutionError, 'Only admin users may mutate OauthClients'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Osso
|
4
|
+
module GraphQL
|
5
|
+
module Mutations
|
6
|
+
class MarkRedirectUriPrimary < BaseMutation
|
7
|
+
null false
|
8
|
+
|
9
|
+
argument :id, ID, required: true
|
10
|
+
|
11
|
+
field :oauth_client, Types::OauthClient, null: true
|
12
|
+
field :errors, [String], null: false
|
13
|
+
|
14
|
+
def resolve(id:)
|
15
|
+
redirect_uri = Osso::Models::RedirectUri.find(id)
|
16
|
+
oauth_client = redirect_uri.oauth_client
|
17
|
+
|
18
|
+
oauth_client.redirect_uris.update(primary: false)
|
19
|
+
redirect_uri.update(primary: true)
|
20
|
+
|
21
|
+
response_data(oauth_client: oauth_client.reload)
|
22
|
+
rescue StandardError => e
|
23
|
+
response_error(errors: e.message)
|
24
|
+
end
|
25
|
+
|
26
|
+
def ready?(*)
|
27
|
+
return true if context[:scope] == :admin
|
28
|
+
|
29
|
+
raise ::GraphQL::ExecutionError, 'Only admin users may mutate OauthClients'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Osso
|
4
|
+
module GraphQL
|
5
|
+
module Mutations
|
6
|
+
class RegenerateOauthCredentials < BaseMutation
|
7
|
+
null false
|
8
|
+
|
9
|
+
argument :id, ID, required: true
|
10
|
+
|
11
|
+
field :oauth_client, Types::OauthClient, null: false
|
12
|
+
field :errors, [String], null: false
|
13
|
+
|
14
|
+
def resolve(id:)
|
15
|
+
oauth_client = Osso::Models::OauthClient.find(id)
|
16
|
+
oauth_client.generate_secrets
|
17
|
+
|
18
|
+
return response_data(oauth_client: oauth_client) if oauth_client.save
|
19
|
+
|
20
|
+
response_error(errors: oauth_client.errors.full_messages)
|
21
|
+
end
|
22
|
+
|
23
|
+
def ready?(*)
|
24
|
+
return true if context[:scope] == :admin
|
25
|
+
|
26
|
+
raise ::GraphQL::ExecutionError, 'Only admin users may mutate OauthClients'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/osso/graphql/query.rb
CHANGED
@@ -8,12 +8,13 @@ module Osso
|
|
8
8
|
argument :sort_column, String, required: false
|
9
9
|
argument :sort_order, String, required: false
|
10
10
|
end
|
11
|
-
field :oauth_clients, null: true, resolver: Resolvers::OAuthClients
|
12
11
|
|
13
12
|
field :enterprise_account, null: true, resolver: Resolvers::EnterpriseAccount do
|
14
13
|
argument :domain, String, required: true
|
15
14
|
end
|
16
15
|
|
16
|
+
field :oauth_clients, null: true, resolver: Resolvers::OAuthClients
|
17
|
+
|
17
18
|
field(
|
18
19
|
:identity_provider,
|
19
20
|
Types::IdentityProvider,
|
@@ -22,6 +23,15 @@ module Osso
|
|
22
23
|
) do
|
23
24
|
argument :id, ID, required: true
|
24
25
|
end
|
26
|
+
|
27
|
+
field(
|
28
|
+
:oauth_client,
|
29
|
+
Types::OauthClient,
|
30
|
+
null: true,
|
31
|
+
resolve: ->(_obj, args, _context) { Osso::Models::OauthClient.find(args[:id]) },
|
32
|
+
) do
|
33
|
+
argument :id, ID, required: true
|
34
|
+
end
|
25
35
|
end
|
26
36
|
end
|
27
37
|
end
|
data/lib/osso/graphql/types.rb
CHANGED
@@ -13,5 +13,6 @@ require_relative 'types/identity_provider_service'
|
|
13
13
|
require_relative 'types/identity_provider_status'
|
14
14
|
require_relative 'types/identity_provider'
|
15
15
|
require_relative 'types/enterprise_account'
|
16
|
+
require_relative 'types/redirect_uri'
|
16
17
|
require_relative 'types/oauth_client'
|
17
18
|
require_relative 'types/user'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'graphql'
|
4
|
+
|
5
|
+
module Osso
|
6
|
+
module GraphQL
|
7
|
+
module Types
|
8
|
+
class RedirectUri < Types::BaseObject
|
9
|
+
description 'An allowed redirect URI for an OauthClient'
|
10
|
+
implements ::GraphQL::Types::Relay::Node
|
11
|
+
|
12
|
+
global_id_field :gid
|
13
|
+
field :id, ID, null: false
|
14
|
+
field :uri, String, null: false
|
15
|
+
field :primary, Boolean, null: false
|
16
|
+
|
17
|
+
def self.authorized?(object, context)
|
18
|
+
super && context[:scope] == :admin
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/osso/helpers/auth.rb
CHANGED
@@ -9,21 +9,15 @@ module Osso
|
|
9
9
|
has_many :identity_providers
|
10
10
|
has_many :redirect_uris
|
11
11
|
|
12
|
-
before_validation :
|
12
|
+
before_validation :generate_secrets, on: :create
|
13
13
|
validates :name, :secret, presence: true
|
14
14
|
validates :identifier, presence: true, uniqueness: true
|
15
15
|
|
16
|
-
def
|
16
|
+
def primary_redirect_uri
|
17
17
|
redirect_uris.find(&:primary)
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
redirect_uris.map(&:uri)
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def setup
|
20
|
+
def generate_secrets
|
27
21
|
self.identifier = SecureRandom.hex(16)
|
28
22
|
self.secret = SecureRandom.hex(32)
|
29
23
|
end
|
data/lib/osso/routes/admin.rb
CHANGED
data/lib/osso/routes/auth.rb
CHANGED
@@ -23,7 +23,7 @@ module Osso
|
|
23
23
|
self,
|
24
24
|
provider_name: 'saml',
|
25
25
|
identity_provider_id_regex: UUID_REGEXP,
|
26
|
-
path_prefix: '/saml',
|
26
|
+
path_prefix: '/auth/saml',
|
27
27
|
callback_suffix: 'callback',
|
28
28
|
) do |identity_provider_id, _env|
|
29
29
|
provider = Models::IdentityProvider.find(identity_provider_id)
|
data/lib/osso/version.rb
CHANGED
data/spec/routes/auth_spec.rb
CHANGED
@@ -3,6 +3,31 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe Osso::Auth do
|
6
|
+
describe 'get /auth/saml/:uuid' do
|
7
|
+
describe 'for an Okta SAML provider' do
|
8
|
+
let(:enterprise) { create(:enterprise_with_okta) }
|
9
|
+
let(:okta_provider) { enterprise.identity_providers.first }
|
10
|
+
it 'uses omniauth saml' do
|
11
|
+
get("/auth/saml/#{okta_provider.id}")
|
12
|
+
|
13
|
+
expect(last_response).to be_redirect
|
14
|
+
follow_redirect!
|
15
|
+
expect(last_request.url).to match("auth/saml/#{okta_provider.id}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'for an Azure SAML provider' do
|
20
|
+
let(:enterprise) { create(:enterprise_with_okta) }
|
21
|
+
let(:azure_provider) { enterprise.identity_providers.first }
|
22
|
+
it 'uses omniauth saml' do
|
23
|
+
get("/auth/saml/#{azure_provider.id}")
|
24
|
+
|
25
|
+
expect(last_response).to be_redirect
|
26
|
+
follow_redirect!
|
27
|
+
expect(last_request.url).to match("auth/saml/#{azure_provider.id}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
6
31
|
describe 'post /auth/saml/:uuid/callback' do
|
7
32
|
describe 'for an Okta SAML provider' do
|
8
33
|
let(:enterprise) { create(:enterprise_with_okta) }
|
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.3.
|
4
|
+
version: 0.0.3.12
|
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-
|
11
|
+
date: 2020-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -271,6 +271,7 @@ files:
|
|
271
271
|
- lib/osso/graphql/.DS_Store
|
272
272
|
- lib/osso/graphql/mutation.rb
|
273
273
|
- lib/osso/graphql/mutations.rb
|
274
|
+
- lib/osso/graphql/mutations/add_redirect_uris_to_oauth_client.rb
|
274
275
|
- lib/osso/graphql/mutations/base_mutation.rb
|
275
276
|
- lib/osso/graphql/mutations/configure_identity_provider.rb
|
276
277
|
- lib/osso/graphql/mutations/create_enterprise_account.rb
|
@@ -278,6 +279,9 @@ files:
|
|
278
279
|
- lib/osso/graphql/mutations/create_oauth_client.rb
|
279
280
|
- lib/osso/graphql/mutations/delete_enterprise_account.rb
|
280
281
|
- lib/osso/graphql/mutations/delete_oauth_client.rb
|
282
|
+
- lib/osso/graphql/mutations/delete_redirect_uri.rb
|
283
|
+
- lib/osso/graphql/mutations/mark_redirect_uri_primary.rb
|
284
|
+
- lib/osso/graphql/mutations/regenerate_oauth_credentials.rb
|
281
285
|
- lib/osso/graphql/query.rb
|
282
286
|
- lib/osso/graphql/resolvers.rb
|
283
287
|
- lib/osso/graphql/resolvers/enterprise_account.rb
|
@@ -294,6 +298,7 @@ files:
|
|
294
298
|
- lib/osso/graphql/types/identity_provider_service.rb
|
295
299
|
- lib/osso/graphql/types/identity_provider_status.rb
|
296
300
|
- lib/osso/graphql/types/oauth_client.rb
|
301
|
+
- lib/osso/graphql/types/redirect_uri.rb
|
297
302
|
- lib/osso/graphql/types/user.rb
|
298
303
|
- lib/osso/helpers/auth.rb
|
299
304
|
- lib/osso/helpers/helpers.rb
|