resolv 0.6.0 → 0.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.
- checksums.yaml +4 -4
- data/.github/workflows/push_gem.yml +5 -5
- data/.gitignore +1 -0
- data/README.md +6 -4
- data/ext/win32/resolv/lib/resolv.rb +70 -61
- data/ext/win32/resolv/resolv.c +2 -0
- data/lib/resolv.rb +50 -22
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f3223ba332f64c3b4b3af1b7044b9fb1369f6da74e05d74d4704fa5d1235d3c
|
4
|
+
data.tar.gz: 205750363ae9e6014d7cf7daa1e81010525543d7178fc3258ae4eaee4b007afb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cb060b5cac5331a0c1a719e1c436588230636687f655487d01cbe6c028fb704e425c90b63480bd12eff8c6c798653ad593b8315a108305e91db61c69a9704e0
|
7
|
+
data.tar.gz: 05d23a3d86214475e34406c614b611d5898ca66f49cebf9ff0507e0afa46acd85cab72d8b162f7a3d702bdb4c22577ee8a88bdbdefeb76bfca3757aed3b553b5
|
@@ -23,24 +23,24 @@ jobs:
|
|
23
23
|
|
24
24
|
steps:
|
25
25
|
- name: Harden Runner
|
26
|
-
uses: step-security/harden-runner@
|
26
|
+
uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
|
27
27
|
with:
|
28
28
|
egress-policy: audit
|
29
29
|
|
30
|
-
- uses: actions/checkout@
|
30
|
+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
31
31
|
|
32
32
|
- name: Set up Ruby
|
33
|
-
uses: ruby/setup-ruby@
|
33
|
+
uses: ruby/setup-ruby@a4effe49ee8ee5b8b5091268c473a4628afb5651 # v1.245.0
|
34
34
|
with:
|
35
35
|
bundler-cache: true
|
36
36
|
ruby-version: ruby
|
37
37
|
|
38
38
|
- name: Publish to RubyGems
|
39
|
-
uses: rubygems/release-gem@
|
39
|
+
uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1
|
40
40
|
|
41
41
|
- name: Create GitHub release
|
42
42
|
run: |
|
43
43
|
tag_name="$(git describe --tags --abbrev=0)"
|
44
44
|
gh release create "${tag_name}" --verify-tag --generate-notes
|
45
45
|
env:
|
46
|
-
GITHUB_TOKEN: ${{ secrets.
|
46
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -14,15 +14,18 @@ gem 'resolv'
|
|
14
14
|
|
15
15
|
And then execute:
|
16
16
|
|
17
|
-
|
17
|
+
```bash
|
18
|
+
bundle install
|
19
|
+
```
|
18
20
|
|
19
21
|
Or install it yourself as:
|
20
22
|
|
21
|
-
|
23
|
+
```bash
|
24
|
+
gem install resolv
|
25
|
+
```
|
22
26
|
|
23
27
|
## Usage
|
24
28
|
|
25
|
-
|
26
29
|
```ruby
|
27
30
|
p Resolv.getaddress "www.ruby-lang.org"
|
28
31
|
p Resolv.getname "210.251.121.214"
|
@@ -44,4 +47,3 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
44
47
|
## Contributing
|
45
48
|
|
46
49
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/resolv.
|
47
|
-
|
@@ -4,13 +4,8 @@
|
|
4
4
|
|
5
5
|
=end
|
6
6
|
|
7
|
-
require 'win32/registry'
|
8
|
-
|
9
7
|
module Win32
|
10
8
|
module Resolv
|
11
|
-
API = Registry::API
|
12
|
-
Error = Registry::Error
|
13
|
-
|
14
9
|
def self.get_hosts_path
|
15
10
|
path = get_hosts_dir
|
16
11
|
path = File.expand_path('hosts', path)
|
@@ -47,89 +42,103 @@ module Win32
|
|
47
42
|
# Windows NT
|
48
43
|
#====================================================================
|
49
44
|
module Resolv
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
45
|
+
begin
|
46
|
+
require 'win32/registry'
|
47
|
+
module SZ
|
48
|
+
refine Registry do
|
49
|
+
# ad hoc workaround for broken registry
|
50
|
+
def read_s(key)
|
51
|
+
type, str = read(key)
|
52
|
+
unless type == Registry::REG_SZ
|
53
|
+
warn "Broken registry, #{name}\\#{key} was #{Registry.type2name(type)}, ignored"
|
54
|
+
return String.new
|
55
|
+
end
|
56
|
+
str
|
58
57
|
end
|
59
|
-
str
|
60
58
|
end
|
61
59
|
end
|
60
|
+
using SZ
|
61
|
+
rescue LoadError
|
62
|
+
require "open3"
|
62
63
|
end
|
63
|
-
using SZ
|
64
64
|
|
65
65
|
TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'
|
66
66
|
|
67
67
|
class << self
|
68
68
|
private
|
69
69
|
def get_hosts_dir
|
70
|
-
|
71
|
-
reg.read_s_expand('DataBasePath')
|
72
|
-
end
|
70
|
+
get_item_property(TCPIP_NT, 'DataBasePath', expand: true)
|
73
71
|
end
|
74
72
|
|
75
73
|
def get_info
|
76
74
|
search = nil
|
77
75
|
nameserver = get_dns_server_list
|
78
|
-
Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
|
79
|
-
begin
|
80
|
-
slist = reg.read_s('SearchList')
|
81
|
-
search = slist.split(/,\s*/) unless slist.empty?
|
82
|
-
rescue Registry::Error
|
83
|
-
end
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
77
|
+
slist = get_item_property(TCPIP_NT, 'SearchList')
|
78
|
+
search = slist.split(/,\s*/) unless slist.empty?
|
79
|
+
|
80
|
+
if add_search = search.nil?
|
81
|
+
search = []
|
82
|
+
nvdom = get_item_property(TCPIP_NT, 'NV Domain')
|
83
|
+
|
84
|
+
unless nvdom.empty?
|
85
|
+
@search = [ nvdom ]
|
86
|
+
udmnd = get_item_property(TCPIP_NT, 'UseDomainNameDevolution').to_i
|
87
|
+
if udmnd != 0
|
88
|
+
if /^\w+\./ =~ nvdom
|
89
|
+
devo = $'
|
96
90
|
end
|
97
|
-
rescue Registry::Error
|
98
91
|
end
|
99
92
|
end
|
93
|
+
end
|
100
94
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
ns = regif.read_s(key)
|
107
|
-
rescue Registry::Error
|
108
|
-
else
|
109
|
-
break ns.split(/[,\s]\s*/) unless ns.empty?
|
110
|
-
end
|
111
|
-
end
|
112
|
-
next if (nameserver & ns).empty?
|
113
|
-
|
114
|
-
if add_search
|
115
|
-
begin
|
116
|
-
[ 'Domain', 'DhcpDomain' ].each do |key|
|
117
|
-
dom = regif.read_s(key)
|
118
|
-
unless dom.empty?
|
119
|
-
search.concat(dom.split(/,\s*/))
|
120
|
-
break
|
121
|
-
end
|
122
|
-
end
|
123
|
-
rescue Registry::Error
|
124
|
-
end
|
95
|
+
ifs = if defined?(Win32::Registry)
|
96
|
+
Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT + '\Interfaces') do |reg|
|
97
|
+
reg.keys
|
98
|
+
rescue Registry::Error
|
99
|
+
[]
|
125
100
|
end
|
101
|
+
else
|
102
|
+
cmd = "Get-ChildItem 'HKLM:\\#{TCPIP_NT}\\Interfaces' | ForEach-Object { $_.PSChildName }"
|
103
|
+
output, _ = Open3.capture2('powershell', '-Command', cmd)
|
104
|
+
output.split(/\n+/)
|
105
|
+
end
|
106
|
+
|
107
|
+
ifs.each do |iface|
|
108
|
+
next unless ns = %w[NameServer DhcpNameServer].find do |key|
|
109
|
+
ns = get_item_property(TCPIP_NT + '\Interfaces' + "\\#{iface}", key)
|
110
|
+
break ns.split(/[,\s]\s*/) unless ns.empty?
|
111
|
+
end
|
112
|
+
|
113
|
+
next if (nameserver & ns).empty?
|
114
|
+
|
115
|
+
if add_search
|
116
|
+
[ 'Domain', 'DhcpDomain' ].each do |key|
|
117
|
+
dom = get_item_property(TCPIP_NT + '\Interfaces' + "\\#{iface}", key)
|
118
|
+
unless dom.empty?
|
119
|
+
search.concat(dom.split(/,\s*/))
|
120
|
+
break
|
126
121
|
end
|
127
122
|
end
|
128
123
|
end
|
129
|
-
search << devo if add_search and devo
|
130
124
|
end
|
125
|
+
search << devo if add_search and devo
|
131
126
|
[ search.uniq, nameserver.uniq ]
|
132
127
|
end
|
128
|
+
|
129
|
+
def get_item_property(path, name, expand: false)
|
130
|
+
if defined?(Win32::Registry)
|
131
|
+
Registry::HKEY_LOCAL_MACHINE.open(path) do |reg|
|
132
|
+
expand ? reg.read_s_expand(name) : reg.read_s(name)
|
133
|
+
rescue Registry::Error
|
134
|
+
""
|
135
|
+
end
|
136
|
+
else
|
137
|
+
cmd = "Get-ItemProperty -Path 'HKLM:\\#{path}' -Name '#{name}' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty '#{name}'"
|
138
|
+
output, _ = Open3.capture2('powershell', '-Command', cmd)
|
139
|
+
output.strip
|
140
|
+
end
|
141
|
+
end
|
133
142
|
end
|
134
143
|
end
|
135
144
|
end
|
data/ext/win32/resolv/resolv.c
CHANGED
data/lib/resolv.rb
CHANGED
@@ -33,7 +33,7 @@ require 'securerandom'
|
|
33
33
|
|
34
34
|
class Resolv
|
35
35
|
|
36
|
-
VERSION = "0.6.
|
36
|
+
VERSION = "0.6.2"
|
37
37
|
|
38
38
|
##
|
39
39
|
# Looks up the first IP address for +name+.
|
@@ -173,13 +173,16 @@ class Resolv
|
|
173
173
|
|
174
174
|
class ResolvTimeout < Timeout::Error; end
|
175
175
|
|
176
|
+
WINDOWS = /mswin|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM || ::RbConfig::CONFIG['host_os'] =~ /mswin/
|
177
|
+
private_constant :WINDOWS
|
178
|
+
|
176
179
|
##
|
177
180
|
# Resolv::Hosts is a hostname resolver that uses the system hosts file.
|
178
181
|
|
179
182
|
class Hosts
|
180
|
-
if
|
183
|
+
if WINDOWS
|
181
184
|
begin
|
182
|
-
require 'win32/resolv'
|
185
|
+
require 'win32/resolv' unless defined?(Win32::Resolv)
|
183
186
|
DefaultFileName = Win32::Resolv.get_hosts_path || IO::NULL
|
184
187
|
rescue LoadError
|
185
188
|
end
|
@@ -659,8 +662,20 @@ class Resolv
|
|
659
662
|
}
|
660
663
|
end
|
661
664
|
|
662
|
-
|
663
|
-
|
665
|
+
case RUBY_PLATFORM
|
666
|
+
when *[
|
667
|
+
# https://www.rfc-editor.org/rfc/rfc6056.txt
|
668
|
+
# Appendix A. Survey of the Algorithms in Use by Some Popular Implementations
|
669
|
+
/freebsd/, /linux/, /netbsd/, /openbsd/, /solaris/,
|
670
|
+
/darwin/, # the same as FreeBSD
|
671
|
+
] then
|
672
|
+
def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
|
673
|
+
udpsock.bind(bind_host, 0)
|
674
|
+
end
|
675
|
+
else
|
676
|
+
# Sequential port assignment
|
677
|
+
def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
|
678
|
+
# Ephemeral port number range recommended by RFC 6056
|
664
679
|
port = random(1024..65535)
|
665
680
|
udpsock.bind(bind_host, port)
|
666
681
|
rescue Errno::EADDRINUSE, # POSIX
|
@@ -983,13 +998,13 @@ class Resolv
|
|
983
998
|
next unless keyword
|
984
999
|
case keyword
|
985
1000
|
when 'nameserver'
|
986
|
-
nameserver.concat(args)
|
1001
|
+
nameserver.concat(args.each(&:freeze))
|
987
1002
|
when 'domain'
|
988
1003
|
next if args.empty?
|
989
|
-
search = [args[0]]
|
1004
|
+
search = [args[0].freeze]
|
990
1005
|
when 'search'
|
991
1006
|
next if args.empty?
|
992
|
-
search = args
|
1007
|
+
search = args.each(&:freeze)
|
993
1008
|
when 'options'
|
994
1009
|
args.each {|arg|
|
995
1010
|
case arg
|
@@ -1000,22 +1015,22 @@ class Resolv
|
|
1000
1015
|
end
|
1001
1016
|
}
|
1002
1017
|
}
|
1003
|
-
return { :nameserver => nameserver, :search => search, :ndots => ndots }
|
1018
|
+
return { :nameserver => nameserver.freeze, :search => search.freeze, :ndots => ndots.freeze }.freeze
|
1004
1019
|
end
|
1005
1020
|
|
1006
1021
|
def Config.default_config_hash(filename="/etc/resolv.conf")
|
1007
1022
|
if File.exist? filename
|
1008
|
-
|
1023
|
+
Config.parse_resolv_conf(filename)
|
1024
|
+
elsif WINDOWS
|
1025
|
+
require 'win32/resolv' unless defined?(Win32::Resolv)
|
1026
|
+
search, nameserver = Win32::Resolv.get_resolv_info
|
1027
|
+
config_hash = {}
|
1028
|
+
config_hash[:nameserver] = nameserver if nameserver
|
1029
|
+
config_hash[:search] = [search].flatten if search
|
1030
|
+
config_hash
|
1009
1031
|
else
|
1010
|
-
|
1011
|
-
require 'win32/resolv'
|
1012
|
-
search, nameserver = Win32::Resolv.get_resolv_info
|
1013
|
-
config_hash = {}
|
1014
|
-
config_hash[:nameserver] = nameserver if nameserver
|
1015
|
-
config_hash[:search] = [search].flatten if search
|
1016
|
-
end
|
1032
|
+
{}
|
1017
1033
|
end
|
1018
|
-
config_hash || {}
|
1019
1034
|
end
|
1020
1035
|
|
1021
1036
|
def lazy_initialize
|
@@ -1664,6 +1679,7 @@ class Resolv
|
|
1664
1679
|
prev_index = @index
|
1665
1680
|
save_index = nil
|
1666
1681
|
d = []
|
1682
|
+
size = -1
|
1667
1683
|
while true
|
1668
1684
|
raise DecodeError.new("limit exceeded") if @limit <= @index
|
1669
1685
|
case @data.getbyte(@index)
|
@@ -1684,7 +1700,10 @@ class Resolv
|
|
1684
1700
|
end
|
1685
1701
|
@index = idx
|
1686
1702
|
else
|
1687
|
-
|
1703
|
+
l = self.get_label
|
1704
|
+
d << l
|
1705
|
+
size += 1 + l.string.bytesize
|
1706
|
+
raise DecodeError.new("name label data exceed 255 octets") if size > 255
|
1688
1707
|
end
|
1689
1708
|
end
|
1690
1709
|
end
|
@@ -2110,7 +2129,14 @@ class Resolv
|
|
2110
2129
|
|
2111
2130
|
attr_reader :ttl
|
2112
2131
|
|
2113
|
-
ClassHash =
|
2132
|
+
ClassHash = Module.new do
|
2133
|
+
module_function
|
2134
|
+
|
2135
|
+
def []=(type_class_value, klass)
|
2136
|
+
type_value, class_value = type_class_value
|
2137
|
+
Resource.const_set(:"Type#{type_value}_Class#{class_value}", klass)
|
2138
|
+
end
|
2139
|
+
end
|
2114
2140
|
|
2115
2141
|
def encode_rdata(msg) # :nodoc:
|
2116
2142
|
raise NotImplementedError.new
|
@@ -2148,7 +2174,9 @@ class Resolv
|
|
2148
2174
|
end
|
2149
2175
|
|
2150
2176
|
def self.get_class(type_value, class_value) # :nodoc:
|
2151
|
-
|
2177
|
+
cache = :"Type#{type_value}_Class#{class_value}"
|
2178
|
+
|
2179
|
+
return (const_defined?(cache) && const_get(cache)) ||
|
2152
2180
|
Generic.create(type_value, class_value)
|
2153
2181
|
end
|
2154
2182
|
|
@@ -2577,7 +2605,7 @@ class Resolv
|
|
2577
2605
|
end
|
2578
2606
|
|
2579
2607
|
##
|
2580
|
-
# Flags for this
|
2608
|
+
# Flags for this property:
|
2581
2609
|
# - Bit 0 : 0 = not critical, 1 = critical
|
2582
2610
|
|
2583
2611
|
attr_reader :flags
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resolv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanaka Akira
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies: []
|
13
12
|
description: Thread-aware DNS resolver library in Ruby.
|
14
13
|
email:
|
@@ -42,7 +41,6 @@ licenses:
|
|
42
41
|
metadata:
|
43
42
|
homepage_uri: https://github.com/ruby/resolv
|
44
43
|
source_code_uri: https://github.com/ruby/resolv
|
45
|
-
post_install_message:
|
46
44
|
rdoc_options: []
|
47
45
|
require_paths:
|
48
46
|
- lib
|
@@ -57,8 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
55
|
- !ruby/object:Gem::Version
|
58
56
|
version: '0'
|
59
57
|
requirements: []
|
60
|
-
rubygems_version: 3.
|
61
|
-
signing_key:
|
58
|
+
rubygems_version: 3.6.7
|
62
59
|
specification_version: 4
|
63
60
|
summary: Thread-aware DNS resolver library in Ruby.
|
64
61
|
test_files: []
|