Software /
code /
prosody-modules
Comparison
mod_pubsub_googlecode/mod_pubsub_googlecode.lua @ 946:2c5430ff1c11
mod_pubsub_googlecode: Module to receive post-commit webhook requests from Google Code Hosting
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 03 Apr 2013 15:14:16 +0100 |
child | 948:79b4a1db7a57 |
comparison
equal
deleted
inserted
replaced
945:dbcbcec37d24 | 946:2c5430ff1c11 |
---|---|
1 module:depends("http"); | |
2 | |
3 local st = require "util.stanza"; | |
4 local json = require "util.json"; | |
5 local formdecode = require "net.http".formdecode; | |
6 local hmac = require "util.hmac"; | |
7 local st = require "util.stanza"; | |
8 local json = require "util.json"; | |
9 local datetime = require "util.datetime".datetime; | |
10 | |
11 | |
12 local pubsub_service = module:depends("pubsub").service; | |
13 | |
14 local node = module:get_option_string("googlecode_node", "googlecode"); | |
15 local auth_key = module:get_option_string("googlecode_auth_key"); | |
16 | |
17 if not auth_key then | |
18 module:log("warn", "Specify googlecode_auth_key to prevent commit spoofing!"); | |
19 end | |
20 | |
21 function handle_POST(event) | |
22 local request = event.request; | |
23 local body = request.body; | |
24 | |
25 if auth_key then | |
26 local digest_header = request.headers["google-code-project-hosting-hook-hmac"]; | |
27 local digest = hmac.md5(auth_key, body, true); | |
28 if digest ~= digest_header then | |
29 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)); | |
30 return "No thanks."; | |
31 end | |
32 end | |
33 | |
34 local data = json.decode(body); | |
35 | |
36 local project = data.project_name or "somewhere"; | |
37 for _, rev in ipairs(data.revisions) do | |
38 if rev.url:match("^http://wiki.") then | |
39 local what; | |
40 for _, page in ipairs(rev.added) do | |
41 what = page:match("^/(.-)%.wiki"); | |
42 if what then break; end | |
43 end | |
44 if not what then | |
45 for _, page in ipairs(rev.modified) do | |
46 what = page:match("^/(.-)%.wiki"); | |
47 if what then break; end | |
48 end | |
49 end | |
50 rev.message = "wiki ("..(what or "unknown page").."): "..rev.message; | |
51 end | |
52 | |
53 local ok, err = pubsub_service:publish(node, true, project, | |
54 st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "project" }) | |
55 :tag("entry", { xmlns = "http://www.w3.org/2005/Atom" }) | |
56 :tag("id"):text(tostring(rev.revision)):up() | |
57 :tag("title"):text(rev.message):up() | |
58 :tag("link", { rel = "alternate", href = rev.url }):up() | |
59 :tag("published"):text(datetime(rev.timestamp)):up() | |
60 :tag("author") | |
61 :tag("name"):text(rev.author):up() | |
62 :up() | |
63 ); | |
64 end | |
65 module:log("debug", "Handled POST: \n%s\n", tostring(body)); | |
66 return "Thank you Google!"; | |
67 end | |
68 | |
69 module:provides("http", { | |
70 route = { | |
71 POST = handle_POST; | |
72 }; | |
73 }); | |
74 | |
75 function module.load() | |
76 if not pubsub_service.nodes[node] then | |
77 local ok, err = pubsub_service:create(node, true); | |
78 if not ok then | |
79 module:log("error", "Error creating node: %s", err); | |
80 else | |
81 module:log("debug", "Node %q created", node); | |
82 end | |
83 end | |
84 end |