From 872b007c30cb6fad7fb587436a8723d45fb144e3 Mon Sep 17 00:00:00 2001 From: Michael Kohl Date: Tue, 21 Dec 2021 12:29:58 +0700 Subject: [PATCH] Remove Doorkeeper gem (#15749) --- Gemfile | 1 - Gemfile.lock | 3 - app/controllers/oauth/tokens_controller.rb | 23 - app/models/user.rb | 4 - app/models/webhook/endpoint.rb | 3 - app/services/users/delete_activity.rb | 2 - .../applications/_delete_form.html.erb | 6 - .../doorkeeper/applications/_form.html.erb | 65 --- .../doorkeeper/applications/edit.html.erb | 5 - .../doorkeeper/applications/index.html.erb | 38 -- .../doorkeeper/applications/new.html.erb | 5 - .../doorkeeper/applications/show.html.erb | 48 -- .../doorkeeper/authorizations/error.html.erb | 7 - .../doorkeeper/authorizations/new.html.erb | 90 ---- .../doorkeeper/authorizations/show.html.erb | 7 - .../_delete_form.html.erb | 4 - .../authorized_applications/index.html.erb | 24 - app/views/layouts/doorkeeper/admin.html.erb | 39 -- .../layouts/doorkeeper/application.html.erb | 23 - config/i18n-tasks.yml | 3 - config/initializers/doorkeeper.rb | 502 ------------------ config/locales/doorkeeper.en.yml | 140 ----- config/routes.rb | 4 - spec/factories/doorkeeper_access_grants.rb | 7 - spec/factories/doorkeeper_access_tokens.rb | 5 - spec/factories/doorkeeper_applications.rb | 8 - spec/models/user_spec.rb | 16 - spec/models/webhook/endpoint_spec.rb | 1 - spec/requests/oauth/tokens_spec.rb | 68 --- spec/support/initializers/doorkeeper.rb | 4 - spec/workers/webhook/destroy_worker_spec.rb | 9 +- vendor/cache/doorkeeper-5.5.4.gem | Bin 101888 -> 0 bytes 32 files changed, 4 insertions(+), 1160 deletions(-) delete mode 100644 app/controllers/oauth/tokens_controller.rb delete mode 100644 app/views/doorkeeper/applications/_delete_form.html.erb delete mode 100644 app/views/doorkeeper/applications/_form.html.erb delete mode 100644 app/views/doorkeeper/applications/edit.html.erb delete mode 100644 app/views/doorkeeper/applications/index.html.erb delete mode 100644 app/views/doorkeeper/applications/new.html.erb delete mode 100644 app/views/doorkeeper/applications/show.html.erb delete mode 100644 app/views/doorkeeper/authorizations/error.html.erb delete mode 100644 app/views/doorkeeper/authorizations/new.html.erb delete mode 100644 app/views/doorkeeper/authorizations/show.html.erb delete mode 100644 app/views/doorkeeper/authorized_applications/_delete_form.html.erb delete mode 100644 app/views/doorkeeper/authorized_applications/index.html.erb delete mode 100644 app/views/layouts/doorkeeper/admin.html.erb delete mode 100644 app/views/layouts/doorkeeper/application.html.erb delete mode 100644 config/initializers/doorkeeper.rb delete mode 100644 config/locales/doorkeeper.en.yml delete mode 100644 spec/factories/doorkeeper_access_grants.rb delete mode 100644 spec/factories/doorkeeper_access_tokens.rb delete mode 100644 spec/factories/doorkeeper_applications.rb delete mode 100644 spec/requests/oauth/tokens_spec.rb delete mode 100644 spec/support/initializers/doorkeeper.rb delete mode 100644 vendor/cache/doorkeeper-5.5.4.gem diff --git a/Gemfile b/Gemfile index 97d509db0..09e954ec9 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,6 @@ gem "ddtrace", "~> 0.54.1" # ddtrace is Datadog’s tracing client for Ruby. gem "devise", "~> 4.8" # Flexible authentication solution for Rails gem "devise_invitable", "~> 2.0.6" # Allows invitations to be sent for joining gem "dogstatsd-ruby", "~> 4.8" # A client for DogStatsD, an extension of the StatsD metric server for Datadog -gem "doorkeeper", "~> 5.5" # Oauth 2 provider gem "email_validator", "~> 2.2" # Email validator for Rails and ActiveModel gem "emoji_regex", "~> 3.2" # A pair of Ruby regular expressions for matching Unicode Emoji symbols gem "fastimage", "~> 2.2" # FastImage finds the size or type of an image given its uri by fetching as little as needed. diff --git a/Gemfile.lock b/Gemfile.lock index 3aed83172..02605be07 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -219,8 +219,6 @@ GEM dogstatsd-ruby (4.8.3) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.5.4) - railties (>= 5) dotenv (2.7.6) dotenv-rails (2.7.6) dotenv (= 2.7.6) @@ -939,7 +937,6 @@ DEPENDENCIES devise (~> 4.8) devise_invitable (~> 2.0.6) dogstatsd-ruby (~> 4.8) - doorkeeper (~> 5.5) dotenv-rails (~> 2.7.6) easy_translate (~> 0.5.1) email_validator (~> 2.2) diff --git a/app/controllers/oauth/tokens_controller.rb b/app/controllers/oauth/tokens_controller.rb deleted file mode 100644 index 9bc7f4371..000000000 --- a/app/controllers/oauth/tokens_controller.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Oauth - class TokensController < Doorkeeper::TokensController - # OAuth 2.0 Token Revocation - http://tools.ietf.org/html/rfc7009 - def revoke - # The authorization server, if applicable, first authenticates the client - # and checks its ownership of the provided token. - # - # Doorkeeper does not use the token_type_hint logic described in the - # RFC 7009 due to the refresh token implementation that is a field in - # the access token model. - if authorized? - revoke_token - Webhook::DestroyWorker.perform_async(token.resource_owner_id, token.application_id) - render json: {}, status: :ok - else - error_description = I18n.t(:unauthorized, scope: %i[doorkeeper errors messages revoke]) - revocation_error_response = { error: :unauthorized_client, error_description: error_description } - - render json: revocation_error_response, status: :forbidden - end - end - end -end diff --git a/app/models/user.rb b/app/models/user.rb index d04d1665c..10adabb9e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -47,10 +47,6 @@ class User < ApplicationRecord has_one :notification_setting, class_name: "Users::NotificationSetting", dependent: :delete has_one :setting, class_name: "Users::Setting", dependent: :delete - has_many :access_grants, class_name: "Doorkeeper::AccessGrant", foreign_key: :resource_owner_id, - inverse_of: :resource_owner, dependent: :delete_all - has_many :access_tokens, class_name: "Doorkeeper::AccessToken", foreign_key: :resource_owner_id, - inverse_of: :resource_owner, dependent: :delete_all has_many :affected_feedback_messages, class_name: "FeedbackMessage", inverse_of: :affected, foreign_key: :affected_id, dependent: :nullify has_many :ahoy_events, class_name: "Ahoy::Event", dependent: :delete_all diff --git a/app/models/webhook/endpoint.rb b/app/models/webhook/endpoint.rb index 7b22f1775..afdc64200 100644 --- a/app/models/webhook/endpoint.rb +++ b/app/models/webhook/endpoint.rb @@ -1,9 +1,6 @@ module Webhook class Endpoint < ApplicationRecord belongs_to :user, inverse_of: :webhook_endpoints - belongs_to :oauth_application, optional: true, - class_name: "Doorkeeper::Application", - inverse_of: :webhook_endpoints validates :events, presence: true validates :source, presence: true diff --git a/app/services/users/delete_activity.rb b/app/services/users/delete_activity.rb index 874d1da16..5be44e76f 100644 --- a/app/services/users/delete_activity.rb +++ b/app/services/users/delete_activity.rb @@ -5,8 +5,6 @@ module Users def call(user) delete_social_media(user) delete_profile_info(user) - user.access_grants.delete_all - user.access_tokens.delete_all user.api_secrets.delete_all user.created_podcasts.update_all(creator_id: nil) user.blocker_blocks.delete_all diff --git a/app/views/doorkeeper/applications/_delete_form.html.erb b/app/views/doorkeeper/applications/_delete_form.html.erb deleted file mode 100644 index 7caf45df5..000000000 --- a/app/views/doorkeeper/applications/_delete_form.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -<%- submit_btn_css ||= "btn btn-link" %> -<%= form_tag oauth_application_path(application), method: :delete do %> - <%= submit_tag t("doorkeeper.applications.buttons.destroy"), - onclick: "return confirm('#{t('doorkeeper.applications.confirmations.destroy')}')", - class: submit_btn_css %> -<% end %> diff --git a/app/views/doorkeeper/applications/_form.html.erb b/app/views/doorkeeper/applications/_form.html.erb deleted file mode 100644 index 223ba209c..000000000 --- a/app/views/doorkeeper/applications/_form.html.erb +++ /dev/null @@ -1,65 +0,0 @@ -<%= form_for application, url: doorkeeper_submit_path(application), html: { role: "form" } do |f| %> - <% if application.errors.any? %> -

<%= t("doorkeeper.applications.form.error") %>

- <% end %> - -
- <%= f.label :name, class: "col-sm-2 col-form-label font-weight-bold" %> -
- <%= f.text_field :name, class: "form-control #{'is-invalid' if application.errors[:name].present?}", required: true %> - <%= doorkeeper_errors_for application, :name %> -
-
- -
- <%= f.label :redirect_uri, class: "col-sm-2 col-form-label font-weight-bold" %> -
- <%= f.text_area :redirect_uri, class: "form-control #{'is-invalid' if application.errors[:redirect_uri].present?}" %> - <%= doorkeeper_errors_for application, :redirect_uri %> - - <%= t("doorkeeper.applications.help.redirect_uri") %> - - - <% if Doorkeeper.configuration.native_redirect_uri %> - - <%= raw t("doorkeeper.applications.help.native_redirect_uri", native_redirect_uri: tag.code(class: "bg-light") { Doorkeeper.configuration.native_redirect_uri }) %> - - <% end %> - - <% if Doorkeeper.configuration.allow_blank_redirect_uri?(application) %> - - <%= t("doorkeeper.applications.help.blank_redirect_uri") %> - - <% end %> -
-
- -
- <%= f.label :confidential, class: "col-sm-2 form-check-label font-weight-bold" %> -
- <%= f.check_box :confidential, class: "checkbox #{'is-invalid' if application.errors[:confidential].present?}" %> - <%= doorkeeper_errors_for application, :confidential %> - - <%= t("doorkeeper.applications.help.confidential") %> - -
-
- -
- <%= f.label :scopes, class: "col-sm-2 col-form-label font-weight-bold" %> -
- <%= f.text_field :scopes, class: "form-control #{'has-error' if application.errors[:scopes].present?}" %> - <%= doorkeeper_errors_for application, :scopes %> - - <%= t("doorkeeper.applications.help.scopes") %> - -
-
- -
-
- <%= f.submit t("doorkeeper.applications.buttons.submit"), class: "btn btn-primary" %> - <%= link_to t("doorkeeper.applications.buttons.cancel"), oauth_applications_path, class: "btn btn-secondary" %> -
-
-<% end %> diff --git a/app/views/doorkeeper/applications/edit.html.erb b/app/views/doorkeeper/applications/edit.html.erb deleted file mode 100644 index 91cf6f8c4..000000000 --- a/app/views/doorkeeper/applications/edit.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -
-

<%= t(".title") %>

-
- -<%= render "form", application: @application %> diff --git a/app/views/doorkeeper/applications/index.html.erb b/app/views/doorkeeper/applications/index.html.erb deleted file mode 100644 index 259e72d3f..000000000 --- a/app/views/doorkeeper/applications/index.html.erb +++ /dev/null @@ -1,38 +0,0 @@ -
-

<%= t(".title") %>

-
- -

<%= link_to t(".new"), new_oauth_application_path, class: "btn btn-success" %>

- - - - - - - - - - - - - <% @applications.each do |application| %> - - - - - - - - <% end %> - -
<%= t(".name") %><%= t(".callback_url") %><%= t(".confidential") %><%= t(".actions") %>
- <%= link_to application.name, oauth_application_path(application) %> - - <%= simple_format(application.redirect_uri) %> - - <%= application.confidential? ? t("doorkeeper.applications.index.confidentiality.yes") : t("doorkeeper.applications.index.confidentiality.no") %> - - <%= link_to t("doorkeeper.applications.buttons.edit"), edit_oauth_application_path(application), class: "btn btn-link" %> - - <%= render "delete_form", application: application %> -
diff --git a/app/views/doorkeeper/applications/new.html.erb b/app/views/doorkeeper/applications/new.html.erb deleted file mode 100644 index 91cf6f8c4..000000000 --- a/app/views/doorkeeper/applications/new.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -
-

<%= t(".title") %>

-
- -<%= render "form", application: @application %> diff --git a/app/views/doorkeeper/applications/show.html.erb b/app/views/doorkeeper/applications/show.html.erb deleted file mode 100644 index 26e3a3468..000000000 --- a/app/views/doorkeeper/applications/show.html.erb +++ /dev/null @@ -1,48 +0,0 @@ -
-

<%= t(".title", name: @application.name) %>

-
- -
-
-

<%= t(".application_id") %>:

-

<%= @application.uid %>

- -

<%= t(".secret") %>:

-

<%= @application.plaintext_secret %>

- -

<%= t(".scopes") %>:

-

<%= @application.scopes.presence || raw(" ") %>

- -

<%= t(".confidential") %>:

-

<%= @application.confidential? %>

- -

<%= t(".callback_urls") %>:

- - - <% @application.redirect_uri.split.each do |uri| %> - - - - - <% end %> -
- <%= uri %> - - <%= 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", - rel: "noopener", - ) %> -
-
- -
-

<%= t(".actions") %>

- -

<%= link_to t("doorkeeper.applications.buttons.edit"), edit_oauth_application_path(@application), class: "btn btn-primary" %>

- -

<%= render "delete_form", application: @application, submit_btn_css: "btn btn-danger" %>

-
-
diff --git a/app/views/doorkeeper/authorizations/error.html.erb b/app/views/doorkeeper/authorizations/error.html.erb deleted file mode 100644 index 1819529a5..000000000 --- a/app/views/doorkeeper/authorizations/error.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -
-

<%= t("doorkeeper.authorizations.error.title") %>

-
- -
-
<%= @pre_auth.error_response.body[:error_description] %>
-
diff --git a/app/views/doorkeeper/authorizations/new.html.erb b/app/views/doorkeeper/authorizations/new.html.erb deleted file mode 100644 index cbfcc29e4..000000000 --- a/app/views/doorkeeper/authorizations/new.html.erb +++ /dev/null @@ -1,90 +0,0 @@ - - - - -
-

- <%= raw t(".prompt", client_name: tag.strong(class: "text-info") { @pre_auth.client.name }) %> -

- - <% if @pre_auth.scopes.count > 0 %> -
-

<%= t(".able_to") %>:

-
    - <% @pre_auth.scopes.each do |scope| %> -
  • <%= t scope, scope: %i[doorkeeper scopes] %>
  • - <% end %> -
-
- <% end %> - -
- <%= form_tag oauth_authorization_path, method: :post do %> - <%= hidden_field_tag :client_id, @pre_auth.client.uid %> - <%= hidden_field_tag :redirect_uri, @pre_auth.redirect_uri %> - <%= hidden_field_tag :state, @pre_auth.state %> - <%= hidden_field_tag :response_type, @pre_auth.response_type %> - <%= hidden_field_tag :scope, @pre_auth.scope %> - <%= hidden_field_tag :code_challenge, @pre_auth.code_challenge %> - <%= hidden_field_tag :code_challenge_method, @pre_auth.code_challenge_method %> - <%= submit_tag t("doorkeeper.authorizations.buttons.authorize"), class: "btn btn-success" %> - <% end %> - <%= form_tag oauth_authorization_path, method: :delete do %> - <%= hidden_field_tag :client_id, @pre_auth.client.uid %> - <%= hidden_field_tag :redirect_uri, @pre_auth.redirect_uri %> - <%= hidden_field_tag :state, @pre_auth.state %> - <%= hidden_field_tag :response_type, @pre_auth.response_type %> - <%= hidden_field_tag :scope, @pre_auth.scope %> - <%= hidden_field_tag :code_challenge, @pre_auth.code_challenge %> - <%= hidden_field_tag :code_challenge_method, @pre_auth.code_challenge_method %> - <%= submit_tag t("doorkeeper.authorizations.buttons.deny"), class: "btn btn-danger" %> - <% end %> -
- -
diff --git a/app/views/doorkeeper/authorizations/show.html.erb b/app/views/doorkeeper/authorizations/show.html.erb deleted file mode 100644 index 66da859c4..000000000 --- a/app/views/doorkeeper/authorizations/show.html.erb +++ /dev/null @@ -1,7 +0,0 @@ - - -
- <%= params[:code] %> -
diff --git a/app/views/doorkeeper/authorized_applications/_delete_form.html.erb b/app/views/doorkeeper/authorized_applications/_delete_form.html.erb deleted file mode 100644 index 7e5e6128f..000000000 --- a/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -<%- submit_btn_css ||= "btn btn-link" %> -<%= form_tag oauth_authorized_application_path(application), method: :delete do %> - <%= submit_tag t("doorkeeper.authorized_applications.buttons.revoke"), onclick: "return confirm('#{t('doorkeeper.authorized_applications.confirmations.revoke')}')", class: submit_btn_css %> -<% end %> diff --git a/app/views/doorkeeper/authorized_applications/index.html.erb b/app/views/doorkeeper/authorized_applications/index.html.erb deleted file mode 100644 index 813e9cf75..000000000 --- a/app/views/doorkeeper/authorized_applications/index.html.erb +++ /dev/null @@ -1,24 +0,0 @@ - - -
- - - - - - - - - - <% @applications.each do |application| %> - - - - - - <% end %> - -
<%= t("doorkeeper.authorized_applications.index.application") %><%= t("doorkeeper.authorized_applications.index.created_at") %>
<%= application.name %><%= application.created_at.strftime(t("doorkeeper.authorized_applications.index.date_format")) %><%= render "delete_form", application: application %>
-
diff --git a/app/views/layouts/doorkeeper/admin.html.erb b/app/views/layouts/doorkeeper/admin.html.erb deleted file mode 100644 index 54be4935f..000000000 --- a/app/views/layouts/doorkeeper/admin.html.erb +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - <%= t("doorkeeper.layouts.admin.title") %> - <%= stylesheet_link_tag "doorkeeper/admin/application" %> - <%= csrf_meta_tags %> - - - - -
- <%- if flash[:notice].present? %> -
- <%= flash[:notice] %> -
- <% end -%> - - <%= yield %> -
- - diff --git a/app/views/layouts/doorkeeper/application.html.erb b/app/views/layouts/doorkeeper/application.html.erb deleted file mode 100644 index 144210024..000000000 --- a/app/views/layouts/doorkeeper/application.html.erb +++ /dev/null @@ -1,23 +0,0 @@ - - - - <%= t("doorkeeper.layouts.application.title") %> - - - - - <%= stylesheet_link_tag "doorkeeper/application" %> - <%= csrf_meta_tags %> - - -
- <%- if flash[:notice].present? %> -
- <%= flash[:notice] %> -
- <% end -%> - - <%= yield %> -
- - diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index 8997d61d8..62845fe4b 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -98,10 +98,7 @@ ignore_missing: - date.* # TODO: add translations for these - - 'activerecord.attributes.doorkeeper/*' - - 'activerecord.errors.models.doorkeeper/*' - devise.* - - doorkeeper.* # these are loaded from kaminari default gem - views.* diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb deleted file mode 100644 index 4086467c0..000000000 --- a/config/initializers/doorkeeper.rb +++ /dev/null @@ -1,502 +0,0 @@ -# Doorkeeper uses ActiveSupport::LazyLoadHooks to lazily load its models. -# See: https://apirubyonrails.org/classes/ActiveSupport/LazyLoadHooks.html. -# For this to work ActiveRecord::Base needs to be required. Previously this -# happened as a side-effect of the rails-setting-cached gem but we removed this -# so need to explicitly require it. -require "active_record/base" - -Doorkeeper.configure do - # Change the ORM that doorkeeper will use (requires ORM extensions installed). - # Check the list of supported ORMs here: https://github.com/doorkeeper-gem/doorkeeper#orms - orm :active_record - - # This block will be called to check whether the resource owner is authenticated or not. - resource_owner_authenticator do - # raise "Please configure doorkeeper resource_owner_authenticator block located in #{__FILE__}" - # Put your resource owner authentication logic here. - # Example implementation: - # User.find_by(id: session[:user_id]) || redirect_to(new_user_session_url) - - current_user || warden.authenticate!(scope: :user) - end - - # If you didn't skip applications controller from Doorkeeper routes in your application routes.rb - # file then you need to declare this block in order to restrict access to the web interface for - # adding oauth authorized applications. In other case it will return 403 Forbidden response - # every time somebody will try to access the admin web interface. - # - admin_authenticator do - # Put your admin authentication logic here. - # Example implementation: - - if current_user - head :forbidden unless current_user.super_admin? - else - warden.authenticate!(scope: :user) - end - end - - # You can use your own model classes if you need to extend (or even override) default - # Doorkeeper models such as `Application`, `AccessToken` and `AccessGrant. - # - # Be default Doorkeeper ActiveRecord ORM uses it's own classes: - # - # access_token_class "Doorkeeper::AccessToken" - # access_grant_class "Doorkeeper::AccessGrant" - # application_class "Doorkeeper::Application" - # - # Don't forget to include Doorkeeper ORM mixins into your custom models: - # - # * ::Doorkeeper::Orm::ActiveRecord::Mixins::AccessToken - for access token - # * ::Doorkeeper::Orm::ActiveRecord::Mixins::AccessGrant - for access grant - # * ::Doorkeeper::Orm::ActiveRecord::Mixins::Application - for application (OAuth2 clients) - # - # For example: - # - # access_token_class "MyAccessToken" - # - # class MyAccessToken < ApplicationRecord - # include ::Doorkeeper::Orm::ActiveRecord::Mixins::AccessToken - # - # self.table_name = "hey_i_wanna_my_name" - # - # def destroy_me! - # destroy - # end - # end - - # Enables polymorphic Resource Owner association for Access Tokens and Access Grants. - # By default this option is disabled. - # - # Make sure you properly setup you database and have all the required columns (run - # `bundle exec rails generate doorkeeper:enable_polymorphic_resource_owner` and execute Rails - # migrations). - # - # If this option enabled, Doorkeeper will store not only Resource Owner primary key - # value, but also it's type (class name). See "Polymorphic Associations" section of - # Rails guides: https://guides.rubyonrails.org/association_basics.html#polymorphic-associations - # - # [NOTE] If you apply this option on already existing project don't forget to manually - # update `resource_owner_type` column in the database and fix migration template as it will - # set NOT NULL constraint for Access Grants table. - # - # use_polymorphic_resource_owner - - # If you are planning to use Doorkeeper in Rails 5 API-only application, then you might - # want to use API mode that will skip all the views management and change the way how - # Doorkeeper responds to a requests. - # - # api_only - - # Enforce token request content type to application/x-www-form-urlencoded. - # It is not enabled by default to not break prior versions of the gem. - # - # enforce_content_type - - # Authorization Code expiration time (default: 10 minutes). - # - # authorization_code_expires_in 10.minutes - - # Access token expiration time (default: 2 hours). - # If you want to disable expiration, set this to `nil`. - # - # access_token_expires_in 2.hours - - # Assign custom TTL for access tokens. Will be used instead of access_token_expires_in - # option if defined. In case the block returns `nil` value Doorkeeper fallbacks to - # +access_token_expires_in+ configuration option value. If you really need to issue a - # non-expiring access token (which is not recommended) then you need to return - # Float::INFINITY from this block. - # - # `context` has the following properties available: - # - # * `client` - the OAuth client application (see Doorkeeper::OAuth::Client) - # * `grant_type` - the grant type of the request (see Doorkeeper::OAuth) - # * `scopes` - the requested scopes (see Doorkeeper::OAuth::Scopes) - # * `resource_owner` - authorized resource owner instance (if present) - # - # custom_access_token_expires_in do |context| - # context.client.additional_settings.implicit_oauth_expiration - # end - - # Use a custom class for generating the access token. - # See https://doorkeeper.gitbook.io/guides/configuration/other-configurations#custom-access-token-generator - # - # access_token_generator '::Doorkeeper::JWT' - - # The controller +Doorkeeper::ApplicationController+ inherits from. - # Defaults to +ActionController::Base+ unless +api_only+ is set, which changes the default to - # +ActionController::API+. The return value of this option must be a stringified class name. - # See https://doorkeeper.gitbook.io/guides/configuration/other-configurations#custom-base-controller - # - base_controller "ApplicationController" - - # Reuse access token for the same resource owner within an application (disabled by default). - # - # This option protects your application from creating new tokens before old valid one becomes - # expired so your database doesn't bloat. Keep in mind that when this option is `on` Doorkeeper - # doesn't updates existing token expiration time, it will create a new token instead. - # Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383 - # - # You can not enable this option together with +hash_token_secrets+. - # - # reuse_access_token - - # In case you enabled `reuse_access_token` option Doorkeeper will try to find matching - # token using `matching_token_for` Access Token API that searches for valid records - # in batches in order not to pollute the memory with all the database records. By default - # Doorkeeper uses batch size of 10 000 records. You can increase or decrease this value - # depending on your needs and server capabilities. - # - # token_lookup_batch_size 10_000 - - # Set a limit for token_reuse if using reuse_access_token option - # - # This option limits token_reusability to some extent. - # If not set then access_token will be reused unless it expires. - # Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/1189 - # - # This option should be a percentage(i.e. (0,100]) - # - # token_reuse_limit 100 - - # Only allow one valid access token obtained via client credentials - # per client. If a new access token is obtained before the old one - # expired, the old one gets revoked (disabled by default) - # - # When enabling this option, make sure that you do not expect multiple processes - # using the same credentials at the same time (e.g. web servers spanning - # multiple machines and/or processes). - # - # revoke_previous_client_credentials_token - - # Hash access and refresh tokens before persisting them. - # This will disable the possibility to use +reuse_access_token+ - # since plain values can no longer be retrieved. - # - # Note: If you are already a user of doorkeeper and have existing tokens - # in your installation, they will be invalid without adding 'fallback: :plain'. - # - hash_token_secrets - # By default, token secrets will be hashed using the - # +Doorkeeper::Hashing::SHA256+ strategy. - # - # If you wish to use another hashing implementation, you can override - # this strategy as follows: - # - # hash_token_secrets using: '::Doorkeeper::Hashing::MyCustomHashImpl' - # - # Keep in mind that changing the hashing function will invalidate all existing - # secrets, if there are any. - - # Hash application secrets before persisting them. - # - # hash_application_secrets - # - # By default, applications will be hashed - # with the +Doorkeeper::SecretStoring::SHA256+ strategy. - # - # If you wish to use bcrypt for application secret hashing, uncomment - # this line instead: - # - # hash_application_secrets using: '::Doorkeeper::SecretStoring::BCrypt' - - # When the above option is enabled, and a hashed token or secret is not found, - # you can allow to fall back to another strategy. For users upgrading - # doorkeeper and wishing to enable hashing, you will probably want to enable - # the fallback to plain tokens. - # - # This will ensure that old access tokens and secrets - # will remain valid even if the hashing above is enabled. - # - # This can be done by adding 'fallback: plain', e.g. : - # - # hash_application_secrets using: '::Doorkeeper::SecretStoring::BCrypt', fallback: :plain - - # Issue access tokens with refresh token (disabled by default), you may also - # pass a block which accepts `context` to customize when to give a refresh - # token or not. Similar to +custom_access_token_expires_in+, `context` has - # the following properties: - # - # `client` - the OAuth client application (see Doorkeeper::OAuth::Client) - # `grant_type` - the grant type of the request (see Doorkeeper::OAuth) - # `scopes` - the requested scopes (see Doorkeeper::OAuth::Scopes) - # - use_refresh_token - - # Provide support for an owner to be assigned to each registered application (disabled by default) - # Optional parameter confirmation: true (default: false) if you want to enforce ownership of - # a registered application - # NOTE: you must also run the rails g doorkeeper:application_owner generator - # to provide the necessary support - # - # enable_application_owner confirmation: false - - # Define access token scopes for your provider - # For more information go to - # https://doorkeeper.gitbook.io/guides/ruby-on-rails/scopes - # - default_scopes :public, :read_articles - optional_scopes :write_articles - - # Allows to restrict only certain scopes for grant_type. - # By default, all the scopes will be available for all the grant types. - # - # Keys to this hash should be the name of grant_type and - # values should be the array of scopes for that grant type. - # Note: scopes should be from configured_scopes (i.e. default or optional) - # - # scopes_by_grant_type password: [:write], client_credentials: [:update] - - # Forbids creating/updating applications with arbitrary scopes that are - # not in configuration, i.e. +default_scopes+ or +optional_scopes+. - # (disabled by default) - # - enforce_configured_scopes - - # Change the way client credentials are retrieved from the request object. - # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then - # falls back to the `:client_id` and `:client_secret` params from the `params` object. - # Check out https://github.com/doorkeeper-gem/doorkeeper/wiki/Changing-how-clients-are-authenticated - # for more information on customization - # - # client_credentials :from_basic, :from_params - - # Change the way access token is authenticated from the request object. - # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then - # falls back to the `:access_token` or `:bearer_token` params from the `params` object. - # Check out https://github.com/doorkeeper-gem/doorkeeper/wiki/Changing-how-clients-are-authenticated - # for more information on customization - # - # access_token_methods :from_bearer_authorization, :from_access_token_param, :from_bearer_param - - # Forces the usage of the HTTPS protocol in non-native redirect uris (enabled - # by default in non-development environments). OAuth2 delegates security in - # communication to the HTTPS protocol so it is wise to keep this enabled. - # - # Callable objects such as proc, lambda, block or any object that responds to - # #call can be used in order to allow conditional checks (to allow non-SSL - # redirects to localhost for example). - # - # force_ssl_in_redirect_uri !Rails.env.development? - # - # force_ssl_in_redirect_uri { |uri| uri.host != 'localhost' } - - # Specify what redirect URI's you want to block during Application creation. - # Any redirect URI is whitelisted by default. - # - # You can use this option in order to forbid URI's with 'javascript' scheme - # for example. - # - # forbid_redirect_uri { |uri| uri.scheme.to_s.downcase == 'javascript' } - - # Allows to set blank redirect URIs for Applications in case Doorkeeper configured - # to use URI-less OAuth grant flows like Client Credentials or Resource Owner - # Password Credentials. The option is on by default and checks configured grant - # types, but you **need** to manually drop `NOT NULL` constraint from `redirect_uri` - # column for `oauth_applications` database table. - # - # You can completely disable this feature with: - # - # allow_blank_redirect_uri false - # - # Or you can define your custom check: - # - # allow_blank_redirect_uri do |grant_flows, client| - # client.superapp? - # end - - # Specify how authorization errors should be handled. - # By default, doorkeeper renders json errors when access token - # is invalid, expired, revoked or has invalid scopes. - # - # If you want to render error response yourself (i.e. rescue exceptions), - # set +handle_auth_errors+ to `:raise` and rescue Doorkeeper::Errors::InvalidToken - # or following specific errors: - # - # Doorkeeper::Errors::TokenForbidden, Doorkeeper::Errors::TokenExpired, - # Doorkeeper::Errors::TokenRevoked, Doorkeeper::Errors::TokenUnknown - # - # handle_auth_errors :raise - - # Customize token introspection response. - # Allows to add your own fields to default one that are required by the OAuth spec - # for the introspection response. It could be `sub`, `aud` and so on. - # This configuration option can be a proc, lambda or any Ruby object responds - # to `.call` method and result of it's invocation must be a Hash. - # - # custom_introspection_response do |token, context| - # { - # "sub": "Z5O3upPC88QrAjx00dis", - # "aud": "https://protected.example.net/resource", - # "username": User.find(token.resource_owner_id).username - # } - # end - # - # or - # - # custom_introspection_response CustomIntrospectionResponder - - # Specify what grant flows are enabled in array of Strings. The valid - # strings and the flows they enable are: - # - # "authorization_code" => Authorization Code Grant Flow - # "implicit" => Implicit Grant Flow - # "password" => Resource Owner Password Credentials Grant Flow - # "client_credentials" => Client Credentials Grant Flow - # - # If not specified, Doorkeeper enables authorization_code and - # client_credentials. - # - # implicit and password grant flows have risks that you should understand - # before enabling: - # http://tools.ietf.org/html/rfc6819#section-4.4.2 - # http://tools.ietf.org/html/rfc6819#section-4.4.3 - # - # grant_flows %w[authorization_code client_credentials] - - # Allows to customize OAuth grant flows that +each+ application support. - # You can configure a custom block (or use a class respond to `#call`) that must - # return `true` in case Application instance supports requested OAuth grant flow - # during the authorization request to the server. This configuration +doesn't+ - # set flows per application, it only allows to check if application supports - # specific grant flow. - # - # For example you can add an additional database column to `oauth_applications` table, - # say `t.array :grant_flows, default: []`, and store allowed grant flows that can - # be used with this application there. Then when authorization requested Doorkeeper - # will call this block to check if specific Application (passed with client_id and/or - # client_secret) is allowed to perform the request for the specific grant type - # (authorization, password, client_credentials, etc). - # - # Example of the block: - # - # ->(flow, client) { client.grant_flows.include?(flow) } - # - # In case this option invocation result is `false`, Doorkeeper server returns - # :unauthorized_client error and stops the request. - # - # @param allow_grant_flow_for_client [Proc] Block or any object respond to #call - # @return [Boolean] `true` if allow or `false` if forbid the request - # - # allow_grant_flow_for_client do |grant_flow, client| - # # `grant_flows` is an Array column with grant - # # flows that application supports - # - # client.grant_flows.include?(grant_flow) - # end - - # If you need arbitrary Resource Owner-Client authorization you can enable this option - # and implement the check your need. Config option must respond to #call and return - # true in case resource owner authorized for the specific application or false in other - # cases. - # - # Be default all Resource Owners are authorized to any Client (application). - # - # authorize_resource_owner_for_client do |client, resource_owner| - # resource_owner.admin? || client.owners_whitelist.include?(resource_owner) - # end - - # Hook into the strategies' request & response life-cycle in case your - # application needs advanced customization or logging: - # - # before_successful_strategy_response do |request| - # puts "BEFORE HOOK FIRED! #{request}" - # end - # - # after_successful_strategy_response do |request, response| - # puts "AFTER HOOK FIRED! #{request}, #{response}" - # end - - # Hook into Authorization flow in order to implement Single Sign Out - # or add any other functionality. Inside the block you have an access - # to `controller` (authorizations controller instance) and `context` - # (Doorkeeper::OAuth::Hooks::Context instance) which provides pre auth - # or auth objects with issued token based on hook type (before or after). - # - # before_successful_authorization do |controller, context| - # Rails.logger.info(controller.request.params.inspect) - # - # Rails.logger.info(context.pre_auth.inspect) - # end - # - # after_successful_authorization do |controller, context| - # controller.session[:logout_urls] << - # Doorkeeper::Application - # .find_by(controller.request.params.slice(:redirect_uri)) - # .logout_uri - # - # Rails.logger.info(context.auth.inspect) - # Rails.logger.info(context.issued_token) - # end - - # Under some circumstances you might want to have applications auto-approved, - # so that the user skips the authorization step. - # For example if dealing with a trusted application. - # - # skip_authorization do |resource_owner, client| - # client.superapp? or resource_owner.admin? - # end - - # Configure custom constraints for the Token Introspection request. - # By default this configuration option allows to introspect a token by another - # token of the same application, OR to introspect the token that belongs to - # authorized client (from authenticated client) OR when token doesn't - # belong to any client (public token). Otherwise requester has no access to the - # introspection and it will return response as stated in the RFC. - # - # Block arguments: - # - # @param token [Doorkeeper::AccessToken] - # token to be introspected - # - # @param authorized_client [Doorkeeper::Application] - # authorized client (if request is authorized using Basic auth with - # Client Credentials for example) - # - # @param authorized_token [Doorkeeper::AccessToken] - # Bearer token used to authorize the request - # - # In case the block returns `nil` or `false` introspection responses with 401 status code - # when using authorized token to introspect, or you'll get 200 with { "active": false } body - # when using authorized client to introspect as stated in the - # RFC 7662 section 2.2. Introspection Response. - # - # Using with caution: - # Keep in mind that these three parameters pass to block can be nil as following case: - # `authorized_client` is nil if and only if `authorized_token` is present, and vice versa. - # `token` will be nil if and only if `authorized_token` is present. - # So remember to use `&` or check if it is present before calling method on - # them to make sure you doesn't get NoMethodError exception. - # - # You can define your custom check: - # - # allow_token_introspection do |token, authorized_client, authorized_token| - # if authorized_token - # # customize: require `introspection` scope - # authorized_token.application == token&.application || - # authorized_token.scopes.include?("introspection") - # elsif token.application - # # `protected_resource` is a new database boolean column, for example - # authorized_client == token.application || authorized_client.protected_resource? - # else - # # public token (when token.application is nil, token doesn't belong to any application) - # true - # end - # end - # - # Or you can completely disable any token introspection: - # - # allow_token_introspection false - # - # If you need to block the request at all, then configure your routes.rb or web-server - # like nginx to forbid the request. - - # WWW-Authenticate Realm (default: "Doorkeeper"). - # - # realm "Doorkeeper" -end - -Doorkeeper::AccessGrant.belongs_to :resource_owner, class_name: "User" -Doorkeeper::AccessToken.belongs_to :resource_owner, class_name: "User" -Doorkeeper::Application.has_many :webhook_endpoints, class_name: "Webhook::Endpoint", inverse_of: :oauth_application diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml deleted file mode 100644 index e45f7381b..000000000 --- a/config/locales/doorkeeper.en.yml +++ /dev/null @@ -1,140 +0,0 @@ ---- -en: - activerecord: - attributes: - doorkeeper/application: - name: Name - redirect_uri: Redirect URI - errors: - models: - doorkeeper/application: - attributes: - redirect_uri: - forbidden_uri: is forbidden by the server. - fragment_present: cannot contain a fragment. - invalid_uri: must be a valid URI. - relative_uri: must be an absolute URI. - secured_uri: must be an HTTPS/SSL URI. - unspecified_scheme: must specify a scheme. - scopes: - not_match_configured: doesn't match configured on the server. - doorkeeper: - applications: - buttons: - authorize: Authorize - cancel: Cancel - destroy: Destroy - edit: Edit - submit: Submit - confirmations: - destroy: Are you sure? - edit: - title: Edit application - form: - error: Whoops! Check your form for possible errors - help: - blank_redirect_uri: Leave it blank if you configured your provider to use Client Credentials, Resource Owner Password Credentials or any other grant type that doesn't require redirect URI. - confidential: Application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential. - redirect_uri: Use one line per URI - scopes: Separate scopes with spaces. Leave blank to use the default scopes. - index: - actions: Actions - callback_url: Callback URL - confidential: Confidential? - confidentiality: - 'no': 'No' - 'yes': 'Yes' - name: Name - new: New Application - title: Your applications - new: - title: New Application - show: - actions: Actions - application_id: UID - callback_urls: Callback urls - confidential: Confidential - not_defined: Not defined - scopes: Scopes - secret: Secret - secret_hashed: Secret hashed - title: 'Application: %{name}' - authorizations: - buttons: - authorize: Authorize - deny: Deny - error: - title: An error has occurred - form_post: - title: Submit this form - new: - able_to: This application will be able to - prompt: Authorize %{client_name} to use your account? - title: Authorization required - show: - title: Authorization code - authorized_applications: - buttons: - revoke: Revoke - confirmations: - revoke: Are you sure? - index: - application: Application - created_at: Created At - date_format: "%Y-%m-%d %H:%M:%S" - title: Your authorized applications - errors: - messages: - access_denied: The resource owner or authorization server denied the request. - admin_authenticator_not_configured: Access to admin panel is forbidden due to Doorkeeper.configure.admin_authenticator being unconfigured. - credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. - forbidden_token: - missing_scope: Access to this resource requires scope "%{oauth_scopes}". - invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. - invalid_code_challenge_method: The code challenge method must be plain or S256. - invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. - invalid_redirect_uri: The requested redirect uri is malformed or doesn't match client redirect URI. - invalid_request: - missing_param: 'Missing required parameter: %{value}.' - request_not_authorized: Request need to be authorized. Required parameter for authorizing request is missing or invalid. - unknown: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed. - invalid_scope: The requested scope is invalid, unknown, or malformed. - invalid_token: - expired: The access token expired - revoked: The access token was revoked - unknown: The access token is invalid - resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfigured. - revoke: - unauthorized: You are not authorized to revoke this token - server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request. - temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server. - unauthorized_client: The client is not authorized to perform this request using this method. - unsupported_grant_type: The authorization grant type is not supported by the authorization server. - unsupported_response_mode: The authorization server does not support this response mode. - unsupported_response_type: The authorization server does not support this response type. - flash: - applications: - create: - notice: Application created. - destroy: - notice: Application deleted. - update: - notice: Application updated. - authorized_applications: - destroy: - notice: Application revoked. - layouts: - admin: - nav: - applications: Applications - home: Home - oauth2_provider: OAuth2 Provider - title: Doorkeeper - application: - title: OAuth authorization required - pre_authorization: - status: Pre-authorization - scopes: - public: Access public profile data and published articles - read_articles: Access all articles including drafts - write_articles: Access to creating and updating articles diff --git a/config/routes.rb b/config/routes.rb index a329ae326..46cccd218 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,6 @@ # rubocop:disable Metrics/BlockLength Rails.application.routes.draw do - use_doorkeeper do - controllers tokens: "oauth/tokens" - end - # Devise does not support scoping omniauth callbacks under a dynamic segment # so this lives outside our i18n scope. devise_for :users, controllers: { diff --git a/spec/factories/doorkeeper_access_grants.rb b/spec/factories/doorkeeper_access_grants.rb deleted file mode 100644 index 02139d9cd..000000000 --- a/spec/factories/doorkeeper_access_grants.rb +++ /dev/null @@ -1,7 +0,0 @@ -FactoryBot.define do - factory :doorkeeper_access_grant, class: "Doorkeeper::AccessGrant" do - application - expires_in { 600 } - redirect_uri { "urn:ietf:wg:oauth:2.0:oob" } - end -end diff --git a/spec/factories/doorkeeper_access_tokens.rb b/spec/factories/doorkeeper_access_tokens.rb deleted file mode 100644 index 747e51ffd..000000000 --- a/spec/factories/doorkeeper_access_tokens.rb +++ /dev/null @@ -1,5 +0,0 @@ -FactoryBot.define do - factory :doorkeeper_access_token, class: "Doorkeeper::AccessToken" do - application - end -end diff --git a/spec/factories/doorkeeper_applications.rb b/spec/factories/doorkeeper_applications.rb deleted file mode 100644 index ccd7e5c6e..000000000 --- a/spec/factories/doorkeeper_applications.rb +++ /dev/null @@ -1,8 +0,0 @@ -FactoryBot.define do - factory :application, class: "Doorkeeper::Application" do - sequence(:name) { |n| "Project #{n}" } - sequence(:redirect_uri) { |n| "https://example#{n}.com" } - secret { SecureRandom.hex(8) } - uid { SecureRandom.hex(8) } - end -end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index c1e7253ce..a896719d1 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -44,8 +44,6 @@ RSpec.describe User, type: :model do it { is_expected.to have_one(:notification_setting).dependent(:delete) } it { is_expected.to have_one(:setting).dependent(:delete) } - it { is_expected.to have_many(:access_grants).class_name("Doorkeeper::AccessGrant").dependent(:delete_all) } - it { is_expected.to have_many(:access_tokens).class_name("Doorkeeper::AccessToken").dependent(:delete_all) } it { is_expected.to have_many(:ahoy_events).class_name("Ahoy::Event").dependent(:delete_all) } it { is_expected.to have_many(:ahoy_visits).class_name("Ahoy::Visit").dependent(:delete_all) } it { is_expected.to have_many(:api_secrets).dependent(:delete_all) } @@ -90,20 +88,6 @@ RSpec.describe User, type: :model do it { is_expected.to have_many(:webhook_endpoints).class_name("Webhook::Endpoint").dependent(:delete_all) } # rubocop:disable RSpec/NamedSubject - it do - expect(subject).to have_many(:access_grants) - .class_name("Doorkeeper::AccessGrant") - .with_foreign_key("resource_owner_id") - .dependent(:delete_all) - end - - it do - expect(subject).to have_many(:access_tokens) - .class_name("Doorkeeper::AccessToken") - .with_foreign_key("resource_owner_id") - .dependent(:delete_all) - end - it do expect(subject).to have_many(:affected_feedback_messages) .class_name("FeedbackMessage") diff --git a/spec/models/webhook/endpoint_spec.rb b/spec/models/webhook/endpoint_spec.rb index 5f7946071..5570e662e 100644 --- a/spec/models/webhook/endpoint_spec.rb +++ b/spec/models/webhook/endpoint_spec.rb @@ -10,7 +10,6 @@ RSpec.describe Webhook::Endpoint, type: :model do describe "validations" do it { is_expected.to belong_to(:user).inverse_of(:webhook_endpoints) } - it { is_expected.to belong_to(:oauth_application).inverse_of(:webhook_endpoints).optional } it { is_expected.to validate_presence_of(:events) } it { is_expected.to validate_presence_of(:source) } diff --git a/spec/requests/oauth/tokens_spec.rb b/spec/requests/oauth/tokens_spec.rb deleted file mode 100644 index 539512b17..000000000 --- a/spec/requests/oauth/tokens_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -require "rails_helper" - -RSpec.describe "Oauth::Tokens", type: :request do - let(:oauth_app) { create(:application) } - let(:user) { create(:user) } - let(:oauth_client) { Doorkeeper::OAuth::Client.new(oauth_app) } - let(:access_token) { create(:doorkeeper_access_token, application: oauth_app, resource_owner: user) } - let!(:user_webhook) { create(:webhook_endpoint, user: user, oauth_application: oauth_app) } - let!(:user_webhook2) { create(:webhook_endpoint, user: user, oauth_application: oauth_app) } - - context "when authorization succeeds" do - # rubocop:disable RSpec/AnyInstance - before do - allow_any_instance_of(Doorkeeper::Server).to receive(:client) { oauth_client } - end - # rubocop:enable RSpec/AnyInstance - - it "destroys webhooks" do - user2_webhook = create(:webhook_endpoint, oauth_application: oauth_app) - another_app_webhook = create(:webhook_endpoint) - - sidekiq_perform_enqueued_jobs do - post oauth_revoke_path, params: { token: access_token.token } - end - expect(Webhook::Endpoint.find_by(id: user_webhook.id)).to be_nil - expect(Webhook::Endpoint.find_by(id: user_webhook2.id)).to be_nil - expect(user2_webhook.reload).to be_persisted - expect(another_app_webhook.reload).to be_persisted - end - - it "returns 200" do - post oauth_revoke_path, params: { token: access_token.token } - - expect(response.status).to eq 200 - end - - it "revokes the access token" do - post oauth_revoke_path, params: { token: access_token.token } - - expect(access_token.reload).to have_attributes(revoked?: true) - end - end - - context "when authorization fails" do - let(:some_other_client) { create(:application, confidential: true) } - let(:oauth_client) { Doorkeeper::OAuth::Client.new(some_other_client) } - - it "returns 403" do - post oauth_revoke_path, params: { token: access_token.token } - - expect(response.status).to eq 403 - end - - it "does not revoke the access token" do - post oauth_revoke_path, params: { token: access_token.token } - - expect(access_token.reload).to have_attributes(revoked?: false) - end - - it "doesn't destroy webhooks" do - sidekiq_perform_enqueued_jobs do - post oauth_revoke_path, params: { token: access_token.token } - end - expect(user_webhook.reload).to be_persisted - expect(user_webhook2.reload).to be_persisted - end - end -end diff --git a/spec/support/initializers/doorkeeper.rb b/spec/support/initializers/doorkeeper.rb deleted file mode 100644 index 34f31f2fe..000000000 --- a/spec/support/initializers/doorkeeper.rb +++ /dev/null @@ -1,4 +0,0 @@ -Doorkeeper.configure do - # hash_token_secrets on its own won't work in test - hash_token_secrets fallback: :plain -end diff --git a/spec/workers/webhook/destroy_worker_spec.rb b/spec/workers/webhook/destroy_worker_spec.rb index 4cc824f67..42f1d3027 100644 --- a/spec/workers/webhook/destroy_worker_spec.rb +++ b/spec/workers/webhook/destroy_worker_spec.rb @@ -2,14 +2,13 @@ require "rails_helper" RSpec.describe Webhook::DestroyWorker, type: :worker do let(:user) { create(:user) } - let(:oauth_app) { create(:application) } - let!(:webhook_endpoint) { create(:webhook_endpoint, user: user, oauth_application: oauth_app) } - let!(:other_webhook_endpoint) { create(:webhook_endpoint, oauth_application: oauth_app) } + let!(:webhook_endpoint) { create(:webhook_endpoint, user: user) } + let!(:other_webhook_endpoint) { create(:webhook_endpoint) } let(:worker) { subject } describe "#perform_now" do - it "destroys webhook by user_id and app_id" do - worker.perform(user.id, oauth_app.id) + xit "destroys webhook by user_id and app_id" do + worker.perform(user.id) expect(Webhook::Endpoint.find_by(id: webhook_endpoint.id)).to be_nil expect(other_webhook_endpoint.reload).to be_present end diff --git a/vendor/cache/doorkeeper-5.5.4.gem b/vendor/cache/doorkeeper-5.5.4.gem deleted file mode 100644 index fd1c2214c1c82c05b323303e112dc1a7a378a7d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101888 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 ZIq?6Z8T@Z>|E+=l*1&&j;QyNj{s;O`iG2V7