示例#1
0
    def test_link_headers(self, get):
        user = UserFactory.create()
        url = "foo"
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)

        path = data_file("no-rel.atom")
        with open(path, "r") as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None, links=[{"url": "foo", "rel": "self"}])
        self.assertEqual(feed.entries.count(), 1)
示例#2
0
    def test_link_headers(self, get):
        user = UserFactory.create()
        url = 'foo'
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)

        path = data_file('no-rel.atom')
        with open(path, 'r') as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None,
                     links=[{'url': 'foo', 'rel': 'self'}])
        self.assertEqual(feed.entries.count(), 1)
示例#3
0
    def test_link_headers(self, get):
        user = UserFactory.create(ttl=99999)
        url = 'http://foo'
        get.return_value = responses(304)
        FeedFactory.create(url=url, category__user=user, user=user)

        path = data_file('no-rel.atom')
        with open(path, 'r') as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None,
                     links=[{'url': 'http://foo', 'rel': 'self'}])
        self.assertEqual(es.client.count(es.user_alias(user.pk),
                                         doc_type='entries')['count'], 1)
示例#4
0
    def test_pubsubhubbub_handling(self, get):
        user = UserFactory.create(ttl=99999)
        url = 'http://bruno.im/atom/tag/django-community/'
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)
        get.assert_called_with(
            url, headers={'User-Agent': USER_AGENT % '1 subscriber',
                          'Accept': feedparser.ACCEPT_HEADER},
            timeout=10)

        self.assertEqual(feed.entries.count(), 0)
        path = data_file('bruno.im.atom')
        with open(path, 'r') as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None, links=None)

        if user.es:
            entries = self.counts(user, feed={'feed': feed.pk})['feed']
        else:
            entries = feed.entries.count()
        self.assertEqual(entries, 5)

        # Check content handling
        if user.es:
            entries = es.manager.user(user).filter(
                feed=feed.pk).fetch()['hits']
        else:
            entries = feed.entries.all()

        for entry in entries:
            self.assertTrue(len(entry.subtitle) > 2400)

        # Check date handling
        if user.es:
            eleven = es.manager.user(user).filter(
                feed=feed.pk,
                timestamp__gt='2010-12-31',
                timestamp__lt='2012-01-01'
            ).fetch()
            eleven = len(eleven['hits'])
            twelve = es.manager.user(user).filter(
                feed=feed.pk,
                timestamp__gt='2011-12-31',
                timestamp__lt='2013-01-01'
            ).fetch()
            twelve = len(twelve['hits'])
        else:
            eleven = feed.entries.filter(date__year=2011).count()
            twelve = feed.entries.filter(date__year=2012).count()
        self.assertEqual(eleven, 3)
        self.assertEqual(twelve, 2)
示例#5
0
    def test_link_headers(self, get, head):
        head.side_effect = resolve_url
        user = UserFactory.create(ttl=99999)
        url = 'http://foo'
        get.return_value = responses(304)
        FeedFactory.create(url=url, category__user=user, user=user)

        path = data_file('no-rel.atom')
        with open(path, 'r') as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None,
                     links=[{'url': 'http://foo', 'rel': 'self'}])
        self.assertEqual(es.client.count(es.user_alias(user.pk),
                                         doc_type='entries')['count'], 1)
示例#6
0
    def test_pubsubhubbub_handling(self, get, head):
        head.side_effect = resolve_url
        user = UserFactory.create(ttl=99999)
        url = 'http://bruno.im/atom/tag/django-community/'
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)
        get.assert_called_with(url,
                               headers={
                                   'User-Agent': USER_AGENT % '1 subscriber',
                                   'Accept': feedparser.ACCEPT_HEADER
                               },
                               timeout=10,
                               auth=None)

        self.assertEqual(feed.entries.count(), 0)
        path = data_file('bruno.im.atom')
        with open(path, 'r') as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None, links=None)

        entries = self.counts(user, feed={'feed': feed.pk})['feed']
        self.assertEqual(entries, 5)

        # Check content handling
        entries = es.manager.user(user).filter(feed=feed.pk).fetch()['hits']

        for entry in entries:
            self.assertTrue(len(entry.subtitle) > 2400)

        # Check date handling
        eleven = es.manager.user(user).filter(
            feed=feed.pk,
            timestamp__gt='2010-12-31',
            timestamp__lt='2012-01-01').fetch()
        eleven = len(eleven['hits'])
        twelve = es.manager.user(user).filter(
            feed=feed.pk,
            timestamp__gt='2011-12-31',
            timestamp__lt='2013-01-01').fetch()
        twelve = len(twelve['hits'])
        self.assertEqual(eleven, 3)
        self.assertEqual(twelve, 2)
