domain_name_validator 0.2
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.
- data/ChangeLog.md +15 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +24 -0
- data/LICENSE.txt +23 -0
- data/README.md +66 -0
- data/Rakefile +4 -0
- data/domain_name_validator.gemspec +28 -0
- data/lib/domain_name_validator/validator.rb +49 -0
- data/lib/domain_name_validator/version.rb +3 -0
- data/lib/domain_name_validator.rb +5 -0
- data/spec/domain_name_validator_spec.rb +67 -0
- data/spec/spec_helper.rb +13 -0
- metadata +68 -0
data/ChangeLog.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
0.2 (2013-06-24)
|
2
|
+
----------------
|
3
|
+
|
4
|
+
First version built and deployed as a gem on a real project, for general
|
5
|
+
evaluation and testing purposes.
|
6
|
+
|
7
|
+
* Added more RSpec tests for improved test coverage.
|
8
|
+
* Enhanced documentation.
|
9
|
+
|
10
|
+
|
11
|
+
0.1 (2013-06-18)
|
12
|
+
----------------
|
13
|
+
|
14
|
+
Initial working version of the code, with minimal RSpec tests. Released on
|
15
|
+
GitHub for review, but not yet published as a gem to the Ruby community.
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
domain_name_validator (0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.2.4)
|
10
|
+
rspec (2.13.0)
|
11
|
+
rspec-core (~> 2.13.0)
|
12
|
+
rspec-expectations (~> 2.13.0)
|
13
|
+
rspec-mocks (~> 2.13.0)
|
14
|
+
rspec-core (2.13.1)
|
15
|
+
rspec-expectations (2.13.0)
|
16
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
17
|
+
rspec-mocks (2.13.1)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
x86-mingw32
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
domain_name_validator!
|
24
|
+
rspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Copyright (c) 2013 David Keener
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
domain_name_validator
|
2
|
+
=====================
|
3
|
+
|
4
|
+
Ever needed to validate a domain name? This gem will validate any domain name
|
5
|
+
represented in ASCII or UTF-8.
|
6
|
+
|
7
|
+
Domain names provide a unique, memorizable name to represent numerically
|
8
|
+
addressable Internet resources. They also provide a level of abstraction that
|
9
|
+
allows the underlying Internet address to be changed while still referencing
|
10
|
+
a resource by its domain name. The domain name space is managed by the
|
11
|
+
Internet Corporation for Assigned Names and Numbers (ICANN).
|
12
|
+
|
13
|
+
The right-most label of a domain name is referred to as the top-level domain, or
|
14
|
+
TLD. A limited set of top-level domain names, and two-character country codes,
|
15
|
+
have been standardized. The Internet Assigned Numbers Authority (IANA)
|
16
|
+
maintains an annotated list of top-level domains, as well as a list of
|
17
|
+
"special use," or reserved, top-level domain names.
|
18
|
+
|
19
|
+
* http://www.iana.org/domains/root/db/
|
20
|
+
* http://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xml
|
21
|
+
|
22
|
+
Domain names follow some very detailed rules:
|
23
|
+
|
24
|
+
1. The maximum length of a domain name is 253 characters.
|
25
|
+
|
26
|
+
2. A domain name is divided into "labels" separated by periods. The maximum
|
27
|
+
number of labels is 127.
|
28
|
+
|
29
|
+
3. The maximum length of any label within a domain name is 63 characters.
|
30
|
+
|
31
|
+
4. No label, including TLDs, can begin or end with a dash.
|
32
|
+
|
33
|
+
5. Top-level domain names cannot be all numeric.
|
34
|
+
|
35
|
+
6. The right-most label must be either a recognized TLD or a 2-letter country
|
36
|
+
code. The only exception is for international domain names, for which
|
37
|
+
TLD checking is currently bypassed.
|
38
|
+
|
39
|
+
|
40
|
+
Internationalized Domain Names
|
41
|
+
------------------------------
|
42
|
+
|
43
|
+
What about internationalized domain names? ICANN approved the Internationalized
|
44
|
+
Domain Name (IDNA) system in 2003. This standard allows for Unicode domain
|
45
|
+
names to be encoded into ASCII using Punycode. Essentially, a label may contain
|
46
|
+
"xn--" as a prefix, followed by the Punycode representation of a Unicode string,
|
47
|
+
resulting in domain names such as xn--kbenhavn-54.eu. Note that there are also
|
48
|
+
some approved Unicode TLDs.
|
49
|
+
|
50
|
+
The process of rendering an internationalized domain name in ASCII via
|
51
|
+
Punycode is called normalization. This gem will validate a normalized domain
|
52
|
+
name, but not a Unicode domain name. Note, however, that it currently does not
|
53
|
+
validate normalized TLDs against ICANN's list of valid TLDs.
|
54
|
+
|
55
|
+
It's also unclear whether the "xn--" prefix should count against the label
|
56
|
+
size limit of 63 characters. In the absence of specific guidelines, and because
|
57
|
+
I've never actually seen an overly long label, I have chosen to apply the limit
|
58
|
+
irregardless of the presence of the "xn--" prefix within a label.
|
59
|
+
|
60
|
+
YOUR SUPPORT
|
61
|
+
------------
|
62
|
+
|
63
|
+
Please help me make this gem as useful as possible for its admittedly limited
|
64
|
+
purpose. If ICANN's rules change, a clearer rules interpretation becomes
|
65
|
+
available, or new valid TLDs are added, please help out by notifying me of
|
66
|
+
potentially useful changes, or by submitting a pull request via GitHub.
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "domain_name_validator/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "domain_name_validator"
|
7
|
+
gem.version = DomainNameValidator::VERSION
|
8
|
+
gem.date = '2013-06-17'
|
9
|
+
gem.platform = Gem::Platform::RUBY
|
10
|
+
gem.authors = ["David Keener"]
|
11
|
+
gem.email = ["dkeener@keenertech.com"]
|
12
|
+
gem.homepage = "http://www.keenertech.com"
|
13
|
+
gem.summary = %q{Domain Name Validator}
|
14
|
+
gem.description = %q{Checks the validity of domain names.}
|
15
|
+
|
16
|
+
gem.add_development_dependency "rspec"
|
17
|
+
|
18
|
+
gem.rubyforge_project = "domain_name_validator"
|
19
|
+
|
20
|
+
gem.files = `git ls-files`.split("\n")
|
21
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
|
24
|
+
#gem.rdoc_options = ["--charset=UTF-8"]
|
25
|
+
#gem.extra_rdoc_files = %w[README.rdoc LICENSE Changelog.rdoc]
|
26
|
+
|
27
|
+
gem.require_paths = ["lib"]
|
28
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# The purpose of this class is to provide a simple capability for validating
|
2
|
+
# domain names represented in ASCII or UTF-8, a feature that seems to be
|
3
|
+
# missing from other more wide-ranging domain-related gems.
|
4
|
+
|
5
|
+
class DomainNameValidator
|
6
|
+
|
7
|
+
MAX_DOMAIN_LENGTH = 253
|
8
|
+
MAX_LABEL_LENGTH = 63
|
9
|
+
MAX_LEVELS = 127
|
10
|
+
MIN_LEVELS = 2
|
11
|
+
|
12
|
+
ERR_MAX_DOMAIN_SIZE = 'Maximum domain length of 253 exceeded'
|
13
|
+
ERR_MAX_LABEL_SIZE = 'Maximum domain label length of 63 exceeded'
|
14
|
+
ERR_MAX_LEVEL_SIZE = 'Maximum domain level limit of 127 exceeded'
|
15
|
+
ERR_MIN_LEVEL_SIZE = 'Minimum domain level limit of 2 not achieved'
|
16
|
+
ERR_LABEL_DASH_BEGIN = 'No domain label may begin with a dash'
|
17
|
+
ERR_LABEL_DASH_END = 'No domain label may end with a dash'
|
18
|
+
ERR_TOP_NUMERICAL = 'The top-level domain (the extension) cannot be numerical'
|
19
|
+
ERR_ILLEGAL_CHARS = 'Domain label contains an illegal character'
|
20
|
+
|
21
|
+
# Validates the proper formatting of a normalized domain name, i.e. - a
|
22
|
+
# domain that is represented in ASCII. Thus, international domain names are
|
23
|
+
# supported and validated, if they have undergone the required IDN
|
24
|
+
# conversion to ASCII. The validation rules are:
|
25
|
+
#
|
26
|
+
# 1. The maximum length of a domain name is 253 characters.
|
27
|
+
# 2. A domain name is divided into "labels" separated by periods. The maximum
|
28
|
+
# number of labels (including the top-level domain as a label) is 127.
|
29
|
+
# 3. The maximum length of any label within a domain name is 63 characters.
|
30
|
+
# 4. No label, including top-level domains, can begin or end with a dash.
|
31
|
+
# 5. Top-level names cannot be all numeric.
|
32
|
+
|
33
|
+
def validate(dn, errs = [])
|
34
|
+
errs << ERR_MAX_DOMAIN_SIZE if dn.size > MAX_DOMAIN_LENGTH
|
35
|
+
parts = dn.split('.')
|
36
|
+
errs << ERR_MAX_LEVEL_SIZE if parts.size > MAX_LEVELS
|
37
|
+
errs << ERR_MIN_LEVEL_SIZE if parts.size < MIN_LEVELS
|
38
|
+
parts.each do |p|
|
39
|
+
errs << ERR_MAX_LABEL_SIZE if p.size > MAX_LABEL_LENGTH
|
40
|
+
errs << ERR_LABEL_DASH_BEGIN if p[0] == '-'
|
41
|
+
errs << ERR_LABEL_DASH_END if p[-1] == '-'
|
42
|
+
errs << ERR_ILLEGAL_CHARS unless p.match(/^[a-z0-9\-\_]+$/)
|
43
|
+
end
|
44
|
+
errs << ERR_TOP_NUMERICAL if parts.last.match(/^[0-9]+$/)
|
45
|
+
|
46
|
+
errs.size == 0 # TRUE if valid, FALSE otherwise
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DomainNameValidator do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@validator = DomainNameValidator.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'Basic Validation' do
|
10
|
+
|
11
|
+
it 'should pass a valid domain name' do
|
12
|
+
response = @validator.validate('keenertech.com')
|
13
|
+
response.should be == true
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should fail when it finds a numeric top-level extension' do
|
17
|
+
response = @validator.validate('keenertech.123')
|
18
|
+
response.should be == false
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should fail when the domain name max size is exceeded' do
|
22
|
+
domain = "a"*250 + ".com" # 254 chars; max is 253
|
23
|
+
response = @validator.validate(domain)
|
24
|
+
response.should be == false
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should fail when the max number of levels is exceeded' do
|
28
|
+
domain = "a."*127 + "com" # 128 levels; max is 127
|
29
|
+
response = @validator.validate(domain)
|
30
|
+
response.should be == false
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should fail when a label exceeds the max label length' do
|
34
|
+
domain = "a"*64 + "b.c.com" # 64 chars; max is 63 for a label
|
35
|
+
response = @validator.validate(domain)
|
36
|
+
response.should be == false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should fail when a label begins with a dash' do
|
40
|
+
domain = "a.-b.c.com"
|
41
|
+
response = @validator.validate(domain)
|
42
|
+
response.should be == false
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should fail when a TLD begins with a dash' do
|
46
|
+
domain = "a.b.c.-com"
|
47
|
+
response = @validator.validate(domain)
|
48
|
+
response.should be == false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'Internationalized (normalized) domain names' do
|
53
|
+
|
54
|
+
it 'should fail when a TLD begins with a dash' do
|
55
|
+
domain = "xn--kbenhavn-54.eu"
|
56
|
+
response = @validator.validate(domain)
|
57
|
+
response.should be == true
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
# TODO: (2013/06/24) TLD checking will be added soon....
|
63
|
+
|
64
|
+
describe 'TLD Checking' do
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(
|
2
|
+
File.join(File.dirname(__FILE__), %w[.. lib domain_name_validator]))
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
# == Mock Framework
|
6
|
+
#
|
7
|
+
# RSpec uses it's own mocking framework by default. If you prefer to
|
8
|
+
# use mocha, flexmock or RR, uncomment the appropriate line:
|
9
|
+
#
|
10
|
+
# config.mock_with :mocha
|
11
|
+
# config.mock_with :flexmock
|
12
|
+
# config.mock_with :rr
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: domain_name_validator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Keener
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-06-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &30848232 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *30848232
|
25
|
+
description: Checks the validity of domain names.
|
26
|
+
email:
|
27
|
+
- dkeener@keenertech.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- ChangeLog.md
|
33
|
+
- Gemfile
|
34
|
+
- Gemfile.lock
|
35
|
+
- LICENSE.txt
|
36
|
+
- README.md
|
37
|
+
- Rakefile
|
38
|
+
- domain_name_validator.gemspec
|
39
|
+
- lib/domain_name_validator.rb
|
40
|
+
- lib/domain_name_validator/validator.rb
|
41
|
+
- lib/domain_name_validator/version.rb
|
42
|
+
- spec/domain_name_validator_spec.rb
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
homepage: http://www.keenertech.com
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project: domain_name_validator
|
64
|
+
rubygems_version: 1.8.16
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Domain Name Validator
|
68
|
+
test_files: []
|