Esempio n. 1
0
    def ping_func(source, target):
        log = logging.getLogger('pingback')
        log.debug('received pingback from %r to %r' % (source, target))
        domain = Site.objects.get_current().domain

        # fetch the source request, then check if it really pings the target.
        try:
            doc = urlopen(source)
        except (HTTPError, URLError):
            raise PingbackError(PingbackError.SOURCE_DOES_NOT_EXIST)

        # does the source refer to the target?
        soup = BeautifulSoup(doc.read())
        mylink = soup.find('a', href=target)
        if not mylink:
            raise PingbackError(PingbackError.SOURCE_DOES_NOT_LINK)

        # grab the title of the pingback source
        title = soup.find('title')
        if title:
            title = strip_tags(unicode(title))
        else:
            title = 'Unknown title'

        # extract the text around the incoming link
        content = unicode(mylink.findParent())
        i = content.index(unicode(mylink))
        content = strip_tags(content)
        max_length = getattr(settings, 'PINGBACK_RESPONSE_LENGTH', 200)
        if len(content) > max_length:
            start = i - max_length / 2
            if start < 0:
                start = 0
            end = i + len(unicode(mylink)) + max_length / 2
            if end > len(content):
                end = len(content)
            content = content[start:end]

        scheme, server, path, query, fragment = urlsplit(target)

        # check if the target is valid target
        if not (server == domain or server.split(':')[0] == domain):
            return PingbackError.TARGET_IS_NOT_PINGABLE

        resolver = get_resolver(None)

        try:
            func, a, kw = resolver.resolve(path)
        except urlresolvers.Resolver404:
            raise PingbackError(PingbackError.TARGET_DOES_NOT_EXIST)

        url_signatures = resolver.reverse_dict.getlist(func)
        # stupid workaround because django returns tuple instead of RegexURLPattern
        registered = False
        for name in kwargs:
            if resolver.reverse_dict[name] in url_signatures:
                registered = True
                break
        if not registered:
            raise PingbackError(PingbackError.TARGET_IS_NOT_PINGABLE)

        object_resolver = kwargs[name]
        obj = object_resolver(*a, **kw)

        content_type = ContentType.objects.get_for_model(obj)
        try:
            Pingback.objects.get(url=source,
                                 content_type=content_type,
                                 object_id=obj.id)
            raise PingbackError(PingbackError.PINGBACK_ALREADY_REGISTERED)
        except Pingback.DoesNotExist:
            pass

        pb = Pingback(object=obj,
                      url=source,
                      content=content.encode('utf-8'),
                      title=title.encode('utf-8'),
                      approved=True)
        pb.save()
        return 'pingback from %s to %s saved' % (source, target)
Esempio n. 2
0
def ping(source, target):
    """ Pingback server function.

    Requires URL of pinger resource and link of pinging resource.

    Determinition of pingable object by it's url is done by setting
    settings.PINGBACK_SERVER in the following format::

        {
        'post_detail': 'pingback.getters.post_get',
        }

    Where:
     - 'post_detail' is name of url
     - 'pingback.getters.post_get' is name of function, which will return
       object using parameters, resolved by URL.
    """
    domain = Site.objects.get_current().domain

    try:
        doc = urlopen(source)
    except (HTTPError, URLError):
        return PingbackError.SOURCE_DOES_NOT_EXIST

    soup = BeautifulSoup(doc.read())
    mylink = soup.find('a', href=target)
    if not mylink:
        return PingbackError.SOURCE_DOES_NOT_LINKING
    # title
    title = soup.find('title')
    if title:
        title = strip_tags(unicode(title))
    else:
        title = 'Unknown title'
    content = unicode(mylink.findParent())
    i = content.index(unicode(mylink))
    content = strip_tags(content)
    max_length = settings.PINGBACK_RESPONSE_LENGTH
    if len(content) > max_length:
        start = i - max_length / 2
        if start < 0:
            start = 0
        end = i + len(unicode(mylink)) + max_length / 2
        if end > len(content):
            end = len(content)
        content = content[start:end]

    scheme, server, path, query, fragment = urlsplit(target)

    if not (server == domain or server.split(':')[0] == domain):
        return PingbackError.TARGET_IS_NOT_PINGABLE

    resolver = ur.RegexURLResolver(r'^/', settings.ROOT_URLCONF)

    try:
        func, smth, params = resolver.resolve(path)
    except ur.Resolver404:
        return PingbackError.TARGET_DOES_NOT_EXIST
    name = resolver.reverse_dict[func][-1].name
    if not name in settings.PINGBACK_SERVER:
        return PingbackError.TARGET_IS_NOT_PINGABLE
    getter = settings.PINGBACK_SERVER[name]
    if not callable(getter):
        getter = get_callable(getter)
    obj = getter(**params)

    ctype = ContentType.objects.get_for_model(obj)
    try:
        Pingback.objects.get(url=source, content_type=ctype, object_id=obj.id)
        return PingbackError.PINGBACK_ALREADY_REGISTERED
    except Pingback.DoesNotExist:
        pass

    pb = Pingback(object=obj,
                  url=source,
                  content=content.encode('utf-8'),
                  title=title.encode('utf-8'),
                  approved=True)
    pb.save()

    return 'pingback from %s to %s saved' % (source, target)
