validates_hostname 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f22a46962c7ec3fce9de05c3382e9ec5ad8f2a21
4
- data.tar.gz: 4e8e292b92f385c00148a1d742ccef1fb39b569c
3
+ metadata.gz: 95afd4c7854435996ba31b490d2fe4472460c6e0
4
+ data.tar.gz: a3ab78cc20012156408c984225c274556772f8c8
5
5
  SHA512:
6
- metadata.gz: 6935ccc2c596c927ec26d302635612830c5eef05d61a01dbe863561a9cb9b479118a71b6e1d64e4593066ac487a0efd95bae0024fffcad7e6421d245e8db4ab3
7
- data.tar.gz: 52a4ac6e1c8cdf17d04b08218642f31a6f3d8e411f38dd086dc28b17b69aa078a5b381f3af91b53fc22fb55b724d8e2f82066a5584b1bd16b31358282b2d99e5
6
+ metadata.gz: 01762b519ad24527b5a39f9a956693dd7b3f4e45ddec56323ec10349e2d34601d7c8031a612d9812b8ae22938d28cf37ea8cc3bec64f71bef178a70f449608e0
7
+ data.tar.gz: 94d45c227dede08a555069d661644252b2553c48559d52ff25331332b64537183348fe699ee9202522150e2be10fd38b66be96a4a79f9737c0b4ccec215f2f50
data/CHANGELOG.rdoc CHANGED
File without changes
data/MIT-LICENSE CHANGED
File without changes
data/Rakefile CHANGED
File without changes
@@ -1,4 +1,5 @@
1
1
  require 'active_support/concern'
2
+ require 'active_record'
2
3
  require 'active_model'
3
4
 
4
5
  module PAK
@@ -6,45 +7,86 @@ module PAK
6
7
  autoload :VERSION, 'validates_hostname/version'
7
8
 
8
9
  # List from IANA: http://www.iana.org/domains/root/db/
