Software /
code /
prosody-modules
Comparison
mod_pubsub_post/mod_pubsub_post.lua @ 3017:8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 20 May 2018 02:56:48 +0200 |
parent | 3016:3f4e2340bfdc |
child | 3018:727a8beeb5c3 |
comparison
equal
deleted
inserted
replaced
3016:3f4e2340bfdc | 3017:8e48c0b233e0 |
---|---|
13 ["item-not-found"] = 404; | 13 ["item-not-found"] = 404; |
14 ["internal-server-error"] = 500; | 14 ["internal-server-error"] = 500; |
15 ["conflict"] = 409; | 15 ["conflict"] = 409; |
16 }; | 16 }; |
17 | 17 |
18 local function publish_payload(node, item_id, payload) | 18 local function publish_payload(node, actor, item_id, payload) |
19 local post_item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = item_id, }) | 19 local post_item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = item_id, }) |
20 :add_child(payload); | 20 :add_child(payload); |
21 local ok, err = pubsub_service:publish(node, true, item_id, post_item); | 21 local ok, err = pubsub_service:publish(node, actor, item_id, post_item); |
22 module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); | 22 module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); |
23 if not ok then | 23 if not ok then |
24 return error_mapping[err] or 500; | 24 return error_mapping[err] or 500; |
25 end | 25 end |
26 return 202; | 26 return 202; |
27 end | 27 end |
28 | 28 |
29 local function handle_json(node, data) | 29 local function handle_json(node, actor, data) |
30 local parsed, err = json.decode(data); | 30 local parsed, err = json.decode(data); |
31 if not parsed then | 31 if not parsed then |
32 return { status_code = 400; body = tostring(err); } | 32 return { status_code = 400; body = tostring(err); } |
33 end | 33 end |
34 if type(parsed) ~= "table" then | 34 if type(parsed) ~= "table" then |
35 return { status_code = 400; body = "object or array expected"; }; | 35 return { status_code = 400; body = "object or array expected"; }; |
36 end | 36 end |
37 local wrapper = st.stanza("json", { xmlns="urn:xmpp:json:0" }):text(data); | 37 local wrapper = st.stanza("json", { xmlns="urn:xmpp:json:0" }):text(data); |
38 return publish_payload(node, data.id or "current", wrapper); | 38 return publish_payload(node, actor, data.id or "current", wrapper); |
39 end | 39 end |
40 | 40 |
41 local function publish_atom(node, feed) | 41 local function publish_atom(node, actor, feed) |
42 for entry in feed:childtags("entry") do | 42 for entry in feed:childtags("entry") do |
43 local item_id = entry:get_child_text("id"); | 43 local item_id = entry:get_child_text("id"); |
44 if not item_id then | 44 if not item_id then |
45 item_id = uuid_generate(); | 45 item_id = uuid_generate(); |
46 entry:tag("id"):text(item_id):up(); | 46 entry:tag("id"):text(item_id):up(); |
47 end | 47 end |
48 if not entry:get_child_text("published") then | 48 if not entry:get_child_text("published") then |
49 entry:tag("published"):text(timestamp_generate()):up(); | 49 entry:tag("published"):text(timestamp_generate()):up(); |
50 end | 50 end |
51 local resp = publish_payload(node, item_id, entry); | 51 local resp = publish_payload(node, actor, item_id, entry); |
52 if resp ~= 202 then return resp; end | 52 if resp ~= 202 then return resp; end |
53 end | 53 end |
54 return 202; | 54 return 202; |
55 end | 55 end |
56 | 56 |
57 local function handle_xml(node, payload) | 57 local function handle_xml(node, actor, payload) |
58 local xmlpayload, err = xml.parse(payload); | 58 local xmlpayload, err = xml.parse(payload); |
59 if not xmlpayload then | 59 if not xmlpayload then |
60 module:log("debug", "XML parse error: %s\n%q", err, payload); | 60 module:log("debug", "XML parse error: %s\n%q", err, payload); |
61 return { status_code = 400, body = tostring(err) }; | 61 return { status_code = 400, body = tostring(err) }; |
62 end | 62 end |
63 if xmlpayload.attr.xmlns == "http://www.w3.org/2005/Atom" and xmlpayload.name == "feed" then | 63 if xmlpayload.attr.xmlns == "http://www.w3.org/2005/Atom" and xmlpayload.name == "feed" then |
64 return publish_atom(node, xmlpayload); | 64 return publish_atom(node, actor, xmlpayload); |
65 else | 65 else |
66 return publish_payload(node, "current", xmlpayload); | 66 return publish_payload(node, actor, "current", xmlpayload); |
67 end | 67 end |
68 end | 68 end |
69 | 69 |
70 function handle_POST(event, path) | 70 function handle_POST(event, path) |
71 local request = event.request; | 71 local request = event.request; |
72 module:log("debug", "Handling POST: \n%s\n", tostring(request.body)); | 72 module:log("debug", "Handling POST: \n%s\n", tostring(request.body)); |
73 | 73 |
74 local content_type = request.headers.content_type or "application/octet-stream"; | 74 local content_type = request.headers.content_type or "application/octet-stream"; |
75 local actor = true; | |
75 | 76 |
76 if content_type == "application/xml" or content_type:sub(-4) == "+xml" then | 77 if content_type == "application/xml" or content_type:sub(-4) == "+xml" then |
77 return handle_xml(path, request.body); | 78 return handle_xml(path, actor, request.body); |
78 elseif content_type == "application/json" or content_type:sub(-5) == "+json" then | 79 elseif content_type == "application/json" or content_type:sub(-5) == "+json" then |
79 return handle_json(path, request.body); | 80 return handle_json(path, actor, request.body); |
80 end | 81 end |
81 | 82 |
82 module:log("debug", "Unsupported content-type: %q", content_type); | 83 module:log("debug", "Unsupported content-type: %q", content_type); |
83 return 415; | 84 return 415; |
84 end | 85 end |