gitlab-net-dns 0.13.0 → 0.15.0
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/lib/net/dns/resolver.rb +13 -3
- data/lib/net/dns/version.rb +1 -1
- data/test/unit/dns_resolver_test.rb +80 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74ee6c4e55aca3a4b262ef65ed15aa7eb4faefba46e236581313e600f488d4fb
|
4
|
+
data.tar.gz: c0737bd705ee060cb3e0cabd8f16985e24cbc9c32435ab7287435075a70c4532
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88cc517f05b54349d8cc62a597415e395888398e9d4557b1f9c8176b7dc1b98ab6b4683a82ca50909c37054c1e9bee076648eb637242db69d2ab94899577ea71
|
7
|
+
data.tar.gz: 9e4bfdd6c46a3e1e48449aa384561cd158c4e7580e01593d24f860900ffc708d789fbdfbc5f6b39ba35fdeccc2d5d3971e4f482e158792e16d56509d2d5b200d
|
data/lib/net/dns/resolver.rb
CHANGED
@@ -1642,13 +1642,14 @@ module Net
|
|
1642
1642
|
socket.bind(Socket.pack_sockaddr_in(@config[:source_port], @config[:source_address].to_s))
|
1643
1643
|
|
1644
1644
|
sockaddr = Socket.pack_sockaddr_in(ns_port, ns.to_s)
|
1645
|
+
success = false
|
1645
1646
|
|
1646
1647
|
@config[:tcp_timeout].timeout do
|
1647
1648
|
socket.connect(sockaddr)
|
1648
1649
|
@logger.info "Contacting nameserver #{ns} port #{ns_port}"
|
1649
1650
|
socket.write(length + packet_data)
|
1650
1651
|
ans = socket.recv(Net::DNS::INT16SZ)
|
1651
|
-
len = ans.unpack("n")[0]
|
1652
|
+
len = ans.unpack("n")[0].to_i
|
1652
1653
|
|
1653
1654
|
@logger.info "Receiving #{len} bytes..."
|
1654
1655
|
|
@@ -1667,8 +1668,16 @@ module Net
|
|
1667
1668
|
@logger.warn "Malformed packet from nameserver #{ns}, trying next."
|
1668
1669
|
next
|
1669
1670
|
end
|
1671
|
+
|
1672
|
+
success = true
|
1670
1673
|
end
|
1671
|
-
|
1674
|
+
|
1675
|
+
# Return buffer and the socket "from" data:
|
1676
|
+
# from[0] - Address family as a string (e.g., "AF_INET" or "AF_INET6")
|
1677
|
+
# from[1] - Port number as an integer
|
1678
|
+
# from[2] - IP address as a string (e.g., "192.168.1.1" or "::1")
|
1679
|
+
# from[3] - IP address as a string (same as from[2])
|
1680
|
+
return [buffer, ["", ns_port, ns.to_s, ns.to_s]] if success
|
1672
1681
|
rescue Timeout::Error
|
1673
1682
|
@logger.warn "Nameserver #{ns} not responding within TCP timeout, trying next one"
|
1674
1683
|
next
|
@@ -1676,7 +1685,8 @@ module Net
|
|
1676
1685
|
socket.close
|
1677
1686
|
end
|
1678
1687
|
end
|
1679
|
-
|
1688
|
+
|
1689
|
+
nil
|
1680
1690
|
end
|
1681
1691
|
|
1682
1692
|
def query_udp(packet, packet_data)
|
data/lib/net/dns/version.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'net/dns/resolver'
|
3
|
+
|
4
|
+
class TestDNSResolver < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@resolver = Net::DNS::Resolver.new(
|
7
|
+
nameservers: ['8.8.8.8'],
|
8
|
+
port: 53,
|
9
|
+
source_address: IPAddr.new('0.0.0.0'),
|
10
|
+
tcp_timeout: 5,
|
11
|
+
udp_timeout: 5
|
12
|
+
)
|
13
|
+
|
14
|
+
# Sample DNS packet data
|
15
|
+
@packet_data = "\x12\x34\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Tests for query_tcp
|
19
|
+
def test_query_tcp_successful_response
|
20
|
+
mock_socket = Minitest::Mock.new
|
21
|
+
|
22
|
+
Socket.stub(:new, mock_socket) do
|
23
|
+
mock_socket.expect(:bind, nil, [String])
|
24
|
+
mock_socket.expect(:connect, nil, [String])
|
25
|
+
mock_socket.expect(:write, @packet_data.size + 2, [String])
|
26
|
+
mock_socket.expect(:recv, "\x00\x20", [2]) # Length = 32 bytes
|
27
|
+
mock_socket.expect(:recvfrom, ["A" * 32, nil], [32])
|
28
|
+
mock_socket.expect(:close, nil)
|
29
|
+
|
30
|
+
Socket.stub(:pack_sockaddr_in, "mock_sockaddr") do
|
31
|
+
result = @resolver.send(:query_tcp, @packet, @packet_data)
|
32
|
+
|
33
|
+
refute_nil result
|
34
|
+
assert_equal 2, result.size
|
35
|
+
assert_equal "A" * 32, result[0] # Response data
|
36
|
+
assert_equal ["", 53, "8.8.8.8", "8.8.8.8"], result[1] # From info
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
mock_socket.verify
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_query_tcp_zero_length_response
|
44
|
+
mock_socket = Minitest::Mock.new
|
45
|
+
|
46
|
+
Socket.stub(:new, mock_socket) do
|
47
|
+
mock_socket.expect(:bind, nil, [String])
|
48
|
+
mock_socket.expect(:connect, nil, [String])
|
49
|
+
mock_socket.expect(:write, @packet_data.size + 2, [String])
|
50
|
+
mock_socket.expect(:recv, "\x00\x00", [2]) # Length = 0 bytes
|
51
|
+
mock_socket.expect(:close, nil)
|
52
|
+
|
53
|
+
Socket.stub(:pack_sockaddr_in, "mock_sockaddr") do
|
54
|
+
result = @resolver.send(:query_tcp, @packet, @packet_data)
|
55
|
+
assert_nil result # Should return nil for zero-length response
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
mock_socket.verify
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_query_tcp_bogus_response
|
63
|
+
mock_socket = Minitest::Mock.new
|
64
|
+
|
65
|
+
Socket.stub(:new, mock_socket) do
|
66
|
+
mock_socket.expect(:bind, nil, [String])
|
67
|
+
mock_socket.expect(:connect, nil, [String])
|
68
|
+
mock_socket.expect(:write, @packet_data.size + 2, [String])
|
69
|
+
mock_socket.expect(:recv, "0", [2]) # Length = 0 bytes
|
70
|
+
mock_socket.expect(:close, nil)
|
71
|
+
|
72
|
+
Socket.stub(:pack_sockaddr_in, "mock_sockaddr") do
|
73
|
+
result = @resolver.send(:query_tcp, @packet, @packet_data)
|
74
|
+
assert_nil result # Should return nil for zero-length response
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
mock_socket.verify
|
79
|
+
end
|
80
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab-net-dns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Ceresa
|
8
8
|
- Simone Carletti
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logger
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- spec/unit/resolver/udp_timeout_spec.rb
|
125
125
|
- spec/unit/resolver_spec.rb
|
126
126
|
- test/test_helper.rb
|
127
|
+
- test/unit/dns_resolver_test.rb
|
127
128
|
- test/unit/header_test.rb
|
128
129
|
- test/unit/names_test.rb
|
129
130
|
- test/unit/packet_test.rb
|
@@ -168,6 +169,7 @@ test_files:
|
|
168
169
|
- spec/unit/resolver/udp_timeout_spec.rb
|
169
170
|
- spec/unit/resolver_spec.rb
|
170
171
|
- test/test_helper.rb
|
172
|
+
- test/unit/dns_resolver_test.rb
|
171
173
|
- test/unit/header_test.rb
|
172
174
|
- test/unit/names_test.rb
|
173
175
|
- test/unit/packet_test.rb
|