Sat, 22 May 2010 01:48:31 +0200
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
1 | -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2710
diff
changeset
|
2 | -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2710
diff
changeset
|
3 | -- Copyright (C) 2008-2010 Waqas Hussain |
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
4 | -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
5 | -- This project is MIT/X11 licensed. Please see the |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
6 | -- COPYING file in the source package for more information. |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
7 | -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1208
diff
changeset
|
8 | |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | local server = require "net.server"; |
871
642af1bdf74e
net.adns: Load the correct dns lib
Matthew Wild <mwild1@gmail.com>
parents:
870
diff
changeset
|
10 | local dns = require "net.dns"; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | local log = require "util.logger".init("adns"); |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
14 | local t_insert, t_remove = table.insert, table.remove; |
973
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
15 | local coroutine, tostring, pcall = coroutine, tostring, pcall; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | |
2558
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
17 | local function dummy_send(sock, data, i, j) return (j-i)+1; end |
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
18 | |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | module "adns" |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 | |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | function lookup(handler, qname, qtype, qclass) |
1010
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
22 | return coroutine.wrap(function (peek) |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
23 | if peek then |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
24 | log("debug", "Records for %s already cached, using those...", qname); |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
25 | handler(peek); |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
26 | return; |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
27 | end |
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
28 | log("debug", "Records for %s not in cache, sending query (%s)...", qname, tostring(coroutine.running())); |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | dns.query(qname, qtype, qclass); |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
30 | coroutine.yield({ qclass or "IN", qtype or "A", qname, coroutine.running()}); -- Wait for reply |
1010
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
31 | log("debug", "Reply for %s (%s)", qname, tostring(coroutine.running())); |
973
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
32 | local ok, err = pcall(handler, dns.peek(qname, qtype, qclass)); |
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
33 | if not ok then |
1901
3c52b949e472
net.adns: Bump log-level of DNS handler errors to, er, 'error'
Matthew Wild <mwild1@gmail.com>
parents:
1788
diff
changeset
|
34 | log("error", "Error in DNS response handler: %s", tostring(err)); |
973
b091a1a7273b
net.adns: Catch errors in DNS response callbacks
Matthew Wild <mwild1@gmail.com>
parents:
886
diff
changeset
|
35 | end |
1010
0eed5db7758d
net.adns: Call handler for records already cached
Matthew Wild <mwild1@gmail.com>
parents:
980
diff
changeset
|
36 | end)(dns.peek(qname, qtype, qclass)); |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | end |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
39 | function cancel(handle, call_handler) |
1208
5f992ddc9685
Add log message when DNS lookup is cancelled
Matthew Wild <mwild1@gmail.com>
parents:
1207
diff
changeset
|
40 | log("warn", "Cancelling DNS lookup for %s", tostring(handle[3])); |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
41 | dns.cancel(handle); |
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
42 | if call_handler then |
1207
6842bacddfcb
net.adns: Fix for calling handler when cancelling DNS lookup
Matthew Wild <mwild1@gmail.com>
parents:
1203
diff
changeset
|
43 | coroutine.resume(handle[4]); |
1203
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
44 | end |
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
45 | end |
23725bfdeed5
net.adns: Add support for cancelling a non-blocking lookup, optionally calling the handler
Matthew Wild <mwild1@gmail.com>
parents:
1010
diff
changeset
|
46 | |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
47 | function new_async_socket(sock, resolver) |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
48 | local peername = "<unknown>"; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | local listener = {}; |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
50 | local handler = {}; |
2125
f107f0205793
net.adns: Update for new net.server API (doesn't work with libevent yet)
Matthew Wild <mwild1@gmail.com>
parents:
1901
diff
changeset
|
51 | function listener.onincoming(conn, data) |
2652
cbc58fc170ad
net.adns: Fix potential traceback on DNS responses with libevent enabled (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2578
diff
changeset
|
52 | if data then |
cbc58fc170ad
net.adns: Fix potential traceback on DNS responses with libevent enabled (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2578
diff
changeset
|
53 | dns.feed(handler, data); |
cbc58fc170ad
net.adns: Fix potential traceback on DNS responses with libevent enabled (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2578
diff
changeset
|
54 | end |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 | end |
2125
f107f0205793
net.adns: Update for new net.server API (doesn't work with libevent yet)
Matthew Wild <mwild1@gmail.com>
parents:
1901
diff
changeset
|
56 | function listener.ondisconnect(conn, err) |
2661
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
57 | if err then |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
58 | log("warn", "DNS socket for %s disconnected: %s", peername, err); |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
59 | local servers = resolver.server; |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
60 | if resolver.socketset[conn] == resolver.best_server and resolver.best_server == #servers then |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
61 | log("error", "Exhausted all %d configured DNS servers, next lookup will try %s again", #servers, servers[1]); |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
62 | end |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
63 | |
be4b1e796bd2
net.adns: Don't treat locally-initiated disconnects as fatal with libevent backend in use (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents:
2652
diff
changeset
|
64 | resolver:servfail(conn); -- Let the magic commence |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
65 | end |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 | end |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
67 | handler = server.wrapclient(sock, "dns", 53, listener); |
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
68 | if not handler then |
1787
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
69 | log("warn", "handler is nil"); |
c4dff34f3d32
net.adns: Utilise new net.dns API to handle DNS network errors
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
70 | end |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
71 | |
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
72 | handler.settimeout = function () end |
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
73 | handler.setsockname = function (_, ...) return sock:setsockname(...); end |
2558
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
74 | handler.setpeername = function (_, ...) peername = (...); local ret = sock:setpeername(...); _:set_send(dummy_send); return ret; end |
2556
50d1ba86a959
net.adns: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2232
diff
changeset
|
75 | handler.connect = function (_, ...) return sock:connect(...) end |
2558
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
76 | --handler.send = function (_, data) _:write(data); return _.sendbuffer and _.sendbuffer(); end |
0a65fc0c7bee
net.adns: Use different flavour of voodoo to make UDP sockets work smoothly with libevent (no packet merging)
Matthew Wild <mwild1@gmail.com>
parents:
2556
diff
changeset
|
77 | handler.send = function (_, data) return sock:send(data); end |
2232
aa8db84ae69d
net.adns: Some cleanup, happens to also make it compatible with libevent
Matthew Wild <mwild1@gmail.com>
parents:
2125
diff
changeset
|
78 | return handler; |
870
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 | end |
4fd5d8f1657c
net.adns: Add helper module for performing non-blocking DNS lookups
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | |
2578
61e5eff54415
net.dns, net.adns: Changed dns:socket_wrapper_set to dns.socket_wrapper_set for consistency.
Waqas Hussain <waqas20@gmail.com>
parents:
2558
diff
changeset
|
81 | dns.socket_wrapper_set(new_async_socket); |
872 | 82 | |
83 | return _M; |