doorkeeper 5.1.0 → 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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +3 -3
  3. data/CHANGELOG.md +881 -0
  4. data/CONTRIBUTING.md +11 -9
  5. data/Dangerfile +2 -2
  6. data/Dockerfile +29 -0
  7. data/Gemfile +4 -3
  8. data/NEWS.md +1 -814
  9. data/README.md +11 -3
  10. data/RELEASING.md +6 -5
  11. data/app/controllers/doorkeeper/application_controller.rb +2 -2
  12. data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
  13. data/app/controllers/doorkeeper/applications_controller.rb +1 -0
  14. data/app/controllers/doorkeeper/authorizations_controller.rb +16 -9
  15. data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -2
  16. data/app/controllers/doorkeeper/tokens_controller.rb +32 -9
  17. data/app/views/doorkeeper/applications/_form.html.erb +0 -6
  18. data/app/views/doorkeeper/applications/show.html.erb +1 -1
  19. data/config/locales/en.yml +8 -2
  20. data/doorkeeper.gemspec +9 -1
  21. data/gemfiles/rails_5_0.gemfile +3 -2
  22. data/gemfiles/rails_5_1.gemfile +3 -2
  23. data/gemfiles/rails_5_2.gemfile +3 -2
  24. data/gemfiles/rails_6_0.gemfile +4 -3
  25. data/gemfiles/rails_master.gemfile +3 -2
  26. data/lib/doorkeeper/config/option.rb +13 -7
  27. data/lib/doorkeeper/config.rb +157 -42
  28. data/lib/doorkeeper/errors.rb +13 -18
  29. data/lib/doorkeeper/grape/helpers.rb +6 -2
  30. data/lib/doorkeeper/helpers/controller.rb +28 -7
  31. data/lib/doorkeeper/models/access_grant_mixin.rb +7 -6
  32. data/lib/doorkeeper/models/access_token_mixin.rb +99 -20
  33. data/lib/doorkeeper/models/application_mixin.rb +3 -3
  34. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  35. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  36. data/lib/doorkeeper/models/concerns/revocable.rb +0 -27
  37. data/lib/doorkeeper/oauth/authorization/code.rb +12 -14
  38. data/lib/doorkeeper/oauth/authorization/token.rb +10 -7
  39. data/lib/doorkeeper/oauth/authorization_code_request.rb +31 -15
  40. data/lib/doorkeeper/oauth/base_request.rb +10 -4
  41. data/lib/doorkeeper/oauth/client.rb +7 -8
  42. data/lib/doorkeeper/oauth/client_credentials/creator.rb +23 -2
  43. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +7 -7
  44. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +10 -2
  45. data/lib/doorkeeper/oauth/client_credentials_request.rb +1 -1
  46. data/lib/doorkeeper/oauth/code_request.rb +5 -11
  47. data/lib/doorkeeper/oauth/code_response.rb +4 -4
  48. data/lib/doorkeeper/oauth/error.rb +1 -1
  49. data/lib/doorkeeper/oauth/error_response.rb +6 -6
  50. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +7 -5
  51. data/lib/doorkeeper/oauth/helpers/unique_token.rb +8 -5
  52. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -5
  53. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  54. data/lib/doorkeeper/oauth/invalid_token_response.rb +5 -2
  55. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  56. data/lib/doorkeeper/oauth/password_access_token_request.rb +9 -4
  57. data/lib/doorkeeper/oauth/pre_authorization.rb +76 -38
  58. data/lib/doorkeeper/oauth/refresh_token_request.rb +17 -14
  59. data/lib/doorkeeper/oauth/token.rb +2 -2
  60. data/lib/doorkeeper/oauth/token_introspection.rb +26 -16
  61. data/lib/doorkeeper/oauth/token_request.rb +4 -18
  62. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  63. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  64. data/lib/doorkeeper/orm/active_record/application.rb +5 -83
  65. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +53 -0
  66. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +47 -0
  67. data/lib/doorkeeper/orm/active_record/mixins/application.rb +128 -0
  68. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +61 -0
  69. data/lib/doorkeeper/orm/active_record.rb +21 -6
  70. data/lib/doorkeeper/rails/helpers.rb +4 -4
  71. data/lib/doorkeeper/rails/routes.rb +5 -7
  72. data/lib/doorkeeper/rake/db.rake +3 -3
  73. data/lib/doorkeeper/request/authorization_code.rb +5 -3
  74. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  75. data/lib/doorkeeper/request/password.rb +2 -2
  76. data/lib/doorkeeper/request/refresh_token.rb +3 -3
  77. data/lib/doorkeeper/request.rb +7 -12
  78. data/lib/doorkeeper/server.rb +3 -7
  79. data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
  80. data/lib/doorkeeper/version.rb +1 -1
  81. data/lib/doorkeeper.rb +6 -3
  82. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  83. data/lib/generators/doorkeeper/confidential_applications_generator.rb +1 -1
  84. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  85. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  86. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
  87. data/lib/generators/doorkeeper/templates/initializer.rb +149 -33
  88. data/lib/generators/doorkeeper/templates/migration.rb.erb +4 -1
  89. data/spec/controllers/application_metal_controller_spec.rb +1 -1
  90. data/spec/controllers/applications_controller_spec.rb +95 -1
  91. data/spec/controllers/authorizations_controller_spec.rb +156 -75
  92. data/spec/controllers/protected_resources_controller_spec.rb +28 -20
  93. data/spec/controllers/token_info_controller_spec.rb +1 -1
  94. data/spec/controllers/tokens_controller_spec.rb +206 -38
  95. data/spec/dummy/config/application.rb +3 -1
  96. data/spec/dummy/config/initializers/doorkeeper.rb +54 -9
  97. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +3 -3
  98. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +1 -1
  99. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +1 -1
  100. data/spec/generators/install_generator_spec.rb +1 -1
  101. data/spec/generators/previous_refresh_token_generator_spec.rb +2 -2
  102. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +1 -1
  103. data/spec/lib/config_spec.rb +104 -7
  104. data/spec/lib/doorkeeper_spec.rb +1 -1
  105. data/spec/lib/models/revocable_spec.rb +3 -3
  106. data/spec/lib/oauth/authorization_code_request_spec.rb +129 -115
  107. data/spec/lib/oauth/base_request_spec.rb +154 -135
  108. data/spec/lib/oauth/base_response_spec.rb +27 -29
  109. data/spec/lib/oauth/client/credentials_spec.rb +1 -1
  110. data/spec/lib/oauth/client_credentials/creator_spec.rb +43 -3
  111. data/spec/lib/oauth/client_credentials/issuer_spec.rb +12 -12
  112. data/spec/lib/oauth/client_credentials/validation_spec.rb +4 -4
  113. data/spec/lib/oauth/client_credentials_integration_spec.rb +16 -18
  114. data/spec/lib/oauth/client_credentials_request_spec.rb +78 -80
  115. data/spec/lib/oauth/client_spec.rb +26 -26
  116. data/spec/lib/oauth/code_request_spec.rb +34 -35
  117. data/spec/lib/oauth/code_response_spec.rb +21 -25
  118. data/spec/lib/oauth/error_response_spec.rb +42 -44
  119. data/spec/lib/oauth/error_spec.rb +12 -14
  120. data/spec/lib/oauth/forbidden_token_response_spec.rb +11 -13
  121. data/spec/lib/oauth/helpers/scope_checker_spec.rb +30 -18
  122. data/spec/lib/oauth/helpers/uri_checker_spec.rb +17 -2
  123. data/spec/lib/oauth/invalid_request_response_spec.rb +73 -0
  124. data/spec/lib/oauth/invalid_token_response_spec.rb +32 -34
  125. data/spec/lib/oauth/password_access_token_request_spec.rb +145 -147
  126. data/spec/lib/oauth/pre_authorization_spec.rb +161 -153
  127. data/spec/lib/oauth/refresh_token_request_spec.rb +138 -138
  128. data/spec/lib/oauth/scopes_spec.rb +104 -106
  129. data/spec/lib/oauth/token_request_spec.rb +117 -110
  130. data/spec/lib/oauth/token_response_spec.rb +71 -73
  131. data/spec/lib/oauth/token_spec.rb +121 -123
  132. data/spec/lib/server_spec.rb +0 -12
  133. data/spec/models/doorkeeper/access_grant_spec.rb +21 -4
  134. data/spec/models/doorkeeper/access_token_spec.rb +42 -11
  135. data/spec/models/doorkeeper/application_spec.rb +114 -77
  136. data/spec/requests/applications/applications_request_spec.rb +1 -1
  137. data/spec/requests/endpoints/authorization_spec.rb +26 -8
  138. data/spec/requests/endpoints/token_spec.rb +1 -1
  139. data/spec/requests/flows/authorization_code_errors_spec.rb +1 -0
  140. data/spec/requests/flows/authorization_code_spec.rb +123 -45
  141. data/spec/requests/flows/client_credentials_spec.rb +38 -0
  142. data/spec/requests/flows/implicit_grant_errors_spec.rb +22 -10
  143. data/spec/requests/flows/implicit_grant_spec.rb +9 -8
  144. data/spec/requests/flows/password_spec.rb +67 -10
  145. data/spec/requests/flows/refresh_token_spec.rb +20 -20
  146. data/spec/requests/flows/revoke_token_spec.rb +37 -23
  147. data/spec/spec_helper.rb +1 -4
  148. data/spec/support/doorkeeper_rspec.rb +1 -1
  149. data/spec/support/helpers/request_spec_helper.rb +14 -2
  150. data/spec/support/shared/controllers_shared_context.rb +33 -23
  151. data/spec/validators/redirect_uri_validator_spec.rb +41 -16
  152. metadata +19 -16
  153. data/.coveralls.yml +0 -1
  154. data/.github/ISSUE_TEMPLATE.md +0 -25
  155. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  156. data/.gitignore +0 -20
  157. data/.gitlab-ci.yml +0 -16
  158. data/.hound.yml +0 -3
  159. data/.rspec +0 -1
  160. data/.rubocop.yml +0 -50
  161. data/.travis.yml +0 -35
  162. data/app/validators/redirect_uri_validator.rb +0 -50
  163. data/spec/support/http_method_shim.rb +0 -29
