whois 3.3.1 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +736 -699
- data/data/tld.json +20 -5
- data/lib/whois/record/parser/base_icann_compliant.rb +20 -18
- data/lib/whois/record/parser/{whois.nic-se.se.rb → base_iisse.rb} +17 -16
- data/lib/whois/record/parser/whois.ascio.com.rb +198 -0
- data/lib/whois/record/parser/whois.cira.ca.rb +4 -4
- data/lib/whois/record/parser/whois.cnnic.cn.rb +7 -6
- data/lib/whois/record/parser/whois.co.ca.rb +6 -5
- data/lib/whois/record/parser/whois.denic.de.rb +1 -1
- data/lib/whois/record/parser/whois.dns.be.rb +20 -6
- data/lib/whois/record/parser/whois.enom.com.rb +3 -0
- data/lib/whois/record/parser/whois.gandi.net.rb +37 -29
- data/lib/whois/record/parser/whois.godaddy.com.rb +15 -15
- data/lib/whois/record/parser/whois.iis.nu.rb +28 -0
- data/lib/whois/record/parser/whois.iis.se.rb +28 -0
- data/lib/whois/record/parser/whois.jprs.jp.rb +6 -5
- data/lib/whois/record/parser/whois.nic.am.rb +3 -3
- data/lib/whois/record/parser/whois.nic.asia.rb +4 -0
- data/lib/whois/record/parser/whois.nic.bj.rb +128 -0
- data/lib/whois/record/parser/whois.nic.io.rb +23 -0
- data/lib/whois/record/parser/{whois.meregistry.net.rb → whois.nic.me.rb} +15 -15
- data/lib/whois/record/parser/{whois.nic.net.nf.rb → whois.nic.nf.rb} +2 -2
- data/lib/whois/record/parser/whois.nic.xxx.rb +10 -9
- data/lib/whois/record/parser/whois.register.com.rb +3 -134
- data/lib/whois/record/parser/whois.rrpproxy.net.rb +114 -0
- data/lib/whois/record/parser/whois.schlund.info.rb +26 -0
- data/lib/whois/record/parser/whois.udag.net.rb +26 -0
- data/lib/whois/record/parser/whois.yoursrs.com.rb +15 -14
- data/lib/whois/record/scanners/base.rb +6 -3
- data/lib/whois/record/scanners/base_icann_compliant.rb +4 -4
- data/lib/whois/record/scanners/{whois.nic-se.se.rb → base_iisse.rb} +7 -4
- data/lib/whois/record/scanners/scannable.rb +5 -2
- data/lib/whois/record/scanners/whois.ascio.com.rb +36 -0
- data/lib/whois/version.rb +2 -2
- data/whois.gemspec +3 -3
- metadata +14 -8
- data/lib/whois/record/parser/whois.nic.nu.rb +0 -96
- data/lib/whois/record/scanners/whois.gandi.net.rb +0 -49
data/data/tld.json
CHANGED
@@ -720,7 +720,7 @@
|
|
720
720
|
"host": "whois.nic.md"
|
721
721
|
},
|
722
722
|
".me": {
|
723
|
-
"host": "whois.
|
723
|
+
"host": "whois.nic.me"
|
724
724
|
},
|
725
725
|
".mg": {
|
726
726
|
"host": "whois.nic.mg"
|
@@ -803,7 +803,7 @@
|
|
803
803
|
"adapter": "none"
|
804
804
|
},
|
805
805
|
".nf": {
|
806
|
-
"host": "whois.nic.
|
806
|
+
"host": "whois.nic.nf"
|
807
807
|
},
|
808
808
|
".ng": {
|
809
809
|
"host": "whois.nic.net.ng"
|
@@ -830,7 +830,7 @@
|
|
830
830
|
"url": "http://www.cenpac.net.nr/dns/whois.html"
|
831
831
|
},
|
832
832
|
".nu": {
|
833
|
-
"host": "whois.
|
833
|
+
"host": "whois.iis.nu"
|
834
834
|
},
|
835
835
|
".nz": {
|
836
836
|
"host": "whois.srs.net.nz"
|
@@ -935,7 +935,7 @@
|
|
935
935
|
"adapter": "none"
|
936
936
|
},
|
937
937
|
".se": {
|
938
|
-
"host": "whois.
|
938
|
+
"host": "whois.iis.se"
|
939
939
|
},
|
940
940
|
".sg": {
|
941
941
|
"host": "whois.sgnic.sg"
|
@@ -1198,6 +1198,12 @@
|
|
1198
1198
|
".xn--80ao21a": {
|
1199
1199
|
"host": "whois.nic.kz"
|
1200
1200
|
},
|
1201
|
+
".xn--80asehdb": {
|
1202
|
+
"host": "whois.online.rs.corenic.net"
|
1203
|
+
},
|
1204
|
+
".xn--80aswg": {
|
1205
|
+
"host": "whois.online.rs.corenic.net"
|
1206
|
+
},
|
1201
1207
|
".xn--90a3ac": {
|
1202
1208
|
"host": null,
|
1203
1209
|
"adapter": "none"
|
@@ -1227,7 +1233,7 @@
|
|
1227
1233
|
"adapter": "none"
|
1228
1234
|
},
|
1229
1235
|
".xn--j1amh": {
|
1230
|
-
"host": "whois.
|
1236
|
+
"host": "whois.dotukr.com"
|
1231
1237
|
},
|
1232
1238
|
".xn--j6w193g": {
|
1233
1239
|
"host": "whois.hkirc.hk"
|
@@ -1244,6 +1250,9 @@
|
|
1244
1250
|
".xn--mgb9awbf": {
|
1245
1251
|
"host": "whois.registry.om"
|
1246
1252
|
},
|
1253
|
+
".xn--mgba3a4f16a": {
|
1254
|
+
"host": "whois.nic.ir"
|
1255
|
+
},
|
1247
1256
|
".xn--mgbaam7a8h": {
|
1248
1257
|
"host": "whois.aeda.net.ae"
|
1249
1258
|
},
|
@@ -1266,6 +1275,9 @@
|
|
1266
1275
|
".xn--mgbx4cd0ab": {
|
1267
1276
|
"host": "whois.domainregistry.my"
|
1268
1277
|
},
|
1278
|
+
".xn--ngbc5azd": {
|
1279
|
+
"host": "whois.xn--ngbc5azd.aridnrs.net.au"
|
1280
|
+
},
|
1269
1281
|
".xn--o3cw4h": {
|
1270
1282
|
"host": "whois.thnic.co.th"
|
1271
1283
|
},
|
@@ -1284,6 +1296,9 @@
|
|
1284
1296
|
"host": null,
|
1285
1297
|
"adapter": "none"
|
1286
1298
|
},
|
1299
|
+
".xn--unup4y": {
|
1300
|
+
"host": "whois.donuts.co"
|
1301
|
+
},
|
1287
1302
|
".xn--wgbh1c": {
|
1288
1303
|
"host": "whois.dotmasr.eg"
|
1289
1304
|
},
|
@@ -30,7 +30,7 @@ module Whois
|
|
30
30
|
|
31
31
|
|
32
32
|
property_supported :domain do
|
33
|
-
node('
|
33
|
+
node('Domain Name', &:downcase)
|
34
34
|
end
|
35
35
|
|
36
36
|
property_supported :domain_id do
|
@@ -46,6 +46,8 @@ module Whois
|
|
46
46
|
else
|
47
47
|
:registered
|
48
48
|
end
|
49
|
+
else
|
50
|
+
status
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
@@ -103,7 +105,7 @@ module Whois
|
|
103
105
|
|
104
106
|
property_supported :nameservers do
|
105
107
|
Array.wrap(node('Name Server') || node('Name Servers')).reject(&:empty?).map do |name|
|
106
|
-
Nameserver.new(:
|
108
|
+
Nameserver.new(name: name.downcase)
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
@@ -113,22 +115,22 @@ module Whois
|
|
113
115
|
def build_contact(element, type)
|
114
116
|
node("#{element} Name") do
|
115
117
|
Record::Contact.new(
|
116
|
-
:
|
117
|
-
:
|
118
|
-
:
|
119
|
-
:
|
120
|
-
:
|
121
|
-
:
|
122
|
-
:
|
123
|
-
:
|
124
|
-
:
|
125
|
-
:
|
126
|
-
|
127
|
-
|
128
|
-
:
|
129
|
-
|
130
|
-
|
131
|
-
:
|
118
|
+
type: type,
|
119
|
+
id: node("Registry #{element} ID"),
|
120
|
+
name: value_for_property(element, 'Name'),
|
121
|
+
organization: value_for_property(element, 'Organization'),
|
122
|
+
address: value_for_property(element, 'Street'),
|
123
|
+
city: value_for_property(element, 'City'),
|
124
|
+
zip: value_for_property(element, 'Postal Code'),
|
125
|
+
state: value_for_property(element, 'State/Province'),
|
126
|
+
country_code: value_for_property(element, 'Country'),
|
127
|
+
phone: [ value_for_property(element, 'Phone'),
|
128
|
+
value_for_property(element, 'Phone Ext')
|
129
|
+
].reject(&:empty?).join(' ext: '),
|
130
|
+
fax: [ value_for_property(element, 'Fax'),
|
131
|
+
value_for_property(element, 'Fax Ext')
|
132
|
+
].reject(&:empty?).join(' ext: '),
|
133
|
+
email: value_for_property(element, 'Email')
|
132
134
|
)
|
133
135
|
end
|
134
136
|
end
|
@@ -8,22 +8,18 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
require 'whois/record/parser/base'
|
11
|
-
require 'whois/record/scanners/
|
11
|
+
require 'whois/record/scanners/base_iisse'
|
12
|
+
|
12
13
|
|
13
14
|
module Whois
|
14
15
|
class Record
|
15
16
|
class Parser
|
16
17
|
|
17
|
-
#
|
18
|
-
|
19
|
-
# @author Simone Carletti <weppos@weppos.net>
|
20
|
-
# @author Mikkel Kristensen <mikkel@tdx.dk>
|
21
|
-
# @author Pieter Agten <pieter.agten@gmail.com>
|
22
|
-
#
|
23
|
-
class WhoisNicSeSe < Base
|
18
|
+
# Base parser for IIS.se servers.
|
19
|
+
class BaseIisse < Base
|
24
20
|
include Scanners::Scannable
|
25
21
|
|
26
|
-
self.scanner = Scanners::
|
22
|
+
self.scanner = Scanners::BaseIisse
|
27
23
|
|
28
24
|
|
29
25
|
property_supported :disclaimer do
|
@@ -31,6 +27,13 @@ module Whois
|
|
31
27
|
end
|
32
28
|
|
33
29
|
|
30
|
+
property_supported :domain do
|
31
|
+
node("domain")
|
32
|
+
end
|
33
|
+
|
34
|
+
property_not_supported :domain_id
|
35
|
+
|
36
|
+
|
34
37
|
property_supported :status do
|
35
38
|
if available?
|
36
39
|
:available
|
@@ -57,12 +60,12 @@ module Whois
|
|
57
60
|
end
|
58
61
|
|
59
62
|
property_supported :updated_on do
|
60
|
-
node("modified") { |value| Time.parse(value) unless value ==
|
63
|
+
node("modified") { |value| Time.parse(value) unless value == "-" }
|
61
64
|
end
|
62
65
|
|
63
66
|
|
64
67
|
property_supported :registrar do
|
65
|
-
node("registrar") { |name| Record::Registrar.new(:
|
68
|
+
node("registrar") { |name| Record::Registrar.new(name: name) unless name == "-" }
|
66
69
|
end
|
67
70
|
|
68
71
|
|
@@ -79,16 +82,14 @@ module Whois
|
|
79
82
|
end
|
80
83
|
|
81
84
|
|
82
|
-
#
|
83
|
-
#
|
84
|
-
# nserver: ns2.loopia.se
|
85
|
-
# nserver: ns2.loopia.se 93.188.0.21
|
85
|
+
# nserver: ns2.loopia.se
|
86
|
+
# nserver: ns2.loopia.se 93.188.0.21
|
86
87
|
#
|
87
88
|
property_supported :nameservers do
|
88
89
|
node("nserver") do |values|
|
89
90
|
values.map do |line|
|
90
91
|
name, ipv4 = line.split(/\s+/)
|
91
|
-
Record::Nameserver.new(:
|
92
|
+
Record::Nameserver.new(name: name, ipv4: ipv4)
|
92
93
|
end
|
93
94
|
end
|
94
95
|
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
#--
|
2
|
+
# Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2009-2013 Simone Carletti <weppos@weppos.net>
|
7
|
+
#++
|
8
|
+
|
9
|
+
|
10
|
+
require 'whois/record/parser/base'
|
11
|
+
require 'whois/record/scanners/whois.ascio.com'
|
12
|
+
|
13
|
+
|
14
|
+
module Whois
|
15
|
+
class Record
|
16
|
+
class Parser
|
17
|
+
|
18
|
+
# Parser for the whois.ascio.com server.
|
19
|
+
#
|
20
|
+
# @see Whois::Record::Parser::Example
|
21
|
+
# The Example parser for the list of all available methods.
|
22
|
+
#
|
23
|
+
# @author Simone Carletti
|
24
|
+
# @author Igor Dolzhikov <bluesriverz@gmail.com>
|
25
|
+
#
|
26
|
+
class WhoisAscioCom < Base
|
27
|
+
include Scanners::Scannable
|
28
|
+
|
29
|
+
self.scanner = Scanners::WhoisAscioCom
|
30
|
+
|
31
|
+
|
32
|
+
property_supported :disclaimer do
|
33
|
+
node("field:disclaimer")
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
property_supported :domain do
|
38
|
+
if content_for_scanner =~ /Domain name: (.+)\n/
|
39
|
+
$1.downcase
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
property_not_supported :domain_id
|
44
|
+
|
45
|
+
|
46
|
+
property_supported :available? do
|
47
|
+
!!(content_for_scanner =~ /^Object not found/)
|
48
|
+
end
|
49
|
+
|
50
|
+
property_supported :registered? do
|
51
|
+
!available?
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
property_supported :created_on do
|
56
|
+
if content_for_scanner =~ /Record created: (.+)\n/
|
57
|
+
Time.parse($1)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
property_supported :updated_on do
|
62
|
+
if content_for_scanner =~ /Record last updated: (.+)\n/
|
63
|
+
Time.parse($1)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
property_supported :expires_on do
|
68
|
+
if content_for_scanner =~ /Record expires: (.+)\n/
|
69
|
+
Time.parse($1)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
property_supported :registrar do
|
75
|
+
return unless registered?
|
76
|
+
Record::Registrar.new(
|
77
|
+
id: "ASCIOTEC1364",
|
78
|
+
name: "Ascio Technologies",
|
79
|
+
organization: "Ascio Technologies, Inc",
|
80
|
+
url: "http://www.ascio.com/"
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
property_supported :registrant_contacts do
|
86
|
+
build_contact('Registrant:', Record::Contact::TYPE_REGISTRANT)
|
87
|
+
end
|
88
|
+
|
89
|
+
property_supported :admin_contacts do
|
90
|
+
if content_for_scanner =~ /Administrative and Technical contact:/
|
91
|
+
build_contact('Administrative and Technical contact:', Record::Contact::TYPE_ADMINISTRATIVE)
|
92
|
+
else
|
93
|
+
build_contact('Administrative contact:', Record::Contact::TYPE_ADMINISTRATIVE)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
property_supported :technical_contacts do
|
98
|
+
if content_for_scanner =~ /Administrative and Technical contact:/
|
99
|
+
build_contact('Administrative and Technical contact:', Record::Contact::TYPE_TECHNICAL)
|
100
|
+
else
|
101
|
+
build_contact('Technical contact:', Record::Contact::TYPE_TECHNICAL)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
property_supported :nameservers do
|
107
|
+
if content_for_scanner =~ /Domain servers in listed order:\n((?:[^\n]+\n)+)/
|
108
|
+
$1.split("\n").map do |line|
|
109
|
+
# ns1.ascio.net (NSASCION521)
|
110
|
+
name = line.strip.split(" ").first
|
111
|
+
Record::Nameserver.new(name: name.downcase)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def build_contact(element, type)
|
120
|
+
match = content_for_scanner.slice(/#{element}.*\n((.*\n){8})/, 1)
|
121
|
+
return unless match
|
122
|
+
|
123
|
+
lines = match.split("\n").map(&:strip)
|
124
|
+
|
125
|
+
# Registrant:
|
126
|
+
# 0 ASCIO Technologies Inc. (ASCIOTEC1364) | Dacentec BVBA (DACENTEC94997)
|
127
|
+
# 1 Islands Brygge 55 | Antwerpsesteenweg 19
|
128
|
+
# 2 |
|
129
|
+
# 3 Copenhagen, S, 2300 | Lochristi, , 9080
|
130
|
+
# 4 DK | BE
|
131
|
+
|
132
|
+
# Administrative and Technical contact:
|
133
|
+
# 0 Hostmaster, Netnames (NH323743) | Fossen, Arvid (AF05750)
|
134
|
+
# 1 Group NBT | Dacentec BVBA
|
135
|
+
# 2 3rd Floor Prospero House | Antwerpsesteenweg 19
|
136
|
+
# 3 241 Borough High St. |
|
137
|
+
# 4 London, SE1 1GA | Lochristi, 9080
|
138
|
+
# 5 GB | BE
|
139
|
+
# 6 hostmaster@netnames.net | arvid@dacentec.com
|
140
|
+
# 7 +44.2070159370 Fax: +44.2070159375 | +32.093242050 Fax:
|
141
|
+
|
142
|
+
phone, fax, email = nil
|
143
|
+
|
144
|
+
# (id) check on the end of the line
|
145
|
+
if lines[0].to_s =~ /(.+) \((.+)\)/
|
146
|
+
name, id = lines.shift.to_s.scan(/(.+) \((.+)\)/).first.map(&:strip)
|
147
|
+
else
|
148
|
+
name, id = lines.shift.strip, nil
|
149
|
+
end
|
150
|
+
|
151
|
+
if type == Record::Contact::TYPE_REGISTRANT
|
152
|
+
organization, name = name, nil
|
153
|
+
else
|
154
|
+
|
155
|
+
# name reverse in right order without comma
|
156
|
+
name = name.split(',').map(&:strip).reverse.join(' ') if name
|
157
|
+
organization = lines.shift
|
158
|
+
|
159
|
+
# Does the last line contains the word fax, or has >9 digits
|
160
|
+
if lines[-1].to_s =~ / [Ff]ax: [\d\+\.]+/
|
161
|
+
phone, fax = lines.pop.to_s.scan(/^(.+) [Ff]ax: (.+)$/).first.map(&:strip)
|
162
|
+
elsif lines[-1].to_s.gsub!(/ [Ff]ax:/, '').gsub(/[^\d]+/, '').length > 9
|
163
|
+
phone = lines.pop
|
164
|
+
end
|
165
|
+
|
166
|
+
email = lines.pop
|
167
|
+
end
|
168
|
+
|
169
|
+
address = lines[0..1].join(' ').strip
|
170
|
+
if lines[2].to_s =~ /^(.+), (.*), (.+)$/
|
171
|
+
city, state, zip = lines[2].scan(/^(.+), (.*), (.+)$/).first.map(&:strip)
|
172
|
+
state = nil if state.empty?
|
173
|
+
else
|
174
|
+
state = nil
|
175
|
+
city, zip = lines[2].scan(/^(.+), (.+)$/).first.map(&:strip)
|
176
|
+
end
|
177
|
+
country_code = lines[3]
|
178
|
+
Record::Contact.new(
|
179
|
+
type: type,
|
180
|
+
id: id,
|
181
|
+
name: name,
|
182
|
+
organization: organization,
|
183
|
+
address: address,
|
184
|
+
city: city,
|
185
|
+
state: state,
|
186
|
+
zip: zip,
|
187
|
+
country_code: country_code,
|
188
|
+
email: email,
|
189
|
+
phone: phone,
|
190
|
+
fax: fax
|
191
|
+
)
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
@@ -88,9 +88,9 @@ module Whois
|
|
88
88
|
property_supported :registrar do
|
89
89
|
node("Registrar") do |hash|
|
90
90
|
Record::Registrar.new(
|
91
|
-
:
|
92
|
-
:
|
93
|
-
:
|
91
|
+
id: hash["Number"],
|
92
|
+
name: hash["Name"],
|
93
|
+
organization: hash["Name"]
|
94
94
|
)
|
95
95
|
end
|
96
96
|
end
|
@@ -166,7 +166,7 @@ module Whois
|
|
166
166
|
end
|
167
167
|
|
168
168
|
|
169
|
-
|
169
|
+
private
|
170
170
|
|
171
171
|
def build_contact(element, type)
|
172
172
|
node(element) do |hash|
|
@@ -46,11 +46,6 @@ module Whois
|
|
46
46
|
!reserved? && !available?
|
47
47
|
end
|
48
48
|
|
49
|
-
# NEWPROPERTY
|
50
|
-
def reserved?
|
51
|
-
!!node("status:reserved")
|
52
|
-
end
|
53
|
-
|
54
49
|
|
55
50
|
property_supported :created_on do
|
56
51
|
node("Registration Date") { |value| Time.parse(value) }
|
@@ -90,7 +85,13 @@ module Whois
|
|
90
85
|
end
|
91
86
|
|
92
87
|
|
93
|
-
|
88
|
+
# NEWPROPERTY
|
89
|
+
def reserved?
|
90
|
+
!!node("status:reserved")
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
private
|
94
95
|
|
95
96
|
def build_contact(element, type)
|
96
97
|
node("#{element}") do |value|
|