mirror of
https://github.com/discourse/discourse.git
synced 2025-04-30 16:14:48 +08:00
allow regex options on username site settings
This commit is contained in:
parent
c29334cf23
commit
ddbd1d5ab8
17
lib/validators/regex_setting_validation.rb
Normal file
17
lib/validators/regex_setting_validation.rb
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
module RegexSettingValidation
|
||||||
|
|
||||||
|
def initialize_regex_opts(opts = {})
|
||||||
|
@regex = Regexp.new(opts[:regex]) if opts[:regex]
|
||||||
|
@regex_error = opts[:regex_error] || 'site_settings.errors.regex_mismatch'
|
||||||
|
end
|
||||||
|
|
||||||
|
def regex_match?(val)
|
||||||
|
if @regex && !(val =~ @regex)
|
||||||
|
@regex_fail = true
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -1,8 +1,10 @@
|
|||||||
class StringSettingValidator
|
class StringSettingValidator
|
||||||
|
|
||||||
|
include RegexSettingValidation
|
||||||
|
|
||||||
def initialize(opts = {})
|
def initialize(opts = {})
|
||||||
@opts = opts
|
@opts = opts
|
||||||
@regex = Regexp.new(opts[:regex]) if opts[:regex]
|
initialize_regex_opts(opts)
|
||||||
@regex_error = opts[:regex_error] || 'site_settings.errors.regex_mismatch'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def valid_value?(val)
|
def valid_value?(val)
|
||||||
@ -13,12 +15,7 @@ class StringSettingValidator
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
if @regex && !(val =~ @regex)
|
regex_match?(val)
|
||||||
@regex_fail = true
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def error_message
|
def error_message
|
||||||
|
@ -1,13 +1,21 @@
|
|||||||
class UsernameSettingValidator
|
class UsernameSettingValidator
|
||||||
|
|
||||||
|
include RegexSettingValidation
|
||||||
|
|
||||||
def initialize(opts = {})
|
def initialize(opts = {})
|
||||||
@opts = opts
|
@opts = opts
|
||||||
|
initialize_regex_opts(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def valid_value?(val)
|
def valid_value?(val)
|
||||||
!val.present? || User.where(username: val).exists?
|
!val.present? || (User.where(username: val).exists? && regex_match?(val))
|
||||||
end
|
end
|
||||||
|
|
||||||
def error_message
|
def error_message
|
||||||
|
if @regex_fail
|
||||||
|
I18n.t(@regex_error)
|
||||||
|
else
|
||||||
I18n.t('site_settings.errors.invalid_username')
|
I18n.t('site_settings.errors.invalid_username')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
@ -17,5 +17,26 @@ describe UsernameSettingValidator do
|
|||||||
it "returns false if value does not match a user's username" do
|
it "returns false if value does not match a user's username" do
|
||||||
expect(validator.valid_value?('no way')).to eq(false)
|
expect(validator.valid_value?('no way')).to eq(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "regex support" do
|
||||||
|
let!(:darthvader) { Fabricate(:user, username: 'darthvader') }
|
||||||
|
let!(:luke) { Fabricate(:user, username: 'luke') }
|
||||||
|
|
||||||
|
it "returns false if regex doesn't match" do
|
||||||
|
v = described_class.new(regex: 'darth')
|
||||||
|
expect(v.valid_value?('luke')).to eq(false)
|
||||||
|
expect(v.valid_value?('vader')).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true if regex matches" do
|
||||||
|
v = described_class.new(regex: 'darth')
|
||||||
|
expect(v.valid_value?('darthvader')).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false if regex matches but username doesn't match a user" do
|
||||||
|
v = described_class.new(regex: 'darth')
|
||||||
|
expect(v.valid_value?('darthmaul')).to eq(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user