author | Matthew Wild <mwild1@gmail.com> |
Sun, 17 Mar 2024 10:10:24 +0000 | |
changeset 13464 | a688947fab1e |
parent 12978 | ba409c67353b |
permissions | -rw-r--r-- |
12978
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12819
diff
changeset
|
1 |
local adns = require "prosody.net.adns"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12819
diff
changeset
|
2 |
local inet_pton = require "prosody.util.net".pton; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12819
diff
changeset
|
3 |
local inet_ntop = require "prosody.util.net".ntop; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12819
diff
changeset
|
4 |
local idna_to_ascii = require "prosody.util.encodings".idna.to_ascii; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12819
diff
changeset
|
5 |
local promise = require "prosody.util.promise"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12819
diff
changeset
|
6 |
local t_move = require "prosody.util.table".move; |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
local methods = {}; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
local resolver_mt = { __index = methods }; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
|
10489
913276ba0c47
net.connect: Mention RFC 6724 regression
Kim Alvefur <zash@zash.se>
parents:
10488
diff
changeset
|
11 |
-- FIXME RFC 6724 |
10488
b13a31cea7d9
net.connect: Add some TODOs and FIXMEs
Kim Alvefur <zash@zash.se>
parents:
10445
diff
changeset
|
12 |
|
12605
72f7bb3f30d3
net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents:
12417
diff
changeset
|
13 |
local function do_dns_lookup(self, dns_resolver, record_type, name, allow_insecure) |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
14 |
return promise.new(function (resolve, reject) |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
15 |
local ipv = (record_type == "A" and "4") or (record_type == "AAAA" and "6") or nil; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
16 |
if ipv and self.extra["use_ipv"..ipv] == false then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
17 |
return reject(("IPv%s disabled - %s lookup skipped"):format(ipv, record_type)); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
18 |
elseif record_type == "TLSA" and self.extra.use_dane ~= true then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
19 |
return reject("DANE disabled - TLSA lookup skipped"); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
20 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
21 |
dns_resolver:lookup(function (answer, err) |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
22 |
if not answer then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
23 |
return reject(err); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
24 |
elseif answer.bogus then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
25 |
return reject(("Validation error in %s lookup"):format(record_type)); |
12605
72f7bb3f30d3
net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents:
12417
diff
changeset
|
26 |
elseif not (answer.secure or allow_insecure) then |
72f7bb3f30d3
net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents:
12417
diff
changeset
|
27 |
return reject(("Insecure response in %s lookup"):format(record_type)); |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
28 |
elseif answer.status and #answer == 0 then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
29 |
return reject(("%s in %s lookup"):format(answer.status, record_type)); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
30 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
31 |
|
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
32 |
local targets = { secure = answer.secure }; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
33 |
for _, record in ipairs(answer) do |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
34 |
if ipv then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
35 |
table.insert(targets, { self.conn_type..ipv, record[record_type:lower()], self.port, self.extra }); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
36 |
else |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
37 |
table.insert(targets, record[record_type:lower()]); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
38 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
39 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
40 |
return resolve(targets); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
41 |
end, name, record_type, "IN"); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
42 |
end); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
43 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
44 |
|
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
45 |
local function merge_targets(ipv4_targets, ipv6_targets) |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
46 |
local result = { secure = ipv4_targets.secure and ipv6_targets.secure }; |
12413
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
47 |
local common_length = math.min(#ipv4_targets, #ipv6_targets); |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
48 |
for i = 1, common_length do |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
49 |
table.insert(result, ipv6_targets[i]); |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
50 |
table.insert(result, ipv4_targets[i]); |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
51 |
end |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
52 |
if common_length < #ipv4_targets then |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
53 |
t_move(ipv4_targets, common_length+1, #ipv4_targets, common_length+1, result); |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
54 |
elseif common_length < #ipv6_targets then |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
55 |
t_move(ipv6_targets, common_length+1, #ipv6_targets, common_length+1, result); |
9f0baf15e792
net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents:
12412
diff
changeset
|
56 |
end |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
57 |
return result; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
58 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
59 |
|
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 |
-- Find the next target to connect to, and |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 |
-- pass it to cb() |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 |
function methods:next(cb) |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
if self.targets then |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 |
if #self.targets == 0 then |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 |
cb(nil); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
return; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
local next_target = table.remove(self.targets, 1); |
12414
596625eed326
net.resolvers.basic: Indicate to callback if we have more targets available
Matthew Wild <mwild1@gmail.com>
parents:
12413
diff
changeset
|
69 |
cb(next_target[1], next_target[2], next_target[3], next_target[4], not not self.targets[1]); |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
return; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 |
|
10389
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10388
diff
changeset
|
73 |
if not self.hostname then |
12029
6ed7fd28f5e3
net.resolvers: Report when hostname fails IDNA
Kim Alvefur <zash@zash.se>
parents:
11905
diff
changeset
|
74 |
self.last_error = "hostname failed IDNA"; |
10389
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10388
diff
changeset
|
75 |
cb(nil); |
10404
4c2d789a106b
net.resolvers: Fix traceback from hostname failing IDNA
Kim Alvefur <zash@zash.se>
parents:
10389
diff
changeset
|
76 |
return; |
10389
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10388
diff
changeset
|
77 |
end |
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10388
diff
changeset
|
78 |
|
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
79 |
-- Resolve DNS to target list |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
80 |
local dns_resolver = adns.resolver(); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
81 |
|
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
82 |
local dns_lookups = { |
12605
72f7bb3f30d3
net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents:
12417
diff
changeset
|
83 |
ipv4 = do_dns_lookup(self, dns_resolver, "A", self.hostname, true); |
72f7bb3f30d3
net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents:
12417
diff
changeset
|
84 |
ipv6 = do_dns_lookup(self, dns_resolver, "AAAA", self.hostname, true); |
12417
e155f4509954
net.resolvers.basic: Fix incorrect field name (thanks CI)
Matthew Wild <mwild1@gmail.com>
parents:
12414
diff
changeset
|
85 |
tlsa = do_dns_lookup(self, dns_resolver, "TLSA", ("_%d._%s.%s"):format(self.port, self.conn_type, self.hostname)); |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
86 |
}; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
87 |
|
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
88 |
promise.all_settled(dns_lookups):next(function (dns_results) |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
89 |
-- Combine targets, assign to self.targets, self:next(cb) |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
90 |
local have_ipv4 = dns_results.ipv4.status == "fulfilled"; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
91 |
local have_ipv6 = dns_results.ipv6.status == "fulfilled"; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
92 |
|
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
93 |
if have_ipv4 and have_ipv6 then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
94 |
self.targets = merge_targets(dns_results.ipv4.value, dns_results.ipv6.value); |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
95 |
elseif have_ipv4 then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
96 |
self.targets = dns_results.ipv4.value; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
97 |
elseif have_ipv6 then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
98 |
self.targets = dns_results.ipv6.value; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
99 |
else |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
100 |
self.targets = {}; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
101 |
end |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
102 |
|
11418 | 103 |
if self.extra and self.extra.use_dane then |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
104 |
if self.targets.secure and dns_results.tlsa.status == "fulfilled" then |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
105 |
self.extra.tlsa = dns_results.tlsa.value; |
11712
5ef729c355f3
Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents:
11434
diff
changeset
|
106 |
self.extra.dane_hostname = self.hostname; |
5ef729c355f3
Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents:
11434
diff
changeset
|
107 |
else |
5ef729c355f3
Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents:
11434
diff
changeset
|
108 |
self.extra.tlsa = nil; |
5ef729c355f3
Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents:
11434
diff
changeset
|
109 |
self.extra.dane_hostname = nil; |
11418 | 110 |
end |
12819
2d134201dc55
net.resolvers.basic: Record hostname coming from secure SRV records
Kim Alvefur <zash@zash.se>
parents:
12605
diff
changeset
|
111 |
elseif self.extra and self.extra.srv_secure then |
2d134201dc55
net.resolvers.basic: Record hostname coming from secure SRV records
Kim Alvefur <zash@zash.se>
parents:
12605
diff
changeset
|
112 |
self.extra.secure_hostname = self.hostname; |
11418 | 113 |
end |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
114 |
|
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 |
self:next(cb); |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
116 |
end):catch(function (err) |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
117 |
self.last_error = err; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
118 |
self.targets = {}; |
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
119 |
end); |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 |
local function new(hostname, port, conn_type, extra) |
10440
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
123 |
local ascii_host = idna_to_ascii(hostname); |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
124 |
local targets = nil; |
11011
1d8e1f7a587c
net.resolvers.basic: Default conn_type to 'tcp' consistently if unspecified (thanks marc0s)
Matthew Wild <mwild1@gmail.com>
parents:
10443
diff
changeset
|
125 |
conn_type = conn_type or "tcp"; |
10440
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
126 |
|
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
127 |
local is_ip = inet_pton(hostname); |
10441
fcfc8f4d14a8
net.resolvers.basic: Fix resolution of IPv6 literals (in brackets) (fixes #1459)
Kim Alvefur <zash@zash.se>
parents:
10440
diff
changeset
|
128 |
if not is_ip and hostname:sub(1,1) == '[' then |
fcfc8f4d14a8
net.resolvers.basic: Fix resolution of IPv6 literals (in brackets) (fixes #1459)
Kim Alvefur <zash@zash.se>
parents:
10440
diff
changeset
|
129 |
is_ip = inet_pton(hostname:sub(2,-2)); |
fcfc8f4d14a8
net.resolvers.basic: Fix resolution of IPv6 literals (in brackets) (fixes #1459)
Kim Alvefur <zash@zash.se>
parents:
10440
diff
changeset
|
130 |
end |
10440
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
131 |
if is_ip then |
10443
97c0f5fe5f41
net.resolvers.basic: Normalise IP literals, ensures net.server is happy
Kim Alvefur <zash@zash.se>
parents:
10441
diff
changeset
|
132 |
hostname = inet_ntop(is_ip); |
10440
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
133 |
if #is_ip == 16 then |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
134 |
targets = { { conn_type.."6", hostname, port, extra } }; |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
135 |
elseif #is_ip == 4 then |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
136 |
targets = { { conn_type.."4", hostname, port, extra } }; |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
137 |
end |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
138 |
end |
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
139 |
|
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 |
return setmetatable({ |
10440
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
141 |
hostname = ascii_host; |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 |
port = port; |
11011
1d8e1f7a587c
net.resolvers.basic: Default conn_type to 'tcp' consistently if unspecified (thanks marc0s)
Matthew Wild <mwild1@gmail.com>
parents:
10443
diff
changeset
|
143 |
conn_type = conn_type; |
12412
acfc51b9530c
net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents:
12133
diff
changeset
|
144 |
extra = extra or {}; |
10440
0d702ec77f0c
net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents:
10404
diff
changeset
|
145 |
targets = targets; |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 |
}, resolver_mt); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 |
return { |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 |
new = new; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 |
}; |