@@ -2,46 +2,44 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe BaseResponse do
7
- subject do
8
- BaseResponse.new
9
- end
5
+ describe Doorkeeper::OAuth::BaseResponse do
6
+ subject do
7
+ Doorkeeper::OAuth::BaseResponse.new
8
+ end
10
9
 
11
- describe "#body" do
12
- it "returns an empty Hash" do
13
- expect(subject.body).to eq({})
14
- end
10
+ describe "#body" do
11
+ it "returns an empty Hash" do
12
+ expect(subject.body).to eq({})
15
13
  end
14
+ end
16
15
 
17
- describe "#description" do
18
- it "returns an empty String" do
19
- expect(subject.description).to eq("")
20
- end
16
+ describe "#description" do
17
+ it "returns an empty String" do
18
+ expect(subject.description).to eq("")
21
19
  end
20
+ end
22
21
 
23
- describe "#headers" do
24
- it "returns an empty Hash" do
25
- expect(subject.headers).to eq({})
26
- end
22
+ describe "#headers" do
23
+ it "returns an empty Hash" do
24
+ expect(subject.headers).to eq({})
27
25
  end
26
+ end
28
27
 
29
- describe "#redirectable?" do
30
- it "returns false" do
31
- expect(subject.redirectable?).to eq(false)
32
- end
28
+ describe "#redirectable?" do
29
+ it "returns false" do
30
+ expect(subject.redirectable?).to eq(false)
33
31
  end
