doorkeeper 4.4.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitlab-ci.yml +16 -0
- data/.travis.yml +2 -0
- data/Appraisals +2 -2
- data/Gemfile +1 -1
- data/NEWS.md +67 -1
- data/README.md +92 -9
- data/Rakefile +6 -0
- data/UPGRADE.md +2 -0
- data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
- data/app/controllers/doorkeeper/application_controller.rb +4 -3
- data/app/controllers/doorkeeper/application_metal_controller.rb +4 -0
- data/app/controllers/doorkeeper/applications_controller.rb +42 -22
- data/app/controllers/doorkeeper/authorizations_controller.rb +55 -12
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +19 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +2 -6
- data/app/helpers/doorkeeper/dashboard_helper.rb +7 -7
- data/app/validators/redirect_uri_validator.rb +3 -2
- data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
- data/app/views/doorkeeper/applications/_form.html.erb +25 -24
- data/app/views/doorkeeper/applications/edit.html.erb +1 -1
- data/app/views/doorkeeper/applications/index.html.erb +17 -7
- data/app/views/doorkeeper/applications/new.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +6 -6
- data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
- data/app/views/doorkeeper/authorizations/new.html.erb +4 -0
- data/app/views/layouts/doorkeeper/admin.html.erb +15 -15
- data/config/locales/en.yml +12 -3
- data/doorkeeper.gemspec +18 -20
- data/gemfiles/rails_5_2.gemfile +1 -1
- data/gemfiles/rails_master.gemfile +4 -1
- data/lib/doorkeeper/config.rb +77 -27
- data/lib/doorkeeper/engine.rb +4 -0
- data/lib/doorkeeper/errors.rb +2 -5
- data/lib/doorkeeper/grape/helpers.rb +1 -1
- data/lib/doorkeeper/helpers/controller.rb +7 -2
- data/lib/doorkeeper/models/access_grant_mixin.rb +71 -0
- data/lib/doorkeeper/models/access_token_mixin.rb +40 -23
- data/lib/doorkeeper/models/concerns/scopes.rb +1 -1
- data/lib/doorkeeper/oauth/authorization/code.rb +31 -8
- data/lib/doorkeeper/oauth/authorization/context.rb +15 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +36 -14
- data/lib/doorkeeper/oauth/authorization_code_request.rb +27 -2
- data/lib/doorkeeper/oauth/base_request.rb +20 -9
- data/lib/doorkeeper/oauth/client/credentials.rb +1 -1
- data/lib/doorkeeper/oauth/client.rb +0 -2
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -1
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +6 -3
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +4 -6
- data/lib/doorkeeper/oauth/client_credentials_request.rb +0 -4
- data/lib/doorkeeper/oauth/error_response.rb +11 -3
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +0 -8
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +1 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +7 -4
- data/lib/doorkeeper/oauth/pre_authorization.rb +45 -13
- data/lib/doorkeeper/oauth/refresh_token_request.rb +6 -1
- data/lib/doorkeeper/oauth/scopes.rb +1 -1
- data/lib/doorkeeper/oauth/token.rb +5 -2
- data/lib/doorkeeper/oauth/token_introspection.rb +2 -2
- data/lib/doorkeeper/oauth/token_response.rb +4 -2
- data/lib/doorkeeper/oauth.rb +13 -0
- data/lib/doorkeeper/orm/active_record/application.rb +22 -14
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +26 -0
- data/lib/doorkeeper/orm/active_record.rb +2 -0
- data/lib/doorkeeper/rails/helpers.rb +2 -4
- data/lib/doorkeeper/rails/routes.rb +13 -1
- data/lib/doorkeeper/rake/db.rake +40 -0
- data/lib/doorkeeper/rake/setup.rake +6 -0
- data/lib/doorkeeper/rake.rb +14 -0
- data/lib/doorkeeper/request/authorization_code.rb +0 -2
- data/lib/doorkeeper/request/client_credentials.rb +0 -2
- data/lib/doorkeeper/request/code.rb +0 -2
- data/lib/doorkeeper/request/password.rb +0 -2
- data/lib/doorkeeper/request/refresh_token.rb +0 -2
- data/lib/doorkeeper/request/token.rb +0 -2
- data/lib/doorkeeper/request.rb +28 -35
- data/lib/doorkeeper/version.rb +4 -24
- data/lib/doorkeeper.rb +19 -17
- data/lib/generators/doorkeeper/application_owner_generator.rb +23 -18
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +32 -0
- data/lib/generators/doorkeeper/install_generator.rb +17 -9
- data/lib/generators/doorkeeper/migration_generator.rb +23 -18
- data/lib/generators/doorkeeper/pkce_generator.rb +32 -0
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +29 -24
- data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +6 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +76 -11
- data/lib/generators/doorkeeper/views_generator.rb +3 -1
- data/spec/controllers/application_metal_controller_spec.rb +50 -0
- data/spec/controllers/applications_controller_spec.rb +126 -13
- data/spec/controllers/authorizations_controller_spec.rb +279 -17
- data/spec/controllers/protected_resources_controller_spec.rb +16 -16
- data/spec/controllers/token_info_controller_spec.rb +4 -12
- data/spec/controllers/tokens_controller_spec.rb +13 -15
- data/spec/dummy/app/assets/config/manifest.js +2 -0
- data/spec/dummy/config/environments/test.rb +4 -5
- data/spec/dummy/config/initializers/doorkeeper.rb +11 -1
- data/spec/dummy/config/initializers/new_framework_defaults.rb +4 -0
- data/spec/dummy/config/routes.rb +3 -42
- data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +6 -0
- data/spec/dummy/db/migrate/{20180210183654_add_confidential_to_application.rb → 20180210183654_add_confidential_to_applications.rb} +1 -1
- data/spec/dummy/db/schema.rb +36 -36
- data/spec/generators/application_owner_generator_spec.rb +1 -1
- data/spec/generators/confidential_applications_generator_spec.rb +45 -0
- data/spec/generators/install_generator_spec.rb +1 -1
- data/spec/generators/migration_generator_spec.rb +1 -1
- data/spec/generators/pkce_generator_spec.rb +43 -0
- data/spec/generators/previous_refresh_token_generator_spec.rb +1 -1
- data/spec/generators/views_generator_spec.rb +1 -1
- data/spec/grape/grape_integration_spec.rb +1 -1
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +1 -1
- data/spec/lib/config_spec.rb +88 -14
- data/spec/lib/doorkeeper_spec.rb +1 -126
- data/spec/lib/models/expirable_spec.rb +0 -3
- data/spec/lib/models/revocable_spec.rb +0 -2
- data/spec/lib/models/scopes_spec.rb +0 -4
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -4
- data/spec/lib/oauth/authorization_code_request_spec.rb +24 -2
- data/spec/lib/oauth/base_request_spec.rb +40 -2
- data/spec/lib/oauth/base_response_spec.rb +1 -1
- data/spec/lib/oauth/client/credentials_spec.rb +1 -3
- data/spec/lib/oauth/client_credentials/creator_spec.rb +5 -1
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +26 -7
- data/spec/lib/oauth/client_credentials/validation_spec.rb +2 -3
- data/spec/lib/oauth/client_credentials_integration_spec.rb +1 -1
- data/spec/lib/oauth/client_credentials_request_spec.rb +3 -5
- data/spec/lib/oauth/client_spec.rb +0 -3
- data/spec/lib/oauth/code_request_spec.rb +4 -2
- data/spec/lib/oauth/error_response_spec.rb +0 -3
- data/spec/lib/oauth/error_spec.rb +0 -2
- data/spec/lib/oauth/forbidden_token_response_spec.rb +1 -4
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -3
- data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -1
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +5 -2
- data/spec/lib/oauth/invalid_token_response_spec.rb +1 -4
- data/spec/lib/oauth/password_access_token_request_spec.rb +37 -2
- data/spec/lib/oauth/pre_authorization_spec.rb +40 -6
- data/spec/lib/oauth/refresh_token_request_spec.rb +11 -7
- data/spec/lib/oauth/scopes_spec.rb +0 -3
- data/spec/lib/oauth/token_request_spec.rb +4 -5
- data/spec/lib/oauth/token_response_spec.rb +0 -1
- data/spec/lib/oauth/token_spec.rb +37 -14
- data/spec/lib/orm/active_record/stale_records_cleaner_spec.rb +79 -0
- data/spec/lib/request/strategy_spec.rb +0 -1
- data/spec/lib/server_spec.rb +1 -1
- data/spec/models/doorkeeper/access_grant_spec.rb +44 -1
- data/spec/models/doorkeeper/access_token_spec.rb +66 -22
- data/spec/models/doorkeeper/application_spec.rb +14 -30
- data/spec/requests/applications/applications_request_spec.rb +134 -1
- data/spec/requests/applications/authorized_applications_spec.rb +1 -1
- data/spec/requests/endpoints/authorization_spec.rb +1 -1
- data/spec/requests/endpoints/token_spec.rb +7 -5
- data/spec/requests/flows/authorization_code_errors_spec.rb +1 -1
- data/spec/requests/flows/authorization_code_spec.rb +198 -2
- data/spec/requests/flows/client_credentials_spec.rb +46 -6
- data/spec/requests/flows/implicit_grant_errors_spec.rb +1 -1
- data/spec/requests/flows/implicit_grant_spec.rb +38 -11
- data/spec/requests/flows/password_spec.rb +56 -2
- data/spec/requests/flows/refresh_token_spec.rb +2 -2
- data/spec/requests/flows/revoke_token_spec.rb +11 -11
- data/spec/requests/flows/skip_authorization_spec.rb +16 -11
- data/spec/requests/protected_resources/metal_spec.rb +1 -1
- data/spec/requests/protected_resources/private_api_spec.rb +1 -1
- data/spec/routing/custom_controller_routes_spec.rb +59 -7
- data/spec/routing/default_routes_spec.rb +2 -2
- data/spec/routing/scoped_routes_spec.rb +16 -2
- data/spec/spec_helper.rb +54 -3
- data/spec/spec_helper_integration.rb +2 -74
- data/spec/support/doorkeeper_rspec.rb +19 -0
- data/spec/support/helpers/authorization_request_helper.rb +4 -4
- data/spec/support/helpers/request_spec_helper.rb +10 -2
- data/spec/support/helpers/url_helper.rb +7 -3
- data/spec/support/http_method_shim.rb +12 -16
- data/spec/validators/redirect_uri_validator_spec.rb +7 -1
- data/spec/version/version_spec.rb +3 -3
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
- metadata +37 -33
- data/lib/generators/doorkeeper/add_client_confidentiality_generator.rb +0 -31
- data/lib/generators/doorkeeper/templates/add_confidential_to_application_migration.rb.erb +0 -11
- data/spec/controllers/application_metal_controller.rb +0 -10
- /data/spec/support/dependencies/{factory_girl.rb → factory_bot.rb} +0 -0
|
@@ -34,11 +34,12 @@ class RedirectUriValidator < ActiveModel::EachValidator
|
|
|
34
34
|
|
|
35
35
|
def invalid_ssl_uri?(uri)
|
|
36
36
|
forces_ssl = Doorkeeper.configuration.force_ssl_in_redirect_uri
|
|
37
|
+
non_https = uri.try(:scheme) == 'http'
|
|
37
38
|
|
|
38
39
|
if forces_ssl.respond_to?(:call)
|
|
39
|
-
forces_ssl.call(uri)
|
|
40
|
+
forces_ssl.call(uri) && non_https
|
|
40
41
|
else
|
|
41
|
-
forces_ssl &&
|
|
42
|
+
forces_ssl && non_https
|
|
42
43
|
end
|
|
43
44
|
end
|
|
44
45
|
end
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
<%- submit_btn_css ||= 'btn btn-link' %>
|
|
2
2
|
<%= form_tag oauth_application_path(application), method: :delete do %>
|
|
3
|
-
<%= submit_tag t('doorkeeper.applications.buttons.destroy'),
|
|
3
|
+
<%= submit_tag t('doorkeeper.applications.buttons.destroy'),
|
|
4
|
+
onclick: "return confirm('#{ t('doorkeeper.applications.confirmations.destroy') }')",
|
|
5
|
+
class: submit_btn_css %>
|
|
4
6
|
<% end %>
|
|
@@ -1,58 +1,59 @@
|
|
|
1
|
-
<%= form_for application, url: doorkeeper_submit_path(application), html: {
|
|
1
|
+
<%= form_for application, url: doorkeeper_submit_path(application), html: { role: 'form' } do |f| %>
|
|
2
2
|
<% if application.errors.any? %>
|
|
3
3
|
<div class="alert alert-danger" data-alert><p><%= t('doorkeeper.applications.form.error') %></p></div>
|
|
4
4
|
<% end %>
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
<%= f.label :name, class: 'col-sm-2
|
|
6
|
+
<div class="form-group row">
|
|
7
|
+
<%= f.label :name, class: 'col-sm-2 col-form-label font-weight-bold' %>
|
|
8
8
|
<div class="col-sm-10">
|
|
9
|
-
<%= f.text_field :name, class:
|
|
9
|
+
<%= f.text_field :name, class: "form-control #{ 'is-invalid' if application.errors[:name].present? }", required: true %>
|
|
10
10
|
<%= doorkeeper_errors_for application, :name %>
|
|
11
11
|
</div>
|
|
12
|
-
|
|
12
|
+
</div>
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
<%= f.label :redirect_uri, class: 'col-sm-2
|
|
14
|
+
<div class="form-group row">
|
|
15
|
+
<%= f.label :redirect_uri, class: 'col-sm-2 col-form-label font-weight-bold' %>
|
|
16
16
|
<div class="col-sm-10">
|
|
17
|
-
<%= f.text_area :redirect_uri, class:
|
|
17
|
+
<%= f.text_area :redirect_uri, class: "form-control #{ 'is-invalid' if application.errors[:redirect_uri].present? }" %>
|
|
18
18
|
<%= doorkeeper_errors_for application, :redirect_uri %>
|
|
19
|
-
<span class="
|
|
19
|
+
<span class="form-text text-secondary">
|
|
20
20
|
<%= t('doorkeeper.applications.help.redirect_uri') %>
|
|
21
21
|
</span>
|
|
22
|
+
|
|
22
23
|
<% if Doorkeeper.configuration.native_redirect_uri %>
|
|
23
|
-
<span class="
|
|
24
|
-
<%= raw t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code) { Doorkeeper.configuration.native_redirect_uri }) %>
|
|
24
|
+
<span class="form-text text-secondary">
|
|
25
|
+
<%= raw t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code, class: 'bg-light') { Doorkeeper.configuration.native_redirect_uri }) %>
|
|
25
26
|
</span>
|
|
26
27
|
<% end %>
|
|
27
28
|
</div>
|
|
28
|
-
|
|
29
|
+
</div>
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
<%= f.label :confidential, class: 'col-sm-2
|
|
31
|
+
<div class="form-group row">
|
|
32
|
+
<%= f.label :confidential, class: 'col-sm-2 form-check-label font-weight-bold' %>
|
|
32
33
|
<div class="col-sm-10">
|
|
33
|
-
<%= f.check_box :confidential, class: '
|
|
34
|
+
<%= f.check_box :confidential, class: "checkbox #{ 'is-invalid' if application.errors[:confidential].present? }" %>
|
|
34
35
|
<%= doorkeeper_errors_for application, :confidential %>
|
|
35
|
-
<span class="
|
|
36
|
+
<span class="form-text text-secondary">
|
|
36
37
|
<%= t('doorkeeper.applications.help.confidential') %>
|
|
37
38
|
</span>
|
|
38
39
|
</div>
|
|
39
|
-
|
|
40
|
+
</div>
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
<%= f.label :scopes, class: 'col-sm-2
|
|
42
|
+
<div class="form-group row">
|
|
43
|
+
<%= f.label :scopes, class: 'col-sm-2 col-form-label font-weight-bold' %>
|
|
43
44
|
<div class="col-sm-10">
|
|
44
|
-
<%= f.text_field :scopes, class:
|
|
45
|
+
<%= f.text_field :scopes, class: "form-control #{ 'has-error' if application.errors[:scopes].present? }" %>
|
|
45
46
|
<%= doorkeeper_errors_for application, :scopes %>
|
|
46
|
-
<span class="
|
|
47
|
+
<span class="form-text text-secondary">
|
|
47
48
|
<%= t('doorkeeper.applications.help.scopes') %>
|
|
48
49
|
</span>
|
|
49
50
|
</div>
|
|
50
|
-
|
|
51
|
+
</div>
|
|
51
52
|
|
|
52
53
|
<div class="form-group">
|
|
53
54
|
<div class="col-sm-offset-2 col-sm-10">
|
|
54
|
-
<%= f.submit t('doorkeeper.applications.buttons.submit'), class:
|
|
55
|
-
<%= link_to t('doorkeeper.applications.buttons.cancel'), oauth_applications_path, class:
|
|
55
|
+
<%= f.submit t('doorkeeper.applications.buttons.submit'), class: 'btn btn-primary' %>
|
|
56
|
+
<%= link_to t('doorkeeper.applications.buttons.cancel'), oauth_applications_path, class: 'btn btn-secondary' %>
|
|
56
57
|
</div>
|
|
57
58
|
</div>
|
|
58
59
|
<% end %>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<div class="
|
|
1
|
+
<div class="border-bottom mb-4">
|
|
2
2
|
<h1><%= t('.title') %></h1>
|
|
3
3
|
</div>
|
|
4
4
|
|
|
@@ -10,18 +10,28 @@
|
|
|
10
10
|
<th><%= t('.name') %></th>
|
|
11
11
|
<th><%= t('.callback_url') %></th>
|
|
12
12
|
<th><%= t('.confidential') %></th>
|
|
13
|
-
<th
|
|
13
|
+
<th><%= t('.actions') %></th>
|
|
14
14
|
<th></th>
|
|
15
15
|
</tr>
|
|
16
16
|
</thead>
|
|
17
17
|
<tbody>
|
|
18
18
|
<% @applications.each do |application| %>
|
|
19
19
|
<tr id="application_<%= application.id %>">
|
|
20
|
-
<td
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
<td
|
|
24
|
-
|
|
20
|
+
<td class="align-middle">
|
|
21
|
+
<%= link_to application.name, oauth_application_path(application) %>
|
|
22
|
+
</td>
|
|
23
|
+
<td class="align-middle">
|
|
24
|
+
<%= simple_format(application.redirect_uri) %>
|
|
25
|
+
</td>
|
|
26
|
+
<td class="align-middle">
|
|
27
|
+
<%= application.confidential? ? t('doorkeeper.applications.index.confidentiality.yes') : t('doorkeeper.applications.index.confidentiality.no') %>
|
|
28
|
+
</td>
|
|
29
|
+
<td class="align-middle">
|
|
30
|
+
<%= link_to t('doorkeeper.applications.buttons.edit'), edit_oauth_application_path(application), class: 'btn btn-link' %>
|
|
31
|
+
</td>
|
|
32
|
+
<td class="align-middle">
|
|
33
|
+
<%= render 'delete_form', application: application %>
|
|
34
|
+
</td>
|
|
25
35
|
</tr>
|
|
26
36
|
<% end %>
|
|
27
37
|
</tbody>
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
<div class="
|
|
1
|
+
<div class="border-bottom mb-4">
|
|
2
2
|
<h1><%= t('.title', name: @application.name) %></h1>
|
|
3
3
|
</div>
|
|
4
4
|
|
|
5
5
|
<div class="row">
|
|
6
6
|
<div class="col-md-8">
|
|
7
7
|
<h4><%= t('.application_id') %>:</h4>
|
|
8
|
-
<p><code id="application_id"><%= @application.uid %></code></p>
|
|
8
|
+
<p><code class="bg-light" id="application_id"><%= @application.uid %></code></p>
|
|
9
9
|
|
|
10
10
|
<h4><%= t('.secret') %>:</h4>
|
|
11
|
-
<p><code id="secret"><%= @application.secret %></code></p>
|
|
11
|
+
<p><code class="bg-light" id="secret"><%= @application.secret %></code></p>
|
|
12
12
|
|
|
13
13
|
<h4><%= t('.scopes') %>:</h4>
|
|
14
|
-
<p><code id="scopes"><%= @application.scopes %></code></p>
|
|
14
|
+
<p><code class="bg-light" id="scopes"><%= @application.scopes.presence || raw(' ') %></code></p>
|
|
15
15
|
|
|
16
16
|
<h4><%= t('.confidential') %>:</h4>
|
|
17
|
-
<p><code id="confidential"><%= @application.confidential? %></code></p>
|
|
17
|
+
<p><code class="bg-light" id="confidential"><%= @application.confidential? %></code></p>
|
|
18
18
|
|
|
19
19
|
<h4><%= t('.callback_urls') %>:</h4>
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<% @application.redirect_uri.split.each do |uri| %>
|
|
23
23
|
<tr>
|
|
24
24
|
<td>
|
|
25
|
-
<code><%= uri %></code>
|
|
25
|
+
<code class="bg-light"><%= uri %></code>
|
|
26
26
|
</td>
|
|
27
27
|
<td>
|
|
28
28
|
<%= link_to t('doorkeeper.applications.buttons.authorize'), oauth_authorization_path(client_id: @application.uid, redirect_uri: uri, response_type: 'code', scope: @application.scopes), class: 'btn btn-success', target: '_blank' %>
|
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
<%= hidden_field_tag :state, @pre_auth.state %>
|
|
27
27
|
<%= hidden_field_tag :response_type, @pre_auth.response_type %>
|
|
28
28
|
<%= hidden_field_tag :scope, @pre_auth.scope %>
|
|
29
|
+
<%= hidden_field_tag :code_challenge, @pre_auth.code_challenge %>
|
|
30
|
+
<%= hidden_field_tag :code_challenge_method, @pre_auth.code_challenge_method %>
|
|
29
31
|
<%= submit_tag t('doorkeeper.authorizations.buttons.authorize'), class: "btn btn-success btn-lg btn-block" %>
|
|
30
32
|
<% end %>
|
|
31
33
|
<%= form_tag oauth_authorization_path, method: :delete do %>
|
|
@@ -34,6 +36,8 @@
|
|
|
34
36
|
<%= hidden_field_tag :state, @pre_auth.state %>
|
|
35
37
|
<%= hidden_field_tag :response_type, @pre_auth.response_type %>
|
|
36
38
|
<%= hidden_field_tag :scope, @pre_auth.scope %>
|
|
39
|
+
<%= hidden_field_tag :code_challenge, @pre_auth.code_challenge %>
|
|
40
|
+
<%= hidden_field_tag :code_challenge_method, @pre_auth.code_challenge_method %>
|
|
37
41
|
<%= submit_tag t('doorkeeper.authorizations.buttons.deny'), class: "btn btn-danger btn-lg btn-block" %>
|
|
38
42
|
<% end %>
|
|
39
43
|
</div>
|
|
@@ -4,27 +4,27 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<title
|
|
7
|
+
<title><%= t('doorkeeper.layouts.admin.title') %></title>
|
|
8
8
|
<%= stylesheet_link_tag "doorkeeper/admin/application" %>
|
|
9
9
|
<%= csrf_meta_tags %>
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
<% end %>
|
|
12
|
+
<nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-5">
|
|
13
|
+
<%= link_to t('doorkeeper.layouts.admin.nav.oauth2_provider'), oauth_applications_path, class: 'navbar-brand' %>
|
|
14
|
+
|
|
15
|
+
<div class="collapse navbar-collapse">
|
|
16
|
+
<ul class="navbar-nav mr-auto">
|
|
17
|
+
<li class="nav-item <%= 'active' if request.path == oauth_applications_path %>">
|
|
18
|
+
<%= link_to t('doorkeeper.layouts.admin.nav.applications'), oauth_applications_path, class: 'nav-link' %>
|
|
19
|
+
</li>
|
|
20
|
+
<li class="nav-item">
|
|
21
|
+
<%= link_to t('doorkeeper.layouts.admin.nav.home'), root_path, class: 'nav-link' %>
|
|
22
|
+
</li>
|
|
24
23
|
</ul>
|
|
25
24
|
</div>
|
|
26
|
-
</
|
|
27
|
-
|
|
25
|
+
</nav>
|
|
26
|
+
|
|
27
|
+
<div class="doorkeeper-admin container">
|
|
28
28
|
<%- if flash[:notice].present? %>
|
|
29
29
|
<div class="alert alert-info">
|
|
30
30
|
<%= flash[:notice] %>
|
data/config/locales/en.yml
CHANGED
|
@@ -14,6 +14,8 @@ en:
|
|
|
14
14
|
relative_uri: 'must be an absolute URI.'
|
|
15
15
|
secured_uri: 'must be an HTTPS/SSL URI.'
|
|
16
16
|
forbidden_uri: 'is forbidden by the server.'
|
|
17
|
+
scopes:
|
|
18
|
+
not_match_configured: "doesn't match configured on the server."
|
|
17
19
|
|
|
18
20
|
doorkeeper:
|
|
19
21
|
applications:
|
|
@@ -40,14 +42,15 @@ en:
|
|
|
40
42
|
name: 'Name'
|
|
41
43
|
callback_url: 'Callback URL'
|
|
42
44
|
confidential: 'Confidential?'
|
|
45
|
+
actions: 'Actions'
|
|
43
46
|
confidentiality:
|
|
44
|
-
yes: 'Yes'
|
|
45
|
-
no: 'No'
|
|
47
|
+
'yes': 'Yes'
|
|
48
|
+
'no': 'No'
|
|
46
49
|
new:
|
|
47
50
|
title: 'New Application'
|
|
48
51
|
show:
|
|
49
52
|
title: 'Application: %{name}'
|
|
50
|
-
application_id: 'Application
|
|
53
|
+
application_id: 'Application UID'
|
|
51
54
|
secret: 'Secret'
|
|
52
55
|
scopes: 'Scopes'
|
|
53
56
|
confidential: 'Confidential'
|
|
@@ -78,6 +81,9 @@ en:
|
|
|
78
81
|
created_at: 'Created At'
|
|
79
82
|
date_format: '%Y-%m-%d %H:%M:%S'
|
|
80
83
|
|
|
84
|
+
pre_authorization:
|
|
85
|
+
status: 'Pre-authorization'
|
|
86
|
+
|
|
81
87
|
errors:
|
|
82
88
|
messages:
|
|
83
89
|
# Common error messages
|
|
@@ -86,12 +92,14 @@ en:
|
|
|
86
92
|
unauthorized_client: 'The client is not authorized to perform this request using this method.'
|
|
87
93
|
access_denied: 'The resource owner or authorization server denied the request.'
|
|
88
94
|
invalid_scope: 'The requested scope is invalid, unknown, or malformed.'
|
|
95
|
+
invalid_code_challenge_method: 'The code challenge method must be plain or S256.'
|
|
89
96
|
server_error: 'The authorization server encountered an unexpected condition which prevented it from fulfilling the request.'
|
|
90
97
|
temporarily_unavailable: 'The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server.'
|
|
91
98
|
|
|
92
99
|
# Configuration error messages
|
|
93
100
|
credential_flow_not_configured: 'Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured.'
|
|
94
101
|
resource_owner_authenticator_not_configured: 'Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfigured.'
|
|
102
|
+
admin_authenticator_not_configured: 'Access to admin panel is forbidden due to Doorkeeper.configure.admin_authenticator being unconfigured.'
|
|
95
103
|
|
|
96
104
|
# Access grant errors
|
|
97
105
|
unsupported_response_type: 'The authorization server does not support this response type.'
|
|
@@ -120,6 +128,7 @@ en:
|
|
|
120
128
|
|
|
121
129
|
layouts:
|
|
122
130
|
admin:
|
|
131
|
+
title: 'Doorkeeper'
|
|
123
132
|
nav:
|
|
124
133
|
oauth2_provider: 'OAuth2 Provider'
|
|
125
134
|
applications: 'Applications'
|
data/doorkeeper.gemspec
CHANGED
|
@@ -1,32 +1,30 @@
|
|
|
1
|
-
$LOAD_PATH.push File.expand_path(
|
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require 'doorkeeper/version'
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
|
-
s.name =
|
|
6
|
+
s.name = 'doorkeeper'
|
|
7
7
|
s.version = Doorkeeper.gem_version
|
|
8
|
-
s.authors = [
|
|
8
|
+
s.authors = ['Felipe Elias Philipp', 'Tute Costa', 'Jon Moss', 'Nikita Bulai']
|
|
9
9
|
s.email = %w(bulaj.nikita@gmail.com)
|
|
10
|
-
s.homepage =
|
|
11
|
-
s.summary =
|
|
12
|
-
s.description =
|
|
10
|
+
s.homepage = 'https://github.com/doorkeeper-gem/doorkeeper'
|
|
11
|
+
s.summary = 'OAuth 2 provider for Rails and Grape'
|
|
12
|
+
s.description = 'Doorkeeper is an OAuth 2 provider for Rails and Grape.'
|
|
13
13
|
s.license = 'MIT'
|
|
14
14
|
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
|
16
16
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
|
17
|
-
s.require_paths = [
|
|
17
|
+
s.require_paths = ['lib']
|
|
18
18
|
|
|
19
|
-
s.add_dependency
|
|
20
|
-
s.required_ruby_version =
|
|
19
|
+
s.add_dependency 'railties', '>= 4.2'
|
|
20
|
+
s.required_ruby_version = '>= 2.1'
|
|
21
21
|
|
|
22
|
-
s.add_development_dependency
|
|
23
|
-
s.add_development_dependency
|
|
24
|
-
s.add_development_dependency
|
|
25
|
-
s.add_development_dependency
|
|
26
|
-
s.add_development_dependency
|
|
27
|
-
s.add_development_dependency
|
|
28
|
-
s.add_development_dependency
|
|
29
|
-
s.add_development_dependency
|
|
30
|
-
|
|
31
|
-
s.post_install_message = Doorkeeper::CVE_2018_1000211_WARNING
|
|
22
|
+
s.add_development_dependency 'capybara', '~> 2.18'
|
|
23
|
+
s.add_development_dependency 'coveralls'
|
|
24
|
+
s.add_development_dependency 'grape'
|
|
25
|
+
s.add_development_dependency 'database_cleaner', '~> 1.6'
|
|
26
|
+
s.add_development_dependency 'factory_bot', '~> 4.8'
|
|
27
|
+
s.add_development_dependency 'generator_spec', '~> 0.9.3'
|
|
28
|
+
s.add_development_dependency 'rake', '>= 11.3.0'
|
|
29
|
+
s.add_development_dependency 'rspec-rails'
|
|
32
30
|
end
|
data/gemfiles/rails_5_2.gemfile
CHANGED
|
@@ -9,6 +9,9 @@ gem "appraisal"
|
|
|
9
9
|
gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
|
|
10
10
|
gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
|
|
11
11
|
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
%w[rspec-core rspec-expectations rspec-mocks rspec-rails rspec-support].each do |lib|
|
|
14
|
+
gem lib, git: "https://github.com/rspec/#{lib}.git", branch: 'master'
|
|
15
|
+
end
|
|
13
16
|
|
|
14
17
|
gemspec path: "../"
|
data/lib/doorkeeper/config.rb
CHANGED
|
@@ -15,19 +15,19 @@ module Doorkeeper
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def self.configuration
|
|
18
|
-
@config || (
|
|
18
|
+
@config || (raise MissingConfiguration)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def self.setup_orm_adapter
|
|
22
22
|
@orm_adapter = "doorkeeper/orm/#{configuration.orm}".classify.constantize
|
|
23
|
-
rescue NameError =>
|
|
24
|
-
|
|
25
|
-
[doorkeeper] ORM adapter not found (#{configuration.orm}), or there was an error
|
|
26
|
-
trying to load it.
|
|
27
|
-
|
|
28
|
-
You probably need to add the related gem for this adapter to work with
|
|
29
|
-
doorkeeper.
|
|
30
|
-
|
|
23
|
+
rescue NameError => error
|
|
24
|
+
raise error, "ORM adapter not found (#{configuration.orm})", <<-ERROR_MSG.strip_heredoc
|
|
25
|
+
[doorkeeper] ORM adapter not found (#{configuration.orm}), or there was an error
|
|
26
|
+
trying to load it.
|
|
27
|
+
|
|
28
|
+
You probably need to add the related gem for this adapter to work with
|
|
29
|
+
doorkeeper.
|
|
30
|
+
ERROR_MSG
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def self.setup_orm_models
|
|
@@ -90,7 +90,7 @@ doorkeeper.
|
|
|
90
90
|
#
|
|
91
91
|
# @param methods [Array] Define client credentials
|
|
92
92
|
def client_credentials(*methods)
|
|
93
|
-
@config.instance_variable_set(:@
|
|
93
|
+
@config.instance_variable_set(:@client_credentials_methods, methods)
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
# Change the way access token is authenticated from the request object.
|
|
@@ -103,9 +103,12 @@ doorkeeper.
|
|
|
103
103
|
@config.instance_variable_set(:@access_token_methods, methods)
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
# Issue access tokens with refresh token (disabled
|
|
107
|
-
def use_refresh_token
|
|
108
|
-
@config.instance_variable_set(
|
|
106
|
+
# Issue access tokens with refresh token (disabled if not set)
|
|
107
|
+
def use_refresh_token(enabled = true, &block)
|
|
108
|
+
@config.instance_variable_set(
|
|
109
|
+
:@refresh_token_enabled,
|
|
110
|
+
block ? block : enabled
|
|
111
|
+
)
|
|
109
112
|
end
|
|
110
113
|
|
|
111
114
|
# Reuse access token for the same resource owner within an application
|
|
@@ -114,6 +117,25 @@ doorkeeper.
|
|
|
114
117
|
def reuse_access_token
|
|
115
118
|
@config.instance_variable_set(:@reuse_access_token, true)
|
|
116
119
|
end
|
|
120
|
+
|
|
121
|
+
# Use an API mode for applications generated with --api argument
|
|
122
|
+
# It will skip applications controller, disable forgery protection
|
|
123
|
+
def api_only
|
|
124
|
+
@config.instance_variable_set(:@api_only, true)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Forbids creating/updating applications with arbitrary scopes that are
|
|
128
|
+
# not in configuration, i.e. `default_scopes` or `optional_scopes`.
|
|
129
|
+
# (disabled by default)
|
|
130
|
+
def enforce_configured_scopes
|
|
131
|
+
@config.instance_variable_set(:@enforce_configured_scopes, true)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Enforce request content type as the spec requires:
|
|
135
|
+
# disabled by default for backward compatibility.
|
|
136
|
+
def enforce_content_type
|
|
137
|
+
@config.instance_variable_set(:@enforce_content_type, true)
|
|
138
|
+
end
|
|
117
139
|
end
|
|
118
140
|
|
|
119
141
|
module Option
|
|
@@ -179,25 +201,39 @@ doorkeeper.
|
|
|
179
201
|
option :resource_owner_authenticator,
|
|
180
202
|
as: :authenticate_resource_owner,
|
|
181
203
|
default: (lambda do |_routes|
|
|
182
|
-
::Rails.logger.warn(
|
|
204
|
+
::Rails.logger.warn(
|
|
205
|
+
I18n.t('doorkeeper.errors.messages.resource_owner_authenticator_not_configured')
|
|
206
|
+
)
|
|
207
|
+
|
|
183
208
|
nil
|
|
184
209
|
end)
|
|
185
210
|
|
|
186
211
|
option :admin_authenticator,
|
|
187
212
|
as: :authenticate_admin,
|
|
188
|
-
default:
|
|
213
|
+
default: (lambda do |_routes|
|
|
214
|
+
::Rails.logger.warn(
|
|
215
|
+
I18n.t('doorkeeper.errors.messages.admin_authenticator_not_configured')
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
head :forbidden
|
|
219
|
+
end)
|
|
189
220
|
|
|
190
221
|
option :resource_owner_from_credentials,
|
|
191
222
|
default: (lambda do |_routes|
|
|
192
|
-
::Rails.logger.warn(
|
|
223
|
+
::Rails.logger.warn(
|
|
224
|
+
I18n.t('doorkeeper.errors.messages.credential_flow_not_configured')
|
|
225
|
+
)
|
|
226
|
+
|
|
193
227
|
nil
|
|
194
228
|
end)
|
|
229
|
+
option :before_successful_authorization, default: ->(_context) {}
|
|
230
|
+
option :after_successful_authorization, default: ->(_context) {}
|
|
195
231
|
option :before_successful_strategy_response, default: ->(_request) {}
|
|
196
232
|
option :after_successful_strategy_response,
|
|
197
233
|
default: ->(_request, _response) {}
|
|
198
234
|
option :skip_authorization, default: ->(_routes) {}
|
|
199
235
|
option :access_token_expires_in, default: 7200
|
|
200
|
-
option :custom_access_token_expires_in, default: ->(
|
|
236
|
+
option :custom_access_token_expires_in, default: ->(_context) { nil }
|
|
201
237
|
option :authorization_code_expires_in, default: 600
|
|
202
238
|
option :orm, default: :active_record
|
|
203
239
|
option :native_redirect_uri, default: 'urn:ietf:wg:oauth:2.0:oob'
|
|
@@ -232,7 +268,6 @@ doorkeeper.
|
|
|
232
268
|
#
|
|
233
269
|
option :force_ssl_in_redirect_uri, default: !Rails.env.development?
|
|
234
270
|
|
|
235
|
-
|
|
236
271
|
# Use a custom class for generating the access token.
|
|
237
272
|
# https://github.com/doorkeeper-gem/doorkeeper#custom-access-token-generator
|
|
238
273
|
#
|
|
@@ -251,20 +286,35 @@ doorkeeper.
|
|
|
251
286
|
default: 'ActionController::Base'
|
|
252
287
|
|
|
253
288
|
attr_reader :reuse_access_token
|
|
289
|
+
attr_reader :api_only
|
|
290
|
+
attr_reader :enforce_content_type
|
|
291
|
+
|
|
292
|
+
def api_only
|
|
293
|
+
@api_only ||= false
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def enforce_content_type
|
|
297
|
+
@enforce_content_type ||= false
|
|
298
|
+
end
|
|
254
299
|
|
|
255
300
|
def refresh_token_enabled?
|
|
256
|
-
@refresh_token_enabled
|
|
257
|
-
|
|
301
|
+
if defined?(@refresh_token_enabled)
|
|
302
|
+
@refresh_token_enabled
|
|
303
|
+
else
|
|
304
|
+
false
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
def enforce_configured_scopes?
|
|
309
|
+
!!(defined?(@enforce_configured_scopes) && @enforce_configured_scopes)
|
|
258
310
|
end
|
|
259
311
|
|
|
260
312
|
def enable_application_owner?
|
|
261
|
-
@enable_application_owner
|
|
262
|
-
!!@enable_application_owner
|
|
313
|
+
!!(defined?(@enable_application_owner) && @enable_application_owner)
|
|
263
314
|
end
|
|
264
315
|
|
|
265
316
|
def confirm_application_owner?
|
|
266
|
-
@confirm_application_owner
|
|
267
|
-
!!@confirm_application_owner
|
|
317
|
+
!!(defined?(@confirm_application_owner) && @confirm_application_owner)
|
|
268
318
|
end
|
|
269
319
|
|
|
270
320
|
def default_scopes
|
|
@@ -280,7 +330,7 @@ doorkeeper.
|
|
|
280
330
|
end
|
|
281
331
|
|
|
282
332
|
def client_credentials_methods
|
|
283
|
-
@
|
|
333
|
+
@client_credentials_methods ||= %i[from_basic from_params]
|
|
284
334
|
end
|
|
285
335
|
|
|
286
336
|
def access_token_methods
|
|
@@ -288,11 +338,11 @@ doorkeeper.
|
|
|
288
338
|
end
|
|
289
339
|
|
|
290
340
|
def authorization_response_types
|
|
291
|
-
@authorization_response_types ||= calculate_authorization_response_types
|
|
341
|
+
@authorization_response_types ||= calculate_authorization_response_types.freeze
|
|
292
342
|
end
|
|
293
343
|
|
|
294
344
|
def token_grant_types
|
|
295
|
-
@token_grant_types ||= calculate_token_grant_types
|
|
345
|
+
@token_grant_types ||= calculate_token_grant_types.freeze
|
|
296
346
|
end
|
|
297
347
|
|
|
298
348
|
private
|
data/lib/doorkeeper/engine.rb
CHANGED
|
@@ -17,6 +17,10 @@ module Doorkeeper
|
|
|
17
17
|
|
|
18
18
|
if defined?(Sprockets) && Sprockets::VERSION.chr.to_i >= 4
|
|
19
19
|
initializer 'doorkeeper.assets.precompile' do |app|
|
|
20
|
+
# Force users to use:
|
|
21
|
+
# //= link doorkeeper/admin/application.css
|
|
22
|
+
# in Doorkeeper 5 for Sprockets 4 instead of precompile.
|
|
23
|
+
# Add note to official docs & Wiki
|
|
20
24
|
app.config.assets.precompile += %w[
|
|
21
25
|
doorkeeper/application.css
|
|
22
26
|
doorkeeper/admin/application.css
|
data/lib/doorkeeper/errors.rb
CHANGED
|
@@ -36,10 +36,7 @@ module Doorkeeper
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class TokenGeneratorNotFound < DoorkeeperError
|
|
43
|
-
end
|
|
39
|
+
UnableToGenerateToken = Class.new(DoorkeeperError)
|
|
40
|
+
TokenGeneratorNotFound = Class.new(DoorkeeperError)
|
|
44
41
|
end
|
|
45
42
|
end
|