Esempio n. 3
0
    def ping_func(source, target):
        log = logging.getLogger('pingback')
        log.debug('received pingback from %r to %r' % (source, target))
        domain = Site.objects.get_current().domain

        # fetch the source request, then check if it really pings the target.
        try:
            doc = urlopen(source)
        except (HTTPError, URLError):
            raise PingbackError(PingbackError.SOURCE_DOES_NOT_EXIST)

        # does the source refer to the target?
        soup = BeautifulSoup(doc.read())
        mylink = soup.find('a', href=target)
        if not mylink:
            raise PingbackError(PingbackError.SOURCE_DOES_NOT_LINK)

        # grab the title of the pingback source
        title = soup.find('title')
        if title:
            title = strip_tags(unicode(title))
        else:
            title = 'Unknown title'

        # extract the text around the incoming link
        content = unicode(mylink.findParent())
        i = content.index(unicode(mylink))
        content = strip_tags(content)
        max_length = getattr(settings, 'PINGBACK_RESPONSE_LENGTH', 200)
        if len(content) > max_length:
            start = i - max_length/2
            if start < 0:
                start = 0
            end = i + len(unicode(mylink)) + max_length/2
            if end > len(content):
                end = len(content)
            content = content[start:end]

        scheme, server, path, query, fragment = urlsplit(target)

        # check if the target is valid target
        if not (server == domain or server.split(':')[0] == domain):
            return PingbackError.TARGET_IS_NOT_PINGABLE

        resolver = get_resolver(None)

        try:
            func, a, kw = resolver.resolve(path)
        except urlresolvers.Resolver404:
            raise PingbackError(PingbackError.TARGET_DOES_NOT_EXIST)

        url_signatures = resolver.reverse_dict.getlist(func)
        # stupid workaround because django returns tuple instead of RegexURLPattern
        registered = False
        for name in kwargs:
            if resolver.reverse_dict[name] in url_signatures:
                registered = True
                break
        if not registered:
            raise PingbackError(PingbackError.TARGET_IS_NOT_PINGABLE)

        object_resolver = kwargs[name]
        obj = object_resolver(*a, **kw)

        content_type = ContentType.objects.get_for_model(obj)
        try:
            Pingback.objects.get(url=source, content_type=content_type, object_id=obj.id)
            raise PingbackError(PingbackError.PINGBACK_ALREADY_REGISTERED)
        except Pingback.DoesNotExist:
            pass

        pb = Pingback(object=obj, url=source, content=content.encode('utf-8'), title=title.encode('utf-8'), approved=True)
        pb.save()
        return 'pingback from %s to %s saved' % (source, target)
Esempio n. 4
0
def ping(source, target):
    """ Pingback server function.

    Requires URL of pinger resource and link of pinging resource.

    Determinition of pingable object by it's url is done by setting
    settings.PINGBACK_SERVER in the following format::

        {
        'post_detail': 'pingback.getters.post_get',
        }

    Where:
     - 'post_detail' is name of url
     - 'pingback.getters.post_get' is name of function, which will return
       object using parameters, resolved by URL.
    """
    domain = Site.objects.get_current().domain

    try:
        doc = urlopen(source)
    except (HTTPError, URLError):
        return PingbackError.SOURCE_DOES_NOT_EXIST

    soup = BeautifulSoup(doc.read())
    mylink = soup.find('a', href=target)
    if not mylink:
        return PingbackError.SOURCE_DOES_NOT_LINKING
    # title
    title = soup.find('title')
    if title:
        title = strip_tags(unicode(title))
    else:
        title = 'Unknown title'
    content = unicode(mylink.findParent())
    i = content.index(unicode(mylink))
    content = strip_tags(content)
    max_length = settings.PINGBACK_RESPONSE_LENGTH
    if len(content) > max_length:
        start = i - max_length/2
        if start < 0:
            start = 0
        end = i + len(unicode(mylink)) + max_length/2
        if end > len(content):
            end = len(content)
        content = content[start:end]

    scheme, server, path, query, fragment = urlsplit(target)

    if not (server == domain or server.split(':')[0] == domain):
        return PingbackError.TARGET_IS_NOT_PINGABLE

    resolver = ur.RegexURLResolver(r'^/', settings.ROOT_URLCONF)

    try:
        func, smth, params = resolver.resolve(path)
    except ur.Resolver404:
        return PingbackError.TARGET_DOES_NOT_EXIST
    name = resolver.reverse_dict[func][-1].name
    if not name in settings.PINGBACK_SERVER:
        return PingbackError.TARGET_IS_NOT_PINGABLE
    getter = settings.PINGBACK_SERVER[name]
    if not callable(getter):
        getter = get_callable(getter)
    obj = getter(**params)

    ctype = ContentType.objects.get_for_model(obj)
    try:
        Pingback.objects.get(url=source, content_type=ctype, object_id=obj.id)
        return PingbackError.PINGBACK_ALREADY_REGISTERED
    except Pingback.DoesNotExist:
        pass

    pb = Pingback(object=obj, url=source, content=content.encode('utf-8'), title=title.encode('utf-8'), approved=True)
    pb.save()

    return 'pingback from %s to %s saved' % (source, target)