10
+ # http://data.iana.org/TLD/tlds-alpha-by-domain.txt
9
11
  ALLOWED_TLDS = %w(
10
- ac ad ae aero af ag ai al am an ao aq ar arpa as asia at au aw ax az
11
- ba bb bd be bf bg bh bi biz bj bl bm bn bo br bs bt bv bw by bz
12
- ca cat cc cd cf cg ch ci ck cl cm cn co com coop cr cu cv cx cy cz
13
- de dj dk dm do dz
14
- ec edu ee eg eh er es et eu
15
- fi fj fk fm fo fr
16
- ga gb gd ge gf gg gh gi gl gm gn gov gp gq gr gs gt gu gw gy
17
- hk hm hn hr ht hu
18
- id ie il im in info int io iq ir is it
19
- je jm jo jobs jp
20
- ke kg kh ki km kn kp kr kw ky kz
21
- la lb lc li lk lr ls lt lu lv ly
22
- ma mc md me mf mg mh mil mk ml mm mn mo mobi mp mq mr ms mt mu museum
23
- mv mw mx my mz
24
- na name nc ne net nf ng ni nl no np nr nu nz
25
- om org
26
- pa pe pf pg ph pk pl pm pn pr pro ps pt pw py
27
- qa
28
- re ro rs ru rw
29
- sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sv sy sz
30
- tc td tel tf tg th tj tk tl tm tn to tp tr travel tt tv tw tz
31
- ua ug uk um us uy uz
32
- va vc ve vg vi vn vu
33
- wf ws
34
- ye yt yu
35
- za zm zw
12
+ . abogado ac academy accountants active actor ad adult ae aero af ag agency ai
13
+ airforce al allfinanz alsace am amsterdam an android ao aq aquarelle ar archi
14
+ army arpa as asia associates at attorney au auction audio autos aw ax axa az ba
15
+ band bank bar bargains bayern bb bd be beer berlin best bf bg bh bi bid bike
16
+ bio biz bj black blackfriday bloomberg blue bm bmw bn bnpparibas bo boo
17
+ boutique br brussels bs bt budapest build builders business buzz bv bw by bz
18
+ bzh ca cab cal camera camp cancerresearch capetown capital caravan cards care
19
+ career careers cartier casa cash cat catering cc cd center ceo cern cf cg ch
20
+ channel cheap christmas chrome church ci citic city ck cl claims cleaning click
21
+ clinic clothing club cm cn co coach codes coffee college cologne com community
22
+ company computer condos construction consulting contractors cooking cool coop
23
+ country cr credit creditcard cricket crs cruises cu cuisinella cv cw cx cy
24
+ cymru cz dad dance dating day de deals degree delivery democrat dental dentist
25
+ desi dev diamonds diet digital direct directory discount dj dk dm dnp do docs
26
+ domains doosan durban dvag dz eat ec edu education ee eg email emerck energy
27
+ engineer engineering enterprises equipment er es esq estate et eu eurovision
28
+ eus events everbank exchange expert exposed fail farm fashion feedback fi
29
+ finance financial firmdale fish fishing fit fitness fj fk flights florist
30
+ flowers flsmidth fly fm fo foo forsale foundation fr frl frogans fund furniture
31
+ futbol ga gal gallery garden gb gbiz gd ge gent gf gg ggee gh gi gift gifts
32
+ gives gl glass gle global globo gm gmail gmo gmx gn google gop gov gp gq gr
33
+ graphics gratis green gripe gs gt gu guide guitars guru gw gy hamburg haus
34
+ healthcare help here hiphop hiv hk hm hn holdings holiday homes horse host
35
+ hosting house how hr ht hu ibm id ie il im immo immobilien in industries info
36
+ ing ink institute insure int international investments io iq ir irish is it iwc
37
+ je jetzt jm jo jobs joburg jp juegos kaufen kddi ke kg kh ki kim kitchen kiwi
38
+ km kn koeln kp kr krd kred kw ky kz la lacaixa land lat latrobe lawyer lb lc
39
+ lds lease legal lgbt li lidl life lighting limited limo link lk loans london
40
+ lotto lr ls lt ltda lu luxe luxury lv ly ma madrid maison management mango
41
+ market marketing mc md me media meet melbourne meme memorial menu mg mh miami
42
+ mil mini mk ml mm mn mo mobi moda moe monash money mormon mortgage moscow
43
+ motorcycles mov mp mq mr ms mt mu museum mv mw mx my mz na nagoya name navy nc
44
+ ne net network neustar new nexus nf ng ngo nhk ni ninja nl no np nr nra nrw nu
45
+ nyc nz okinawa om ong onl ooo org organic osaka otsuka ovh pa paris partners
46
+ parts party pe pf pg ph pharmacy photo photography photos physio pics pictures
47
+ pink pizza pk pl place plumbing pm pn pohl poker porn post pr praxi press pro
48
+ prod productions prof properties property ps pt pub pw py qa qpon quebec re
49
+ realtor recipes red rehab reise reisen reit ren rentals repair report
50
+ republican rest restaurant reviews rich rio rip ro rocks rodeo rs rsvp ru ruhr
51
+ rw ryukyu sa saarland sale samsung sarl sb sc sca scb schmidt schule schwarz
52
+ science scot sd se services sew sexy sg sh shiksha shoes shriram si singles sj
53
+ sk sky sl sm sn so social software sohu solar solutions soy space spiegel sr st
54
+ su supplies supply support surf surgery suzuki sv sx sy sydney systems sz
55
+ taipei tatar tattoo tax tc td technology tel tf tg th tienda tips tires tirol
56
+ tj tk tl tm tn to today tokyo tools top town toys tp tr trade training travel
57
+ trust tt tui tv tw tz ua ug uk university uno uol us uy uz va vacations vc ve
58
+ vegas ventures versicherung vet vg vi viajes video villas vision vlaanderen vn
59
+ vodka vote voting voto voyage vu wales wang watch webcam website wed wedding wf
60
+ whoswho wien wiki williamhill wme work works world ws wtc wtf xn--1qqw23a
61
+ xn--3bst00m xn--3ds443g xn--3e0b707e xn--45brj9c xn--45q11c xn--4gbrim
62
+ xn--55qw42g xn--55qx5d xn--6frz82g xn--6qq986b3xl xn--80adxhks xn--80ao21a
63
+ xn--80asehdb xn--80aswg xn--90a3ac xn--c1avg xn--cg4bki xn--clchc0ea0b2g2a9gcd
64
+ xn--czr694b xn--czrs0t xn--czru2d xn--d1acj3b xn--d1alf xn--fiq228c5hs
65
+ xn--fiq64b xn--fiqs8s xn--fiqz9s xn--flw351e xn--fpcrj9c3d xn--fzc2c9e2c
66
+ xn--gecrj9c xn--h2brj9c xn--hxt814e xn--i1b6b1a6a2e xn--io0a7i xn--j1amh
67
+ xn--j6w193g xn--kprw13d xn--kpry57d xn--kput3i xn--l1acc xn--lgbbat1ad8j
68
+ xn--mgb9awbf xn--mgba3a4f16a xn--mgbaam7a8h xn--mgbab2bd xn--mgbayh7gpa
69
+ xn--mgbbh1a71e xn--mgbc0a9azcg xn--mgberp4a5d4ar xn--mgbx4cd0ab xn--ngbc5azd
70
+ xn--node xn--nqv7f xn--nqv7fs00ema xn--o3cw4h xn--ogbpf8fl xn--p1acf xn--p1ai
71
+ xn--pgbs0dh xn--q9jyb4c xn--qcka1pmc xn--rhqv96g xn--s9brj9c xn--ses554g
72
+ xn--unup4y xn--vermgensberater-ctb xn--vermgensberatung-pwb xn--vhquv
73
+ xn--wgbh1c xn--wgbl6a xn--xhq521b xn--xkc2al3hye2a xn--xkc2dl3a5ee0h
74
+ xn--yfro4i67o xn--ygbi2ammx xn--zfr164b xxx xyz yachts yandex ye yoga yokohama
75
+ youtube yt za zip zm zone zuerich zw
36
76
  )
