doorkeeper 5.2.5 → 5.3.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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +2 -2
  3. data/CHANGELOG.md +16 -11
  4. data/Gemfile +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +2 -2
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +2 -2
  7. data/app/controllers/doorkeeper/applications_controller.rb +3 -3
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +2 -2
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +3 -3
  10. data/gemfiles/rails_5_0.gemfile +2 -2
  11. data/gemfiles/rails_5_1.gemfile +2 -2
  12. data/gemfiles/rails_5_2.gemfile +2 -2
  13. data/gemfiles/rails_6_0.gemfile +2 -2
  14. data/gemfiles/rails_master.gemfile +2 -2
  15. data/lib/doorkeeper/config.rb +71 -39
  16. data/lib/doorkeeper/grape/helpers.rb +1 -1
  17. data/lib/doorkeeper/helpers/controller.rb +10 -8
  18. data/lib/doorkeeper/models/access_grant_mixin.rb +7 -6
  19. data/lib/doorkeeper/models/access_token_mixin.rb +55 -18
  20. data/lib/doorkeeper/models/application_mixin.rb +3 -3
  21. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  22. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  23. data/lib/doorkeeper/models/concerns/revocable.rb +0 -27
  24. data/lib/doorkeeper/oauth/authorization/code.rb +4 -4
  25. data/lib/doorkeeper/oauth/authorization/token.rb +9 -6
  26. data/lib/doorkeeper/oauth/authorization_code_request.rb +13 -6
  27. data/lib/doorkeeper/oauth/base_request.rb +8 -4
  28. data/lib/doorkeeper/oauth/client.rb +7 -8
  29. data/lib/doorkeeper/oauth/client_credentials/creator.rb +16 -9
  30. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +7 -7
  31. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +4 -4
  32. data/lib/doorkeeper/oauth/client_credentials_request.rb +1 -1
  33. data/lib/doorkeeper/oauth/code_response.rb +2 -2
  34. data/lib/doorkeeper/oauth/error.rb +1 -1
  35. data/lib/doorkeeper/oauth/error_response.rb +5 -5
  36. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +7 -5
  37. data/lib/doorkeeper/oauth/helpers/unique_token.rb +8 -5
  38. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +1 -1
  39. data/lib/doorkeeper/oauth/invalid_request_response.rb +3 -3
  40. data/lib/doorkeeper/oauth/invalid_token_response.rb +5 -2
  41. data/lib/doorkeeper/oauth/password_access_token_request.rb +3 -3
  42. data/lib/doorkeeper/oauth/pre_authorization.rb +7 -5
  43. data/lib/doorkeeper/oauth/refresh_token_request.rb +5 -5
  44. data/lib/doorkeeper/oauth/token.rb +2 -2
  45. data/lib/doorkeeper/oauth/token_introspection.rb +6 -6
  46. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  47. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  48. data/lib/doorkeeper/orm/active_record/application.rb +3 -155
  49. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +53 -0
  50. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +47 -0
  51. data/lib/doorkeeper/orm/active_record/mixins/application.rb +128 -0
  52. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +3 -3
  53. data/lib/doorkeeper/orm/active_record.rb +3 -3
  54. data/lib/doorkeeper/rails/helpers.rb +4 -4
  55. data/lib/doorkeeper/rails/routes.rb +5 -7
  56. data/lib/doorkeeper/rake/db.rake +3 -3
  57. data/lib/doorkeeper/request/authorization_code.rb +3 -3
  58. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  59. data/lib/doorkeeper/request/password.rb +2 -2
  60. data/lib/doorkeeper/request/refresh_token.rb +3 -3
  61. data/lib/doorkeeper/request.rb +1 -1
  62. data/lib/doorkeeper/server.rb +1 -1
  63. data/lib/doorkeeper/stale_records_cleaner.rb +1 -1
  64. data/lib/doorkeeper/version.rb +2 -2
  65. data/lib/doorkeeper.rb +2 -3
  66. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  67. data/lib/generators/doorkeeper/confidential_applications_generator.rb +1 -1
  68. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  69. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  70. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +2 -2
  71. data/lib/generators/doorkeeper/templates/initializer.rb +39 -8
  72. data/spec/controllers/application_metal_controller_spec.rb +1 -1
  73. data/spec/controllers/applications_controller_spec.rb +3 -2
  74. data/spec/controllers/authorizations_controller_spec.rb +18 -18
  75. data/spec/controllers/protected_resources_controller_spec.rb +25 -17
  76. data/spec/controllers/token_info_controller_spec.rb +1 -1
  77. data/spec/controllers/tokens_controller_spec.rb +1 -1
  78. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +3 -3
  79. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +1 -1
  80. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +1 -1
  81. data/spec/generators/install_generator_spec.rb +1 -1
  82. data/spec/generators/previous_refresh_token_generator_spec.rb +2 -2
  83. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +1 -1
  84. data/spec/lib/config_spec.rb +61 -21
  85. data/spec/lib/doorkeeper_spec.rb +1 -1
  86. data/spec/lib/models/revocable_spec.rb +3 -3
  87. data/spec/lib/oauth/authorization_code_request_spec.rb +127 -125
  88. data/spec/lib/oauth/base_request_spec.rb +160 -158
  89. data/spec/lib/oauth/base_response_spec.rb +27 -29
  90. data/spec/lib/oauth/client/credentials_spec.rb +1 -1
  91. data/spec/lib/oauth/client_credentials/creator_spec.rb +42 -5
  92. data/spec/lib/oauth/client_credentials/issuer_spec.rb +12 -12
  93. data/spec/lib/oauth/client_credentials/validation_spec.rb +4 -4
  94. data/spec/lib/oauth/client_credentials_integration_spec.rb +16 -18
  95. data/spec/lib/oauth/client_credentials_request_spec.rb +78 -80
  96. data/spec/lib/oauth/client_spec.rb +26 -26
  97. data/spec/lib/oauth/code_request_spec.rb +34 -34
  98. data/spec/lib/oauth/code_response_spec.rb +21 -25
  99. data/spec/lib/oauth/error_response_spec.rb +42 -44
  100. data/spec/lib/oauth/error_spec.rb +12 -14
  101. data/spec/lib/oauth/forbidden_token_response_spec.rb +11 -13
  102. data/spec/lib/oauth/helpers/scope_checker_spec.rb +30 -18
  103. data/spec/lib/oauth/invalid_request_response_spec.rb +48 -50
  104. data/spec/lib/oauth/invalid_token_response_spec.rb +32 -34
  105. data/spec/lib/oauth/password_access_token_request_spec.rb +145 -147
  106. data/spec/lib/oauth/pre_authorization_spec.rb +159 -161
  107. data/spec/lib/oauth/refresh_token_request_spec.rb +138 -139
  108. data/spec/lib/oauth/scopes_spec.rb +104 -106
  109. data/spec/lib/oauth/token_request_spec.rb +115 -111
  110. data/spec/lib/oauth/token_response_spec.rb +71 -73
  111. data/spec/lib/oauth/token_spec.rb +121 -123
  112. data/spec/models/doorkeeper/access_grant_spec.rb +3 -5
  113. data/spec/models/doorkeeper/access_token_spec.rb +7 -7
  114. data/spec/models/doorkeeper/application_spec.rb +295 -373
  115. data/spec/requests/applications/applications_request_spec.rb +1 -1
  116. data/spec/requests/endpoints/authorization_spec.rb +5 -3
  117. data/spec/requests/flows/authorization_code_spec.rb +34 -22
  118. data/spec/requests/flows/client_credentials_spec.rb +1 -1
  119. data/spec/requests/flows/password_spec.rb +32 -12
  120. data/spec/requests/flows/refresh_token_spec.rb +19 -19
  121. data/spec/requests/flows/revoke_token_spec.rb +18 -12
  122. data/spec/spec_helper.rb +1 -4
  123. data/spec/support/shared/controllers_shared_context.rb +33 -23
  124. data/spec/validators/redirect_uri_validator_spec.rb +1 -1
  125. metadata +6 -5
  126. data/spec/support/http_method_shim.rb +0 -29