32
+ end
34
33
 
35
- describe "#redirect_uri" do
36
- it "returns an empty String" do
37
- expect(subject.redirect_uri).to eq("")
38
- end
34
+ describe "#redirect_uri" do
35
+ it "returns an empty String" do
36
+ expect(subject.redirect_uri).to eq("")
39
37
  end
38
+ end
40
39
 
41
- describe "#status" do
42
- it "returns :ok" do
43
- expect(subject.status).to eq(:ok)
44
- end
40
+ describe "#status" do
41
+ it "returns :ok" do
42
+ expect(subject.status).to eq(:ok)
45
43
  end
46
44
  end
47
45
  end
@@ -14,7 +14,7 @@ class Doorkeeper::OAuth::Client
14
14
  expect(Credentials.new("something", "something")).to be_present
15
15
  end
16
16
 
17
- describe :from_request do
17
+ describe ".from_request" do
18
18
  let(:request) { double.as_null_object }
19
19
 
20
20
  let(:method) do
@@ -31,17 +31,31 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
31
31
  end
32
32
 
33
33
  context "when existing token has not crossed token_reuse_limit" do
34
- it "returns the existing valid token" do
34
+ let!(:existing_token) { subject.call(client, scopes, expires_in: 1000) }
35
+
36
+ before do
35
37
  allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
