From 33c7afa2916a0944436b72867aaaa5b2d0fc9173 Mon Sep 17 00:00:00 2001 From: Nikita Bulai Date: Mon, 12 Feb 2024 11:31:20 +0300 Subject: [PATCH] Make new errors backward compatible Fixes #1685 --- CHANGELOG.md | 1 + lib/doorkeeper/oauth/error_response.rb | 16 ++++++++++++++-- spec/lib/oauth/error_response_spec.rb | 7 +++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe6cbd949..85697b57c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ User-visible changes worth mentioning. ## main - [#PR ID] Add your changelog here. +- [#1691] Make new Doorkeeper errors backward compatible with older extensions. ## 5.6.8 diff --git a/lib/doorkeeper/oauth/error_response.rb b/lib/doorkeeper/oauth/error_response.rb index 8301b8fc3..27463061c 100644 --- a/lib/doorkeeper/oauth/error_response.rb +++ b/lib/doorkeeper/oauth/error_response.rb @@ -10,14 +10,26 @@ class ErrorResponse < BaseResponse def self.from_request(request, attributes = {}) new( attributes.merge( - name: request.error&.name_for_response, - exception_class: request.error, + name: error_name_for(request.error), + exception_class: exception_class_for(request.error), state: request.try(:state), redirect_uri: request.try(:redirect_uri), ), ) end + def self.error_name_for(error) + error.respond_to?(:name_for_response) ? error.name_for_response : error + end + + def self.exception_class_for(error) + return error if error.respond_to?(:name_for_response) + + "Doorkeeper::Errors::#{error.to_s.classify}".safe_constantize + end + + private_class_method :error_name_for, :exception_class_for + delegate :name, :description, :state, to: :@error def initialize(attributes = {}) diff --git a/spec/lib/oauth/error_response_spec.rb b/spec/lib/oauth/error_response_spec.rb index 9bb3acc41..0f7a5f374 100644 --- a/spec/lib/oauth/error_response_spec.rb +++ b/spec/lib/oauth/error_response_spec.rb @@ -36,6 +36,13 @@ error = described_class.from_request double(error: Doorkeeper::Errors::InvalidClient, state: :hello) expect(error.state).to eq(:hello) end + + it "supports old extensions" do + error = described_class.from_request double(error: :invalid_client) + expect(error.name).to eq(:invalid_client) + + expect { error.raise_exception! }.to raise_error(Doorkeeper::Errors::InvalidClient) + end end it "ignores empty error values" do