Skip to content

Commit 8f79f73

Browse files
authored
Merge pull request #1293 from jasl/refactor-loading-validator
move AR specific redirect uri validator to AR ORM directory
2 parents 5277f4a + 5ee0f5b commit 8f79f73

File tree

6 files changed

+66
-64
lines changed

6 files changed

+66
-64
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ User-visible changes worth mentioning.
77

88
## master
99

10+
- [#1293] Move ar specific redirect uri validator to ar orm directory.
1011
- [#1288] Allow to pass attributes to the `Doorkeeper::OAuth::PreAuthorization#as_json` method to customize
1112
the PreAuthorization response.
1213
- [#1286] Add ability to customize grant flows per application (OAuth client) (#1245 , #1207)

app/validators/redirect_uri_validator.rb

Lines changed: 0 additions & 60 deletions
This file was deleted.

lib/doorkeeper/orm/active_record.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
require "active_support/lazy_load_hooks"
44

5-
require "doorkeeper/orm/active_record/stale_records_cleaner"
6-
75
module Doorkeeper
86
module Orm
97
# ActiveRecord ORM for Doorkeeper entity models.
@@ -17,6 +15,8 @@ module Orm
1715
module ActiveRecord
1816
def self.initialize_models!
1917
lazy_load do
18+
require "doorkeeper/orm/active_record/stale_records_cleaner"
19+
require "doorkeeper/orm/active_record/redirect_uri_validator"
2020
require "doorkeeper/orm/active_record/access_grant"
2121
require "doorkeeper/orm/active_record/access_token"
2222
require "doorkeeper/orm/active_record/application"

lib/doorkeeper/orm/active_record/application.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Application < ActiveRecord::Base
1111

1212
validates :name, :secret, :uid, presence: true
1313
validates :uid, uniqueness: { case_sensitive: true }
14-
validates :redirect_uri, redirect_uri: true
14+
validates :redirect_uri, "doorkeeper/redirect_uri": true
1515
validates :confidential, inclusion: { in: [true, false] }
1616

1717
validate :scopes_match_configured, if: :enforce_scopes?
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# frozen_string_literal: true
2+
3+
require "uri"
4+
5+
module Doorkeeper
6+
# ActiveModel validator for redirect URI validation in according
7+
# to OAuth standards and Doorkeeper configuration.
8+
class RedirectUriValidator < ActiveModel::EachValidator
9+
def validate_each(record, attribute, value)
10+
if value.blank?
11+
return if Doorkeeper.configuration.allow_blank_redirect_uri?(record)
12+
13+
record.errors.add(attribute, :blank)
14+
else
15+
value.split.each do |val|
16+
next if oob_redirect_uri?(val)
17+
18+
uri = ::URI.parse(val)
19+
record.errors.add(attribute, :forbidden_uri) if forbidden_uri?(uri)
20+
record.errors.add(attribute, :fragment_present) unless uri.fragment.nil?
21+
record.errors.add(attribute, :unspecified_scheme) if unspecified_scheme?(uri)
22+
record.errors.add(attribute, :relative_uri) if relative_uri?(uri)
23+
record.errors.add(attribute, :secured_uri) if invalid_ssl_uri?(uri)
24+
end
25+
end
26+
rescue URI::InvalidURIError
27+
record.errors.add(attribute, :invalid_uri)
28+
end
29+
30+
private
31+
32+
def oob_redirect_uri?(uri)
33+
Doorkeeper::OAuth::NonStandard::IETF_WG_OAUTH2_OOB_METHODS.include?(uri)
34+
end
35+
36+
def forbidden_uri?(uri)
37+
Doorkeeper.configuration.forbid_redirect_uri.call(uri)
38+
end
39+
40+
def unspecified_scheme?(uri)
41+
return true if uri.opaque.present?
42+
43+
%w[localhost].include?(uri.try(:scheme))
44+
end
45+
46+
def relative_uri?(uri)
47+
uri.scheme.nil? && uri.host.nil?
48+
end
49+
50+
def invalid_ssl_uri?(uri)
51+
forces_ssl = Doorkeeper.configuration.force_ssl_in_redirect_uri
52+
non_https = uri.try(:scheme) == "http"
53+
54+
if forces_ssl.respond_to?(:call)
55+
forces_ssl.call(uri) && non_https
56+
else
57+
forces_ssl && non_https
58+
end
59+
end
60+
end
61+
end

spec/validators/redirect_uri_validator_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
require "spec_helper"
44

5-
describe RedirectUriValidator do
5+
describe Doorkeeper::RedirectUriValidator do
66
subject do
77
FactoryBot.create(:application)
88
end

0 commit comments

Comments
 (0)