Merge pull request #793 from gpodder/remove-advertise
[mygpo.git] / mygpo / pubsub / views.py
blobe9fcd40311c302f5f91e0f9e768938d6c0f117b1
1 # -*- coding: utf-8 -*-
3 # PubSubHubbub subscriber for mygpo
7 import logging
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"""
22 @csrf_exempt
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")
37 logger.debug(
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"
43 % dict(
44 mode=mode,
45 topic=feed_url,
46 challenge=challenge,
47 lease_seconds=lease_seconds,
48 verify_token=verify_token,
52 try:
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:
64 logger.warning(
65 "invalid verify_token, %s expected" % subscription.verify_token
67 return HttpResponseNotFound()
69 subscription.verified = True
70 subscription.save()
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")
80 if not feed_url:
81 logger.info("received notification without url")
82 return HttpResponse(status=400)
84 logger.info("received notification for %s" % feed_url)
86 try:
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)