Software /
code /
prosody
Annotate
net/resolvers/service.lua @ 13265:6ac5ad578565
mod_cron: Load last task run time inside task runner to fix async
This ensures that all interactions with storage happen inside an async
thread, allowing async waiting to be performed in storage drivers.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 14 Oct 2023 22:32:33 +0200 |
parent | 12974:ba409c67353b |
rev | line source |
---|---|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12814
diff
changeset
|
1 local adns = require "prosody.net.adns"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12814
diff
changeset
|
2 local basic = require "prosody.net.resolvers.basic"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12814
diff
changeset
|
3 local inet_pton = require "prosody.util.net".pton; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12814
diff
changeset
|
4 local idna_to_ascii = require "prosody.util.encodings".idna.to_ascii; |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 local methods = {}; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 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
|
8 |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
9 local function new_target_selector(rrset) |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
10 local rr_count = rrset and #rrset; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
11 if not rr_count or rr_count == 0 then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
12 rrset = nil; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
13 else |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
14 table.sort(rrset, function (a, b) return a.srv.priority < b.srv.priority end); |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
15 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
16 local rrset_pos = 1; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
17 local priority_bucket, bucket_total_weight, bucket_len, bucket_used; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
18 return function () |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
19 if not rrset then return; end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
20 |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
21 if not priority_bucket or bucket_used >= bucket_len then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
22 if rrset_pos > rr_count then return; end -- Used up all records |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
23 |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
24 -- Going to start on a new priority now. Gather up all the next |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
25 -- records with the same priority and add them to priority_bucket |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
26 priority_bucket, bucket_total_weight, bucket_len, bucket_used = {}, 0, 0, 0; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
27 local current_priority; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
28 repeat |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
29 local curr_record = rrset[rrset_pos].srv; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
30 if not current_priority then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
31 current_priority = curr_record.priority; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
32 elseif current_priority ~= curr_record.priority then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
33 break; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
34 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
35 table.insert(priority_bucket, curr_record); |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
36 bucket_total_weight = bucket_total_weight + curr_record.weight; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
37 bucket_len = bucket_len + 1; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
38 rrset_pos = rrset_pos + 1; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
39 until rrset_pos > rr_count; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
40 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
41 |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
42 bucket_used = bucket_used + 1; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
43 local n, running_total = math.random(0, bucket_total_weight), 0; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
44 local target_record; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
45 for i = 1, bucket_len do |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
46 local candidate = priority_bucket[i]; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
47 if candidate then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
48 running_total = running_total + candidate.weight; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
49 if running_total >= n then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
50 target_record = candidate; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
51 bucket_total_weight = bucket_total_weight - candidate.weight; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
52 priority_bucket[i] = nil; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
53 break; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
54 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
55 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
56 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
57 return target_record; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
58 end; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
59 end |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
60 |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 -- 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
|
62 -- pass it to cb() |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 function methods:next(cb) |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
64 if self.resolver or self._get_next_target then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
65 if not self.resolver then -- Do we have a basic resolver currently? |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
66 -- We don't, so fetch a new SRV target, create a new basic resolver for it |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
67 local next_srv_target = self._get_next_target and self._get_next_target(); |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
68 if not next_srv_target then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
69 -- No more SRV targets left |
10650
324a0c7d1c6a
net.resolvers.service: Fix resolving of targets with multiple IPs
Kim Alvefur <zash@zash.se>
parents:
10484
diff
changeset
|
70 cb(nil); |
324a0c7d1c6a
net.resolvers.service: Fix resolving of targets with multiple IPs
Kim Alvefur <zash@zash.se>
parents:
10484
diff
changeset
|
71 return; |
324a0c7d1c6a
net.resolvers.service: Fix resolving of targets with multiple IPs
Kim Alvefur <zash@zash.se>
parents:
10484
diff
changeset
|
72 end |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
73 -- Create a new basic resolver for this SRV target |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
74 self.resolver = basic.new(next_srv_target.target, next_srv_target.port, self.conn_type, self.extra); |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 end |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
76 -- Look up the next (basic) target from the current target's resolver |
9388
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
77 self.resolver:next(function (...) |
11901
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
78 if self.resolver then |
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
79 self.last_error = self.resolver.last_error; |
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
80 end |
9388
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
81 if ... == nil then |
10650
324a0c7d1c6a
net.resolvers.service: Fix resolving of targets with multiple IPs
Kim Alvefur <zash@zash.se>
parents:
10484
diff
changeset
|
82 self.resolver = nil; |
9388
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
83 self:next(cb); |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
84 else |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
85 cb(...); |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
86 end |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
87 end); |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 return; |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
89 elseif self.in_progress then |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
90 cb(nil); |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
91 return; |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
10385
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10384
diff
changeset
|
94 if not self.hostname then |
12025
6ed7fd28f5e3
net.resolvers: Report when hostname fails IDNA
Kim Alvefur <zash@zash.se>
parents:
11901
diff
changeset
|
95 self.last_error = "hostname failed IDNA"; |
10385
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10384
diff
changeset
|
96 cb(nil); |
10400
4c2d789a106b
net.resolvers: Fix traceback from hostname failing IDNA
Kim Alvefur <zash@zash.se>
parents:
10385
diff
changeset
|
97 return; |
10385
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10384
diff
changeset
|
98 end |
62a7042e0771
net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents:
10384
diff
changeset
|
99 |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
100 self.in_progress = true; |
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
101 |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 local function ready() |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 self:next(cb); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 -- Resolve DNS to target list |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 local dns_resolver = adns.resolver(); |
10121
33f287519bf6
net.resolvers.service: Fix DNS fallback
Kim Alvefur <zash@zash.se>
parents:
9691
diff
changeset
|
108 dns_resolver:lookup(function (answer, err) |
33f287519bf6
net.resolvers.service: Fix DNS fallback
Kim Alvefur <zash@zash.se>
parents:
9691
diff
changeset
|
109 if not answer and not err then |
33f287519bf6
net.resolvers.service: Fix DNS fallback
Kim Alvefur <zash@zash.se>
parents:
9691
diff
changeset
|
110 -- net.adns returns nil if there are zero records or nxdomain |
33f287519bf6
net.resolvers.service: Fix DNS fallback
Kim Alvefur <zash@zash.se>
parents:
9691
diff
changeset
|
111 answer = {}; |
33f287519bf6
net.resolvers.service: Fix DNS fallback
Kim Alvefur <zash@zash.se>
parents:
9691
diff
changeset
|
112 end |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 if answer then |
12813
4be161c25e14
net.resolvers.service: Fix reporting of Bogus DNSSEC results
Kim Alvefur <zash@zash.se>
parents:
12812
diff
changeset
|
114 if answer.bogus then |
12129
7a68d5828f3b
net.resolvers: Report DNSSEC validation errors instead of NoError
Kim Alvefur <zash@zash.se>
parents:
12025
diff
changeset
|
115 self.last_error = "Validation error in SRV lookup"; |
7a68d5828f3b
net.resolvers: Report DNSSEC validation errors instead of NoError
Kim Alvefur <zash@zash.se>
parents:
12025
diff
changeset
|
116 ready(); |
7a68d5828f3b
net.resolvers: Report DNSSEC validation errors instead of NoError
Kim Alvefur <zash@zash.se>
parents:
12025
diff
changeset
|
117 return; |
12813
4be161c25e14
net.resolvers.service: Fix reporting of Bogus DNSSEC results
Kim Alvefur <zash@zash.se>
parents:
12812
diff
changeset
|
118 elseif not answer.secure then |
4be161c25e14
net.resolvers.service: Fix reporting of Bogus DNSSEC results
Kim Alvefur <zash@zash.se>
parents:
12812
diff
changeset
|
119 if self.extra then |
4be161c25e14
net.resolvers.service: Fix reporting of Bogus DNSSEC results
Kim Alvefur <zash@zash.se>
parents:
12812
diff
changeset
|
120 -- Insecure results, so no DANE |
4be161c25e14
net.resolvers.service: Fix reporting of Bogus DNSSEC results
Kim Alvefur <zash@zash.se>
parents:
12812
diff
changeset
|
121 self.extra.use_dane = false; |
4be161c25e14
net.resolvers.service: Fix reporting of Bogus DNSSEC results
Kim Alvefur <zash@zash.se>
parents:
12812
diff
changeset
|
122 end |
11710
26a8cc9d9eb7
net.resolvers.service: Only do DANE with secure SRV records
Kim Alvefur <zash@zash.se>
parents:
10970
diff
changeset
|
123 end |
12814
3bfb2f9e13af
net.resolvers.service: Record DNSSEC security status of SRV records
Kim Alvefur <zash@zash.se>
parents:
12813
diff
changeset
|
124 if self.extra then |
3bfb2f9e13af
net.resolvers.service: Record DNSSEC security status of SRV records
Kim Alvefur <zash@zash.se>
parents:
12813
diff
changeset
|
125 self.extra.srv_secure = answer.secure; |
3bfb2f9e13af
net.resolvers.service: Record DNSSEC security status of SRV records
Kim Alvefur <zash@zash.se>
parents:
12813
diff
changeset
|
126 end |
11710
26a8cc9d9eb7
net.resolvers.service: Only do DANE with secure SRV records
Kim Alvefur <zash@zash.se>
parents:
10970
diff
changeset
|
127 |
9393
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9392
diff
changeset
|
128 if #answer == 0 then |
9394
bcd94cc355d3
net.resolvers.service: Add support for fallback to bare domain and default port
Kim Alvefur <zash@zash.se>
parents:
9393
diff
changeset
|
129 if self.extra and self.extra.default_port then |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
130 self.resolver = basic.new(self.hostname, self.extra.default_port, self.conn_type, self.extra); |
11901
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
131 else |
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
132 self.last_error = "zero SRV records found"; |
9394
bcd94cc355d3
net.resolvers.service: Add support for fallback to bare domain and default port
Kim Alvefur <zash@zash.se>
parents:
9393
diff
changeset
|
133 end |
9393
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9392
diff
changeset
|
134 ready(); |
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9392
diff
changeset
|
135 return; |
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9392
diff
changeset
|
136 end |
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9392
diff
changeset
|
137 |
9392
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9388
diff
changeset
|
138 if #answer == 1 and answer[1].srv.target == "." then -- No service here |
11901
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
139 self.last_error = "service explicitly unavailable"; |
9392
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9388
diff
changeset
|
140 ready(); |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9388
diff
changeset
|
141 return; |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9388
diff
changeset
|
142 end |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9388
diff
changeset
|
143 |
12401
c029ddcad258
net.resolvers.service: Honour record 'weight' when picking SRV targets
Matthew Wild <mwild1@gmail.com>
parents:
12129
diff
changeset
|
144 self._get_next_target = new_target_selector(answer); |
11901
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
145 else |
26406ce35e20
net.connect: Propagate last error message from resolvers
Kim Alvefur <zash@zash.se>
parents:
11710
diff
changeset
|
146 self.last_error = err; |
8531
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 ready(); |
9395
794eda565c69
net.resolvers.service: Rename internal variable since net.connect uses it for __tostring
Kim Alvefur <zash@zash.se>
parents:
9394
diff
changeset
|
149 end, "_" .. self.service .. "._" .. self.conn_type .. "." .. self.hostname, "SRV", "IN"); |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 |
9395
794eda565c69
net.resolvers.service: Rename internal variable since net.connect uses it for __tostring
Kim Alvefur <zash@zash.se>
parents:
9394
diff
changeset
|
152 local function new(hostname, service, conn_type, extra) |
10440
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
153 local is_ip = inet_pton(hostname); |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
154 if not is_ip and hostname:sub(1,1) == '[' then |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
155 is_ip = inet_pton(hostname:sub(2,-2)); |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
156 end |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
157 if is_ip and extra and extra.default_port then |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
158 return basic.new(hostname, extra.default_port, conn_type, extra); |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
159 end |
1ee87b4979c2
net.resolvers.service: Pass IP literals directly to basic resolver
Kim Alvefur <zash@zash.se>
parents:
10401
diff
changeset
|
160 |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 return setmetatable({ |
10384
94c9c574cd8a
net.resolvers: Apply IDNA conversion to ascii for DNS lookups (fixes #1426)
Kim Alvefur <zash@zash.se>
parents:
9397
diff
changeset
|
162 hostname = idna_to_ascii(hostname); |
9388
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8775
diff
changeset
|
163 service = service; |
8531
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 conn_type = conn_type or "tcp"; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 extra = extra; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 }, resolver_mt); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 return { |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 new = new; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 }; |