@@ -7,152 +7,150 @@ module Doorkeeper
7
7
  class AccessToken
8
8
  end
9
9
  end
10
+ end
10
11
 
11
- module OAuth
12
- describe Token do
13
- describe :from_request do
14
- let(:request) { double.as_null_object }
12
+ describe Doorkeeper::OAuth::Token do
13
+ describe ".from_request" do
14
+ let(:request) { double.as_null_object }
15
15
 
16
- let(:method) do
17
- ->(*) { "token-value" }
18
- end
16
+ let(:method) do
17
+ ->(*) { "token-value" }
18
+ end
19
19
 
20
- it "accepts anything that responds to #call" do
21
- expect(method).to receive(:call).with(request)
22
- Token.from_request request, method
23
- end
20
+ it "accepts anything that responds to #call" do
21
+ expect(method).to receive(:call).with(request)
22
+ described_class.from_request request, method
23
+ end
24
24
 
25
- it "delegates methods received as symbols to Token class" do
26
- expect(Token).to receive(:from_params).with(request)
27
- Token.from_request request, :from_params
28
- end
25
+ it "delegates methods received as symbols to described_class class" do
26
+ expect(described_class).to receive(:from_params).with(request)
27
+ described_class.from_request request, :from_params
28
+ end
29
29
 
