]>
git.gir.st - subscriptionfeed.git/blob - app/webhooks.py
2 This is the webhook server that interfaces with Google's WebSub (formerly pubsubhubbub) server. This is its own server, so it can live on a different host than the frontend.
5 #TODO: fold update-websub.py into this?
9 from flask
import Flask
, request
10 from urllib
. parse
import parse_qs
16 @app . route ( '/websub/v1/<int:timestamp>/<nonce>/<subject>/<sig>' , methods
=[ "GET" ])
17 def websub ( timestamp
, nonce
, subject
, sig
):
18 mode
= request
. args
. get ( 'hub.mode' , '' )
19 topic
= request
. args
. get ( 'hub.topic' , '' )
20 challenge
= request
. args
. get ( 'hub.challenge' , '' )
21 until
= int ( request
. args
. get ( 'hub.lease_seconds' , '0' ))
23 channel_id
= parse_qs ( topic
. split ( '?' )[ 1 ]). get ( 'channel_id' , [ '' ])[ 0 ] # TODO: support playlists # XXX: can raise indexerror
27 if time
. time () - timestamp
> int ( cf
[ 'websub' ][ 'lease' ]):
29 # TODO: implement hmac check: return '',400 unless hmac_sha1_hex("$timestamp/$nonce", $HMACKEY) eq $sig
31 if mode
!= "subscribe" :
33 # Note: channels are not purged from the websub dbtable.
35 with sqlite3
. connect ( cf
[ 'global' ][ 'database' ]) as conn
:
38 INSERT OR REPLACE INTO websub (channel_id, subscribed_until)
39 VALUES (?, datetime(?, 'unixepoch'))
40 """ , ( channel_id
, time
. time ()+ until
))
43 @app . route ( '/websub/v1/<int:timestamp>/<nonce>/<subject>/<sig>' , methods
=[ "POST" ])
44 def websub_post ( timestamp
, nonce
, subject
, sig
):
45 # TODO: implement hmac check: return '',400 unless hmac_sha1_hex("$timestamp/$nonce", $HMACKEY) eq $sig
46 # todo: # say 400 and exit unless hmac_sha1_hex($body, $HMACKEY) eq $ENV{X-Hub-Signature }
48 with sqlite3
. connect ( cf
[ 'global' ][ 'database' ]) as conn
:
50 ok
= update_channel ( conn
, request
. data
)
52 with
open ( '/tmp/websub-subscriptions.err' , 'a' ) as f
:
53 f
. write ( f
"<!-- {time.ctime()} ({int(time.time())}) --> \n {xmlfeed} \n " )
56 if __name__
== '__main__' :