Mercurial > prosody-modules
view mod_pubsub_googlecode/mod_pubsub_googlecode.lua @ 1268:854a3933cfcd
mod_muc_log_http: URL-encode room names. This allows special characters in room names to work. Ideally this escaping shouldn’t be done in the user visible content, but the module’s template system doesn’t currently allow that.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 04 Jan 2014 16:50:57 -0500 |
parents | d988f2db9773 |
children | 7dbde05b48a9 |
line wrap: on
line source
module:depends("http"); local st = require "util.stanza"; local json = require "util.json"; local formdecode = require "net.http".formdecode; local hmac_md5 = require "util.hashes".hmac_md5; local st = require "util.stanza"; local json = require "util.json"; local datetime = require "util.datetime".datetime; local pubsub_service = module:depends("pubsub").service; local node = module:get_option_string("googlecode_node", "googlecode"); local auth_key = module:get_option_string("googlecode_auth_key"); if not auth_key then module:log("warn", "Specify googlecode_auth_key to prevent commit spoofing!"); end function handle_POST(event) local request = event.request; local body = request.body; if auth_key then local digest_header = request.headers["google-code-project-hosting-hook-hmac"]; local digest = hmac_md5(auth_key, body, true); if digest ~= digest_header then module:log("warn", "Commit POST failed authentication check, sender gave %s, we got %s, body was:\n%s", tostring(digest_header), tostring(digest), tostring(body)); return "No thanks."; end end local data = json.decode(body); local project = data.project_name or "somewhere"; for _, rev in ipairs(data.revisions) do if rev.url:match("^http://wiki.") then local what; for _, page in ipairs(rev.added) do what = page:match("^/(.-)%.wiki"); if what then break; end end if not what then for _, page in ipairs(rev.modified) do what = page:match("^/(.-)%.wiki"); if what then break; end end end rev.message = "wiki ("..(what or "unknown page").."): "..rev.message; end local name = rev.author; local email = name:match("<([^>]+)>$"); if email then name = name:gsub("%s*<[^>]+>$", ""); end local ok, err = pubsub_service:publish(node, true, project, st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = project }) :tag("entry", { xmlns = "http://www.w3.org/2005/Atom" }) :tag("id"):text(tostring(rev.revision)):up() :tag("title"):text(rev.message):up() :tag("link", { rel = "alternate", href = rev.url }):up() :tag("published"):text(datetime(rev.timestamp)):up() :tag("author") :tag("name"):text(name):up() :tag("email"):text(email):up() :up() ); end module:log("debug", "Handled POST: \n%s\n", tostring(body)); return "Thank you Google!"; end module:provides("http", { route = { POST = handle_POST; }; }); function module.load() if not pubsub_service.nodes[node] then local ok, err = pubsub_service:create(node, true); if not ok then module:log("error", "Error creating node: %s", err); else module:log("debug", "Node %q created", node); end end end