doorkeeper 3.1.0 → 5.6.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of doorkeeper might be problematic. Click here for more details.

Files changed (270) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1079 -0
  3. data/README.md +114 -326
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +7 -6
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +9 -12
  7. data/app/controllers/doorkeeper/applications_controller.rb +66 -21
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +100 -18
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +23 -4
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +138 -22
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +15 -9
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
  14. data/app/views/doorkeeper/applications/_form.html.erb +33 -21
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +18 -6
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +40 -16
  19. data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
  20. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  21. data/app/views/doorkeeper/authorizations/new.html.erb +17 -11
  22. data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
  23. data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
  24. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  25. data/config/locales/en.yml +37 -9
  26. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  27. data/lib/doorkeeper/config/option.rb +82 -0
  28. data/lib/doorkeeper/config/validations.rb +53 -0
  29. data/lib/doorkeeper/config.rb +602 -142
  30. data/lib/doorkeeper/engine.rb +22 -7
  31. data/lib/doorkeeper/errors.rb +37 -10
  32. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  33. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  34. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  35. data/lib/doorkeeper/grant_flow.rb +45 -0
  36. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  37. data/lib/doorkeeper/grape/helpers.rb +24 -12
  38. data/lib/doorkeeper/helpers/controller.rb +49 -27
  39. data/lib/doorkeeper/models/access_grant_mixin.rb +99 -16
  40. data/lib/doorkeeper/models/access_token_mixin.rb +386 -77
  41. data/lib/doorkeeper/models/application_mixin.rb +73 -30
  42. data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
  43. data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
  44. data/lib/doorkeeper/models/concerns/expiration_time_sql_math.rb +88 -0
  45. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  46. data/lib/doorkeeper/models/concerns/ownership.rb +4 -2
  47. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  48. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  49. data/lib/doorkeeper/models/concerns/revocable.rb +13 -2
  50. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  51. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  52. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  53. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  54. data/lib/doorkeeper/oauth/authorization/token.rb +72 -28
  55. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  56. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  57. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  58. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  59. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  60. data/lib/doorkeeper/oauth/client.rb +10 -12
  61. data/lib/doorkeeper/oauth/client_credentials/creator.rb +48 -4
  62. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +17 -9
  63. data/lib/doorkeeper/oauth/client_credentials/validator.rb +55 -0
  64. data/lib/doorkeeper/oauth/client_credentials_request.rb +14 -15
  65. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  66. data/lib/doorkeeper/oauth/code_response.rb +31 -19
  67. data/lib/doorkeeper/oauth/error.rb +5 -3
  68. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  69. data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
  70. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +24 -19
  71. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  72. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +55 -4
  73. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  74. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  75. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  76. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  77. data/lib/doorkeeper/oauth/password_access_token_request.rb +46 -18
  78. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  79. data/lib/doorkeeper/oauth/refresh_token_request.rb +67 -30
  80. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  81. data/lib/doorkeeper/oauth/token.rb +28 -25
  82. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  83. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  84. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  85. data/lib/doorkeeper/oauth.rb +13 -0
  86. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  87. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -17
  88. data/lib/doorkeeper/orm/active_record/application.rb +6 -20
  89. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +81 -0
  91. data/lib/doorkeeper/orm/active_record/mixins/application.rb +214 -0
  92. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  93. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  94. data/lib/doorkeeper/orm/active_record.rb +36 -26
  95. data/lib/doorkeeper/rails/helpers.rb +14 -15
  96. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  97. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  98. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  99. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  100. data/lib/doorkeeper/rails/routes.rb +45 -28
  101. data/lib/doorkeeper/rake/db.rake +40 -0
  102. data/lib/doorkeeper/rake/setup.rake +6 -0
  103. data/lib/doorkeeper/rake.rb +14 -0
  104. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  105. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  106. data/lib/doorkeeper/request/code.rb +1 -1
  107. data/lib/doorkeeper/request/password.rb +5 -4
  108. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  109. data/lib/doorkeeper/request/strategy.rb +4 -2
  110. data/lib/doorkeeper/request/token.rb +1 -1
  111. data/lib/doorkeeper/request.rb +62 -29
  112. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  113. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  114. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  115. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  116. data/lib/doorkeeper/server.rb +9 -19
  117. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  118. data/lib/doorkeeper/validations.rb +5 -2
  119. data/lib/doorkeeper/version.rb +12 -1
  120. data/lib/doorkeeper.rb +112 -56
  121. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  122. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  123. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  124. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  125. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  126. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  127. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +41 -0
  128. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  129. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  130. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +13 -0
  131. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  132. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  133. data/lib/generators/doorkeeper/templates/initializer.rb +417 -32
  134. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  135. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  136. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  137. metadata +163 -280
  138. data/.gitignore +0 -14
  139. data/.hound.yml +0 -13
  140. data/.rspec +0 -1
  141. data/.travis.yml +0 -22
  142. data/CONTRIBUTING.md +0 -45
  143. data/Gemfile +0 -10
  144. data/NEWS.md +0 -525
  145. data/RELEASING.md +0 -17
  146. data/Rakefile +0 -20
  147. data/app/validators/redirect_uri_validator.rb +0 -34
  148. data/doorkeeper.gemspec +0 -27
  149. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  150. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  151. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  152. data/lib/generators/doorkeeper/application_scopes_generator.rb +0 -34
  153. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  154. data/lib/generators/doorkeeper/templates/add_scopes_to_oauth_applications.rb +0 -5
  155. data/lib/generators/doorkeeper/templates/migration.rb +0 -50
  156. data/spec/controllers/applications_controller_spec.rb +0 -58
  157. data/spec/controllers/authorizations_controller_spec.rb +0 -203
  158. data/spec/controllers/protected_resources_controller_spec.rb +0 -271
  159. data/spec/controllers/token_info_controller_spec.rb +0 -52
  160. data/spec/controllers/tokens_controller_spec.rb +0 -88
  161. data/spec/dummy/Rakefile +0 -7
  162. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  163. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  164. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  165. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  166. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  167. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  168. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  169. data/spec/dummy/app/models/user.rb +0 -9
  170. data/spec/dummy/app/views/home/index.html.erb +0 -0
  171. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  172. data/spec/dummy/config/application.rb +0 -57
  173. data/spec/dummy/config/boot.rb +0 -9
  174. data/spec/dummy/config/database.yml +0 -15
  175. data/spec/dummy/config/environment.rb +0 -5
  176. data/spec/dummy/config/environments/development.rb +0 -29
  177. data/spec/dummy/config/environments/production.rb +0 -62
  178. data/spec/dummy/config/environments/test.rb +0 -55
  179. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  180. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  181. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  182. data/spec/dummy/config/initializers/session_store.rb +0 -8
  183. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  184. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  185. data/spec/dummy/config/routes.rb +0 -52
  186. data/spec/dummy/config.ru +0 -4
  187. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  188. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  189. data/spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb +0 -41
  190. data/spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb +0 -7
  191. data/spec/dummy/db/migrate/20141209001746_add_scopes_to_oauth_applications.rb +0 -5
  192. data/spec/dummy/db/schema.rb +0 -66
  193. data/spec/dummy/public/404.html +0 -26
  194. data/spec/dummy/public/422.html +0 -26
  195. data/spec/dummy/public/500.html +0 -26
  196. data/spec/dummy/public/favicon.ico +0 -0
  197. data/spec/dummy/script/rails +0 -6
  198. data/spec/factories.rb +0 -26
  199. data/spec/generators/application_owner_generator_spec.rb +0 -22
  200. data/spec/generators/install_generator_spec.rb +0 -31
  201. data/spec/generators/migration_generator_spec.rb +0 -20
  202. data/spec/generators/templates/routes.rb +0 -3
  203. data/spec/generators/views_generator_spec.rb +0 -27
  204. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  205. data/spec/lib/config_spec.rb +0 -317
  206. data/spec/lib/doorkeeper_spec.rb +0 -28
  207. data/spec/lib/models/expirable_spec.rb +0 -51
  208. data/spec/lib/models/revocable_spec.rb +0 -36
  209. data/spec/lib/models/scopes_spec.rb +0 -43
  210. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  211. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  212. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  213. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  214. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  215. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  216. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  217. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  218. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  219. data/spec/lib/oauth/client_spec.rb +0 -39
  220. data/spec/lib/oauth/code_request_spec.rb +0 -45
  221. data/spec/lib/oauth/error_response_spec.rb +0 -61
  222. data/spec/lib/oauth/error_spec.rb +0 -23
  223. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  224. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  225. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  226. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
  227. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
  228. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
  229. data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
  230. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -123
  231. data/spec/lib/oauth/scopes_spec.rb +0 -123
  232. data/spec/lib/oauth/token_request_spec.rb +0 -98
  233. data/spec/lib/oauth/token_response_spec.rb +0 -85
  234. data/spec/lib/oauth/token_spec.rb +0 -109
  235. data/spec/lib/request/strategy_spec.rb +0 -53
  236. data/spec/lib/server_spec.rb +0 -52
  237. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  238. data/spec/models/doorkeeper/access_token_spec.rb +0 -350
  239. data/spec/models/doorkeeper/application_spec.rb +0 -187
  240. data/spec/requests/applications/applications_request_spec.rb +0 -94
  241. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  242. data/spec/requests/endpoints/authorization_spec.rb +0 -72
  243. data/spec/requests/endpoints/token_spec.rb +0 -64
  244. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
  245. data/spec/requests/flows/authorization_code_spec.rb +0 -156
  246. data/spec/requests/flows/client_credentials_spec.rb +0 -58
  247. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  248. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  249. data/spec/requests/flows/password_spec.rb +0 -94
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -104
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  252. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  253. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  254. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  255. data/spec/routing/custom_controller_routes_spec.rb +0 -71
  256. data/spec/routing/default_routes_spec.rb +0 -35
  257. data/spec/routing/scoped_routes_spec.rb +0 -31
  258. data/spec/spec_helper.rb +0 -2
  259. data/spec/spec_helper_integration.rb +0 -56
  260. data/spec/support/dependencies/factory_girl.rb +0 -2
  261. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  262. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  263. data/spec/support/helpers/config_helper.rb +0 -9
  264. data/spec/support/helpers/model_helper.rb +0 -45
  265. data/spec/support/helpers/request_spec_helper.rb +0 -76
  266. data/spec/support/helpers/url_helper.rb +0 -55
  267. data/spec/support/orm/active_record.rb +0 -3
  268. data/spec/support/shared/controllers_shared_context.rb +0 -60
  269. data/spec/support/shared/models_shared_examples.rb +0 -52
  270. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,271 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- module ControllerActions