36
38
  allow(Doorkeeper.configuration).to receive(:token_reuse_limit).and_return(50)
37
- existing_token = subject.call(client, scopes, expires_in: 1000)
38
-
39
39
  allow_any_instance_of(Doorkeeper::AccessToken).to receive(:expires_in_seconds).and_return(600)
40
+ end
41
+
42
+ it "returns the existing valid token" do
40
43
  result = subject.call(client, scopes, expires_in: 1000)
41
44
 
42
45
  expect(Doorkeeper::AccessToken.count).to eq(1)
43
46
  expect(result).to eq(existing_token)
44
47
  end
48
+
49
+ context "and when revoke_previous_client_credentials_token is true" do
50
+ before do
51
+ allow(Doorkeeper.configuration).to receive(:revoke_previous_client_credentials_token).and_return(false)
52
+ end
53
+
54
+ it "does not revoke the existing valid token" do
55
+ subject.call(client, scopes, expires_in: 1000)
56
+ expect(existing_token.reload).not_to be_revoked
57
+ end
58
+ end
45
59
  end
46
60
 
47
61
  context "when existing token has crossed token_reuse_limit" do
@@ -85,6 +99,32 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
85
99
  end
86
100
  end
87
101
 
102
+ context "when revoke_previous_client_credentials_token is true" do
103
+ let!(:existing_token) { subject.call(client, scopes, expires_in: 1000) }
104
+
105
+ before do
106
+ allow(Doorkeeper.configuration).to receive(:revoke_previous_client_credentials_token).and_return(true)
107
+ end
108
+
109
+ it "revokes the existing token" do
110
+ subject.call(client, scopes, expires_in: 1000)
111
+ expect(existing_token.reload).to be_revoked
112
+ end
113
+ end
114
+
115
+ context "when revoke_previous_client_credentials_token is false" do
116
+ let!(:existing_token) { subject.call(client, scopes, expires_in: 1000) }
117
+
118
+ before do
119
+ allow(Doorkeeper.configuration).to receive(:revoke_previous_client_credentials_token).and_return(false)
120
+ end
121
+
122
+ it "does not revoke the existing token" do
123
+ subject.call(client, scopes, expires_in: 1000)
124
+ expect(existing_token.reload).not_to be_revoked
125
+ end
126
+ end
127
+
88
128
  it "returns false if creation fails" do
89
129
  expect(Doorkeeper::AccessToken).to receive(:find_or_create_for).and_return(false)
90
130
  created = subject.call(client, scopes)
@@ -8,16 +8,16 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
8
8
  let(:server) do
9
9
  double(
10
10
  :server,
11
- access_token_expires_in: 100
11
+ access_token_expires_in: 100,
12
12
  )
13
13
  end
14
- let(:validation) { double :validation, valid?: true }
14
+ let(:validator) { double :validator, valid?: true }
15
15
 
16
16
  before do
17
17
  allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(false)
18
18
  end
19
19
 
20
- subject { Issuer.new(server, validation) }
20
+ subject { Issuer.new(server, validator) }
21
21
 
22
22
  describe :create do
23
23
  let(:client) { double :client, id: "some-id" }
@@ -35,7 +35,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
35
35
  client,
36
36
  scopes,
37
37
  expires_in: 100,
38
- use_refresh_token: false
38
+ use_refresh_token: false,
39
39
  )
40
40
 
41
41
  subject.create client, scopes, creator
@@ -48,14 +48,14 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
48
48
  expect(subject.error).to eq(:server_error)
49
49
  end
50
50
 
51
- context "when validation fails" do
51
+ context "when validator fails" do
52
52
  before do
53
- allow(validation).to receive(:valid?).and_return(false)
54
- allow(validation).to receive(:error).and_return(:validation_error)
53
+ allow(validator).to receive(:valid?).and_return(false)
54
+ allow(validator).to receive(:error).and_return(:validation_error)
55
55
  expect(creator).not_to receive(:create)
56
56
  end
57
57
 
58
- it "has error set from validation" do
58
+ it "has error set from validator" do
59
59
  subject.create client, scopes, creator
60
60
  expect(subject.error).to eq(:validation_error)
61
61
  end
