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
@@ -2,167 +2,169 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe AuthorizationCodeRequest do
7
- let(:server) do
8
- double :server,
9
- access_token_expires_in: 2.days,
10
- refresh_token_enabled?: false,
11
- custom_access_token_expires_in: lambda { |context|
12
- context.grant_type == Doorkeeper::OAuth::AUTHORIZATION_CODE ? 1234 : nil
13
- }
14
- end
5
+ describe Doorkeeper::OAuth::AuthorizationCodeRequest do
6
+ let(:server) do
7
+ double :server,
8
+ access_token_expires_in: 2.days,
9
+ refresh_token_enabled?: false,
10
+ custom_access_token_expires_in: lambda { |context|
11
+ context.grant_type == Doorkeeper::OAuth::AUTHORIZATION_CODE ? 1234 : nil
12
+ }
13
+ end
15
14
 
16
- let(:grant) { FactoryBot.create :access_grant }
17
- let(:client) { grant.application }
18
- let(:redirect_uri) { client.redirect_uri }
19
- let(:params) { { redirect_uri: redirect_uri } }
15
+ let(:grant) { FactoryBot.create :access_grant }
16
+ let(:client) { grant.application }
17
+ let(:redirect_uri) { client.redirect_uri }
18
+ let(:params) { { redirect_uri: redirect_uri } }
20
19
 
21
- before do
22
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
23
- end
20
+ before do
21
+ allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
22
+ end
24
23
 
25
- subject do
26
- AuthorizationCodeRequest.new(server, grant, client, params)
27
- end
24
+ subject do
25
+ described_class.new(server, grant, client, params)
26
+ end
28
27
 
29
- it "issues a new token for the client" do
30
- expect do
31
- subject.authorize
32
- end.to change { client.reload.access_tokens.count }.by(1)
28
+ it "issues a new token for the client" do
29
+ expect do
30
+ subject.authorize
31
+ end.to change { client.reload.access_tokens.count }.by(1)
33
32
 
34
- expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
35
- end
33
+ expect(client.reload.access_tokens.max_by(&:created_at).expires_in).to eq(1234)
34
+ end
36
35
 
37
- it "issues the token with same grant's scopes" do
38
- subject.authorize
39
- expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
40
- end
36
+ it "issues the token with same grant's scopes" do
37
+ subject.authorize
38
+ expect(Doorkeeper::AccessToken.last.scopes).to eq(grant.scopes)
39
+ end
41
40
 
42
- it "revokes the grant" do
43
- expect { subject.authorize }.to(change { grant.reload.accessible? })
44
- end
41
+ it "revokes the grant" do
42
+ expect { subject.authorize }.to(change { grant.reload.accessible? })
43
+ end
45
44
 
46
- it "requires the grant to be accessible" do
47
- grant.revoke
48
- subject.validate
49
- expect(subject.error).to eq(:invalid_grant)
50
- end
45
+ it "requires the grant to be accessible" do
46
+ grant.revoke
47
+ subject.validate
48
+ expect(subject.error).to eq(:invalid_grant)
49
+ end
51
50
 
52
- it "requires the grant" do
53
- subject.grant = nil
54
- subject.validate
55
- expect(subject.error).to eq(:invalid_grant)
56
- end
51
+ it "requires the grant" do
52
+ subject.grant = nil
53
+ subject.validate
54
+ expect(subject.error).to eq(:invalid_grant)
55
+ end
57
56
 
58
- it "requires the client" do
59
- subject.client = nil
60
- subject.validate
61
- expect(subject.error).to eq(:invalid_client)
62
- end
57
+ it "requires the client" do
58
+ subject.client = nil
59
+ subject.validate
60
+ expect(subject.error).to eq(:invalid_client)
61
+ end
63
62
 
64
- it "requires the redirect_uri" do
65
- subject.redirect_uri = nil
66
- subject.validate
67
- expect(subject.error).to eq(:invalid_request)
68
- expect(subject.missing_param).to eq(:redirect_uri)
69
- end
63
+ it "requires the redirect_uri" do
64
+ subject.redirect_uri = nil
65
+ subject.validate
66
+ expect(subject.error).to eq(:invalid_request)
67
+ expect(subject.missing_param).to eq(:redirect_uri)
68
+ end
70
69
 
71
- it "invalid code_verifier param because server does not support pkce" do
72
- # Some other ORMs work relies on #respond_to? so it's not a good idea to stub it :\
73
- allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(anything).and_call_original
74
- allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(:code_challenge).and_return(false)
70
+ it "invalid code_verifier param because server does not support pkce" do
71
+ # Some other ORMs work relies on #respond_to? so it's not a good idea to stub it :\
72
+ allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(anything).and_call_original
73
+ allow_any_instance_of(Doorkeeper::AccessGrant).to receive(:respond_to?).with(:code_challenge).and_return(false)
75
74
 
76
- subject.code_verifier = "a45a9fea-0676-477e-95b1-a40f72ac3cfb"
77
- subject.validate
78
- expect(subject.error).to eq(:invalid_request)
79
- expect(subject.invalid_request_reason).to eq(:not_support_pkce)
80
- end
75
+ subject.code_verifier = "a45a9fea-0676-477e-95b1-a40f72ac3cfb"
76
+ subject.validate
77
+ expect(subject.error).to eq(:invalid_request)
78
+ expect(subject.invalid_request_reason).to eq(:not_support_pkce)
79
+ end
81
80
 
82
- it "matches the redirect_uri with grant's one" do
83
- subject.redirect_uri = "http://other.com"
84
- subject.validate
85
- expect(subject.error).to eq(:invalid_grant)
86
- end
81
+ it "matches the redirect_uri with grant's one" do
82
+ subject.redirect_uri = "http://other.com"
83
+ subject.validate
84
+ expect(subject.error).to eq(:invalid_grant)
85
+ end
87
86
 
