whois 2.6.1 → 2.6.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.
Files changed (42) hide show
  1. data/CHANGELOG.md +11 -0
  2. data/lib/whois/definitions/tlds.rb +1 -0
  3. data/lib/whois/record/parser/whois.ati.tn.rb +1 -1
  4. data/lib/whois/record/parser/whois.godaddy.com.rb +0 -4
  5. data/lib/whois/record/parser/whois.markmonitor.com.rb +0 -4
  6. data/lib/whois/record/parser/whois.networksolutions.com.rb +146 -0
  7. data/lib/whois/record/parser/whois.registry.om.rb +1 -1
  8. data/lib/whois/record/parser/whois.sx.rb +124 -0
  9. data/lib/whois/record/parser/whois.ua.rb +70 -10
  10. data/lib/whois/record/scanners/base.rb +19 -6
  11. data/lib/whois/record/scanners/whois.ati.tn.rb +1 -1
  12. data/lib/whois/record/scanners/whois.registry.om.rb +1 -1
  13. data/lib/whois/record/scanners/whois.rnids.rs.rb +11 -11
  14. data/lib/whois/record/scanners/whois.sx.rb +81 -0
  15. data/lib/whois/version.rb +1 -1
  16. data/spec/fixtures/responses/whois.networksolutions.com/property_contacts_short.expected +47 -0
  17. data/spec/fixtures/responses/whois.networksolutions.com/property_contacts_short.txt +61 -0
  18. data/spec/fixtures/responses/whois.networksolutions.com/status_registered.expected +89 -0
  19. data/spec/fixtures/responses/whois.networksolutions.com/status_registered.txt +65 -0
  20. data/spec/fixtures/responses/whois.sx/status_available.expected +55 -0
  21. data/spec/fixtures/responses/whois.sx/status_available.txt +9 -0
  22. data/spec/fixtures/responses/whois.sx/status_registered.expected +85 -0
  23. data/spec/fixtures/responses/whois.sx/status_registered.txt +21 -0
  24. data/spec/fixtures/responses/whois.ua/property_contacts_multiple.expected +107 -0
  25. data/spec/fixtures/responses/whois.ua/property_contacts_multiple.txt +84 -0
  26. data/spec/fixtures/responses/whois.ua/status_available.expected +30 -1
  27. data/spec/fixtures/responses/whois.ua/status_registered.expected +65 -3
  28. data/spec/fixtures/responses/whois.ua/status_registered.txt +10 -9
  29. data/spec/tlds +1 -0
  30. data/spec/whois/record/parser/responses/whois.net.ua/property_contacts_multiple_spec.rb +157 -0
  31. data/spec/whois/record/parser/responses/whois.net.ua/property_nameservers_uppercase_spec.rb +4 -4
  32. data/spec/whois/record/parser/responses/whois.net.ua/status_available_spec.rb +47 -5
  33. data/spec/whois/record/parser/responses/whois.net.ua/status_registered_spec.rb +82 -7
  34. data/spec/whois/record/parser/responses/whois.networksolutions.com/property_contacts_short_spec.rb +77 -0
  35. data/spec/whois/record/parser/responses/whois.networksolutions.com/status_registered_spec.rb +133 -0
  36. data/spec/whois/record/parser/responses/whois.sx/status_available_spec.rb +106 -0
  37. data/spec/whois/record/parser/responses/whois.sx/status_registered_spec.rb +136 -0
  38. data/spec/whois/record/parser/responses/whois.ua/property_contacts_multiple_spec.rb +157 -0
  39. data/spec/whois/record/parser/responses/whois.ua/status_available_spec.rb +43 -1
  40. data/spec/whois/record/parser/responses/whois.ua/status_registered_spec.rb +78 -3
  41. data/whois.gemspec +4 -4
  42. metadata +22 -3
data/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # Changelog
2
2
 
3
3
 
4
+ ## Release 2.6.2
5
+
6
+ * SERVER: Added .SX TLD server (GH-170).
7
+
8
+ * NEW: Added full whois.networksolutions.com parser (GH-168). [Thanks @bramp]
9
+
10
+ * NEW: Added full whois.sx parser (GH-170).
11
+
12
+ * NEW: whois.ua parser is now a full parser (GH-169). [Thanks @Uko]
13
+
14
+
4
15
  ## Release 2.6.1
5
16
 
6
17
  * Reverted partial commit about .SX definitions included in v2.6.0 by mistake.
