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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local st = require "util.stanza";
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local jid_bare = require "util.jid".bare;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local jid_split = require "util.jid".split;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local xmlns_carbons = "urn:xmpp:carbons:1";
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local xmlns_forward = "urn:xmpp:forward:0";
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local host_sessions = hosts[module.host].sessions;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 module:hook("iq/self/"..xmlns_carbons..":enable", function(event)
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local origin, stanza = event.origin, event.stanza;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 if stanza.attr.type == "set" then
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 module:log("debug", "%s enabled carbons", origin.full_jid);
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 origin.want_carbons = true;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 origin.send(st.reply(stanza));
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 return true
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 end);
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 module:hook("iq/self/"..xmlns_carbons..":disable", function(event)
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 local origin, stanza = event.origin, event.stanza;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 if stanza.attr.type == "set" then
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 module:log("debug", "%s disabled carbons", origin.full_jid);
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 origin.want_carbons = nil;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 origin.send(st.reply(stanza));
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 return true
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 end);
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 local origin, stanza = event.origin, event.stanza;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 local orig_type = stanza.attr.type;
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 if not (orig_type == nil
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 or orig_type == "normal"
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 bare_jid = (origin.username.."@"..origin.host)
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 -- Stanzas sent by local clients
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 module:hook("pre-message/bare", c2s_message_handler, 1);
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
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
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111
f28a3f260fc2 mod_carbons: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 module:add_feature(xmlns_carbons);