30
- it "stops at the first credentials found" do
31
- not_called_method = double
32
- expect(not_called_method).not_to receive(:call)
33
- Token.from_request request, ->(_r) {}, method, not_called_method
34
- end
30
+ it "stops at the first credentials found" do
31
+ not_called_method = double
32
+ expect(not_called_method).not_to receive(:call)
33
+ described_class.from_request request, ->(_r) {}, method, not_called_method
34
+ end
35
35
 
36
- it "returns the credential from extractor method" do
37
- credentials = Token.from_request request, method
38
- expect(credentials).to eq("token-value")
39
- end
40
- end
36
+ it "returns the credential from extractor method" do
37
+ credentials = described_class.from_request request, method
38
+ expect(credentials).to eq("token-value")
39
+ end
40
+ end
41
41
 
42
- describe :from_access_token_param do
43
- it "returns token from access_token parameter" do
44
- request = double parameters: { access_token: "some-token" }
45
- token = Token.from_access_token_param(request)
46
- expect(token).to eq("some-token")
47
- end
48
- end
42
+ describe ".from_access_token_param" do
43
+ it "returns token from access_token parameter" do
44
+ request = double parameters: { access_token: "some-token" }
45
+ token = described_class.from_access_token_param(request)
46
+ expect(token).to eq("some-token")
47
+ end
48
+ end
49
49
 
50
- describe :from_bearer_param do
51
- it "returns token from bearer_token parameter" do
52
- request = double parameters: { bearer_token: "some-token" }
53
- token = Token.from_bearer_param(request)
54
- expect(token).to eq("some-token")
55
- end
56
- end
50
+ describe ".from_bearer_param" do
51
+ it "returns token from bearer_token parameter" do
52
+ request = double parameters: { bearer_token: "some-token" }
53
+ token = described_class.from_bearer_param(request)
54
+ expect(token).to eq("some-token")
55
+ end
56
+ end
57
57
 
58
- describe :from_bearer_authorization do
59
- it "returns token from capitalized authorization bearer" do
60
- request = double authorization: "Bearer SomeToken"
61
- token = Token.from_bearer_authorization(request)
62
- expect(token).to eq("SomeToken")
63
- end
58
+ describe ".from_bearer_authorization" do
59
+ it "returns token from capitalized authorization bearer" do
60
+ request = double authorization: "Bearer SomeToken"
61
+ token = described_class.from_bearer_authorization(request)
62
+ expect(token).to eq("SomeToken")
63
+ end
64
64
 
65
- it "returns token from lowercased authorization bearer" do
66
- request = double authorization: "bearer SomeToken"
67
- token = Token.from_bearer_authorization(request)
68
- expect(token).to eq("SomeToken")
69
- end
65
+ it "returns token from lowercased authorization bearer" do
66
+ request = double authorization: "bearer SomeToken"
67
+ token = described_class.from_bearer_authorization(request)
68
+ expect(token).to eq("SomeToken")
69
+ end
70
70
 
71
- it "does not return token if authorization is not bearer" do
72
- request = double authorization: "MAC SomeToken"
73
- token = Token.from_bearer_authorization(request)
74
- expect(token).to be_blank
75
- end
76
- end
71
+ it "does not return token if authorization is not bearer" do
72
+ request = double authorization: "MAC SomeToken"
73
+ token = described_class.from_bearer_authorization(request)
74
+ expect(token).to be_blank
75
+ end
76
+ end
77
77
 
78
- describe :from_basic_authorization do
79
- it "returns token from capitalized authorization basic" do
80
- request = double authorization: "Basic #{Base64.encode64 "SomeToken:"}"
81
- token = Token.from_basic_authorization(request)
82
- expect(token).to eq("SomeToken")
83
- end
78
+ describe ".from_basic_authorization" do
79
+ it "returns token from capitalized authorization basic" do
80
+ request = double authorization: "Basic #{Base64.encode64 "SomeToken:"}"
81
+ token = described_class.from_basic_authorization(request)
82
+ expect(token).to eq("SomeToken")
83
+ end
84
84
 
