# HG changeset patch # User Kim Alvefur # Date 1638125125 -3600 # Node ID aaa6f412dce35586d796fb76294d7dcbd51a7ac8 # Parent 9d57aa79c5d9c9a0f9c8771cb4d765e21ab11bc6 mod_bind2: Experimental implementation of XEP-0386: Bind 2.0 Needless to say, completely untested diff -r 9d57aa79c5d9 -r aaa6f412dce3 mod_bind2/mod_bind2.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_bind2/mod_bind2.lua Sun Nov 28 19:45:25 2021 +0100 @@ -0,0 +1,51 @@ +local mm = require "core.modulemanager"; +local sm = require "core.sessionmanager"; + +local xmlns_bind2 --[[]] = "urn:xmpp:bind2:0"; +local xmlns_carbons --[[]] = "urn:xmpp:carbons:2"; + +module:depends("sasl2"); +module:depends("carbons"); + +module:hook_tag(xmlns_sasl2, "authenticate", function (session, auth) + session.bind2 = auth:get_child("bind", xmlns_bind2); +end, 1); + +module:hook("sasl2/c2s/success", function (event) + local session = event.session; + if not session.bind2 then return end + + -- When it receives a bind 2.0 on an authenticated not-yet-bound session, the + -- server MUST: + + -- Clear the offline messages for this user, if any, without sending them (as + -- they will be provided by MAM). + if mm.is_loaded(module.host, "offline") then + -- TODO + end + + -- Perform resource binding to a random resource (see 6120) + if not sm.bind_resource(session, nil) then + -- FIXME How should this be handled even? + session:close("reset"); + return true; + end + + -- Work out which contacts have unread messages in the user's MAM archive, + -- how many, and what the id of the last read message is + -- XXX How do we know what the last read message was? + -- TODO archive:summary(session.username, { after = ??? }); + + -- Get the id of the newest stanza in the user's MAM archive + -- TODO archive:find(session.username, { reverse = true, limit = 1 }); + + -- Silently enable carbons for this session + session.carbons = xmlns_carbons; + + -- After processing the bind stanza, as above, the server MUST respond with + -- an element of type 'bound' in the namespace 'urn:xmpp:bind2:0', as in the + -- below example + event.success:tag("bound", xmlns_bind2):text_tag("jid", session.full_jid):up(); + + session.bind2 = nil; +end);