# HG changeset patch # User Kim Alvefur # Date 1534761577 -7200 # Node ID 4b52cafd5811caccf711d2e1b3afa35b6c8d9731 # Parent c30f2cfe9f150cf9c4c674dcadf6289bf24e0ae8 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. diff -r c30f2cfe9f15 -r 4b52cafd5811 mod_atom/mod_atom.lua --- a/mod_atom/mod_atom.lua Sun Aug 19 17:53:05 2018 +0100 +++ b/mod_atom/mod_atom.lua Mon Aug 20 12:39:37 2018 +0200 @@ -1,47 +1,34 @@ -- HTTP Access to PEP -> microblog -- By Kim Alvefur -module:depends"http"; -module:depends"pep"; +local mod_pep = module:depends"pep"; + local nodeprep = require "util.encodings".stringprep.nodeprep; local st = require "util.stanza"; -local host, hosts = module.host, hosts; -local function handle_request(event, path) - local response = event.response; - - local user = nodeprep(path); - if not user then return 400 end - local jid = user .. "@" .. host; - - local pep_data = hosts[host].modules.pep.module.save(); - if not pep_data.data[jid] or - not pep_data.data[jid]["urn:xmpp:microblog:0"] then - return 404; - end - - local microblogdata = pep_data.data[jid]["urn:xmpp:microblog:0"][2]:get_child("entry", "http://www.w3.org/2005/Atom"); - if not microblogdata then return 404; end - local feed = st.stanza("feed", { xmlns="http://www.w3.org/2005/Atom" } ); - local source = microblogdata:get_child("source"); - if source then - for i = 1,#source do - feed:add_child(source[i]):up(); - end - for i = 1,#microblogdata do - if microblogdata[i].name == "source" then - table.remove(microblogdata, i); - break - end - end - end - feed:add_child(microblogdata); - response.headers.content_type = "application/atom+xml"; - return "" .. tostring(feed) .. "\n"; -end - +module:depends("http") module:provides("http", { route = { - ["GET /*"] = handle_request; - }; + ["GET /*"] = function (event, user) + local actor = event.request.ip; + + user = nodeprep(user); + if not user then return 400; end + + local pubsub_service = mod_pep.get_pep_service(user); + local ok, items = pubsub_service:get_items("urn:xmpp:microblog:0", actor); + if ok then + event.response.headers.content_type = "application/atom+xml"; + local feed = st.stanza("feed", { xmlns = "http://www.w3.org/2005/Atom" }); + for i = #items, 1, -1 do + feed:add_direct_child(items[items[i]].tags[1]); + end + return tostring(feed); + elseif items == "forbidden" then + return 403; + elseif items == "item-not-found" then + return 404; + end + end; + } });