示例#7
0
    def test_pubsubhubbub_handling(self, get):
        url = 'http://bruno.im/atom/tag/django-community/'
        get.return_value = responses(304)
        feed = self.cat.feeds.create(url=url, name='Bruno')
        get.assert_called_with(
            url, headers={'User-Agent': USER_AGENT % '1 subscriber'},
            timeout=10)

        self.assertEqual(feed.entries.count(), 0)
        path = os.path.join(ROOT, 'bruno.im.atom')
        parsed = feedparser.parse(path)
        updated.send(sender=None, notification=parsed)
        self.assertEqual(feed.entries.count(), 5)

        # Check content handling
        for entry in feed.entries.all():
            self.assertTrue(len(entry.subtitle) > 2400)

        # Check date handling
        self.assertEqual(feed.entries.filter(date__year=2011).count(), 3)
        self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
示例#8
0
    def test_pubsubhubbub_handling(self, get):
        user = UserFactory.create()
        url = 'http://bruno.im/atom/tag/django-community/'
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)
        get.assert_called_with(
            url, headers={'User-Agent': USER_AGENT % '1 subscriber',
                          'Accept': feedparser.ACCEPT_HEADER},
            timeout=10)

        self.assertEqual(feed.entries.count(), 0)
        path = test_file('bruno.im.atom')
        parsed = feedparser.parse(path)
        updated.send(sender=None, notification=parsed)
        self.assertEqual(feed.entries.count(), 5)

        # Check content handling
        for entry in feed.entries.all():
            self.assertTrue(len(entry.subtitle) > 2400)

        # Check date handling
        self.assertEqual(feed.entries.filter(date__year=2011).count(), 3)
        self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
示例#9
0
    def test_pubsubhubbub_handling(self, get):
        user = UserFactory.create()
        url = "http://bruno.im/atom/tag/django-community/"
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)
        get.assert_called_with(
            url, headers={"User-Agent": USER_AGENT % "1 subscriber", "Accept": feedparser.ACCEPT_HEADER}, timeout=10
        )

        self.assertEqual(feed.entries.count(), 0)
        path = data_file("bruno.im.atom")
        with open(path, "r") as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None, links=None)
        self.assertEqual(feed.entries.count(), 5)

        # Check content handling
        for entry in feed.entries.all():
            self.assertTrue(len(entry.subtitle) > 2400)

        # Check date handling
        self.assertEqual(feed.entries.filter(date__year=2011).count(), 3)
        self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
示例#10
0
    def test_pubsubhubbub_handling(self, get):
        user = UserFactory.create()
        url = 'http://bruno.im/atom/tag/django-community/'
        get.return_value = responses(304)
        feed = FeedFactory.create(url=url, category__user=user, user=user)
        get.assert_called_with(
            url, headers={'User-Agent': USER_AGENT % '1 subscriber',
                          'Accept': feedparser.ACCEPT_HEADER},
            timeout=10)

        self.assertEqual(feed.entries.count(), 0)
        path = data_file('bruno.im.atom')
        with open(path, 'r') as f:
            data = f.read()
        updated.send(sender=None, notification=data, request=None, links=None)
        self.assertEqual(feed.entries.count(), 5)

        # Check content handling
        for entry in feed.entries.all():
            self.assertTrue(len(entry.subtitle) > 2400)

        # Check date handling
        self.assertEqual(feed.entries.filter(date__year=2011).count(), 3)
        self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
示例#11
0
def callback(request, pk):
    subscription = get_object_or_404(Subscription, pk=pk)

    if request.method == 'GET':
        mode = request.GET['hub.mode']
        topic = request.GET['hub.topic']
        challenge = request.GET['hub.challenge']
        lease_seconds = request.GET.get('hub.lease_seconds', None)
        verify_token = request.GET.get('hub.verify_token', None)

        if mode == 'subscribe':
            if not verify_token.startswith(mode):
                raise Http404

            invalid_subscription = any((
                all((
                    verify_token is not None,
                    subscription.verify_token != verify_token,
                    )),
                topic != subscription.topic,
            ))
            if invalid_subscription:
                raise Http404

            subscription.verified = True
            if lease_seconds is not None:
                subscription.set_expiration(int(lease_seconds))

            subscription.save()
            return HttpResponse(challenge)

        if mode == 'unsubscribe':
            subscription.delete()
            return HttpResponse(challenge)

    elif request.method == 'POST':
        signature = request.META.get('HTTP_X_HUB_SIGNATURE', None)
        if subscription.secret and signature:
            hasher = hmac.new(str(subscription.secret),
                              request.raw_post_data,
                              hashlib.sha1)
            digest = 'sha1=%s' % hasher.hexdigest()
            if signature != digest:
                return HttpResponse('')

        parsed = feedparser.parse(request.raw_post_data)
        links = getattr(parsed.feed, 'links', None)
        if links:
            hub_url = subscription.hub
            topic_url = subscription.topic
            for link in links:
                if link['rel'] == 'hub':
                    hub_url = link['href']
                elif link['rel'] == 'self':
                    topic_url = link['href']

            needs_update = any((
                hub_url and subscription.hub != hub_url,
                topic_url != subscription.topic,
            ))

            if needs_update:
                try:
                    Subscription.objects.subscribe(topic_url, hub=hub_url)
                except SubscriptionError:
                    pass

            updated.send(sender=subscription, notification=parsed)
            return HttpResponse('')

        return HttpResponse()
