author | Kim Alvefur <zash@zash.se> |
Wed, 05 Mar 2014 17:40:44 +0100 | |
changeset 1328 | 446fcda4ec45 |
parent 1302 | e556219cb43d |
child 1417 | 9b6fbababb8c |
permissions | -rw-r--r-- |
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, |
661
a6c8f252e5fa
mod_post_msg: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
321
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 |
e556219cb43d
mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents:
661
diff
changeset
|
53 |
local html, err = xml.parse(post_body.html); |
e556219cb43d
mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents:
661
diff
changeset
|
54 |
if not html then |
e556219cb43d
mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents:
661
diff
changeset
|
55 |
module:log("warn", "mod_post_msg: invalid XML: %s", err); |
e556219cb43d
mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents:
661
diff
changeset
|
56 |
return 400; |
e556219cb43d
mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents:
661
diff
changeset
|
57 |
end |
e556219cb43d
mod_post_msg: add support for HTML messages
Christian Weiske <cweiske@cweiske.de>
parents:
661
diff
changeset
|
58 |
message:tag("html", {xmlns="http://jabber.org/protocol/xhtml-im"}):add_child(html):up(); |
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 |
}); |