@@ -65,7 +65,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
65
65
  end
66
66
  end
67
67
 
68
- context "with custom expirations" do
68
+ context "with custom expiration" do
69
69
  let(:custom_ttl_grant) { 1234 }
70
70
  let(:custom_ttl_scope) { 1235 }
71
71
  let(:custom_scope) { "special" }
@@ -79,7 +79,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
79
79
  elsif context.grant_type == Doorkeeper::OAuth::CLIENT_CREDENTIALS
80
80
  custom_ttl_grant
81
81
  end
82
- }
82
+ },
83
83
  )
84
84
  end
85
85
 
@@ -92,7 +92,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
92
92
  client,
93
93
  scopes,
94
94
  expires_in: custom_ttl_grant,
95
- use_refresh_token: false
95
+ use_refresh_token: false,
96
96
  )
97
97
  subject.create client, scopes, creator
98
98
  end
@@ -102,7 +102,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
102
102
  client,
103
103
  custom_scope,
104
104
  expires_in: custom_ttl_scope,
105
- use_refresh_token: false
105
+ use_refresh_token: false,
106
106
  )
107
107
  subject.create client, custom_scope, creator
108
108
  end
@@ -3,13 +3,13 @@
3
3
  require "spec_helper"
4
4
 
5
5
  class Doorkeeper::OAuth::ClientCredentialsRequest
6
- describe Validation do
6
+ describe Validator do
7
7
  let(:server) { double :server, scopes: nil }
8
8
  let(:application) { double scopes: nil }
9
9
  let(:client) { double application: application }
10
10
  let(:request) { double :request, client: client, scopes: nil }
11
11
 
12
- subject { Validation.new(server, request) }
12
+ subject { described_class.new(server, request) }
13
13
 
14
14
  it "is valid with valid request" do
15
15
  expect(subject).to be_valid
@@ -26,7 +26,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
26
26
  allow(request).to receive(:grant_type).and_return(Doorkeeper::OAuth::CLIENT_CREDENTIALS)
27
27
  allow(server).to receive(:scopes).and_return(server_scopes)
28
28
  allow(request).to receive(:scopes).and_return(
29
- Doorkeeper::OAuth::Scopes.from_string("invalid")
29
+ Doorkeeper::OAuth::Scopes.from_string("invalid"),
30
30
  )
31
31
  expect(subject).not_to be_valid
32
32
  end
@@ -49,7 +49,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
49
49
  allow(request).to receive(:grant_type).and_return(Doorkeeper::OAuth::CLIENT_CREDENTIALS)
50
50
  allow(server).to receive(:scopes).and_return(server_scopes)
51
51
  allow(request).to receive(:scopes).and_return(
52
- Doorkeeper::OAuth::Scopes.from_string("email")
52
+ Doorkeeper::OAuth::Scopes.from_string("email"),
53
53
  )
54
54
  expect(subject).not_to be_valid
55
55
  end
@@ -2,28 +2,26 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe ClientCredentialsRequest do
7
- let(:server) { Doorkeeper.configuration }
5
+ describe Doorkeeper::OAuth::ClientCredentialsRequest do
6
+ let(:server) { Doorkeeper.configuration }
8
7
 
9
- context "with a valid request" do
10
- let(:client) { FactoryBot.create :application }
8
+ context "with a valid request" do
9
+ let(:client) { FactoryBot.create :application }
11
10
 
12
- it "issues an access token" do
13
- request = ClientCredentialsRequest.new(server, client, {})
14
- expect do
15
- request.authorize
16
- end.to change { Doorkeeper::AccessToken.count }.by(1)
17
- end
11
+ it "issues an access token" do
12
+ request = Doorkeeper::OAuth::ClientCredentialsRequest.new(server, client, {})
13
+ expect do
14
+ request.authorize
15
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
18
16
  end
17
+ end
19
18
 
20
- describe "with an invalid request" do
21
- it "does not issue an access token" do
22
- request = ClientCredentialsRequest.new(server, nil, {})
23
- expect do
24
- request.authorize
25
- end.to_not(change { Doorkeeper::AccessToken.count })
26
- end
19
+ describe "with an invalid request" do
20
+ it "does not issue an access token" do
21
+ request = Doorkeeper::OAuth::ClientCredentialsRequest.new(server, nil, {})
22
+ expect do
23
+ request.authorize
24
+ end.to_not(change { Doorkeeper::AccessToken.count })
27
25
  end
