Comparison

plugins/mod_dialback.lua @ 3533:0385b9f29049

mod_dialback: Updated to use the new events API.
author Waqas Hussain <waqas20@gmail.com>
date Sat, 16 Oct 2010 07:06:16 +0500
parent 2923:b7049746bd29
child 3534:c68590b13a6d
comparison
equal deleted inserted replaced
3532:4f2cd1c688e1 3533:0385b9f29049
21 local xmlns_stream = "http://etherx.jabber.org/streams"; 21 local xmlns_stream = "http://etherx.jabber.org/streams";
22 local xmlns_dialback = "jabber:server:dialback"; 22 local xmlns_dialback = "jabber:server:dialback";
23 23
24 local dialback_requests = setmetatable({}, { __mode = 'v' }); 24 local dialback_requests = setmetatable({}, { __mode = 'v' });
25 25
26 module:add_handler({"s2sin_unauthed", "s2sin"}, "verify", xmlns_dialback, 26 module:hook("stanza/jabber:server:dialback:verify", function(event)
27 function (origin, stanza) 27 local origin, stanza = event.origin, event.stanza;
28
29 if origin.type == "s2sin_unauthed" or origin.type == "s2sin" then
28 -- We are being asked to verify the key, to ensure it was generated by us 30 -- We are being asked to verify the key, to ensure it was generated by us
29 origin.log("debug", "verifying that dialback key is ours..."); 31 origin.log("debug", "verifying that dialback key is ours...");
30 local attr = stanza.attr; 32 local attr = stanza.attr;
31 -- COMPAT: Grr, ejabberd breaks this one too?? it is black and white in XEP-220 example 34 33 -- COMPAT: Grr, ejabberd breaks this one too?? it is black and white in XEP-220 example 34
32 --if attr.from ~= origin.to_host then error("invalid-from"); end 34 --if attr.from ~= origin.to_host then error("invalid-from"); end
37 type = "invalid" 39 type = "invalid"
38 origin.log("warn", "Asked to verify a dialback key that was incorrect. An imposter is claiming to be %s?", attr.to); 40 origin.log("warn", "Asked to verify a dialback key that was incorrect. An imposter is claiming to be %s?", attr.to);
39 end 41 end
40 origin.log("debug", "verified dialback key... it is %s", type); 42 origin.log("debug", "verified dialback key... it is %s", type);
41 origin.sends2s(st.stanza("db:verify", { from = attr.to, to = attr.from, id = attr.id, type = type }):text(stanza[1])); 43 origin.sends2s(st.stanza("db:verify", { from = attr.to, to = attr.from, id = attr.id, type = type }):text(stanza[1]));
42 end); 44 return true;
45 end
46 end);
43 47
44 module:add_handler({ "s2sin_unauthed", "s2sin" }, "result", xmlns_dialback, 48 module:hook("stanza/jabber:server:dialback:result", function(event)
45 function (origin, stanza) 49 local origin, stanza = event.origin, event.stanza;
50
51 if origin.type == "s2sin_unauthed" or origin.type == "s2sin" then
46 -- he wants to be identified through dialback 52 -- he wants to be identified through dialback
47 -- We need to check the key with the Authoritative server 53 -- We need to check the key with the Authoritative server
48 local attr = stanza.attr; 54 local attr = stanza.attr;
49 origin.hosts[attr.from] = { dialback_key = stanza[1] }; 55 origin.hosts[attr.from] = { dialback_key = stanza[1] };
50 56
51 if not hosts[attr.to] then 57 if not hosts[attr.to] then
52 -- Not a host that we serve 58 -- Not a host that we serve
53 origin.log("info", "%s tried to connect to %s, which we don't serve", attr.from, attr.to); 59 origin.log("info", "%s tried to connect to %s, which we don't serve", attr.from, attr.to);
54 origin:close("host-unknown"); 60 origin:close("host-unknown");
55 return; 61 return true;
56 end 62 end
57 63
58 dialback_requests[attr.from] = origin; 64 dialback_requests[attr.from] = origin;
59 65
60 if not origin.from_host then 66 if not origin.from_host then
67 end 73 end
68 74
69 origin.log("debug", "asking %s if key %s belongs to them", attr.from, stanza[1]); 75 origin.log("debug", "asking %s if key %s belongs to them", attr.from, stanza[1]);
70 send_s2s(attr.to, attr.from, 76 send_s2s(attr.to, attr.from,
71 st.stanza("db:verify", { from = attr.to, to = attr.from, id = origin.streamid }):text(stanza[1])); 77 st.stanza("db:verify", { from = attr.to, to = attr.from, id = origin.streamid }):text(stanza[1]));
72 end); 78 return true;
79 end
80 end);
73 81
74 module:add_handler({ "s2sout_unauthed", "s2sout" }, "verify", xmlns_dialback, 82 module:hook("stanza/jabber:server:dialback:verify", function(event)
75 function (origin, stanza) 83 local origin, stanza = event.origin, event.stanza;
84
85 if origin.type == "s2sout_unauthed" or origin.type == "s2sout" then
76 local attr = stanza.attr; 86 local attr = stanza.attr;
77 local dialback_verifying = dialback_requests[attr.from]; 87 local dialback_verifying = dialback_requests[attr.from];
78 if dialback_verifying then 88 if dialback_verifying then
79 local valid; 89 local valid;
80 if attr.type == "valid" then 90 if attr.type == "valid" then
92 st.stanza("db:result", { from = attr.to, to = attr.from, id = attr.id, type = valid }) 102 st.stanza("db:result", { from = attr.to, to = attr.from, id = attr.id, type = valid })
93 :text(dialback_verifying.hosts[attr.from].dialback_key)); 103 :text(dialback_verifying.hosts[attr.from].dialback_key));
94 end 104 end
95 dialback_requests[attr.from] = nil; 105 dialback_requests[attr.from] = nil;
96 end 106 end
97 end); 107 return true;
108 end
109 end);
98 110
99 module:add_handler({ "s2sout_unauthed", "s2sout" }, "result", xmlns_dialback, 111 module:hook("stanza/jabber:server:dialback:result", function(event)
100 function (origin, stanza) 112 local origin, stanza = event.origin, event.stanza;
113
114 if origin.type == "s2sout_unauthed" or origin.type == "s2sout" then
101 -- Remote server is telling us whether we passed dialback 115 -- Remote server is telling us whether we passed dialback
102 116
103 local attr = stanza.attr; 117 local attr = stanza.attr;
104 if not hosts[attr.to] then 118 if not hosts[attr.to] then
105 origin:close("host-unknown"); 119 origin:close("host-unknown");
106 return; 120 return true;
107 elseif hosts[attr.to].s2sout[attr.from] ~= origin then 121 elseif hosts[attr.to].s2sout[attr.from] ~= origin then
108 -- This isn't right 122 -- This isn't right
109 origin:close("invalid-id"); 123 origin:close("invalid-id");
110 return; 124 return true;
111 end 125 end
112 if stanza.attr.type == "valid" then 126 if stanza.attr.type == "valid" then
113 s2s_make_authenticated(origin, attr.from); 127 s2s_make_authenticated(origin, attr.from);
114 else 128 else
115 s2s_destroy_session(origin) 129 s2s_destroy_session(origin)
116 end 130 end
117 end); 131 return true;
132 end
133 end);
118 134
119 module:hook_stanza(xmlns_stream, "features", function (origin, stanza) 135 module:hook_stanza(xmlns_stream, "features", function (origin, stanza)
120 s2s_initiate_dialback(origin); 136 s2s_initiate_dialback(origin);
121 return true; 137 return true;
122 end, 100); 138 end, 100);