85
- it "returns token from lowercased authorization basic" do
86
- request = double authorization: "basic #{Base64.encode64 "SomeToken:"}"
87
- token = Token.from_basic_authorization(request)
88
- expect(token).to eq("SomeToken")
89
- end
85
+ it "returns token from lowercased authorization basic" do
86
+ request = double authorization: "basic #{Base64.encode64 "SomeToken:"}"
87
+ token = described_class.from_basic_authorization(request)
88
+ expect(token).to eq("SomeToken")
89
+ end
90
90
 
91
- it "does not return token if authorization is not basic" do
92
- request = double authorization: "MAC #{Base64.encode64 "SomeToken:"}"
93
- token = Token.from_basic_authorization(request)
94
- expect(token).to be_blank
91
+ it "does not return token if authorization is not basic" do
92
+ request = double authorization: "MAC #{Base64.encode64 "SomeToken:"}"
93
+ token = described_class.from_basic_authorization(request)
94
+ expect(token).to be_blank
95
+ end
96
+ end
97
+
98
+ describe ".authenticate" do
99
+ context "refresh tokens are disabled (default)" do
100
+ context "refresh tokens are enabled" do
101
+ it "does not revoke previous refresh_token if token was found" do
102
+ token = ->(_r) { "token" }
103
+ expect(
104
+ Doorkeeper::AccessToken,
105
+ ).to receive(:by_token).with("token").and_return(token)
106
+ expect(token).not_to receive(:revoke_previous_refresh_token!)
107
+ described_class.authenticate double, token
95
108
  end
96
109
  end
97
110
 
98
- describe :authenticate do
99
- context "refresh tokens are disabled (default)" do
100
- context "refresh tokens are enabled" do
101
- it "does not revoke previous refresh_token if token was found" do
102
- token = ->(_r) { "token" }
103
- expect(
104
- AccessToken
105
- ).to receive(:by_token).with("token").and_return(token)
106
- expect(token).not_to receive(:revoke_previous_refresh_token!)
107
- Token.authenticate double, token
108
- end
109
- end
110
-
111
- it "calls the finder if token was returned" do
112
- token = ->(_r) { "token" }
113
- expect(AccessToken).to receive(:by_token).with("token")
114
- Token.authenticate double, token
115
- end
116
- end
111
+ it "calls the finder if token was returned" do
112
+ token = ->(_r) { "token" }
113
+ expect(Doorkeeper::AccessToken).to receive(:by_token).with("token")
114
+ described_class.authenticate double, token
115
+ end
116
+ end
117
117
 
118
- context "token hashing is enabled" do
119
- include_context "with token hashing enabled"
118
+ context "token hashing is enabled" do
119
+ include_context "with token hashing enabled"
120
120
 
121
- let(:hashed_token) { hashed_or_plain_token_func.call("token") }
122
- let(:token) { ->(_r) { "token" } }
121
+ let(:hashed_token) { hashed_or_plain_token_func.call("token") }
122
+ let(:token) { ->(_r) { "token" } }
123
123
 
124
- it "searches with the hashed token" do
125
- expect(
126
- AccessToken
127
- ).to receive(:find_by).with(token: hashed_token).and_return(token)
128
- Token.authenticate double, token
129
- end
130
- end
124
+ it "searches with the hashed token" do
125
+ expect(
126
+ Doorkeeper::AccessToken,
127
+ ).to receive(:find_by).with(token: hashed_token).and_return(token)
128
+ described_class.authenticate double, token
129
+ end
130
+ end
131
131
 
132
- context "refresh tokens are enabled" do
133
- before do
134
- Doorkeeper.configure do
135
- orm DOORKEEPER_ORM
136
- use_refresh_token
137
- end
138
- end
139
-
140
- it "revokes previous refresh_token if token was found" do
141
- token = ->(_r) { "token" }
142
- expect(
143
- AccessToken
144
- ).to receive(:by_token).with("token").and_return(token)
145
- expect(token).to receive(:revoke_previous_refresh_token!)
146
- Token.authenticate double, token
147
- end
148
-
149
- it "calls the finder if token was returned" do
150
- token = ->(_r) { "token" }
151
- expect(AccessToken).to receive(:by_token).with("token")
152
- Token.authenticate double, token
153
- end
132
+ context "refresh tokens are enabled" do
133
+ before do
134
+ Doorkeeper.configure do
135
+ orm DOORKEEPER_ORM
136
+ use_refresh_token
154
137
  end
155
138
  end