28
26
  end
29
27
  end
@@ -2,108 +2,106 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe ClientCredentialsRequest do
7
- let(:server) do
8
- double(
9
- default_scopes: nil,
10
- access_token_expires_in: 2.hours,
11
- custom_access_token_expires_in: ->(_context) { nil }
12
- )
13
- end
5
+ describe Doorkeeper::OAuth::ClientCredentialsRequest do
6
+ let(:server) do
7
+ double(
8
+ default_scopes: nil,
9
+ access_token_expires_in: 2.hours,
10
+ custom_access_token_expires_in: ->(_context) { nil },
11
+ )
12
+ end
14
13
 
15
- let(:application) { FactoryBot.create(:application, scopes: "") }
16
- let(:client) { double :client, application: application }
17
- let(:token_creator) { double :issuer, create: true, token: double }
14
+ let(:application) { FactoryBot.create(:application, scopes: "") }
15
+ let(:client) { double :client, application: application }
16
+ let(:token_creator) { double :issuer, create: true, token: double }
18
17
 
19
- before do
20
- allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
21
- end
18
+ before do
19
+ allow(server).to receive(:option_defined?).with(:custom_access_token_expires_in).and_return(true)
20
+ end
21
+
22
+ subject { Doorkeeper::OAuth::ClientCredentialsRequest.new(server, client) }
23
+
24
+ before do
25
+ subject.issuer = token_creator
26
+ end
27
+
28
+ it "issues an access token for the current client" do
29
+ expect(token_creator).to receive(:create).with(client, nil)
30
+ subject.authorize
31
+ end
22
32
 
23
- subject { ClientCredentialsRequest.new(server, client) }
33
+ it "has successful response when issue was created" do
34
+ subject.authorize
35
+ expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
36
+ end
24
37
 
38
+ context "if issue was not created" do
25
39
  before do
26
- subject.issuer = token_creator
40
+ subject.issuer = double create: false, error: :invalid
27
41
  end
28
42
 
29
- it "issues an access token for the current client" do
30
- expect(token_creator).to receive(:create).with(client, nil)
43
+ it "has an error response" do
31
44
  subject.authorize
45
+ expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
32
46
  end
33
47
 
34
- it "has successful response when issue was created" do
48
+ it "delegates the error to issuer" do
35
49
  subject.authorize
36
- expect(subject.response).to be_a(TokenResponse)
50
+ expect(subject.error).to eq(:invalid)
37
51
  end
52
+ end
38
53
 
39
- context "if issue was not created" do
40
- before do
41
- subject.issuer = double create: false, error: :invalid
42
- end
54
+ context "with scopes" do
55
+ let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string("public email") }
43
56
 
44
- it "has an error response" do
45
- subject.authorize
46
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
47
- end
57
+ before do
58
+ allow(server).to receive(:default_scopes).and_return(default_scopes)
59
+ end
48
60
 
49
- it "delegates the error to issuer" do
50
- subject.authorize
51
- expect(subject.error).to eq(:invalid)
52
- end
61
+ it "issues an access token with default scopes if none was requested" do
62
+ expect(token_creator).to receive(:create).with(client, default_scopes)
63
+ subject.authorize
53
64
  end
54
65
 
55
- context "with scopes" do
56
- let(:default_scopes) { Doorkeeper::OAuth::Scopes.from_string("public email") }
66
+ it "issues an access token with requested scopes" do
67
+ subject = Doorkeeper::OAuth::ClientCredentialsRequest.new(server, client, scope: "email")
68
+ subject.issuer = token_creator
69
+ expect(token_creator).to receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string("email"))
70
+ subject.authorize
71
+ end
72
+ end
57
73
 
58
- before do
59
- allow(server).to receive(:default_scopes).and_return(default_scopes)
60
- end
74
+ context "with restricted client" do
75
+ let(:default_scopes) do
76
+ Doorkeeper::OAuth::Scopes.from_string("public email")
77
+ end
78
+ let(:server_scopes) do
79
+ Doorkeeper::OAuth::Scopes.from_string("public email phone")
80
+ end
81
+ let(:client_scopes) do
82
+ Doorkeeper::OAuth::Scopes.from_string("public phone")
83
+ end
61
84
 
