Skip to content

Commit 8d551a1

Browse files
authored
Improve Hostname Validation (#32)
1 parent 5e1293b commit 8d551a1

3 files changed

Lines changed: 58 additions & 4 deletions

File tree

‎lib/mini_defender/rules/hostname.rb‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
# frozen_string_literal: true
22

33
class MiniDefender::Rules::Hostname < MiniDefender::Rule
4-
HOSTNAME_REGEX = /\A[a-zA-Z0-9][a-zA-Z0-9\-]{1,63}(\.[a-zA-Z0-9][a-zA-Z0-9\-]{1,63})+\.?\z/
4+
HOSTNAME_REGEX = /\A([a-zA-Z0-9][a-zA-Z0-9\-]{,62})(\.[a-zA-Z0-9][a-zA-Z0-9\-]{0,62})+\.?\z/
55

66
def self.signature
77
'hostname'
88
end
99

1010
def coerce(value)
11-
value.to_s.downcase.strip
11+
value.to_s
12+
.downcase
13+
.strip
14+
.gsub(/.\z/, '')
1215
end
1316

1417
def passes?(attribute, value, validator)
1518
value = value.to_s.downcase.strip
16-
return false if value.length > 255
19+
if value.length > 255
20+
return false
21+
end
1722

1823
value.match?(HOSTNAME_REGEX)
1924
end

‎lib/mini_defender/version.rb‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module MiniDefender
4-
VERSION = "0.7.1"
4+
VERSION = "0.7.2"
55
end

‎test/rules/hostname_test.rb‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# frozen_string_literal: true
2+
3+
require 'test_helper'
4+
5+
class PasswordTest < Minitest::Test
6+
def setup
7+
@rule = MiniDefender::Rules::Hostname.new
8+
end
9+
10+
def test_valid_hostname
11+
assert(@rule.passes?('hostname', 'www.example.com', nil))
12+
end
13+
14+
def test_pass_for_trailing_dot
15+
assert(@rule.passes?('hostname', 'www.example.com.', nil))
16+
end
17+
18+
def test_must_remove_trailing_dot
19+
assert(@rule.coerce('www.example.com'))
20+
end
21+
22+
def test_fail_for_non_ascii
23+
refute(@rule.passes?('hostname', 'www.مثال.com', nil))
24+
end
25+
26+
def test_allow_long_label
27+
label = '1' * 63
28+
assert(@rule.passes?('hostname', "#{label}.example.com", nil))
29+
end
30+
31+
def test_allow_long_hostname
32+
label = '1' * 63
33+
assert(@rule.passes?('hostname', "#{label}.#{label}.#{label}.example.com", nil))
34+
end
35+
36+
def single_char_subdomain_hostname
37+
assert(@rule.passes?('hostname', 'w.example.com', nil))
38+
end
39+
40+
def test_must_fail_for_64_plus_label
41+
label = '1' * 64
42+
refute(@rule.passes?('hostname', "#{label}.example.com", nil))
43+
end
44+
45+
def test_must_fail_for_254_plus_domain
46+
label = '1' * 63
47+
refute(@rule.passes?('hostname', "#{label}.#{label}.#{label}.#{label}.#{label}.example.com", nil))
48+
end
49+
end

0 commit comments

Comments
 (0)