37
-
77
+
38
78
  DEFAULT_ERROR_MSG = {
39
- :invalid_hostname_length => 'hostname must be between 1 and 255 characters long',
40
- :invalid_label_length => 'label must be between 1 and 63 characters long',
41
- :label_begins_or_ends_with_hyphen => 'label begins or ends with hyphen',
42
- :label_contains_invalid_characters => "label contains invalid characters (valid characters: [%{valid_chars}])",
79
+ :invalid_hostname_length => 'must be between 1 and 255 characters long',
80
+ :invalid_label_length => 'must be between 1 and 63 characters long',
81
+ :label_begins_or_ends_with_hyphen => 'begins or ends with hyphen',
82
+ :label_contains_invalid_characters => "contains invalid characters (valid characters: [%{valid_chars}])",
43
83
  :hostname_label_is_numeric => 'unqualified hostname part cannot consist of numeric values only',
44
- :hostname_is_not_fqdn => 'hostname is not a fully qualified domain name',
45
- :single_numeric_hostname_label => 'hostnames cannot consist of a single numeric label'
84
+ :hostname_is_not_fqdn => 'is not a fully qualified domain name',
85
+ :single_numeric_hostname_label => 'cannot consist of a single numeric label',
86
+ :hostname_contains_consecutive_dots => 'must not contain consecutive dots',
87
+ :hostname_ends_with_dot => 'must not end with a dot'
46
88
  }.freeze
47
-
89
+
48
90
  class HostnameValidator < ActiveModel::EachValidator
49
91
  def initialize(options)
50
92
  opts = {
@@ -52,16 +94,18 @@ module PAK
52
94
  :require_valid_tld => false,
53
95
  :valid_tlds => ALLOWED_TLDS,
54
96
  :allow_numeric_hostname => false,
55
- :allow_wildcard_hostname => false
97
+ :allow_wildcard_hostname => false,
98
+ :allow_root_label => false
56
99
  }.merge(options)
57
100
  super(opts)
58
101
  end
59
-
102
+
60
103
  def validate_each(record, attribute, value)
61
104
  value ||= ''
105
+
62
106
  # maximum hostname length: 255 characters
63
107
  add_error(record, attribute, :invalid_hostname_length) unless value.length.between?(1, 255)
64
-
108
+
65
109
  # split each hostname into labels and do various checks
66
110
  if value.is_a?(String)
67
111
  labels = value.split '.'
@@ -84,7 +128,7 @@ module PAK
84
128
 
85
129
  # CHECK 4: the unqualified hostname portion cannot consist of
86
130
  # numeric values only