62
- it "issues an access token with default scopes if none was requested" do
63
- expect(token_creator).to receive(:create).with(client, default_scopes)
64
- subject.authorize
65
- end
85
+ before do
86
+ allow(server).to receive(:default_scopes).and_return(default_scopes)
87
+ allow(server).to receive(:scopes).and_return(server_scopes)
88
+ allow(server).to receive(:access_token_expires_in).and_return(100)
89
+ allow(application).to receive(:scopes).and_return(client_scopes)
90
+ allow(client).to receive(:id).and_return(nil)
91
+ end
66
92
 
67
- it "issues an access token with requested scopes" do
68
- subject = ClientCredentialsRequest.new(server, client, scope: "email")
69
- subject.issuer = token_creator
70
- expect(token_creator).to receive(:create).with(client, Doorkeeper::OAuth::Scopes.from_string("email"))
71
- subject.authorize
72
- end
93
+ it "delegates the error to issuer if no scope was requested" do
94
+ subject = Doorkeeper::OAuth::ClientCredentialsRequest.new(server, client)
95
+ subject.authorize
96
+ expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
97
+ expect(subject.error).to eq(:invalid_scope)
73
98
  end
74
99
 
75
- context "with restricted client" do
76
- let(:default_scopes) do
77
- Doorkeeper::OAuth::Scopes.from_string("public email")
78
- end
79
- let(:server_scopes) do
80
- Doorkeeper::OAuth::Scopes.from_string("public email phone")
81
- end
82
- let(:client_scopes) do
83
- Doorkeeper::OAuth::Scopes.from_string("public phone")
84
- end
85
-
86
- before do
87
- allow(server).to receive(:default_scopes).and_return(default_scopes)
88
- allow(server).to receive(:scopes).and_return(server_scopes)
89
- allow(server).to receive(:access_token_expires_in).and_return(100)
90
- allow(application).to receive(:scopes).and_return(client_scopes)
91
- allow(client).to receive(:id).and_return(nil)
92
- end
93
-
94
- it "delegates the error to issuer if no scope was requested" do
95
- subject = ClientCredentialsRequest.new(server, client)
96
- subject.authorize
97
- expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
98
- expect(subject.error).to eq(:invalid_scope)
99
- end
100
-
101
- it "issues an access token with requested scopes" do
102
- subject = ClientCredentialsRequest.new(server, client, scope: "phone")
103
- subject.authorize
104
- expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
105
- expect(subject.response.token.scopes_string).to eq("phone")
106
- end
100
+ it "issues an access token with requested scopes" do
101
+ subject = Doorkeeper::OAuth::ClientCredentialsRequest.new(server, client, scope: "phone")
102
+ subject.authorize
103
+ expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
104
+ expect(subject.response.token.scopes_string).to eq("phone")
107
105
  end
108
106
  end
109
107
  end
@@ -2,37 +2,37 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe Client do
7
- describe :find do
8
- let(:method) { double }
5
+ describe Doorkeeper::OAuth::Client do
6
+ describe :find do
7
+ let(:method) { double }
9
8
 
10
- it "finds the client via uid" do
11
- client = double
12
- expect(method).to receive(:call).with("uid").and_return(client)
13
- expect(Client.find("uid", method)).to be_a(Client)
14
- end
9
+ it "finds the client via uid" do
10
+ client = double
11
+ expect(method).to receive(:call).with("uid").and_return(client)
12
+ expect(Doorkeeper::OAuth::Client.find("uid", method))
13
+ .to be_a(Doorkeeper::OAuth::Client)
14
+ end
15
15
 
16
- it "returns nil if client was not found" do
17
- expect(method).to receive(:call).with("uid").and_return(nil)
18
- expect(Client.find("uid", method)).to be_nil
19
- end
16
+ it "returns nil if client was not found" do
17
+ expect(method).to receive(:call).with("uid").and_return(nil)
18
+ expect(Doorkeeper::OAuth::Client.find("uid", method)).to be_nil
20
19
  end
20
+ end
21
21
 
