comparison mod_atom/mod_atom.lua @ 3241:4b52cafd5811

mod_atom: Update to the new mod_pep This takes advantage of the many improvements to PEP added to Prosody recently. Such as support for multiple items and access control.
author Kim Alvefur <zash@zash.se>
date Mon, 20 Aug 2018 12:39:37 +0200
parents 4915b8223b07
children 119e22ccd64a
comparison
equal deleted inserted replaced
3240:c30f2cfe9f15 3241:4b52cafd5811
1 -- HTTP Access to PEP -> microblog 1 -- HTTP Access to PEP -> microblog
2 -- By Kim Alvefur <zash@zash.se> 2 -- By Kim Alvefur <zash@zash.se>
3 3
4 module:depends"http"; 4 local mod_pep = module:depends"pep";
5 module:depends"pep"; 5
6 local nodeprep = require "util.encodings".stringprep.nodeprep; 6 local nodeprep = require "util.encodings".stringprep.nodeprep;
7 local st = require "util.stanza"; 7 local st = require "util.stanza";
8 local host, hosts = module.host, hosts;
9 8
10 local function handle_request(event, path) 9 module:depends("http")
11 local response = event.response;
12
13 local user = nodeprep(path);
14 if not user then return 400 end
15 local jid = user .. "@" .. host;
16
17 local pep_data = hosts[host].modules.pep.module.save();
18 if not pep_data.data[jid] or
19 not pep_data.data[jid]["urn:xmpp:microblog:0"] then
20 return 404;
21 end
22
23 local microblogdata = pep_data.data[jid]["urn:xmpp:microblog:0"][2]:get_child("entry", "http://www.w3.org/2005/Atom");
24 if not microblogdata then return 404; end
25 local feed = st.stanza("feed", { xmlns="http://www.w3.org/2005/Atom" } );
26 local source = microblogdata:get_child("source");
27 if source then
28 for i = 1,#source do
29 feed:add_child(source[i]):up();
30 end
31 for i = 1,#microblogdata do
32 if microblogdata[i].name == "source" then
33 table.remove(microblogdata, i);
34 break
35 end
36 end
37 end
38 feed:add_child(microblogdata);
39 response.headers.content_type = "application/atom+xml";
40 return "<?xml version='1.0' encoding='utf-8'?>" .. tostring(feed) .. "\n";
41 end
42
43 module:provides("http", { 10 module:provides("http", {
44 route = { 11 route = {
45 ["GET /*"] = handle_request; 12 ["GET /*"] = function (event, user)
46 }; 13 local actor = event.request.ip;
14
15 user = nodeprep(user);
16 if not user then return 400; end
17
18 local pubsub_service = mod_pep.get_pep_service(user);
19 local ok, items = pubsub_service:get_items("urn:xmpp:microblog:0", actor);
20 if ok then
21 event.response.headers.content_type = "application/atom+xml";
22 local feed = st.stanza("feed", { xmlns = "http://www.w3.org/2005/Atom" });
23 for i = #items, 1, -1 do
24 feed:add_direct_child(items[items[i]].tags[1]);
25 end
26 return tostring(feed);
27 elseif items == "forbidden" then
28 return 403;
29 elseif items == "item-not-found" then
30 return 404;
31 end
32 end;
33 }
47 }); 34 });