1 # -*- coding: utf-8 -*-
3 # PubSubHubbub subscriber for mygpo
9 from django
.http
import HttpResponseNotFound
, HttpResponse
10 from django
.views
import View
11 from django
.views
.decorators
.csrf
import csrf_exempt
13 from mygpo
.pubsub
.models
import HubSubscription
14 from mygpo
.pubsub
.signals
import subscription_updated
16 logger
= logging
.getLogger(__name__
)
19 class SubscribeView(View
):
20 """Endpoint for Pubsubhubbub subscriptions"""
23 def dispatch(self
, *args
, **kwargs
):
24 return super(SubscribeView
, self
).dispatch(*args
, **kwargs
)
26 def get(self
, request
):
27 """Callback used by the Hub to verify the subscription request"""
29 # received arguments: hub.mode, hub.topic, hub.challenge,
30 # hub.lease_seconds, hub.verify_token
31 mode
= request
.GET
.get("hub.mode")
32 feed_url
= request
.GET
.get("hub.topic")
33 challenge
= request
.GET
.get("hub.challenge")
34 lease_seconds
= request
.GET
.get("hub.lease_seconds")
35 verify_token
= request
.GET
.get("hub.verify_token")
39 "received subscription-parameters: mode: %(mode)s, "
40 + "topic: %(topic)s, challenge: %(challenge)s, lease_seconds: "
41 + "%(lease_seconds)s, verify_token: %(verify_token)s"
47 lease_seconds
=lease_seconds
,
48 verify_token
=verify_token
,
53 subscription
= HubSubscription
.objects
.get(topic_url
=feed_url
)
55 except HubSubscription
.DoesNotExist
:
56 logger
.warning("subscription does not exist")
57 return HttpResponseNotFound()
59 if subscription
.mode
!= mode
:
60 logger
.warning("invalid mode, %s expected" % subscription
.mode
)
61 return HttpResponseNotFound()
63 if subscription
.verify_token
!= verify_token
:
65 "invalid verify_token, %s expected" % subscription
.verify_token
67 return HttpResponseNotFound()
69 subscription
.verified
= True
72 logger
.info("subscription confirmed")
73 return HttpResponse(challenge
)
75 def post(self
, request
):
76 """Callback to notify about a feed update"""
78 feed_url
= request
.GET
.get("url")
81 logger
.info("received notification without url")
82 return HttpResponse(status
=400)
84 logger
.info("received notification for %s" % feed_url
)
87 subscription
= HubSubscription
.objects
.get(topic_url
=feed_url
)
89 except HubSubscription
.DoesNotExist
:
90 logger
.warning("no subscription for this URL")
91 return HttpResponse(status
=400)
93 if subscription
.mode
!= "subscribe":
94 logger
.warning("invalid subscription mode: %s" % subscription
.mode
)
95 return HttpResponse(status
=400)
97 if not subscription
.verified
:
98 logger
.warning("the subscription has not yet been verified")
99 return HttpResponse(status
=400)
101 subscription_updated
.send(sender
=feed_url
)
103 return HttpResponse(status
=200)