Mercurial > prosody-modules
annotate mod_carbons/mod_carbons.lua @ 737:e4ea03b060ed
mod_archive: switch from/to
The XEP-0136 is not very explicit about the meening of <from> and <to>
elements, but the examples are clear: <from> means it comes from the user in
the 'with' attribute of the collection.
That is the opposite of what is currently implemented in that module.
So for better compatibility with complient clients, this switch the 'from' and
'to' fields
| author | Olivier Goffart <ogoffart@woboq.com> |
|---|---|
| date | Wed, 04 Jul 2012 14:08:43 +0200 |
| parents | 2f11d2473afd |
| children | 5f7dd5336dbe |
| rev | line source |
|---|---|
|
521
6d0d2673f95e
mod_carbons: Add MIT license statement.
Kim Alvefur <zash@zash.se>
parents:
520
diff
changeset
|
1 -- XEP-0280: Message Carbons implementation for Prosody |
|
6d0d2673f95e
mod_carbons: Add MIT license statement.
Kim Alvefur <zash@zash.se>
parents:
520
diff
changeset
|
2 -- Copyright (C) 2011 Kim Alvefur |
|
6d0d2673f95e
mod_carbons: Add MIT license statement.
Kim Alvefur <zash@zash.se>
parents:
520
diff
changeset
|
3 -- |
|
6d0d2673f95e
mod_carbons: Add MIT license statement.
Kim Alvefur <zash@zash.se>
parents:
520
diff
changeset
|
4 -- This file is MIT/X11 licensed. |
|
6d0d2673f95e
mod_carbons: Add MIT license statement.
Kim Alvefur <zash@zash.se>
parents:
520
diff
changeset
|
5 |
| 462 | 6 local st = require "util.stanza"; |
| 7 local jid_bare = require "util.jid".bare; | |
| 8 local jid_split = require "util.jid".split; | |
| 9 local xmlns_carbons = "urn:xmpp:carbons:1"; | |
| 10 local xmlns_forward = "urn:xmpp:forward:0"; | |
| 11 local host_sessions = hosts[module.host].sessions; | |
| 12 | |
| 13 module:hook("iq/self/"..xmlns_carbons..":enable", function(event) | |
| 14 local origin, stanza = event.origin, event.stanza; | |
| 15 if stanza.attr.type == "set" then | |
| 16 module:log("debug", "%s enabled carbons", origin.full_jid); | |
| 17 origin.want_carbons = true; | |
| 18 origin.send(st.reply(stanza)); | |
| 19 return true | |
| 20 end | |
| 21 end); | |
| 22 | |
| 23 module:hook("iq/self/"..xmlns_carbons..":disable", function(event) | |
| 24 local origin, stanza = event.origin, event.stanza; | |
| 25 if stanza.attr.type == "set" then | |
| 26 module:log("debug", "%s disabled carbons", origin.full_jid); | |
| 27 origin.want_carbons = nil; | |
| 28 origin.send(st.reply(stanza)); | |
| 29 return true | |
| 30 end | |
| 31 end); | |
| 32 | |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
33 local function message_handler(event, c2s) |
| 462 | 34 local origin, stanza = event.origin, event.stanza; |
| 35 local orig_type = stanza.attr.type; | |
| 36 local orig_to = stanza.attr.to; | |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
37 local orig_from = stanza.attr.from; |
| 462 | 38 |
| 39 if not (orig_type == nil | |
| 40 or orig_type == "normal" | |
| 41 or orig_type == "chat") then | |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
42 return -- No carbons for messages of type error or headline |
| 462 | 43 end |
| 44 | |
| 45 local bare_jid, user_sessions; | |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
46 local no_carbon_to = {}; |
|
617
3ca933c9d8ff
mod_carbons: Make sure parameters to log() are strings.
Kim Alvefur <zash@zash.se>
parents:
606
diff
changeset
|
47 module:log("debug", "Message from %s to %s", tostring(orig_from), tostring(orig_to)); |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
48 if c2s then -- Stanza sent by a local client |
| 462 | 49 bare_jid = (origin.username.."@"..origin.host) |
| 50 user_sessions = host_sessions[origin.username]; | |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
51 else -- Stanza about to be delivered to a local client |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
52 local username, hostname, resource = jid_split(orig_to); |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
53 bare_jid = jid_bare(orig_to); |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
54 user_sessions = host_sessions[username]; |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
55 if resource then |
|
605
5175f6d33470
mod_carbons: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
585
diff
changeset
|
56 module:log("debug", "Message was to resource %s, it will not get carbon", resource); |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
57 no_carbon_to[resource] = true; |
|
585
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
58 elseif user_sessions then |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
59 local top_resources = user_sessions.top_resources; |
|
585
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
60 if top_resources then |
|
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
61 for _, session in ipairs(top_resources) do |
|
605
5175f6d33470
mod_carbons: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
585
diff
changeset
|
62 module:log("debug", "Not sending carbons to top resource %s", session.resource); |
|
585
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
63 no_carbon_to[session.resource] = true; |
|
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
64 end |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
65 end |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
66 end |
| 462 | 67 end |
| 68 | |
|
585
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
69 if not user_sessions then |
|
605
5175f6d33470
mod_carbons: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
585
diff
changeset
|
70 module:log("debug", "Skip carbons for offline user"); |
|
585
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
71 return -- No use in sending carbons to an offline user |
|
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
72 end |
|
ce2798a1bc56
mod_carbons: Don't try to send carbons for entirely offline users.
Kim Alvefur <zash@zash.se>
parents:
545
diff
changeset
|
73 |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
74 if not c2s and stanza:get_child("private", xmlns_carbons) then |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
75 stanza:maptags(function(tag) |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
76 return tag.attr.xmlns == xmlns_carbons |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
77 and tag.name == "private" and tag or nil; |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
78 end); |
|
605
5175f6d33470
mod_carbons: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
585
diff
changeset
|
79 module:log("debug", "Message tagged private, ignoring"); |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
80 return |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
81 end |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
82 |
|
664
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
83 local msg = st.clone(stanza); |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
84 msg.attr.xmlns = msg.attr.xmlns or "jabber:client"; |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
85 local fwd = st.message{ from = bare_jid, type = orig_type, } |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
86 :tag(c2s and "sent" or "received", { xmlns = xmlns_carbons }):up() |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
87 :tag("forwarded", { xmlns = xmlns_forward }) |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
88 :add_child(msg):reset(); |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
89 |
|
618
267548522810
mod_carbons: Remove useless protection against loop that can't happen
Kim Alvefur <zash@zash.se>
parents:
617
diff
changeset
|
90 user_sessions = user_sessions and user_sessions.sessions; |
|
267548522810
mod_carbons: Remove useless protection against loop that can't happen
Kim Alvefur <zash@zash.se>
parents:
617
diff
changeset
|
91 for resource, session in pairs(user_sessions) do |
|
267548522810
mod_carbons: Remove useless protection against loop that can't happen
Kim Alvefur <zash@zash.se>
parents:
617
diff
changeset
|
92 local full_jid = bare_jid .. "/" .. resource; |
|
664
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
93 if session.want_carbons and ((c2s and session ~= origin) or (not c2s and not no_carbon_to[resource])) then |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
94 fwd.attr.to = full_jid; |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
95 module:log("debug", "Sending carbon to %s", full_jid); |
|
2f11d2473afd
mod_carbons: Move creation of the carbon stanza out of the loop.
Kim Alvefur <zash@zash.se>
parents:
618
diff
changeset
|
96 session.send(fwd); |
| 462 | 97 end |
| 98 end | |
| 99 end | |
| 100 | |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
101 local function c2s_message_handler(event) |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
102 return message_handler(event, true) |
| 462 | 103 end |
| 104 | |
| 105 -- Stanzas sent by local clients | |
| 106 module:hook("pre-message/bare", c2s_message_handler, 1); | |
| 107 module:hook("pre-message/full", c2s_message_handler, 1); | |
|
510
59e80326f2b3
mod_carbons: Fix a typo and unindent a line.
Kim Alvefur <zash@zash.se>
parents:
480
diff
changeset
|
108 -- Stanzas to local clients |
|
480
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
109 module:hook("message/bare", message_handler, 1); |
|
0cef5be669de
mod_carbons: Consolidate message handlers
Kim Alvefur <zash@zash.se>
parents:
463
diff
changeset
|
110 module:hook("message/full", message_handler, 1); |
| 462 | 111 |
| 112 module:add_feature(xmlns_carbons); |
