doorkeeper 5.0.0 → 5.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 +5 -5
- data/.hound.yml +2 -1
- data/.rubocop.yml +37 -4
- data/.travis.yml +16 -21
- data/Appraisals +29 -7
- data/Dangerfile +67 -0
- data/Gemfile +19 -5
- data/NEWS.md +107 -10
- data/README.md +75 -470
- data/Rakefile +10 -8
- data/app/controllers/doorkeeper/application_controller.rb +3 -2
- data/app/controllers/doorkeeper/application_metal_controller.rb +4 -13
- data/app/controllers/doorkeeper/applications_controller.rb +21 -7
- data/app/controllers/doorkeeper/authorizations_controller.rb +3 -3
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -0
- data/app/controllers/doorkeeper/token_info_controller.rb +4 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +13 -11
- data/app/helpers/doorkeeper/dashboard_helper.rb +3 -1
- data/app/validators/redirect_uri_validator.rb +7 -2
- data/app/views/doorkeeper/applications/_form.html.erb +6 -0
- data/app/views/doorkeeper/applications/show.html.erb +1 -1
- data/app/views/layouts/doorkeeper/admin.html.erb +5 -3
- data/bin/console +16 -0
- data/config/locales/en.yml +1 -0
- data/doorkeeper.gemspec +28 -24
- data/gemfiles/rails_5_0.gemfile +9 -4
- data/gemfiles/rails_5_1.gemfile +9 -4
- data/gemfiles/rails_5_2.gemfile +10 -5
- data/gemfiles/rails_6_0.gemfile +17 -0
- data/gemfiles/rails_master.gemfile +9 -9
- data/lib/doorkeeper/config/option.rb +64 -0
- data/lib/doorkeeper/config.rb +197 -76
- data/lib/doorkeeper/engine.rb +3 -1
- data/lib/doorkeeper/errors.rb +17 -0
- data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
- data/lib/doorkeeper/grape/helpers.rb +5 -3
- data/lib/doorkeeper/helpers/controller.rb +5 -2
- data/lib/doorkeeper/models/access_grant_mixin.rb +25 -6
- data/lib/doorkeeper/models/access_token_mixin.rb +68 -22
- data/lib/doorkeeper/models/application_mixin.rb +45 -1
- data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
- data/lib/doorkeeper/models/concerns/expirable.rb +6 -2
- data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
- data/lib/doorkeeper/models/concerns/ownership.rb +3 -6
- data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
- data/lib/doorkeeper/models/concerns/revocable.rb +4 -1
- data/lib/doorkeeper/models/concerns/scopes.rb +7 -1
- data/lib/doorkeeper/models/concerns/secret_storable.rb +108 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +4 -2
- data/lib/doorkeeper/oauth/authorization/context.rb +2 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +14 -7
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +3 -1
- data/lib/doorkeeper/oauth/authorization_code_request.rb +8 -4
- data/lib/doorkeeper/oauth/base_request.rb +2 -0
- data/lib/doorkeeper/oauth/base_response.rb +2 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +2 -0
- data/lib/doorkeeper/oauth/client.rb +3 -1
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -0
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +2 -0
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +7 -4
- data/lib/doorkeeper/oauth/client_credentials_request.rb +3 -1
- data/lib/doorkeeper/oauth/code_request.rb +2 -0
- data/lib/doorkeeper/oauth/code_response.rb +4 -2
- data/lib/doorkeeper/oauth/error.rb +2 -0
- data/lib/doorkeeper/oauth/error_response.rb +20 -6
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +25 -8
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +15 -1
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -3
- data/lib/doorkeeper/oauth/invalid_token_response.rb +22 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +9 -2
- data/lib/doorkeeper/oauth/pre_authorization.rb +13 -5
- data/lib/doorkeeper/oauth/refresh_token_request.rb +15 -4
- data/lib/doorkeeper/oauth/scopes.rb +7 -3
- data/lib/doorkeeper/oauth/token.rb +4 -2
- data/lib/doorkeeper/oauth/token_introspection.rb +76 -8
- data/lib/doorkeeper/oauth/token_request.rb +2 -0
- data/lib/doorkeeper/oauth/token_response.rb +11 -9
- data/lib/doorkeeper/oauth.rb +5 -5
- data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -13
- data/lib/doorkeeper/orm/active_record/access_token.rb +6 -13
- data/lib/doorkeeper/orm/active_record/application.rb +26 -7
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +10 -3
- data/lib/doorkeeper/orm/active_record.rb +8 -6
- data/lib/doorkeeper/rails/helpers.rb +5 -1
- data/lib/doorkeeper/rails/routes/mapper.rb +2 -0
- data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
- data/lib/doorkeeper/rails/routes.rb +19 -12
- data/lib/doorkeeper/rake/db.rake +17 -17
- data/lib/doorkeeper/rake.rb +1 -1
- data/lib/doorkeeper/request/authorization_code.rb +2 -0
- data/lib/doorkeeper/request/client_credentials.rb +2 -0
- data/lib/doorkeeper/request/code.rb +2 -0
- data/lib/doorkeeper/request/password.rb +2 -0
- data/lib/doorkeeper/request/refresh_token.rb +2 -0
- data/lib/doorkeeper/request/strategy.rb +2 -0
- data/lib/doorkeeper/request/token.rb +2 -0
- data/lib/doorkeeper/request.rb +3 -1
- data/lib/doorkeeper/secret_storing/base.rb +64 -0
- data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
- data/lib/doorkeeper/secret_storing/plain.rb +33 -0
- data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
- data/lib/doorkeeper/server.rb +2 -0
- data/lib/doorkeeper/stale_records_cleaner.rb +20 -0
- data/lib/doorkeeper/validations.rb +2 -0
- data/lib/doorkeeper/version.rb +4 -2
- data/lib/doorkeeper.rb +69 -59
- data/lib/generators/doorkeeper/application_owner_generator.rb +10 -9
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +10 -9
- data/lib/generators/doorkeeper/install_generator.rb +11 -9
- data/lib/generators/doorkeeper/migration_generator.rb +9 -9
- data/lib/generators/doorkeeper/pkce_generator.rb +10 -9
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +10 -9
- data/lib/generators/doorkeeper/templates/initializer.rb +138 -13
- data/lib/generators/doorkeeper/templates/migration.rb.erb +17 -10
- data/lib/generators/doorkeeper/views_generator.rb +6 -4
- data/spec/controllers/application_metal_controller_spec.rb +24 -10
- data/spec/controllers/applications_controller_spec.rb +76 -78
- data/spec/controllers/authorizations_controller_spec.rb +189 -142
- data/spec/controllers/protected_resources_controller_spec.rb +111 -67
- data/spec/controllers/token_info_controller_spec.rb +14 -12
- data/spec/controllers/tokens_controller_spec.rb +170 -112
- data/spec/dummy/Rakefile +3 -1
- data/spec/dummy/app/controllers/application_controller.rb +3 -1
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +3 -1
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +4 -2
- data/spec/dummy/app/controllers/home_controller.rb +6 -5
- data/spec/dummy/app/controllers/metal_controller.rb +2 -0
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +4 -2
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/user.rb +2 -0
- data/spec/dummy/config/application.rb +26 -2
- data/spec/dummy/config/boot.rb +2 -4
- data/spec/dummy/config/environment.rb +1 -1
- data/spec/dummy/config/environments/development.rb +2 -0
- data/spec/dummy/config/environments/production.rb +2 -0
- data/spec/dummy/config/environments/test.rb +4 -2
- data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
- data/spec/dummy/config/initializers/doorkeeper.rb +7 -3
- data/spec/dummy/config/initializers/secret_token.rb +3 -1
- data/spec/dummy/config/initializers/session_store.rb +3 -1
- data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
- data/spec/dummy/config.ru +3 -1
- data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +20 -13
- data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +1 -1
- data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +2 -0
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/dummy/script/rails +7 -4
- data/spec/factories.rb +11 -9
- data/spec/generators/application_owner_generator_spec.rb +13 -26
- data/spec/generators/confidential_applications_generator_spec.rb +12 -28
- data/spec/generators/install_generator_spec.rb +19 -14
- data/spec/generators/migration_generator_spec.rb +13 -26
- data/spec/generators/pkce_generator_spec.rb +11 -26
- data/spec/generators/previous_refresh_token_generator_spec.rb +16 -29
- data/spec/generators/templates/routes.rb +2 -1
- data/spec/generators/views_generator_spec.rb +14 -12
- data/spec/grape/grape_integration_spec.rb +35 -33
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +9 -7
- data/spec/lib/config_spec.rb +290 -104
- data/spec/lib/doorkeeper_spec.rb +8 -6
- data/spec/lib/models/expirable_spec.rb +22 -8
- data/spec/lib/models/reusable_spec.rb +40 -0
- data/spec/lib/models/revocable_spec.rb +8 -6
- data/spec/lib/models/scopes_spec.rb +27 -13
- data/spec/lib/models/secret_storable_spec.rb +135 -0
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +17 -15
- data/spec/lib/oauth/authorization_code_request_spec.rb +43 -17
- data/spec/lib/oauth/base_request_spec.rb +24 -12
- data/spec/lib/oauth/base_response_spec.rb +3 -1
- data/spec/lib/oauth/client/credentials_spec.rb +26 -24
- data/spec/lib/oauth/client_credentials/creator_spec.rb +56 -10
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +27 -20
- data/spec/lib/oauth/client_credentials/validation_spec.rb +21 -15
- data/spec/lib/oauth/client_credentials_integration_spec.rb +8 -6
- data/spec/lib/oauth/client_credentials_request_spec.rb +27 -21
- data/spec/lib/oauth/client_spec.rb +15 -13
- data/spec/lib/oauth/code_request_spec.rb +10 -8
- data/spec/lib/oauth/code_response_spec.rb +9 -7
- data/spec/lib/oauth/error_response_spec.rb +19 -11
- data/spec/lib/oauth/error_spec.rb +4 -2
- data/spec/lib/oauth/forbidden_token_response_spec.rb +7 -5
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +68 -31
- data/spec/lib/oauth/helpers/unique_token_spec.rb +8 -6
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +124 -93
- data/spec/lib/oauth/invalid_token_response_spec.rb +3 -1
- data/spec/lib/oauth/password_access_token_request_spec.rb +95 -34
- data/spec/lib/oauth/pre_authorization_spec.rb +80 -54
- data/spec/lib/oauth/refresh_token_request_spec.rb +46 -39
- data/spec/lib/oauth/scopes_spec.rb +63 -61
- data/spec/lib/oauth/token_request_spec.rb +80 -25
- data/spec/lib/oauth/token_response_spec.rb +40 -38
- data/spec/lib/oauth/token_spec.rb +64 -45
- data/spec/lib/request/strategy_spec.rb +3 -1
- data/spec/lib/secret_storing/base_spec.rb +60 -0
- data/spec/lib/secret_storing/bcrypt_spec.rb +49 -0
- data/spec/lib/secret_storing/plain_spec.rb +44 -0
- data/spec/lib/secret_storing/sha256_hash_spec.rb +48 -0
- data/spec/lib/server_spec.rb +20 -18
- data/spec/lib/{orm/active_record/stale_records_cleaner_spec.rb → stale_records_cleaner_spec.rb} +28 -18
- data/spec/models/doorkeeper/access_grant_spec.rb +80 -15
- data/spec/models/doorkeeper/access_token_spec.rb +212 -83
- data/spec/models/doorkeeper/application_spec.rb +146 -49
- data/spec/requests/applications/applications_request_spec.rb +100 -68
- data/spec/requests/applications/authorized_applications_spec.rb +20 -18
- data/spec/requests/endpoints/authorization_spec.rb +27 -25
- data/spec/requests/endpoints/token_spec.rb +38 -36
- data/spec/requests/flows/authorization_code_errors_spec.rb +27 -25
- data/spec/requests/flows/authorization_code_spec.rb +260 -158
- data/spec/requests/flows/client_credentials_spec.rb +54 -52
- data/spec/requests/flows/implicit_grant_errors_spec.rb +11 -9
- data/spec/requests/flows/implicit_grant_spec.rb +27 -25
- data/spec/requests/flows/password_spec.rb +64 -56
- data/spec/requests/flows/refresh_token_spec.rb +91 -32
- data/spec/requests/flows/revoke_token_spec.rb +49 -63
- data/spec/requests/flows/skip_authorization_spec.rb +23 -21
- data/spec/requests/protected_resources/metal_spec.rb +7 -5
- data/spec/requests/protected_resources/private_api_spec.rb +37 -35
- data/spec/routing/custom_controller_routes_spec.rb +71 -65
- data/spec/routing/default_routes_spec.rb +22 -20
- data/spec/routing/scoped_routes_spec.rb +20 -18
- data/spec/spec_helper.rb +15 -13
- data/spec/spec_helper_integration.rb +3 -1
- data/spec/support/dependencies/factory_bot.rb +3 -1
- data/spec/support/doorkeeper_rspec.rb +5 -2
- data/spec/support/helpers/access_token_request_helper.rb +3 -1
- data/spec/support/helpers/authorization_request_helper.rb +4 -2
- data/spec/support/helpers/config_helper.rb +2 -0
- data/spec/support/helpers/model_helper.rb +11 -5
- data/spec/support/helpers/request_spec_helper.rb +5 -3
- data/spec/support/helpers/url_helper.rb +20 -18
- data/spec/support/http_method_shim.rb +4 -9
- data/spec/support/orm/active_record.rb +3 -1
- data/spec/support/shared/controllers_shared_context.rb +68 -10
- data/spec/support/shared/hashing_shared_context.rb +36 -0
- data/spec/support/shared/models_shared_examples.rb +12 -10
- data/spec/validators/redirect_uri_validator_spec.rb +76 -47
- data/spec/version/version_spec.rb +7 -5
- metadata +70 -21
- data/gemfiles/rails_4_2.gemfile +0 -13
- data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -10
data/lib/doorkeeper/request.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Doorkeeper
|
|
2
4
|
module Request
|
|
3
5
|
class << self
|
|
@@ -31,7 +33,7 @@ module Doorkeeper
|
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
def build_strategy_class(grant_or_request_type)
|
|
34
|
-
strategy_class_name = grant_or_request_type.to_s.tr(
|
|
36
|
+
strategy_class_name = grant_or_request_type.to_s.tr(" ", "_").camelize
|
|
35
37
|
"Doorkeeper::Request::#{strategy_class_name}".constantize
|
|
36
38
|
end
|
|
37
39
|
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module SecretStoring
|
|
5
|
+
##
|
|
6
|
+
# Base class for secret storing, including common helpers
|
|
7
|
+
class Base
|
|
8
|
+
##
|
|
9
|
+
# Return the value to be stored by the database
|
|
10
|
+
# used for looking up a database value.
|
|
11
|
+
# @param plain_secret The plain secret input / generated
|
|
12
|
+
def self.transform_secret(_plain_secret)
|
|
13
|
+
raise NotImplementedError
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# Transform and store the given secret attribute => value
|
|
18
|
+
# pair used for safely storing the attribute
|
|
19
|
+
# @param resource The model instance being modified
|
|
20
|
+
# @param attribute The secret attribute
|
|
21
|
+
# @param plain_secret The plain secret input / generated
|
|
22
|
+
def self.store_secret(resource, attribute, plain_secret)
|
|
23
|
+
transformed_value = transform_secret(plain_secret)
|
|
24
|
+
resource.public_send(:"#{attribute}=", transformed_value)
|
|
25
|
+
|
|
26
|
+
transformed_value
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
##
|
|
30
|
+
# Return the restored value from the database
|
|
31
|
+
# @param resource The resource instance to act on
|
|
32
|
+
# @param attribute The secret attribute to restore
|
|
33
|
+
# as retrieved from the database.
|
|
34
|
+
def self.restore_secret(_resource, _attribute)
|
|
35
|
+
raise NotImplementedError
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Determines whether this strategy supports restoring
|
|
40
|
+
# secrets from the database. This allows detecting users
|
|
41
|
+
# trying to use a non-restorable strategy with +reuse_access_tokens+.
|
|
42
|
+
def self.allows_restoring_secrets?
|
|
43
|
+
false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Determines what secrets this strategy is applicable for
|
|
48
|
+
def self.validate_for(model)
|
|
49
|
+
valid = %i[token application]
|
|
50
|
+
return true if valid.include?(model.to_sym)
|
|
51
|
+
|
|
52
|
+
raise ArgumentError, "'#{name}' can not be used for #{model}."
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
##
|
|
56
|
+
# Securely compare the given +input+ value with a +stored+ value
|
|
57
|
+
# processed by +transform_secret+.
|
|
58
|
+
def self.secret_matches?(input, stored)
|
|
59
|
+
transformed_input = transform_secret(input)
|
|
60
|
+
ActiveSupport::SecurityUtils.secure_compare transformed_input, stored
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module SecretStoring
|
|
5
|
+
##
|
|
6
|
+
# Plain text secret storing, which is the default
|
|
7
|
+
# but also provides fallback lookup if
|
|
8
|
+
# other secret storing mechanisms are enabled.
|
|
9
|
+
class BCrypt < Base
|
|
10
|
+
##
|
|
11
|
+
# Return the value to be stored by the database
|
|
12
|
+
# @param plain_secret The plain secret input / generated
|
|
13
|
+
def self.transform_secret(plain_secret)
|
|
14
|
+
::BCrypt::Password.create(plain_secret.to_s)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Securely compare the given +input+ value with a +stored+ value
|
|
19
|
+
# processed by +transform_secret+.
|
|
20
|
+
def self.secret_matches?(input, stored)
|
|
21
|
+
::BCrypt::Password.new(stored.to_s) == input.to_s
|
|
22
|
+
rescue ::BCrypt::Errors::InvalidHash
|
|
23
|
+
false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Determines whether this strategy supports restoring
|
|
28
|
+
# secrets from the database. This allows detecting users
|
|
29
|
+
# trying to use a non-restorable strategy with +reuse_access_tokens+.
|
|
30
|
+
def self.allows_restoring_secrets?
|
|
31
|
+
false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
##
|
|
35
|
+
# Determines what secrets this strategy is applicable for
|
|
36
|
+
def self.validate_for(model)
|
|
37
|
+
unless model.to_sym == :application
|
|
38
|
+
raise ArgumentError,
|
|
39
|
+
"'#{name}' can only be used for storing application secrets."
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
unless bcrypt_present?
|
|
43
|
+
raise ArgumentError,
|
|
44
|
+
"'#{name}' requires the 'bcrypt' gem being loaded."
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# Test if we can require the BCrypt gem
|
|
52
|
+
def self.bcrypt_present?
|
|
53
|
+
require "bcrypt"
|
|
54
|
+
true
|
|
55
|
+
rescue LoadError
|
|
56
|
+
false
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module SecretStoring
|
|
5
|
+
##
|
|
6
|
+
# Plain text secret storing, which is the default
|
|
7
|
+
# but also provides fallback lookup if
|
|
8
|
+
# other secret storing mechanisms are enabled.
|
|
9
|
+
class Plain < Base
|
|
10
|
+
##
|
|
11
|
+
# Return the value to be stored by the database
|
|
12
|
+
# @param plain_secret The plain secret input / generated
|
|
13
|
+
def self.transform_secret(plain_secret)
|
|
14
|
+
plain_secret
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Return the restored value from the database
|
|
19
|
+
# @param resource The resource instance to act on
|
|
20
|
+
# @param attribute The secret attribute to restore
|
|
21
|
+
# as retrieved from the database.
|
|
22
|
+
def self.restore_secret(resource, attribute)
|
|
23
|
+
resource.public_send(attribute)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Plain values obviously allow restoring
|
|
28
|
+
def self.allows_restoring_secrets?
|
|
29
|
+
true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module SecretStoring
|
|
5
|
+
##
|
|
6
|
+
# Plain text secret storing, which is the default
|
|
7
|
+
# but also provides fallback lookup if
|
|
8
|
+
# other secret storing mechanisms are enabled.
|
|
9
|
+
class Sha256Hash < Base
|
|
10
|
+
##
|
|
11
|
+
# Return the value to be stored by the database
|
|
12
|
+
# @param plain_secret The plain secret input / generated
|
|
13
|
+
def self.transform_secret(plain_secret)
|
|
14
|
+
::Digest::SHA256.hexdigest plain_secret
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Determines whether this strategy supports restoring
|
|
19
|
+
# secrets from the database. This allows detecting users
|
|
20
|
+
# trying to use a non-restorable strategy with +reuse_access_tokens+.
|
|
21
|
+
def self.allows_restoring_secrets?
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/doorkeeper/server.rb
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
class StaleRecordsCleaner
|
|
5
|
+
CLEANER_CLASS = "StaleRecordsCleaner"
|
|
6
|
+
|
|
7
|
+
def self.for(base_scope)
|
|
8
|
+
orm_adapter = "doorkeeper/orm/#{Doorkeeper.configuration.orm}".classify
|
|
9
|
+
|
|
10
|
+
orm_cleaner = "#{orm_adapter}::#{CLEANER_CLASS}".constantize
|
|
11
|
+
orm_cleaner.new(base_scope)
|
|
12
|
+
rescue NameError
|
|
13
|
+
raise Doorkeeper::Errors::NoOrmCleaner, "'#{Doorkeeper.configuration.orm}' ORM has no cleaner!"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.new(base_scope)
|
|
17
|
+
self.for(base_scope)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/doorkeeper/version.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Doorkeeper
|
|
2
4
|
def self.gem_version
|
|
3
5
|
Gem::Version.new VERSION::STRING
|
|
@@ -6,11 +8,11 @@ module Doorkeeper
|
|
|
6
8
|
module VERSION
|
|
7
9
|
# Semantic versioning
|
|
8
10
|
MAJOR = 5
|
|
9
|
-
MINOR =
|
|
11
|
+
MINOR = 1
|
|
10
12
|
TINY = 0
|
|
11
13
|
PRE = nil
|
|
12
14
|
|
|
13
15
|
# Full version number
|
|
14
|
-
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(
|
|
16
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
|
15
17
|
end
|
|
16
18
|
end
|
data/lib/doorkeeper.rb
CHANGED
|
@@ -1,74 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
require 'doorkeeper/engine'
|
|
3
|
-
require 'doorkeeper/config'
|
|
1
|
+
# frozen_string_literal: true
|
|
4
2
|
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require 'doorkeeper/request/code'
|
|
9
|
-
require 'doorkeeper/request/password'
|
|
10
|
-
require 'doorkeeper/request/refresh_token'
|
|
11
|
-
require 'doorkeeper/request/token'
|
|
3
|
+
require "doorkeeper/version"
|
|
4
|
+
require "doorkeeper/engine"
|
|
5
|
+
require "doorkeeper/config"
|
|
12
6
|
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
16
|
-
require
|
|
7
|
+
require "doorkeeper/request/strategy"
|
|
8
|
+
require "doorkeeper/request/authorization_code"
|
|
9
|
+
require "doorkeeper/request/client_credentials"
|
|
10
|
+
require "doorkeeper/request/code"
|
|
11
|
+
require "doorkeeper/request/password"
|
|
12
|
+
require "doorkeeper/request/refresh_token"
|
|
13
|
+
require "doorkeeper/request/token"
|
|
17
14
|
|
|
18
|
-
require
|
|
19
|
-
require
|
|
20
|
-
require
|
|
21
|
-
require
|
|
22
|
-
require 'doorkeeper/oauth/helpers/scope_checker'
|
|
23
|
-
require 'doorkeeper/oauth/helpers/uri_checker'
|
|
24
|
-
require 'doorkeeper/oauth/helpers/unique_token'
|
|
15
|
+
require "doorkeeper/errors"
|
|
16
|
+
require "doorkeeper/server"
|
|
17
|
+
require "doorkeeper/request"
|
|
18
|
+
require "doorkeeper/validations"
|
|
25
19
|
|
|
26
|
-
require
|
|
27
|
-
require
|
|
28
|
-
require
|
|
29
|
-
require
|
|
30
|
-
require
|
|
31
|
-
require
|
|
32
|
-
require
|
|
33
|
-
require 'doorkeeper/oauth/pre_authorization'
|
|
34
|
-
require 'doorkeeper/oauth/base_request'
|
|
35
|
-
require 'doorkeeper/oauth/authorization_code_request'
|
|
36
|
-
require 'doorkeeper/oauth/refresh_token_request'
|
|
37
|
-
require 'doorkeeper/oauth/password_access_token_request'
|
|
20
|
+
require "doorkeeper/oauth/authorization/code"
|
|
21
|
+
require "doorkeeper/oauth/authorization/context"
|
|
22
|
+
require "doorkeeper/oauth/authorization/token"
|
|
23
|
+
require "doorkeeper/oauth/authorization/uri_builder"
|
|
24
|
+
require "doorkeeper/oauth/helpers/scope_checker"
|
|
25
|
+
require "doorkeeper/oauth/helpers/uri_checker"
|
|
26
|
+
require "doorkeeper/oauth/helpers/unique_token"
|
|
38
27
|
|
|
39
|
-
require
|
|
40
|
-
require
|
|
41
|
-
require
|
|
42
|
-
require
|
|
43
|
-
require
|
|
28
|
+
require "doorkeeper/oauth"
|
|
29
|
+
require "doorkeeper/oauth/scopes"
|
|
30
|
+
require "doorkeeper/oauth/error"
|
|
31
|
+
require "doorkeeper/oauth/base_response"
|
|
32
|
+
require "doorkeeper/oauth/code_response"
|
|
33
|
+
require "doorkeeper/oauth/token_response"
|
|
34
|
+
require "doorkeeper/oauth/error_response"
|
|
35
|
+
require "doorkeeper/oauth/pre_authorization"
|
|
36
|
+
require "doorkeeper/oauth/base_request"
|
|
37
|
+
require "doorkeeper/oauth/authorization_code_request"
|
|
38
|
+
require "doorkeeper/oauth/refresh_token_request"
|
|
39
|
+
require "doorkeeper/oauth/password_access_token_request"
|
|
44
40
|
|
|
45
|
-
require
|
|
46
|
-
require
|
|
47
|
-
require
|
|
48
|
-
require
|
|
49
|
-
require
|
|
50
|
-
require 'doorkeeper/oauth/token_introspection'
|
|
51
|
-
require 'doorkeeper/oauth/invalid_token_response'
|
|
52
|
-
require 'doorkeeper/oauth/forbidden_token_response'
|
|
41
|
+
require "doorkeeper/oauth/client_credentials/validation"
|
|
42
|
+
require "doorkeeper/oauth/client_credentials/creator"
|
|
43
|
+
require "doorkeeper/oauth/client_credentials/issuer"
|
|
44
|
+
require "doorkeeper/oauth/client_credentials/validation"
|
|
45
|
+
require "doorkeeper/oauth/client/credentials"
|
|
53
46
|
|
|
54
|
-
require
|
|
55
|
-
require
|
|
56
|
-
require
|
|
57
|
-
require
|
|
58
|
-
require
|
|
47
|
+
require "doorkeeper/oauth/client_credentials_request"
|
|
48
|
+
require "doorkeeper/oauth/code_request"
|
|
49
|
+
require "doorkeeper/oauth/token_request"
|
|
50
|
+
require "doorkeeper/oauth/client"
|
|
51
|
+
require "doorkeeper/oauth/token"
|
|
52
|
+
require "doorkeeper/oauth/token_introspection"
|
|
53
|
+
require "doorkeeper/oauth/invalid_token_response"
|
|
54
|
+
require "doorkeeper/oauth/forbidden_token_response"
|
|
59
55
|
|
|
60
|
-
require
|
|
61
|
-
require
|
|
62
|
-
require
|
|
56
|
+
require "doorkeeper/secret_storing/base"
|
|
57
|
+
require "doorkeeper/secret_storing/plain"
|
|
58
|
+
require "doorkeeper/secret_storing/sha256_hash"
|
|
59
|
+
require "doorkeeper/secret_storing/bcrypt"
|
|
63
60
|
|
|
64
|
-
require
|
|
61
|
+
require "doorkeeper/models/concerns/orderable"
|
|
62
|
+
require "doorkeeper/models/concerns/scopes"
|
|
63
|
+
require "doorkeeper/models/concerns/expirable"
|
|
64
|
+
require "doorkeeper/models/concerns/reusable"
|
|
65
|
+
require "doorkeeper/models/concerns/revocable"
|
|
66
|
+
require "doorkeeper/models/concerns/accessible"
|
|
67
|
+
require "doorkeeper/models/concerns/secret_storable"
|
|
65
68
|
|
|
66
|
-
require
|
|
67
|
-
require
|
|
69
|
+
require "doorkeeper/models/access_grant_mixin"
|
|
70
|
+
require "doorkeeper/models/access_token_mixin"
|
|
71
|
+
require "doorkeeper/models/application_mixin"
|
|
68
72
|
|
|
69
|
-
require
|
|
73
|
+
require "doorkeeper/helpers/controller"
|
|
70
74
|
|
|
71
|
-
require
|
|
75
|
+
require "doorkeeper/rails/routes"
|
|
76
|
+
require "doorkeeper/rails/helpers"
|
|
77
|
+
|
|
78
|
+
require "doorkeeper/rake"
|
|
79
|
+
require "doorkeeper/stale_records_cleaner"
|
|
80
|
+
|
|
81
|
+
require "doorkeeper/orm/active_record"
|
|
72
82
|
|
|
73
83
|
module Doorkeeper
|
|
74
84
|
def self.authenticate(request, methods = Doorkeeper.configuration.access_token_methods)
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/active_record"
|
|
5
5
|
|
|
6
6
|
module Doorkeeper
|
|
7
|
+
# Generates migration to add reference to owner of the
|
|
8
|
+
# Doorkeeper application.
|
|
9
|
+
#
|
|
7
10
|
class ApplicationOwnerGenerator < ::Rails::Generators::Base
|
|
8
11
|
include ::Rails::Generators::Migration
|
|
9
|
-
source_root File.expand_path(
|
|
10
|
-
desc
|
|
12
|
+
source_root File.expand_path("templates", __dir__)
|
|
13
|
+
desc "Provide support for client application ownership."
|
|
11
14
|
|
|
12
15
|
def application_owner
|
|
13
16
|
migration_template(
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
"add_owner_to_application_migration.rb.erb",
|
|
18
|
+
"db/migrate/add_owner_to_application.rb",
|
|
16
19
|
migration_version: migration_version
|
|
17
20
|
)
|
|
18
21
|
end
|
|
@@ -24,9 +27,7 @@ module Doorkeeper
|
|
|
24
27
|
private
|
|
25
28
|
|
|
26
29
|
def migration_version
|
|
27
|
-
|
|
28
|
-
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
29
|
-
end
|
|
30
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
end
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/active_record"
|
|
5
5
|
|
|
6
6
|
module Doorkeeper
|
|
7
|
+
# Generates migration to add confidential column to Doorkeeper
|
|
8
|
+
# applications table.
|
|
9
|
+
#
|
|
7
10
|
class ConfidentialApplicationsGenerator < ::Rails::Generators::Base
|
|
8
11
|
include ::Rails::Generators::Migration
|
|
9
|
-
source_root File.expand_path(
|
|
10
|
-
desc
|
|
12
|
+
source_root File.expand_path("templates", __dir__)
|
|
13
|
+
desc "Add confidential column to Doorkeeper applications"
|
|
11
14
|
|
|
12
15
|
def pkce
|
|
13
16
|
migration_template(
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
"add_confidential_to_applications.rb.erb",
|
|
18
|
+
"db/migrate/add_confidential_to_applications.rb",
|
|
16
19
|
migration_version: migration_version
|
|
17
20
|
)
|
|
18
21
|
end
|
|
@@ -24,9 +27,7 @@ module Doorkeeper
|
|
|
24
27
|
private
|
|
25
28
|
|
|
26
29
|
def migration_version
|
|
27
|
-
|
|
28
|
-
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
29
|
-
end
|
|
30
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
end
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/active_record"
|
|
5
5
|
|
|
6
6
|
module Doorkeeper
|
|
7
|
+
# Setup doorkeeper into Rails application: locales, routes, etc.
|
|
8
|
+
#
|
|
7
9
|
class InstallGenerator < ::Rails::Generators::Base
|
|
8
10
|
include ::Rails::Generators::Migration
|
|
9
|
-
source_root File.expand_path(
|
|
10
|
-
desc
|
|
11
|
+
source_root File.expand_path("templates", __dir__)
|
|
12
|
+
desc "Installs Doorkeeper."
|
|
11
13
|
|
|
12
14
|
def install
|
|
13
|
-
template
|
|
14
|
-
copy_file File.expand_path(
|
|
15
|
-
|
|
16
|
-
route
|
|
17
|
-
readme
|
|
15
|
+
template "initializer.rb", "config/initializers/doorkeeper.rb"
|
|
16
|
+
copy_file File.expand_path("../../../config/locales/en.yml", __dir__),
|
|
17
|
+
"config/locales/doorkeeper.en.yml"
|
|
18
|
+
route "use_doorkeeper"
|
|
19
|
+
readme "README"
|
|
18
20
|
end
|
|
19
21
|
end
|
|
20
22
|
end
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/active_record"
|
|
5
5
|
|
|
6
6
|
module Doorkeeper
|
|
7
|
+
# Copies main Doorkeeper migration into parent Rails application.
|
|
8
|
+
#
|
|
7
9
|
class MigrationGenerator < ::Rails::Generators::Base
|
|
8
10
|
include ::Rails::Generators::Migration
|
|
9
|
-
source_root File.expand_path(
|
|
10
|
-
desc
|
|
11
|
+
source_root File.expand_path("templates", __dir__)
|
|
12
|
+
desc "Installs Doorkeeper migration file."
|
|
11
13
|
|
|
12
14
|
def install
|
|
13
15
|
migration_template(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
"migration.rb.erb",
|
|
17
|
+
"db/migrate/create_doorkeeper_tables.rb",
|
|
16
18
|
migration_version: migration_version
|
|
17
19
|
)
|
|
18
20
|
end
|
|
@@ -24,9 +26,7 @@ module Doorkeeper
|
|
|
24
26
|
private
|
|
25
27
|
|
|
26
28
|
def migration_version
|
|
27
|
-
|
|
28
|
-
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
29
|
-
end
|
|
29
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/active_record"
|
|
5
5
|
|
|
6
6
|
module Doorkeeper
|
|
7
|
+
# Generates migration with PKCE required database columns for
|
|
8
|
+
# Doorkeeper tables.
|
|
9
|
+
#
|
|
7
10
|
class PkceGenerator < ::Rails::Generators::Base
|
|
8
11
|
include ::Rails::Generators::Migration
|
|
9
|
-
source_root File.expand_path(
|
|
10
|
-
desc
|
|
12
|
+
source_root File.expand_path("templates", __dir__)
|
|
13
|
+
desc "Provide support for PKCE."
|
|
11
14
|
|
|
12
15
|
def pkce
|
|
13
16
|
migration_template(
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
"enable_pkce_migration.rb.erb",
|
|
18
|
+
"db/migrate/enable_pkce.rb",
|
|
16
19
|
migration_version: migration_version
|
|
17
20
|
)
|
|
18
21
|
end
|
|
@@ -24,9 +27,7 @@ module Doorkeeper
|
|
|
24
27
|
private
|
|
25
28
|
|
|
26
29
|
def migration_version
|
|
27
|
-
|
|
28
|
-
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
29
|
-
end
|
|
30
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
end
|