139
+
140
+ it "revokes previous refresh_token if token was found" do
141
+ token = ->(_r) { "token" }
142
+ expect(
143
+ Doorkeeper::AccessToken,
144
+ ).to receive(:by_token).with("token").and_return(token)
145
+ expect(token).to receive(:revoke_previous_refresh_token!)
146
+ described_class.authenticate double, token
147
+ end
148
+
149
+ it "calls the finder if token was returned" do
150
+ token = ->(_r) { "token" }
151
+ expect(Doorkeeper::AccessToken).to receive(:by_token).with("token")
152
+ described_class.authenticate double, token
153
+ end
156
154
  end
157
155
  end
158
156
  end
@@ -81,9 +81,7 @@ describe Doorkeeper::AccessGrant do
81
81
  )
82
82
 
83
83
  # Not all the ORM support :id PK
84
- if grant.respond_to?(:id)
85
- expect(clazz.by_token(plain_text_token).id).to eq(grant.id)
86
- end
84
+ expect(clazz.by_token(plain_text_token).id).to eq(grant.id) if grant.respond_to?(:id)
87
85
 
88
86
  # And it modifies the token value
89
87
  grant.reload
@@ -141,7 +139,7 @@ describe Doorkeeper::AccessGrant do
141
139
  it "matches application" do
142
140
  access_grant_for_different_app = FactoryBot.create(
143
141
  :access_grant,
144
- default_attributes.merge(application: FactoryBot.create(:application))
142
+ default_attributes.merge(application: FactoryBot.create(:application)),
145
143
  )
146
144
 
147
145
  described_class.revoke_all_for(application.id, resource_owner)
@@ -152,7 +150,7 @@ describe Doorkeeper::AccessGrant do
152
150
  it "matches resource owner" do
153
151
  access_grant_for_different_owner = FactoryBot.create(
154
152
  :access_grant,
155
- default_attributes.merge(resource_owner_id: 90)
153
+ default_attributes.merge(resource_owner_id: 90),
156
154
  )
157
155
 
158
156
  described_class.revoke_all_for application.id, resource_owner
@@ -212,7 +212,7 @@ module Doorkeeper
212
212
  end
213
213
 
214
214
  expect { FactoryBot.create :access_token }.to(
215
- raise_error(Doorkeeper::Errors::UnableToGenerateToken)
215
+ raise_error(Doorkeeper::Errors::UnableToGenerateToken),
216
216
  )
217
217
  end
218
218
 
@@ -234,7 +234,7 @@ module Doorkeeper
234
234
  end
235
235
 
236
236
  expect { FactoryBot.create :access_token }.to(
237
- raise_error(LoadError)
237
+ raise_error(LoadError),
238
238
  )
239
239
  end
240
240
 
@@ -245,7 +245,7 @@ module Doorkeeper
245
245
  end
246
246
 
247
247
  expect { FactoryBot.create :access_token }.to(
248
- raise_error(Doorkeeper::Errors::TokenGeneratorNotFound, /NotReal/)
248
+ raise_error(Doorkeeper::Errors::TokenGeneratorNotFound, /NotReal/),
249
249
  )
250
250
  end
251
251
  end
@@ -468,7 +468,7 @@ module Doorkeeper
468
468
  it "matches application" do
469
469
  access_token_for_different_app = FactoryBot.create(
470
470
  :access_token,
471
- default_attributes.merge(application: FactoryBot.create(:application))
471
+ default_attributes.merge(application: FactoryBot.create(:application)),
472
472
  )
473
473
 
474
474
  AccessToken.revoke_all_for application.id, resource_owner
@@ -479,7 +479,7 @@ module Doorkeeper
479
479
  it "matches resource owner" do
480
480
  access_token_for_different_owner = FactoryBot.create(
481
481
  :access_token,
482
- default_attributes.merge(resource_owner_id: 90)
482
+ default_attributes.merge(resource_owner_id: 90),
483
483
  )
484
484
 
485
485
  AccessToken.revoke_all_for application.id, resource_owner
@@ -561,7 +561,7 @@ module Doorkeeper
561
561
 
562
562
  it "excludes tokens with scopes that are not present in server scopes" do
563
563
  FactoryBot.create :access_token, default_attributes.merge(
564
- application: application, scopes: "public read"
564
+ application: application, scopes: "public read",
565
565
  )
566
566
  last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
567
567
  expect(last_token).to be_nil
@@ -570,7 +570,7 @@ module Doorkeeper
570
570
  it "excludes tokens with scopes that are not present in application scopes" do
571
571
  application = FactoryBot.create :application, scopes: "private read"
572
572
  FactoryBot.create :access_token, default_attributes.merge(
573
- application: application
573
+ application: application,
574
574
  )
575
575
  last_token = AccessToken.matching_token_for(application, resource_owner_id, scopes)
576
576
  expect(last_token).to be_nil