87
- if options[:allow_numeric_hostname] == false
131
+ if options[:allow_numeric_hostname] == false and labels.length > 0
88
132
  is_numeric_only = (
89
133
  (
90
134
  Integer(labels[0]) rescue false
@@ -96,14 +140,28 @@ module PAK
96
140
  # CHECK 5: in order to be fully qualified, the full hostname's
97
141
  # TLD must be valid
98
142
  if options[:require_valid_tld] == true
143
+ my_tld = value == '.' ? value : labels.last
144
+ my_tld ||= ''
99
145
  has_tld = options[:valid_tlds].select {
100
- |tld| tld =~ /^#{Regexp.escape(labels.last || '')}$/i
146
+ |tld| tld =~ /^#{Regexp.escape(my_tld)}$/i
101
147
  }.empty? ? false : true
102
148
  add_error(record, attribute, :hostname_is_not_fqdn) unless has_tld
103
149
  end
150
+
151
+ # CHECK 6: hostname may not contain consecutive dots
152
+ if value =~ /\.\./
153
+ add_error(record, attribute, :hostname_contains_consecutive_dots)
154
+ end
155
+
156
+ # CHECK 7: do not allow trailing dot unless option is set
157
+ if options[:allow_root_label] == false
158
+ if value =~ /\.$/
159
+ add_error(record, attribute, :hostname_ends_with_dot)
160
+ end
161
+ end
104
162
  end
105
163
  end
106
-
164
+
107
165
  def add_error(record, attr_name, message, *interpolators)
108
166
  args = {
109
167
  :default => [DEFAULT_ERROR_MSG[message], options[:message]],
@@ -121,10 +179,10 @@ module PAK
121
179
  }.merge(options)
122
180
  super(opts)
123
181
  end
124
-
182
+
125
183
  def validate_each(record, attribute, value)
126
184
  super
127
-
185
+
128
186
  if value.is_a?(String)
129
187
  labels = value.split '.'
130
188
  labels.each do |label|
@@ -143,7 +201,7 @@ module PAK
143
201
  end
144
202
  end
145
203
  end
146
-
204
+
147
205
  def add_error(record, attr_name, message, *interpolators)
148
206
  args = {
149
207
  :default => [DEFAULT_ERROR_MSG[message], options[:message]],
@@ -173,4 +231,4 @@ module PAK
173
231
  end
174
232
  end
175
233
 
176
- ActiveRecord::Base.send(:include, PAK::ValidatesHostname)
234
+ ActiveRecord::Base.send(:include, PAK::ValidatesHostname)
@@ -1,5 +1,5 @@
1
1
  module PAK
2
2
  module ValidatesHostname
3
- VERSION = '1.0.4'
3
+ VERSION = '1.0.5'
4
4
  end
5
5
  end
@@ -16,9 +16,12 @@ Gem::Specification.new do |s|
16
16
  s.licenses = 'MIT'
17
17
  s.require_paths = ["lib"]
18
18
 
19
- s.add_runtime_dependency 'rails'
20
- s.add_runtime_dependency 'rspec'
21
- s.add_runtime_dependency 'rspec-rails'
22
- s.add_runtime_dependency 'activerecord'
23
- s.add_runtime_dependency 'sqlite3-ruby'
19
+ s.add_runtime_dependency 'activerecord', '>= 3.0'
20
+ s.add_runtime_dependency 'activesupport', '>= 3.0'
21
+
22
+ s.add_development_dependency 'rspec', '~> 2.14'
23
+ s.add_development_dependency 'rspec-rails'
24
+ s.add_development_dependency 'rails-all'
25
+ s.add_development_dependency 'sqlite3'
26
+ s.add_development_dependency 'pry-debugger'
24
27
  end
metadata CHANGED
@@ -1,37 +1,65 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_hostname
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kim Nørgaard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-16 00:00:00.000000000 Z
11
+ date: 2015-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.14'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.14'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-rails
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - '>='
32
60
  - !ruby/object:Gem::Version
33
61
  version: '0'
34
- type: :runtime
62
+ type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
@@ -39,13 +67,13 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
- name: rspec-rails
70
+ name: rails-all
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - '>='
46
74
  - !ruby/object:Gem::Version
47
75
  version: '0'
48
- type: :runtime
76
+ type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
@@ -53,13 +81,13 @@ dependencies:
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
- name: activerecord
84
+ name: sqlite3
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - '>='
60
88
  - !ruby/object:Gem::Version
61
89
  version: '0'
62
- type: :runtime
90
+ type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
@@ -67,13 +95,13 @@ dependencies:
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
- name: sqlite3-ruby
98
+ name: pry-debugger
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
101
  - - '>='
74
102
  - !ruby/object:Gem::Version
75
103
  version: '0'
76
- type: :runtime
104
+ type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
@@ -89,13 +117,13 @@ extra_rdoc_files:
89
117
  - CHANGELOG.rdoc
90
118
  - MIT-LICENSE
91
119
  files:
92
- - validates_hostname.gemspec
93
- - MIT-LICENSE
94
120
  - CHANGELOG.rdoc
121
+ - MIT-LICENSE
95
122
  - README.rdoc
96
123
  - Rakefile
97
- - lib/validates_hostname/version.rb
98
124
  - lib/validates_hostname.rb
125
+ - lib/validates_hostname/version.rb
126
+ - validates_hostname.gemspec
99
127
  homepage: https://github.com/KimNorgaard/validates_hostname
100
128
  licenses:
101
129
  - MIT
@@ -116,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
144
  version: '0'
117
145
  requirements: []
118
146
  rubyforge_project:
119
- rubygems_version: 2.0.3
147
+ rubygems_version: 2.2.2
120
148
  signing_key:
121
149
  specification_version: 4
122
150
  summary: Checks for valid hostnames