22
- describe :authenticate do
23
- it "returns the authenticated client via credentials" do
24
- credentials = Client::Credentials.new("some-uid", "some-secret")
25
- authenticator = double
26
- expect(authenticator).to receive(:call).with("some-uid", "some-secret").and_return(double)
27
- expect(Client.authenticate(credentials, authenticator)).to be_a(Client)
28
- end
22
+ describe ".authenticate" do
23
+ it "returns the authenticated client via credentials" do
24
+ credentials = Doorkeeper::OAuth::Client::Credentials.new("some-uid", "some-secret")
25
+ authenticator = double
26
+ expect(authenticator).to receive(:call).with("some-uid", "some-secret").and_return(double)
27
+ expect(Doorkeeper::OAuth::Client.authenticate(credentials, authenticator))
28
+ .to be_a(Doorkeeper::OAuth::Client)
29
+ end
29
30
 
30
- it "returns nil if client was not authenticated" do
31
- credentials = Client::Credentials.new("some-uid", "some-secret")
32
- authenticator = double
33
- expect(authenticator).to receive(:call).with("some-uid", "some-secret").and_return(nil)
34
- expect(Client.authenticate(credentials, authenticator)).to be_nil
35
- end
31
+ it "returns nil if client was not authenticated" do
32
+ credentials = Doorkeeper::OAuth::Client::Credentials.new("some-uid", "some-secret")
33
+ authenticator = double
34
+ expect(authenticator).to receive(:call).with("some-uid", "some-secret").and_return(nil)
35
+ expect(Doorkeeper::OAuth::Client.authenticate(credentials, authenticator)).to be_nil
36
36
  end
37
37
  end
38
38
  end
@@ -2,46 +2,45 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe CodeRequest do
7
- let(:pre_auth) do
8
- double(
9
- :pre_auth,
10
- client: double(:application, id: 9990),
11
- redirect_uri: "http://tst.com/cb",
12
- scopes: nil,
13
- state: nil,
14
- error: nil,
15
- authorizable?: true,
16
- code_challenge: nil,
17
- code_challenge_method: nil
18
- )
19
- end
5
+ describe Doorkeeper::OAuth::CodeRequest do
6
+ let(:pre_auth) do
7
+ server = Doorkeeper.configuration
8
+ allow(server)
9
+ .to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
10
+ allow(server)
11
+ .to receive(:grant_flows).and_return(Doorkeeper::OAuth::Scopes.from_string("authorization_code"))
12
+
13
+ application = FactoryBot.create(:application, scopes: "public")
14
+ client = Doorkeeper::OAuth::Client.new(application)
15
+
16
+ attributes = {
17
+ client_id: client.uid,
18
+ response_type: "code",
19
+ redirect_uri: "https://app.com/callback",
20
+ }
21
+
22
+ pre_auth = Doorkeeper::OAuth::PreAuthorization.new(server, attributes)
23
+ pre_auth.authorizable?
24
+ pre_auth
25
+ end
20
26
 
21
- let(:owner) { double :owner, id: 8900 }
27
+ let(:owner) { double :owner, id: 8900 }
22
28
 
23
- subject do
24
- CodeRequest.new(pre_auth, owner)
25
- end
26
-
27
- it "creates an access grant" do
28
- expect do
29
- subject.authorize
30
- end.to change { Doorkeeper::AccessGrant.count }.by(1)
31
- end
32
-
33
- it "returns a code response" do
34
- expect(subject.authorize).to be_a(CodeResponse)
35
- end
29
+ subject do
30
+ described_class.new(pre_auth, owner)
31
+ end
36
32
 
37
- it "does not create grant when not authorizable" do
38
- allow(pre_auth).to receive(:authorizable?).and_return(false)
39
- expect { subject.authorize }.not_to(change { Doorkeeper::AccessGrant.count })
33
+ context "when pre_auth is authorized" do
34
+ it "creates an access grant and returns a code response" do
35
+ expect { subject.authorize }.to change { Doorkeeper::AccessGrant.count }.by(1)
36
+ expect(subject.authorize).to be_a(Doorkeeper::OAuth::CodeResponse)
40
37
  end
38
+ end
41
39
 
42
- it "returns a error response" do
43
- allow(pre_auth).to receive(:authorizable?).and_return(false)
44
- expect(subject.authorize).to be_a(ErrorResponse)
40
+ context "when pre_auth is denied" do
41
+ it "does not create access grant and returns a error response" do
42
+ expect { subject.deny }.not_to(change { Doorkeeper::AccessGrant.count })
43
+ expect(subject.deny).to be_a(Doorkeeper::OAuth::ErrorResponse)
45
44
  end
46
45
  end
47
46
  end