Пример #1
0
    def pingback_ping(self):
        source = self.params[0]
        target = self.params[1]
        slug = target.split('/')[-2]
        try:
            entry = Entry.objects.get(slug=slug)
            if not entry.allow_comments:
                raise Entry.DoesNotExist
        except Entry.DoesNotExist:
            return XmlRpcDispatcher.fault(33, 'The specified URI cannot be used as target')

        try:
            Comment.objects.get(entry=entry, type__in=['P', 'T'], author_uri=source)
            return XmlRpcDispatcher.fault(48, 'The pingback has already been registered')
        except Comment.DoesNotExist:
            pass

        s = Spider(source)
        if not s.backlinks(target):
            if s.code == 200:
                return XmlRpcDispatcher.fault(17, 'The source URI does not contain a link to the target URI')

            return XmlRpcDispatcher.fault(16, 'The source URI does not exist')

        Comment.objects.create(entry=entry, type='P',
                author=hostname_from_uri(source, http=False),
                author_uri=source, body='')

        return XmlRpcDispatcher.pingback_reply('Pingback stored')
Пример #2
0
def trackback_view(request, entry_id):
    title = request.POST.get('title')
    excerpt = request.POST.get('excerpt', '')
    url = request.POST.get('url')
    blog_name = request.POST.get('blog_name')

    if not url:
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>No URL specified</message>
                </response>''', mimetype='text/xml')
    if len(url) > 1024:
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>Entity Too Large</message>
                </response>''', mimetype='text/xml')

    if not is_absolute_link(url):
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>URL must match https?://.*</message>
                </response>''', mimetype='text/xml')
    
    entry = get_object_or_404(Entry, pk=entry_id)

    if not entry.allow_comments:
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>Trackbacks are not allowed for this entry</message>
                </response>''', mimetype='text/xml')


    try:
        Comment.objects.get(entry=entry, type__in=['T', 'P'], author_uri=url)
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>Trackback already registered</message>
                </response>''', mimetype='text/xml')
    except Comment.DoesNotExist:
        pass

    s = Spider(url)
    if not s.backlinks(entry.get_absolute_url()):
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>URL doesn't link back</message>
                </response>''', mimetype='text/xml')

    if not blog_name:
        blog_name = url.split('/')[2]

    if title:
        excerpt = '%s\n\n%s' % (title, excerpt)

    Comment.objects.create(entry=entry, author=blog_name, author_uri=url, body=excerpt, type='T')

    return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>0</error>
                </response>''')