@@ -273,6 +273,7 @@ Whois::Server.define :tld, ".sr", nil, { :adapter => Whois::Server::Adapters::No
273
273
  Whois::Server.define :tld, ".st", "whois.nic.st"
274
274
  Whois::Server.define :tld, ".su", "whois.tcinet.ru"
275
275
  Whois::Server.define :tld, ".sv", nil, { :adapter => Whois::Server::Adapters::Web, :web => "http://www.uca.edu.sv/dns/" }
276
+ Whois::Server.define :tld, ".sx", "whois.sx"
276
277
  Whois::Server.define :tld, ".sy", nil, { :adapter => Whois::Server::Adapters::None }
277
278
  Whois::Server.define :tld, ".sz", nil, { :adapter => Whois::Server::Adapters::None }
278
279
  Whois::Server.define :tld, ".tc", "whois.adamsnames.tc"
@@ -20,7 +20,7 @@ module Whois
20
20
  # @see Whois::Record::Parser::Example
21
21
  # The Example parser for the list of all available methods.
22
22
  #
23
- # @since RELEASE
23
+ # @since 2.6.0
24
24
  class WhoisAtiTn < Base
25
25
  include Scanners::Ast
26
26
 
@@ -15,10 +15,6 @@ module Whois
15
15
  class Parser
16
16
 
17
17
  # Parser for the whois.godaddy.com server.
18
- #
19
- # @note This parser is just a stub and provides only a few basic methods
20
- # to check for domain availability and get domain status.
21
- # Please consider to contribute implementing missing methods.
22
18
  #
23
19
  # @see Whois::Record::Parser::Example
24
20
  # The Example parser for the list of all available methods.
@@ -16,10 +16,6 @@ module Whois
16
16
 
17
17
  # Parser for the whois.markmonitor.com server.
18
18
  #
19
- # @note This parser is just a stub and provides only a few basic methods
20
- # to check for domain availability and get domain status.
21
- # Please consider to contribute implementing missing methods.
22
- #
23
19
  # @see Whois::Record::Parser::Example
24
20
  # The Example parser for the list of all available methods.
25
21
  class WhoisMarkmonitorCom < Base
@@ -0,0 +1,146 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+
12
+
13
+ module Whois
14
+ class Record
15
+ class Parser
16
+
17
+ # Parser for the whois.networksolutions.com server.
18
+ #
19
+ # @see Whois::Record::Parser::Example
20
+ # The Example parser for the list of all available methods.
21
+ #
22
+ # @author Andrew Brampton <me@bramp.net>
23
+ # @since RELEASE
24
+ class WhoisNetworksolutionsCom < Base
25
+
26
+ property_not_supported :status
27
+
28
+ # The server is contacted only in case of a registered domain.
29
+ property_supported :available? do
30
+ false
31
+ end
32
+
33
+ property_supported :registered? do
34
+ !available?
35
+ end
36
+
37
+
38
+ property_supported :created_on do
39
+ if content_for_scanner =~ /Record created on (.+)\.\n/
40
+ Time.parse($1)
41
+ end
42
+ end
43
+
44
+ property_not_supported :updated_on
45
+
46
+ property_supported :expires_on do
47
+ if content_for_scanner =~ /Record expires on (.+)\.\n/
48
+ Time.parse($1)
49
+ end
50
+ end
51
+
52
+
53
+ property_supported :registrar do
54
+ Record::Registrar.new(
55
+ :name => 'Network Solutions',
56
+ :organization => 'Network Solutions, LLC',
57
+ :url => 'http://www.networksolutions.com/'
58
+ )
59
+ end
60
+
61
+ property_supported :registrant_contacts do
62
+ build_contact('Registrant:', Record::Contact::TYPE_REGISTRANT)
63
+ end
64
+
65
+ property_supported :admin_contacts do
66
+ build_contact('Administrative Contact', Record::Contact::TYPE_ADMIN)
67
+ end
68
+
69
+ property_supported :technical_contacts do
70
+ build_contact('Technical Contact', Record::Contact::TYPE_TECHNICAL)
71
+ end
72
+
73
+
74
+ property_supported :nameservers do
75
+ if content_for_scanner =~ /Domain servers in listed order:\n\n((?:[^\n]+\n)+)/
76
+ $1.split("\n").map do |line|
77
+ # NS01.XIF.COM 63.240.200.70
78
+ name, ipv4 = line.strip.split(" ")
79
+ Record::Nameserver.new(:name => name.downcase, :ipv4 => ipv4)
80
+ end
81
+ end
82
+ end
83
+
84
+
85
+ private
86
+
87
+ def build_contact(element, type)
88
+ match = content_for_scanner.slice(/#{element}.*\n((.+\n){4,7})/, 1)
89
+ return unless match
90
+
91
+ lines = match.split("\n").map(&:strip)
92
+
93
+ # 0 XIF Communications | mpowers LLC
94
+ # 1 1200 New Hampshire Avenue NW | 21010 Southbank St #575
95
+ # 2 Suite 410 | Potomac Falls, VA 20165
96
+ # 3 Washington, DC 20036 | US
97
+ # 4 US
98
+
99
+ # 0 Communications, XIF ContactMiddleName noc@xif.com | mpowers LLC michael@mpowers.net
100
+ # 1 XIF Communications | 21010 Southbank St #575
101
+ # 2 1200 New Hampshire Avenue NW | Potomac Falls, VA 20165
102
+ # 3 Suite 410 | US
103
+ # 4 Washington, DC 20036 | +1.5712832829
104
+ # 5 US
105
+ # 6 202-463-7200 fax: 202-318-4003
106
+
107
+ # Does the first line end in something that looks like a email address?
108
+ if lines[0].to_s =~ /\S+@\S+$/
109
+ # The record has a extra name and number line
110
+ name, email = lines.shift.scan(/^(.+)\s(\S+@\S+)$/).first
111
+ name = name.strip
112
+ end
113
+
114
+ # Does the last line contains the word fax, or has >9 digits
115
+ if lines[-1].to_s =~ / fax: /
116
+ phone, fax = lines.pop.to_s.scan(/^(.+) fax: (.+)$/).first
117
+ phone = phone.strip
118
+ fax = fax.strip
119
+ elsif lines[-1].to_s.gsub(/[^\d]+/, '').length > 9
120
+ phone = lines.pop
121
+ end
122
+
123
+ country_code = lines.pop
124
+ city, state, zip = lines.pop.scan(/^(.+), ([A-Z]{2}) ([\sA-Z0-9\-]+)$/).first
125
+ organization = lines.shift if lines.length >= 2
126
+
127
+ address = lines.join("\n")
128
+
129
+ Record::Contact.new(
130
+ :type => type,
131
+ :name => name,
132
+ :organization => organization,
133
+ :address => address,
134
+ :city => city,
135
+ :state => state,
136
+ :zip => zip,
137
+ :country_code => country_code,
138
+ :email => email,
139
+ :phone => phone,
140
+ :fax => fax
141
+ )
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -20,7 +20,7 @@ module Whois
20
20
  # @see Whois::Record::Parser::Example
21
21
  # The Example parser for the list of all available methods.
22
22
  #
23
- # @since RELEASE
23
+ # @since 2.6.0
24
24
  class WhoisRegistryOm < Base
25
25
  include Scanners::Ast
26
26
 
@@ -0,0 +1,124 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+ require 'whois/record/scanners/whois.sx.rb'
12
+
13
+
14
+ module Whois
15
+ class Record
16
+ class Parser
17
+
18
+ # Parser for the whois.sx server.
19
+ #
20
+ # @see Whois::Record::Parser::Example
21
+ # The Example parser for the list of all available methods.
22
+ #
23
+ # @since RELEASE
24
+ class WhoisSx < Base
25
+ include Scanners::Ast
26
+
27
+ property_not_supported :disclaimer
28
+
29
+
30
+ property_supported :domain do
31
+ "#{node('Domain')}.sx"
32
+ end
33
+
34
+ property_not_supported :domain_id
35
+
36
+
37
+ property_not_supported :referral_whois
38
+
39
+ property_not_supported :referral_url
40
+
41
+
42
+ property_supported :status do
43
+ case (s = node('Status'))
44
+ when /free/
45
+ :available
46
+ when 'active'
47
+ :registered
48
+ else
49
+ Whois.bug!(ParserError, "Unknown status `#{s}'.")
50
+ end
51
+ end
52
+
53
+ property_supported :available? do
54
+ status == :available
55
+ end
56
+
57
+ property_supported :registered? do
58
+ !available?
59
+ end
60
+
61
+
62
+ property_not_supported :created_on
63
+
64
+ property_not_supported :updated_on
65
+
66
+ property_not_supported :expires_on
67
+
68
+
69
+ property_supported :registrar do
70
+ node('Registrar') do |hash|
71
+ Record::Registrar.new(
72
+ :name => hash['Name'],
73
+ :url => hash['Website']
74
+ )
75
+ end
76
+ end
77
+
78
+
79
+ property_supported :registrant_contacts do
80
+ build_contact('Registrant', Whois::Record::Contact::TYPE_REGISTRANT)
81
+ end
82
+
83
+ property_not_supported :admin_contacts
84
+
85
+ property_not_supported :technical_contacts
86
+
87
+
88
+ property_supported :nameservers do
89
+ node('Name servers') do |names|
90
+ names.map do |name|
91
+ Record::Nameserver.new(:name => name)
92
+ end
93
+ end
94
+ end
95
+
96
+
97
+ # Initializes a new {Scanners::WhoisSx} instance
98
+ # passing the {#content_for_scanner}
99
+ # and calls +parse+ on it.
100
+ #
101
+ # @return [Hash]
102
+ def parse
103
+ Scanners::WhoisSx.new(content_for_scanner).parse
104
+ end
105
+
106
+
107
+ private
108
+
109
+ def build_contact(element, type)
110
+ node("#{element}") do |array|
111
+ Record::Contact.new(
112
+ :type => type,
113
+ :id => nil,
114
+ :name => array[0],
115
+ :email => nil
116
+ )
117
+ end
118
+ end
119
+
120
+ end
121
+
122
+ end
123
+ end
124
+ end
@@ -16,20 +16,30 @@ module Whois
16
16
 
17
17
  # Parser for the whois.ua server.
18
18
  #
19
- # @note This parser is just a stub and provides only a few basic methods
20
- # to check for domain availability and get domain status.
21
- # Please consider to contribute implementing missing methods.
22
- #
23
19
  # @since 2.4.0
24
20
  class WhoisUa < Base
25
21
 
22
+ property_supported :domain do
23
+ if content_for_scanner =~ /domain:\s+(.+)\n/
24
+ $1
25
+ end
26
+ end
27
+
28
+ property_not_supported :domain_id
29
+
30
+
31
+ property_not_supported :referral_whois
32
+
33
+ property_not_supported :referral_url
34
+
35
+
26
36
  property_supported :status do
27
37
  if content_for_scanner =~ /status:\s+(.+?)\n/
28
- case s = $1.downcase
29
- when /^ok-until/
30
- :registered
31
- else
32
- Whois.bug!(ParserError, "Unknown status `#{s}'.")
38
+ case (s = $1.downcase)
39
+ when /^ok-until/
40
+ :registered
41
+ else
42
+ Whois.bug!(ParserError, "Unknown status `#{s}'.")
33
43
  end
34
44
  else
35
45
  :available
@@ -45,7 +55,12 @@ module Whois
45
55
  end
46
56
 
47
57
 
48
- property_not_supported :created_on
58
+ property_supported :created_on do
59
+ if content_for_scanner =~ /created:\s+(.+)\n/
60
+ time = $1.split(" ").last
61
+ Time.parse(time)
62
+ end
63
+ end
49
64
 
50
65
  property_supported :updated_on do
51
66
  if content_for_scanner =~ /changed:\s+(.+)\n/
@@ -62,12 +77,57 @@ module Whois
62
77
  end
63
78
 
64
79
 
80
+ property_not_supported :registrar
81
+
82
+ property_not_supported :registrant_contacts
83
+
84
+ property_supported :admin_contacts do
85
+ build_contact("Administrative", Whois::Record::Contact::TYPE_ADMIN)
86
+ end
87
+
88
+ property_supported :technical_contacts do
89
+ build_contact("Technical", Whois::Record::Contact::TYPE_TECHNICAL)
90
+ end
91
+
92
+
65
93
  property_supported :nameservers do
66
94
  content_for_scanner.scan(/nserver:\s+(.+)\n/).flatten.map do |name|
67
95
  Record::Nameserver.new(:name => name.strip.downcase)
68
96
  end
69
97
  end
70
98
 
99
+
100
+ private
101
+
102
+ def build_contact(element, type)
103
+ record = []
104
+ content_for_scanner.scan(/%\s#{element}\sContact:\n %\s=+\n ((?: .+\n)+) (?: \n|\z)/ix).flatten.each do |match|
105
+ address = match.scan(/address:\s+(.+)\n/).flatten
106
+ zip = nil
107
+ zip = address[1].slice!(/\s+\d{5}/).strip if address[1] =~ /\s+\d{5}/
108
+ zip = address[1].slice!(/\d{5}\s+/).strip if address[1] =~ /\d{5}\s+/
109
+ state = nil
110
+ state = address[1].slice!(/\s+[A-Z]{2}\z/).strip if address[1] =~ /\s+[A-Z]{2}\z/
111
+
112
+ record.push Record::Contact.new(
113
+ :type => type,
114
+ :id => match[/org-id:\s+(.+)\n/,1],
115
+ :name => nil,
116
+ :organization => match.scan(/organization:\s+(.+)\n/).join("\n"),
117
+ :address => address[0],
118
+ :zip => zip,
119
+ :state => state,
120
+ :city => address[1],
121
+ :country => address[2],
122
+ :phone => match[/phone:\s+(.+)\n/,1],
123
+ :fax => match[/fax-no:\s+(.+)\n/,1],
124
+ :email => match[/e-mail:\s+(.+)\n/,1],
125
+ :updated_on => (Time.parse($1.split(" ").last) if match =~ /changed:\s+(.+)\n/)
126
+ )
127
+ end
128
+ record
129
+ end
130
+
71
131
  end
72
132
 
73
133
  end