示例#12
0
 def test_missing_links(self, get):
     path = data_file('no-rel.atom')
     with open(path, 'r') as f:
         data = f.read()
     updated.send(sender=None, notification=data, request=None, links=None)
示例#13
0
 def test_missing_links(self, get):
     path = data_file('no-rel.atom')
     with open(path, 'r') as f:
         data = f.read()
     updated.send(sender=None, notification=data, request=None, links=None)
示例#14
0
def callback(request, pk):
    subscription = get_object_or_404(Subscription, pk=pk)
    logger.info(u'PuSH callback on subscription %s', subscription)

    if request.method == 'GET':
        try:
            mode = request.GET['hub.mode']
            topic = request.GET['hub.topic']
            challenge = request.GET['hub.challenge']
        except Exception:
            return HttpResponseBadRequest()
        lease_seconds = request.GET.get('hub.lease_seconds', None)
        verify_token = request.GET.get('hub.verify_token', None)

        if mode == 'subscribe':
            if not verify_token.startswith(mode):
                raise Http404

            invalid_subscription = any((
                all((
                    verify_token is not None,
                    subscription.verify_token != verify_token,
                )),
                topic != subscription.topic,
            ))
            if invalid_subscription:
                raise Http404

            subscription.verified = True
            if lease_seconds is not None:
                subscription.set_expiration(int(lease_seconds))

            subscription.save()
            return HttpResponse(challenge)

        if mode == 'unsubscribe':
            subscription.delete()
            return HttpResponse(challenge)

    elif request.method == 'POST':
        signature = request.META.get('HTTP_X_HUB_SIGNATURE', None)
        if subscription.secret:
            if signature is None:
                # Acknowledging receipt but ignoring the message
                return HttpResponse('')

            hasher = hmac.new(str(subscription.secret),
                              request.raw_post_data,
                              hashlib.sha1)
            digest = 'sha1=%s' % hasher.hexdigest()
            if signature != digest:
                return HttpResponse('')

        logger.info(u'PuSH POST parsing feed data')
        parsed = feedparser.parse(request.raw_post_data)
        logger.info(u'PuSH POST raw data %s', parsed)
        links = getattr(parsed.feed, 'links', None)
        if links:
            hub_url = subscription.hub
            logger.debug(u'\t hub_url: %s', hub_url)
            topic_url = subscription.topic
            logger.debug(u'\t topic_url: %s', topic_url)
            for link in links:
                logger.debug(u'\t\t link: %s', link)
                if link['rel'] == 'hub':
                    hub_url = link['href']
                elif link['rel'] == 'self':
                    topic_url = link['href']
            logger.debug(u'\t hub_url: %s', hub_url)
            logger.debug(u'\t topic_url: %s', topic_url)

            if subscription.needs_update(topic=topic_url, hub=hub_url):
                logger.info(u'PuSH POST needs update %s %s', topic_url, hub_url)
                try:
                    Subscription.objects.subscribe(topic_url, hub=hub_url)
                except SubscriptionError:
                    pass

            updated.send(sender=subscription, notification=parsed)
            return HttpResponse('')

        return HttpResponse()
示例#15
0
def callback(request, pk):
    subscription = get_object_or_404(Subscription, pk=pk)

    if request.method == "GET":
        mode = request.GET["hub.mode"]
        topic = request.GET["hub.topic"]
        challenge = request.GET["hub.challenge"]
        lease_seconds = request.GET.get("hub.lease_seconds", None)
        verify_token = request.GET.get("hub.verify_token", None)

        if mode == "subscribe":
            if not verify_token.startswith(mode):
                raise Http404

            invalid_subscription = any(
                (
                    all((verify_token is not None, subscription.verify_token != verify_token)),
                    topic != subscription.topic,
                )
            )
            if invalid_subscription:
                raise Http404

            subscription.verified = True
            if lease_seconds is not None:
                subscription.set_expiration(int(lease_seconds))

            subscription.save()
            return HttpResponse(challenge)

        if mode == "unsubscribe":
            subscription.delete()
            return HttpResponse(challenge)

    elif request.method == "POST":
        signature = request.META.get("HTTP_X_HUB_SIGNATURE", None)
        if subscription.secret:
            if signature is None:
                # Acknowledging receipt but ignoring the message
                return HttpResponse("")

            hasher = hmac.new(str(subscription.secret), request.raw_post_data, hashlib.sha1)
            digest = "sha1=%s" % hasher.hexdigest()
            if signature != digest:
                return HttpResponse("")

        parsed = feedparser.parse(request.raw_post_data)
        links = getattr(parsed.feed, "links", None)
        if links:
            hub_url = subscription.hub
            topic_url = subscription.topic
            for link in links:
                if link["rel"] == "hub":
                    hub_url = link["href"]
                elif link["rel"] == "self":
                    topic_url = link["href"]

            needs_update = any((hub_url and subscription.hub != hub_url, topic_url != subscription.topic))

            if needs_update:
                try:
                    Subscription.objects.subscribe(topic_url, hub=hub_url)
                except SubscriptionError:
                    pass

            updated.send(sender=subscription, notification=parsed)
            return HttpResponse("")

        return HttpResponse()