Mercurial > prosody-modules
comparison mod_pubsub_feed/mod_pubsub_feed.lua @ 325:4e50e591a7fc
mod_pubsub_feed: Implement signature verification
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 01 Feb 2011 00:24:19 +0100 |
| parents | 100b3ad2e10c |
| children | f42fe4229f8a |
comparison
equal
deleted
inserted
replaced
| 324:100b3ad2e10c | 325:4e50e591a7fc |
|---|---|
| 31 local st = require "util.stanza"; | 31 local st = require "util.stanza"; |
| 32 local httpserver = require "net.httpserver"; | 32 local httpserver = require "net.httpserver"; |
| 33 local formencode = require "net.http".formencode; | 33 local formencode = require "net.http".formencode; |
| 34 local dump = require "util.serialization".serialize; | 34 local dump = require "util.serialization".serialize; |
| 35 local uuid = require "util.uuid".generate; | 35 local uuid = require "util.uuid".generate; |
| 36 local hmac_sha1 = require "util.hmac".sha1; | |
| 36 | 37 |
| 37 local urldecode = require "net.http".urldecode; | 38 local urldecode = require "net.http".urldecode; |
| 38 local urlencode = require "net.http".urlencode; | 39 local urlencode = require "net.http".urlencode; |
| 39 local urlparams = --require "net.http".getQueryParams or whatever MattJ names it, FIXME | 40 local urlparams = --require "net.http".getQueryParams or whatever MattJ names it, FIXME |
| 40 function(s) | 41 function(s) |
| 163 return refresh_interval; | 164 return refresh_interval; |
| 164 end | 165 end |
| 165 | 166 |
| 166 function subscribe(feed) | 167 function subscribe(feed) |
| 167 feed.token = uuid(); | 168 feed.token = uuid(); |
| 169 feed.secret = uuid(); | |
| 168 local _body, body = { | 170 local _body, body = { |
| 169 ["hub.callback"] = "http://"..module.host..":5280/callback?node=" .. urlencode(feed.node); --FIXME figure out your own hostname reliably? | 171 ["hub.callback"] = "http://"..module.host..":5280/callback?node=" .. urlencode(feed.node); --FIXME figure out your own hostname reliably? |
| 170 ["hub.mode"] = "subscribe"; --TODO unsubscribe | 172 ["hub.mode"] = "subscribe"; --TODO unsubscribe |
| 171 ["hub.topic"] = feed.url; | 173 ["hub.topic"] = feed.url; |
| 172 ["hub.verify"] = "async"; | 174 ["hub.verify"] = "async"; |
| 173 ["hub.verify_token"] = feed.token; | 175 ["hub.verify_token"] = feed.token; |
| 174 --["hub.secret"] = ""; -- TODO http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html#authednotify | 176 ["hub.secret"] = feed.secret; |
| 175 --["hub.lease_seconds"] = ""; | 177 --["hub.lease_seconds"] = ""; |
| 176 }, { }; | 178 }, { }; |
| 177 for name, value in pairs(_body) do | 179 for name, value in pairs(_body) do |
| 178 t_insert(body, { name = name, value = value }); | 180 t_insert(body, { name = name, value = value }); |
| 179 end --FIXME Why do I have to do this? | 181 end --FIXME Why do I have to do this? |
| 194 local query = request.url.query; | 196 local query = request.url.query; |
| 195 if query and type(query) == "string" then | 197 if query and type(query) == "string" then |
| 196 query = urlparams(query); | 198 query = urlparams(query); |
| 197 --module:log("debug", "GET data: %s", dump(query)); | 199 --module:log("debug", "GET data: %s", dump(query)); |
| 198 end | 200 end |
| 201 --module:log("debug", "Headers: %s", dump(request.headers)); | |
| 199 | 202 |
| 200 if method == "GET" then | 203 if method == "GET" then |
| 201 if query.node and feed_list[query.node] then | 204 if query.node and feed_list[query.node] then |
| 202 local feed = feed_list[query.node]; | 205 local feed = feed_list[query.node]; |
| 203 if query["hub.topic"] ~= feed.url then | 206 if query["hub.topic"] ~= feed.url then |
| 223 elseif method == "POST" then | 226 elseif method == "POST" then |
| 224 -- TODO http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html#authednotify | 227 -- TODO http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html#authednotify |
| 225 if #body > 0 and feed_list[query.node] then | 228 if #body > 0 and feed_list[query.node] then |
| 226 module:log("debug", "got %d bytes PuSHed for %s", #body, query.node); | 229 module:log("debug", "got %d bytes PuSHed for %s", #body, query.node); |
| 227 local feed = feed_list[query.node]; | 230 local feed = feed_list[query.node]; |
| 231 local signature = request.headers["x-hub-signature"]; | |
| 232 if feed.secret then | |
| 233 local localsig = "sha1=" .. hmac_sha1(feed.secret, body, true); | |
| 234 if localsig ~= signature then | |
| 235 module:log("debug", "Invalid signature"); | |
| 236 return http_response(403); | |
| 237 end | |
| 238 module:log("debug", "Valid signature"); | |
| 239 end | |
| 228 feed.data = body; | 240 feed.data = body; |
| 229 update_entry(feed); | 241 update_entry(feed); |
| 230 feed.last_update = time(); | 242 feed.last_update = time(); |
| 231 return http_response(202); | 243 return http_response(202); |
| 232 end | 244 end |