88
- it "matches the client with grant's one" do
89
- subject.client = FactoryBot.create :application
90
- subject.validate
91
- expect(subject.error).to eq(:invalid_grant)
87
+ it "matches the client with grant's one" do
88
+ subject.client = FactoryBot.create :application
89
+ subject.validate
90
+ expect(subject.error).to eq(:invalid_grant)
91
+ end
92
+
93
+ it "skips token creation if there is a matching one reusable" do
94
+ scopes = grant.scopes
95
+
96
+ Doorkeeper.configure do
97
+ orm DOORKEEPER_ORM
98
+ reuse_access_token
99
+ default_scopes(*scopes)
92
100
  end
93
101
 
94
- it "skips token creation if there is a matching one reusable" do
95
- scopes = grant.scopes
102
+ FactoryBot.create(
103
+ :access_token, application_id: client.id,
104
+ resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s,
105
+ )
96
106
 
97
- Doorkeeper.configure do
98
- orm DOORKEEPER_ORM
99
- reuse_access_token
100
- default_scopes(*scopes)
101
- end
107
+ expect { subject.authorize }.to_not(change { Doorkeeper::AccessToken.count })
108
+ end
102
109
 
103
- FactoryBot.create(:access_token, application_id: client.id,
104
- resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
110
+ it "creates token if there is a matching one but non reusable" do
111
+ scopes = grant.scopes
105
112
 
106
- expect { subject.authorize }.to_not(change { Doorkeeper::AccessToken.count })
113
+ Doorkeeper.configure do
114
+ orm DOORKEEPER_ORM
115
+ reuse_access_token
116
+ default_scopes(*scopes)
107
117
  end
108
118
 
109
- it "creates token if there is a matching one but non reusable" do
110
- scopes = grant.scopes
119
+ FactoryBot.create(
120
+ :access_token, application_id: client.id,
121
+ resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s,
122
+ )
111
123
 
112
- Doorkeeper.configure do
113
- orm DOORKEEPER_ORM
114
- reuse_access_token
115
- default_scopes(*scopes)
116
- end
124
+ allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
117
125
 
118
- FactoryBot.create(:access_token, application_id: client.id,
119
- resource_owner_id: grant.resource_owner_id, scopes: grant.scopes.to_s)
126
+ expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
127
+ end
120
128
 
121
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
129
+ it "calls configured request callback methods" do
130
+ expect(Doorkeeper.configuration.before_successful_strategy_response)
131
+ .to receive(:call).with(subject).once
132
+ expect(Doorkeeper.configuration.after_successful_strategy_response)
133
+ .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
122
134
 
123
- expect { subject.authorize }.to change { Doorkeeper::AccessToken.count }.by(1)
124
- end
135
+ subject.authorize
136
+ end
125
137
 
126
- it "calls configured request callback methods" do
127
- expect(Doorkeeper.configuration.before_successful_strategy_response)
128
- .to receive(:call).with(subject).once
129
- expect(Doorkeeper.configuration.after_successful_strategy_response)
130
- .to receive(:call).with(subject, instance_of(Doorkeeper::OAuth::TokenResponse)).once
138
+ context "when redirect_uri contains some query params" do
139
+ let(:redirect_uri) { client.redirect_uri + "?query=q" }
131
140
 
132
- subject.authorize
141
+ it "compares only host part with grant's redirect_uri" do
142
+ subject.validate
143
+ expect(subject.error).to eq(nil)
133
144
  end
145
+ end
134
146
 
135
- context "when redirect_uri contains some query params" do
136
- let(:redirect_uri) { client.redirect_uri + "?query=q" }
147
+ context "when redirect_uri is not an URI" do
148
+ let(:redirect_uri) { "123d#!s" }
137
149
 
138
- it "compares only host part with grant's redirect_uri" do
139
- subject.validate
140
- expect(subject.error).to eq(nil)
141
- end
150
+ it "responds with invalid_grant" do
151
+ subject.validate
152
+ expect(subject.error).to eq(:invalid_grant)
142
153
  end
154
+ end
143
155
 
144
- context "when redirect_uri is not an URI" do
145
- let(:redirect_uri) { "123d#!s" }
156
+ context "when redirect_uri is the native one" do
157
+ let(:redirect_uri) { "urn:ietf:wg:oauth:2.0:oob" }
146
158
 
147
- it "responds with invalid_grant" do
148
- subject.validate
149
- expect(subject.error).to eq(:invalid_grant)
150
- end
159
+ it "invalidates when redirect_uri of the grant is not native" do
160
+ subject.validate
161
+ expect(subject.error).to eq(:invalid_grant)
151
162
  end
152
163
 
153
- context "when redirect_uri is the native one" do
154
- let(:redirect_uri) { "urn:ietf:wg:oauth:2.0:oob" }
155
-
156
- it "invalidates when redirect_uri of the grant is not native" do
157
- subject.validate
158
- expect(subject.error).to eq(:invalid_grant)
159
- end
160
-
161
- it "validates when redirect_uri of the grant is also native" do
162
- allow(grant).to receive(:redirect_uri) { redirect_uri }
163
- subject.validate
164
- expect(subject.error).to eq(nil)
165
- end
164
+ it "validates when redirect_uri of the grant is also native" do
165
+ allow(grant).to receive(:redirect_uri) { redirect_uri }
166
+ subject.validate
167
+ expect(subject.error).to eq(nil)
166
168
  end
167
169
  end
168
170
  end