Software /
code /
verse
File
plugins/legacy.lua @ 485:c9a144591649
component: Avoid adding to the global stream metatable
This allows component and client connections to be made side-by-side.
Previous to this change, loading this connection module would break the
ability to make client connections, due to overriding stream methods such as
:reopen() and :reset().
A next step would be to share the methods that the two connection modules have
in common.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 23 Mar 2023 18:56:32 +0000 |
parent | 457:73d4eb93657b |
child | 490:6b2f31da9610 |
line wrap: on
line source
local verse = require "verse"; local new_id = require "util.id".short; local xmlns_auth = "jabber:iq:auth"; function verse.plugins.legacy(stream) local function handle_auth_form(result) local query = result:get_child("query", xmlns_auth); if result.attr.type ~= "result" or not query then local type, cond, text = result:get_error(); stream:debug("warn", "%s %s: %s", type, cond, text); --stream:event("authentication-failure", { condition = cond }); -- COMPAT continue anyways end local auth_data = { username = stream.username; password = stream.password; resource = stream.resource or new_id(); digest = false, sequence = false, token = false; }; local request = verse.iq({ to = stream.host, type = "set" }) :tag("query", { xmlns = xmlns_auth }); if #query > 0 then for tag in query:childtags() do local field = tag.name; local value = auth_data[field]; if value then request:tag(field):text(auth_data[field]):up(); elseif value == nil then local cond = "feature-not-implemented"; stream:event("authentication-failure", { condition = cond }); return false; end end else -- COMPAT for servers not following XEP 78 for field, value in pairs(auth_data) do if value then request:tag(field):text(value):up(); end end end stream:send_iq(request, function (response) if response.attr.type == "result" then stream.resource = auth_data.resource; stream.jid = auth_data.username.."@"..stream.host.."/"..auth_data.resource; stream:event("authentication-success"); stream:event("bind-success", stream.jid); else local type, cond, text = response:get_error(); stream:event("authentication-failure", { condition = cond }); end end); end local function handle_opened(attr) if not attr.version then stream:send_iq(verse.iq({type="get"}) :tag("query", { xmlns = "jabber:iq:auth" }) :tag("username"):text(stream.username), handle_auth_form); end end stream:hook("opened", handle_opened); end