4
- def index
5
- render text: 'index'
6
- end
7
-
8
- def show
9
- render text: 'show'
10
- end
11
- end
12
-
13
- describe 'doorkeeper authorize filter' do
14
- context 'accepts token code specified as' do
15
- controller do
16
- before_filter :doorkeeper_authorize!
17
-
18
- def index
19
- render text: 'index'
20
- end
21
- end
22
-
23
- let(:token_string) { '1A2BC3' }
24
- let(:token) do
25
- double(Doorkeeper::AccessToken, acceptable?: true)
26
- end
27
-
28
- it 'access_token param' do
29
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
30
- get :index, access_token: token_string
31
- end
32
-
33
- it 'bearer_token param' do
34
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
35
- get :index, bearer_token: token_string
36
- end
37
-
38
- it 'Authorization header' do
39
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
40
- request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
41
- get :index
42
- end
43
-
44
- it 'different kind of Authorization header' do
45
- expect(Doorkeeper::AccessToken).not_to receive(:by_token)
46
- request.env['HTTP_AUTHORIZATION'] = "MAC #{token_string}"
47
- get :index
48
- end
49
-
50
- it 'does not change Authorization header value' do
51
- expect(Doorkeeper::AccessToken).to receive(:by_token).exactly(2).times.and_return(token)
52
- request.env['HTTP_AUTHORIZATION'] = "Bearer #{token_string}"
53
- get :index
54
- controller.send(:remove_instance_variable, :@_doorkeeper_token)
55
- get :index
56
- end
57
- end
58
-
59
- context 'defined for all actions' do
60
- controller do
61
- before_filter :doorkeeper_authorize!
62
-
63
- include ControllerActions
64
- end
65
-
66
- context 'with valid token', token: :valid do
67
- it 'allows into index action' do
68
- get :index, access_token: token_string
69
- expect(response).to be_success
70
- end
71
-
72
- it 'allows into show action' do
73
- get :show, id: '4', access_token: token_string
74
- expect(response).to be_success
75
- end
76
- end
77
-
78
- context 'with invalid token', token: :invalid do
79
- it 'does not allow into index action' do
80
- get :index, access_token: token_string
81
- expect(response.status).to eq 401
82
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
83
- end
84
-
85
- it 'does not allow into show action' do
86
- get :show, id: '4', access_token: token_string
87
- expect(response.status).to eq 401
88
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
89
- end
90
- end
91
- end
92
-
93
- context 'defined with scopes' do
94
- controller do
95
- before_filter -> { doorkeeper_authorize! :write }
96
-
97
- include ControllerActions
98
- end
99
-
100
- let(:token_string) { '1A2DUWE' }
101
-
102
- it 'allows if the token has particular scopes' do
103
- token = double(Doorkeeper::AccessToken, accessible?: true, scopes: %w(write public))
104
- expect(token).to receive(:acceptable?).with([:write]).and_return(true)
105
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
106
- get :index, access_token: token_string
107
- expect(response).to be_success
108
- end
109
-
110
- it 'does not allow if the token does not include given scope' do
111
- token = double(Doorkeeper::AccessToken, accessible?: true, scopes: ['public'], revoked?: false, expired?: false)
112
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
113
- expect(token).to receive(:acceptable?).with([:write]).and_return(false)
114
- get :index, access_token: token_string
115
- expect(response.status).to eq 403
116
- expect(response.header).to_not include('WWW-Authenticate')
117
- end
118
- end
119
-
120
- context 'when custom unauthorized render options are configured' do
121
- controller do
122
- before_filter :doorkeeper_authorize!
123
-
124
- include ControllerActions
125
- end
126
-
127
- context 'with a JSON custom render', token: :invalid do
128
- before do
129
- module ControllerActions
130
- def doorkeeper_unauthorized_render_options(error: nil)
131
- { json: ActiveSupport::JSON.encode(error_message: error.description) }
132
- end
133
- end
134
- end
135
- after do
136
- module ControllerActions
137
- def doorkeeper_unauthorized_render_options(error: nil)
138
- end
139
- end
140
- end
141
-
142
- it 'it renders a custom JSON response', token: :invalid do
143
- get :index, access_token: token_string
144
- expect(response.status).to eq 401
145
- expect(response.content_type).to eq('application/json')
146
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
147
- parsed_body = JSON.parse(response.body)
148
- expect(parsed_body).not_to be_nil
149
- expect(parsed_body['error_message']).to match('token is invalid')
150
- end
151
- end
152
-
153
- context 'with a text custom render', token: :invalid do
154
- before do
155
- module ControllerActions
156
- def doorkeeper_unauthorized_render_options(error: nil)
157
- { text: 'Unauthorized' }
158
- end
159
- end
160
- end
161
- after do
162
- module ControllerActions
163
- def doorkeeper_unauthorized_render_options(error: nil)
164
- end
165
- end
166
- end
167
-
168
- it 'it renders a custom text response', token: :invalid do
169
- get :index, access_token: token_string
170
- expect(response.status).to eq 401
171
- expect(response.content_type).to eq('text/html')
172
- expect(response.header['WWW-Authenticate']).to match(/^Bearer/)
173
- expect(response.body).to eq('Unauthorized')
174
- end
175
- end
176
- end
177
-
178
- context 'when custom forbidden render options are configured' do
179
- before do
180
- expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
181
- expect(token).to receive(:acceptable?).with([:write]).and_return(false)
182
- end
183
-
184
- after do
185
- module ControllerActions
186
- def doorkeeper_forbidden_render_options(*)
187
- end
188
- end
189
- end
190
-
191
- controller do
192
- before_filter -> { doorkeeper_authorize! :write }
193
-
194
- include ControllerActions
195
- end
196
-
197
- let(:token) do
198
- double(Doorkeeper::AccessToken,
199
- accessible?: true, scopes: ['public'], revoked?: false, expired?: false)
200
- end
201
- let(:token_string) { '1A2DUWE' }
202
-
203
- context 'with a JSON custom render' do
204
- before do
205
- module ControllerActions
206
- def doorkeeper_forbidden_render_options(*)
207
- { json: { error_message: 'Forbidden' } }
208
- end
209
- end
210
- end
211
-
212
- it 'renders a custom JSON response' do
213
- get :index, access_token: token_string
214
- expect(response.header).to_not include('WWW-Authenticate')
215
- expect(response.content_type).to eq('application/json')
216
- expect(response.status).to eq 403
217
- parsed_body = JSON.parse(response.body)
218
- expect(parsed_body).not_to be_nil
219
- expect(parsed_body['error_message']).to match('Forbidden')
220
- end
221
- end
222
-
223
- context 'with a status and JSON custom render' do
224
- before do
225
- module ControllerActions
226
- def doorkeeper_forbidden_render_options(*)
227
- { json: { error_message: 'Not Found' },
228
- respond_not_found_when_forbidden: true }
229
- end
230
- end
231
- end
232
-
233
- it 'overrides the default status code' do
234
- get :index, access_token: token_string
235
- expect(response.status).to eq 404
236
- end
237
- end
238
-
239
- context 'with a text custom render' do
240
- before do
241
- module ControllerActions
242
- def doorkeeper_forbidden_render_options(*)
243
- { text: 'Forbidden' }
244
- end
245
- end
246
- end
247
-
248
- it 'renders a custom status code and text response' do
249
- get :index, access_token: token_string
250
- expect(response.header).to_not include('WWW-Authenticate')
251
- expect(response.status).to eq 403
252
- expect(response.body).to eq('Forbidden')
253
- end
254
- end
255
-
256
- context 'with a status and text custom render' do
257
- before do
258
- module ControllerActions
259
- def doorkeeper_forbidden_render_options(*)
260
- { respond_not_found_when_forbidden: true, text: 'Not Found' }
261
- end
262
- end
263
- end
264
-
265
- it 'overrides the default status code' do
266
- get :index, access_token: token_string
267
- expect(response.status).to eq 404
268
- end
269
- end
270
- end
271
- end
@@ -1,52 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper::TokenInfoController do
4
- describe 'when requesting tokeninfo with valid token' do
5
- let(:doorkeeper_token) { FactoryGirl.create(:access_token) }
6
-
7
- before(:each) do
8
- allow(controller).to receive(:doorkeeper_token) { doorkeeper_token }
9
- end
10
-
11
- def do_get
12
- get :show
13
- end
14
-
15
- describe 'successful request' do
16
-
17
- it 'responds with tokeninfo' do
18
- do_get
19
- expect(response.body).to eq(doorkeeper_token.to_json)
20
- end
21
-
22
- it 'responds with a 200 status' do
23
- do_get
24
- expect(response.status).to eq 200
25
- end
26
- end
27
-
28
- describe 'invalid token response' do
29
- before(:each) do
30
- allow(controller).to receive(:doorkeeper_token).and_return(nil)
31
- end
32
- it 'responds with 401 when doorkeeper_token is not valid' do
33
- do_get
34
- expect(response.status).to eq 401
35
- expect(response.headers['WWW-Authenticate']).to match(/^Bearer/)
36
- end
37
-
38
- it 'responds with 401 when doorkeeper_token is invalid, expired or revoked' do
39
- allow(controller).to receive(:doorkeeper_token).and_return(doorkeeper_token)
40
- allow(doorkeeper_token).to receive(:accessible?).and_return(false)
41
- do_get
42
- expect(response.status).to eq 401
43
- expect(response.headers['WWW-Authenticate']).to match(/^Bearer/)
44
- end
45
-
46
- it 'responds body message for error' do
47
- do_get
48
- expect(response.body).to eq(Doorkeeper::OAuth::ErrorResponse.new(name: :invalid_request, status: :unauthorized).body.to_json)
49
- end
50
- end
51
- end
52
- end
@@ -1,88 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper::TokensController do
4
- describe 'when authorization has succeeded' do
5
- let :token do
6
- double(:token, authorize: true)
7
- end
8
-
9
- before do
10
- allow(controller).to receive(:token) { token }
11
- end
12
-
13
- it 'returns the authorization' do
14
- skip 'verify need of these specs'
15
-
16
- expect(token).to receive(:authorization)
17
-
18
- post :create
19
- end
20
- end
21
-
22
- describe 'when authorization has failed' do
23
- it 'returns the error response' do
24
- token = double(:token, authorize: false)
25
- allow(controller).to receive(:token) { token }
26
-
27
- post :create
28
-
29
- expect(response.status).to eq 401
30
- expect(response.headers['WWW-Authenticate']).to match(/Bearer/)
31
- end
32
- end
33
-
34
- describe 'when there is a failure due to a custom error' do
35
- it 'returns the error response with a custom message' do
36
- # I18n looks for `doorkeeper.errors.messages.custom_message` in locale files
37
- custom_message = "my_message"
38
- allow(I18n).to receive(:translate).
39
- with(
40
- custom_message,
41
- hash_including(scope: [:doorkeeper, :errors, :messages]),
42
- ).
43
- and_return('Authorization custom message')
44
-
45
- doorkeeper_error = Doorkeeper::Errors::DoorkeeperError.new(custom_message)
46
-
47
- strategy = double(:strategy)
48
- request = double(token_request: strategy)
49
- allow(strategy).to receive(:authorize).and_raise(doorkeeper_error)
50
- allow(controller).to receive(:server).and_return(request)
51
-
52
- post :create
53
-
54
- expected_response_body = {
55
- "error" => custom_message,
56
- "error_description" => "Authorization custom message"
57
- }
58
- expect(response.status).to eq 401
59
- expect(response.headers['WWW-Authenticate']).to match(/Bearer/)
60
- expect(JSON.load(response.body)).to eq expected_response_body
61
- end
62
- end
63
-
64
- describe 'when revoke authorization has failed' do
65
- # http://tools.ietf.org/html/rfc7009#section-2.2
66
- it 'returns no error response' do
67
- token = double(:token, authorize: false)
68
- allow(controller).to receive(:token) { token }
69
-
70
- post :revoke
71
-
72
- expect(response.status).to eq 200
73
- end
74
- end
75
-
76
- describe 'authorize response memoization' do
77
- it "memoizes the result of the authorization" do
78
- strategy = double(:strategy, authorize: true)
79
- expect(strategy).to receive(:authorize).once
80
- allow(controller).to receive(:strategy) { strategy }
81
- allow(controller).to receive(:create) do
82
- controller.send :authorize_response
83
- end
84
-
85
- post :create
86
- end
87
- end
88
- end
data/spec/dummy/Rakefile DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env rake
2
- # Add your own tasks in files placed in lib/tasks ending in .rake,
3
- # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
-
5
- require File.expand_path('../config/application', __FILE__)
6
-
7
- Dummy::Application.load_tasks
@@ -1,3 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- protect_from_forgery
3
- end
@@ -1,7 +0,0 @@
1
- class CustomAuthorizationsController < ::ApplicationController
2
- %w(index show new create edit update destroy).each do |action|
3
- define_method action do
4
- render nothing: true
5
- end
6
- end
7
- end
@@ -1,12 +0,0 @@
1
- class FullProtectedResourcesController < ApplicationController
2
- before_filter -> { doorkeeper_authorize! :write, :admin }, only: :show
3
- before_filter :doorkeeper_authorize!, only: :index
4
-
5
- def index
6
- render text: 'index'
7
- end
8
-
9
- def show
10
- render text: 'show'
11
- end
12
- end
@@ -1,17 +0,0 @@
1
- class HomeController < ApplicationController
2
- def index
3
- end
4
-
5
- def sign_in
6
- session[:user_id] = if Rails.env.development?
7
- User.first || User.create!(name: 'Joe', password: 'sekret')
8
- else
9
- User.first
10
- end
11
- redirect_to '/'
12
- end
13
-
14
- def callback
15
- render text: 'ok'
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- class MetalController < ActionController::Metal
2
- include AbstractController::Callbacks
3
- include ActionController::Head
4
- include Doorkeeper::Rails::Helpers
5
-
6
- before_filter :doorkeeper_authorize!
7
-
8
- def index
9
- self.response_body = { ok: true }.to_json
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- class SemiProtectedResourcesController < ApplicationController
2
- before_filter :doorkeeper_authorize!, only: :index
3
-
4
- def index
5
- render text: 'protected index'
6
- end
7
-
8
- def show
9
- render text: 'non protected show'
10
- end
11
- end
@@ -1,5 +0,0 @@
1
- module ApplicationHelper
2
- def current_user
3
- @current_user ||= User.find_by_id(session[:user_id])
4
- end
5
- end
@@ -1,9 +0,0 @@
1
- class User < ActiveRecord::Base
2
- if respond_to?(:attr_accessible)
3
- attr_accessible :name, :password
4
- end
5
-
6
- def self.authenticate!(name, password)
7
- User.where(name: name, password: password).first
8
- end
9
- end
File without changes
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Dummy</title>
5
- <%= csrf_meta_tags %>
6
- </head>
7
- <body>
8
-
9
- <%= link_to "Sign in", '/sign_in' %>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,57 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require 'action_controller/railtie'
4
- require 'sprockets/railtie'
5
-
6
- Bundler.require :default
7
-
8
- require 'yaml'
9
-
10
- orm = if DOORKEEPER_ORM =~ /mongoid/
11
- Mongoid.load!(File.join(File.dirname(File.expand_path(__FILE__)), "#{DOORKEEPER_ORM}.yml"))
12
- :mongoid
13
- else
14
- DOORKEEPER_ORM
15
- end
16
- require "#{orm}/railtie"
17
-
18
- module Dummy
19
- class Application < Rails::Application
20
- # Settings in config/environments/* take precedence over those specified here.
21
- # Application configuration should go into files in config/initializers
22
- # -- all .rb files in that directory are automatically loaded.
23
-
24
- # Only load the plugins named here, in the order given (default is alphabetical).
25
- # :all can be used as a placeholder for all plugins not explicitly named.
26
- # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
27
-
28
- # Activate observers that should always be running.
29
- # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
30
-
31
- if defined?(ActiveRecord) && Rails.version.to_i < 4
32
- config.active_record.whitelist_attributes = true
33
- end
34
-
35
- # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
36
- # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
37
- # config.time_zone = 'Central Time (US & Canada)'
38
-
39
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
40
- config.i18n.load_path += Dir[Rails.root.join('../../', 'config/locales', '*.{rb,yml}').to_s]
41
- # config.i18n.default_locale = :en
42
-
43
- # Configure the default encoding used in templates for Ruby 1.9.
44
- config.encoding = 'utf-8'
45
-
46
- # Configure sensitive parameters which will be filtered from the log file.
47
- config.filter_parameters += [:password]
48
-
49
- # Enable the asset pipeline
50
- config.assets.enabled = true
51
-
52
- # Version of your assets, change this if you want to expire all your assets
53
- config.assets.version = '1.0'
54
-
55
- I18n.enforce_available_locales = false
56
- end
57
- end
@@ -1,9 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
-
4
- orm = ENV['BUNDLE_GEMFILE'].match(/Gemfile\.(.+)\.rb/)
5
- unless defined?(DOORKEEPER_ORM)
6
- DOORKEEPER_ORM = (orm && orm[1]) || :active_record
7
- end
8
-
9
- $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -1,15 +0,0 @@
1
- development:
2
- adapter: sqlite3
3
- database: db/development.sqlite3
4
- pool: 5
5
- timeout: 5000
6
-
7
- test:
8
- adapter: sqlite3
9
- database: ":memory:"
10
- timeout: 500
11
-
12
- production:
13
- adapter: sqlite3
14
- database: ":memory:"
15
- timeout: 500
@@ -1,5 +0,0 @@
1
- # Load the rails application
2
- require File.expand_path('../application', __FILE__)
3
-
4
- # Initialize the rails application
5
- Dummy::Application.initialize!
@@ -1,29 +0,0 @@
1
- Dummy::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # In the development environment your application's code is reloaded on
5
- # every request. This slows down response time but is perfect for development
6
- # since you don't have to restart the web server when you make code changes.
7
- config.cache_classes = false
8
-
9
- # Show full error reports and disable caching
10
- config.consider_all_requests_local = true
11
- config.action_controller.perform_caching = false
12
-
13
- # Don't care if the mailer can't send
14
- # config.action_mailer.raise_delivery_errors = false
15
-
16
- # Print deprecation notices to the Rails logger
17
- config.active_support.deprecation = :log
18
-
19
- # Only use best-standards-support built into browsers
20
- config.action_dispatch.best_standards_support = :builtin
21
-
22
- # Do not compress assets
23
- config.assets.compress = false
24
-
25
- # Expands the lines which load the assets
26
- config.assets.debug = true
27
-
28
- config.eager_load = false
29
- end