annotate mod_post_msg/mod_post_msg.lua @ 2712:d89ab70808f6

mod_cloud_notify: fix bug when multiple resources are used This bug was triggered under the rare circumstances that a message arrived and one resource was smacks hibernated while the other one(s) were offline. Then only the hibernated resource but not the offline one(s) (or the other way round) got notified.
author tmolitor <thilo@eightysoft.de>
date Mon, 08 May 2017 18:24:29 +0200
parents a0375f84d65a
children 926aaaeb0d21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
661
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
1 module:depends"http"
216
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local jid_split = require "util.jid".split;
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local jid_prep = require "util.jid".prep;
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local msg = require "util.stanza".message;
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local test_password = require "core.usermanager".test_password;
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local b64_decode = require "util.encodings".base64.decode;
661
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
8 local formdecode = require "net.http".formdecode;
1302
e556219cb43d mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents: 661
diff changeset
9 local xml = require"util.xml";
216
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
661
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
11 local function require_valid_user(f)
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
12 return function(event, path)
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
13 local request = event.request;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
14 local response = event.response;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
15 local headers = request.headers;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
16 if not headers.authorization then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
17 response.headers.www_authenticate = ("Basic realm=%q"):format(module.host.."/"..module.name);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
18 return 401
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
19 end
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
20 local from_jid, password = b64_decode(headers.authorization:match"[^ ]*$"):match"([^:]*):(.*)";
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
21 from_jid = jid_prep(from_jid);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
22 if from_jid and password then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
23 local user, host = jid_split(from_jid);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
24 local ok, err = test_password(user, host, password);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
25 if ok and user and host then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
26 module:log("debug", "Authed as %s", from_jid);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
27 return f(event, path, from_jid);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
28 elseif err then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
29 module:log("debug", "User failed authentication: %s", err);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
30 end
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
31 end
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
32 return 401
321
661f64627fed mod_post_msg: Add compatibility with usermanager in 0.7
Kim Alvefur <zash@zash.se>
parents: 320
diff changeset
33 end
661f64627fed mod_post_msg: Add compatibility with usermanager in 0.7
Kim Alvefur <zash@zash.se>
parents: 320
diff changeset
34 end
661f64627fed mod_post_msg: Add compatibility with usermanager in 0.7
Kim Alvefur <zash@zash.se>
parents: 320
diff changeset
35
661
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
36 local function handle_post(event, path, authed_user)
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
37 local request = event.request;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
38 local response = event.response;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
39 local headers = request.headers;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
40
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
41 local body_type = headers.content_type;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
42 local to = jid_prep(path);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
43 local message;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
44 if body_type == "text/plain" then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
45 if to and request.body then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
46 message = msg({ to = to, from = authed_user, type = "chat"},request.body);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
47 end
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
48 elseif body_type == "application/x-www-form-urlencoded" then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
49 local post_body = formdecode(request.body);
1302
e556219cb43d mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents: 661
diff changeset
50 message = msg({ to = post_body.to or to, from = authed_user,
1417
9b6fbababb8c mod_post_msg: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 1302
diff changeset
51 type = post_body.type or "chat"}, post_body.body);
1302
e556219cb43d mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents: 661
diff changeset
52 if post_body.html then
1418
a0375f84d65a mod_post_msg: Add <body> wrapper tag with namespace in module so the client doesn't have to
Kim Alvefur <zash@zash.se>
parents: 1417
diff changeset
53 local html, err = xml.parse([[<body xmlns="http://www.w3.org/1999/xhtml">]]..post_body.html..[[</body>]]);
1417
9b6fbababb8c mod_post_msg: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 1302
diff changeset
54 if not html then
9b6fbababb8c mod_post_msg: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 1302
diff changeset
55 module:log("warn", "mod_post_msg: invalid XML: %s", err);
9b6fbababb8c mod_post_msg: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 1302
diff changeset
56 return 400;
9b6fbababb8c mod_post_msg: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 1302
diff changeset
57 end
9b6fbababb8c mod_post_msg: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 1302
diff changeset
58 message:tag("html", {xmlns="http://jabber.org/protocol/xhtml-im"}):add_child(html):up();
1302
e556219cb43d mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents: 661
diff changeset
59 end
661
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
60 else
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
61 return 415;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
62 end
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
63 if message and message.attr.to then
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
64 module:log("debug", "Sending %s", tostring(message));
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
65 module:send(message);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
66 return 201;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
67 end
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
68 return 422;
216
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end
ac5289d5ac8c mod_post_msg: A plugin that recives a single message by HTTP POST and relays it.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70
661
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
71 module:provides("http", {
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
72 default_path = "/msg";
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
73 route = {
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
74 ["POST /*"] = require_valid_user(handle_post);
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
75 OPTIONS = function(e)
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
76 local headers = e.response.headers;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
77 headers.allow = "POST";
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
78 headers.accept = "application/x-www-form-urlencoded, text/plain";
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
79 return 200;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
80 end;
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
81 }
a6c8f252e5fa mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents: 321
diff changeset
82 });