File: error.rb

package info (click to toggle)
ruby-rack-oauth2 2.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 560 kB
  • sloc: ruby: 4,013; makefile: 4
file content (95 lines) | stat: -rw-r--r-- 3,277 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
module Rack
  module OAuth2
    module Server
      class Authorize
        module ErrorHandler
          def self.included(klass)
            klass.send :attr_accessor, :redirect_uri, :state, :protocol_params_location
          end

          def protocol_params
            super.merge(state: state)
          end

          def redirect?
            redirect_uri.present? &&
            protocol_params_location.present?
          end

          def finish
            if redirect?
              super do |response|
                response.redirect Util.redirect_uri(redirect_uri, protocol_params_location, protocol_params)
              end
            else
              raise self
            end
          end
        end

        class BadRequest < Abstract::BadRequest
          include ErrorHandler
        end

        class ServerError < Abstract::ServerError
          include ErrorHandler
        end

        class TemporarilyUnavailable < Abstract::TemporarilyUnavailable
          include ErrorHandler
        end

        module ErrorMethods
          DEFAULT_DESCRIPTION = {
            invalid_request: "The request is missing a required parameter, includes an unsupported parameter or parameter value, or is otherwise malformed.",
            unauthorized_client: "The client is not authorized to use the requested response type.",
            access_denied: "The end-user or authorization server denied the request.",
            unsupported_response_type: "The requested response type is not supported by the authorization server.",
            invalid_scope: "The requested scope is invalid, unknown, or malformed.",
            server_error: "Internal Server Error",
            temporarily_unavailable: "Service Unavailable"
          }

          def self.included(klass)
            DEFAULT_DESCRIPTION.each do |error, default_description|
              case error
              when :server_error, :temporarily_unavailable
                # NOTE: defined below
              else
                klass.class_eval <<-ERROR
                  def #{error}!(description = "#{default_description}", options = {})
                    bad_request! :#{error}, description, options
                  end
                ERROR
              end
            end
          end

          def bad_request!(error = :bad_request, description = nil, options = {})
            error! BadRequest, error, description, options
          end

          def server_error!(description = DEFAULT_DESCRIPTION[:server_error], options = {})
            error! ServerError, :server_error, description, options
          end

          def temporarily_unavailable!(description = DEFAULT_DESCRIPTION[:temporarily_unavailable], options = {})
            error! TemporarilyUnavailable, :temporarily_unavailable, description, options
          end

          private

          def error!(klass, error, description, options)
            exception = klass.new error, description, options
            exception.protocol_params_location = error_params_location
            exception.state = state
            exception.redirect_uri = verified_redirect_uri
            raise exception
          end
        end

        Request.send :include, ErrorMethods
      end
    end
  end
end