whois 3.3.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/CHANGELOG.md +736 -699
  2. data/data/tld.json +20 -5
  3. data/lib/whois/record/parser/base_icann_compliant.rb +20 -18
  4. data/lib/whois/record/parser/{whois.nic-se.se.rb → base_iisse.rb} +17 -16
  5. data/lib/whois/record/parser/whois.ascio.com.rb +198 -0
  6. data/lib/whois/record/parser/whois.cira.ca.rb +4 -4
  7. data/lib/whois/record/parser/whois.cnnic.cn.rb +7 -6
  8. data/lib/whois/record/parser/whois.co.ca.rb +6 -5
  9. data/lib/whois/record/parser/whois.denic.de.rb +1 -1
  10. data/lib/whois/record/parser/whois.dns.be.rb +20 -6
  11. data/lib/whois/record/parser/whois.enom.com.rb +3 -0
  12. data/lib/whois/record/parser/whois.gandi.net.rb +37 -29
  13. data/lib/whois/record/parser/whois.godaddy.com.rb +15 -15
  14. data/lib/whois/record/parser/whois.iis.nu.rb +28 -0
  15. data/lib/whois/record/parser/whois.iis.se.rb +28 -0
  16. data/lib/whois/record/parser/whois.jprs.jp.rb +6 -5
  17. data/lib/whois/record/parser/whois.nic.am.rb +3 -3
  18. data/lib/whois/record/parser/whois.nic.asia.rb +4 -0
  19. data/lib/whois/record/parser/whois.nic.bj.rb +128 -0
  20. data/lib/whois/record/parser/whois.nic.io.rb +23 -0
  21. data/lib/whois/record/parser/{whois.meregistry.net.rb → whois.nic.me.rb} +15 -15
  22. data/lib/whois/record/parser/{whois.nic.net.nf.rb → whois.nic.nf.rb} +2 -2
  23. data/lib/whois/record/parser/whois.nic.xxx.rb +10 -9
  24. data/lib/whois/record/parser/whois.register.com.rb +3 -134
  25. data/lib/whois/record/parser/whois.rrpproxy.net.rb +114 -0
  26. data/lib/whois/record/parser/whois.schlund.info.rb +26 -0
  27. data/lib/whois/record/parser/whois.udag.net.rb +26 -0
  28. data/lib/whois/record/parser/whois.yoursrs.com.rb +15 -14
  29. data/lib/whois/record/scanners/base.rb +6 -3
  30. data/lib/whois/record/scanners/base_icann_compliant.rb +4 -4
  31. data/lib/whois/record/scanners/{whois.nic-se.se.rb → base_iisse.rb} +7 -4
  32. data/lib/whois/record/scanners/scannable.rb +5 -2
  33. data/lib/whois/record/scanners/whois.ascio.com.rb +36 -0
  34. data/lib/whois/version.rb +2 -2
  35. data/whois.gemspec +3 -3
  36. metadata +14 -8
  37. data/lib/whois/record/parser/whois.nic.nu.rb +0 -96
  38. 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.meregistry.net"
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.net.nf"
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.nic.nu"
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.nic-se.se"
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.ua"
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('domain:name', &:downcase)
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(:name => name.downcase)
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
- :type => type,
117
- :id => node("Registry #{element} ID"),
118
- :name => value_for_property(element, 'Name'),
119
- :organization => value_for_property(element, 'Organization'),
120
- :address => value_for_property(element, 'Street'),
121
- :city => value_for_property(element, 'City'),
122
- :zip => value_for_property(element, 'Postal Code'),
123
- :state => value_for_property(element, 'State/Province'),
124
- :country_code => value_for_property(element, 'Country'),
125
- :phone => [ value_for_property(element, 'Phone'),
126
- value_for_property(element, 'Phone Ext')
127
- ].reject(&:empty?).join(' ext: '),
128
- :fax => [ value_for_property(element, 'Fax'),
129
- value_for_property(element, 'Fax Ext')
130
- ].reject(&:empty?).join(' ext: '),
131
- :email => value_for_property(element, 'Email')
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/whois.nic-se.se.rb'
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
- # Parser for the whois.nic-se.se server.
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::WhoisNicSeSe
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(:name => name) unless name == '-' }
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
- # Nameservers are listed in the following formats:
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(:name => name, :ipv4 => ipv4)
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
- :id => hash["Number"],
92
- :name => hash["Name"],
93
- :organization => hash["Name"]
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
- private
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
- private
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|