示例#1
0
def webfinger(contact_addr):
    """
    Returns the Webfinger profile for a contact called <contact> (in
    "user@host" form).
    """
    contact_id, _ = contact_addr.split('@')
    c = Contact.get(int(contact_id))
    if not c or not c.user or not c.user.activated:
        abort(404, 'No such contact')
    diasp = DiasporaContact.get_for_contact(c)

    ns = 'http://docs.oasis-open.org/ns/xri/xrd-1.0'
    doc = etree.Element("{%s}XRD" % ns, nsmap={None: ns})
    etree.SubElement(doc, "Subject").text = "acct:%s" % diasp.username
    etree.SubElement(doc, "Alias").text = \
        '"{0}"'.format(url_for('index', _external=True))
    etree.SubElement(
        doc, "Link",
        rel='http://microformats.org/profile/hcard',
        type='text/html',
        href=url_for('.hcard', guid=diasp.guid, _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='http://joindiaspora.com/seed_location',
        type='text/html',
        href=url_for('index', _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='http://joindiaspora.com/guid',
        type='text/html',
        href=diasp.guid
    )
    etree.SubElement(
        doc, "Link",
        rel='http://webfinger.net/rel/profile-page',
        type='text/html',
        href=url_for('contacts.profile', contact_id=c.id, _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='http://schemas.google.com/g/2010#updates-from',
        type='application/atom+xml',
        href=url_for('contacts.feed', contact_id=c.id, _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='diaspora-public-key',
        type='RSA',
        href=b64encode(c.public_key.encode('ascii'))
    )

    return send_xml(doc)
示例#2
0
def webfinger(contact_addr):
    """
    Returns the Webfinger profile for a contact called <contact> (in
    "user@host" form).
    """
    contact_id, _ = contact_addr.split('@')
    c = Contact.get(int(contact_id))
    if not c or not c.user or not c.user.activated:
        abort(404, 'No such contact')
    diasp = DiasporaContact.get_for_contact(c)

    ns = 'http://docs.oasis-open.org/ns/xri/xrd-1.0'
    doc = etree.Element("{%s}XRD" % ns, nsmap={None: ns})
    etree.SubElement(doc, "Subject").text = "acct:%s" % diasp.username
    etree.SubElement(doc, "Alias").text = \
        '"{0}"'.format(url_for('index', _external=True))
    etree.SubElement(
        doc, "Link",
        rel='http://microformats.org/profile/hcard',
        type='text/html',
        href=url_for('.hcard', guid=diasp.guid, _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='http://joindiaspora.com/seed_location',
        type='text/html',
        href=url_for('index', _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='http://joindiaspora.com/guid',
        type='text/html',
        href=diasp.guid
    )
    etree.SubElement(
        doc, "Link",
        rel='http://webfinger.net/rel/profile-page',
        type='text/html',
        href=url_for('contacts.profile', contact_id=c.id, _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='http://schemas.google.com/g/2010#updates-from',
        type='application/atom+xml',
        href=url_for('contacts.feed', contact_id=c.id, _external=True)
    )
    etree.SubElement(
        doc, "Link",
        rel='diaspora-public-key',
        type='RSA',
        href=b64encode(c.public_key.encode('ascii'))
    )

    return send_xml(doc)
示例#3
0
def host_meta():
    """
    Return a WebFinder host-meta, which points the client to the end-point
    for webfinger querying.
    """
    ns = 'http://docs.oasis-open.org/ns/xri/xrd-1.0'
    doc = etree.Element("{%s}XRD" % ns, nsmap={None: ns})
    etree.SubElement(
        doc,
        "Link",
        rel='lrdd',
        template=url_for('.webfinger', contact_addr='', _external=True) +
        '{uri}',
        type='application/xrd+xml')
    return send_xml(doc)
示例#4
0
def host_meta():
    """
    Return a WebFinder host-meta, which points the client to the end-point
    for webfinger querying.
    """
    ns = 'http://docs.oasis-open.org/ns/xri/xrd-1.0'
    doc = etree.Element("{%s}XRD" % ns, nsmap={None: ns})
    etree.SubElement(
        doc, "Link",
        rel='lrdd',
        template=url_for(
            '.webfinger',
            contact_addr='',
            _external=True
        ) + '{uri}',
        type='application/xrd+xml'
    )
    return send_xml(doc)
示例#5
0
def feed(contact_id):
    """
    An Atom feed of public events for the contact. Only available for contacts
    who are local to this server.
    """
    data, contact = _profile_base(contact_id, public=True)
    if not(contact.user and contact.user.activated):
        flask_abort(404, 'No such user')

    # Fake "guid" for the user, derived from the ID
    guid = '{0}-{1}'.format(get_server_name(), contact.user.id)

    ns = 'http://www.w3.org/2005/Atom'
    doc = etree.Element("{%s}feed" % ns, nsmap={None: ns})
    etree.SubElement(doc, "title").text = 'Pyaspora feed for {0}'.format(
        data['name']
    )
    etree.SubElement(doc, "link").text = data['link']
    etree.SubElement(doc, "updated").text = data['feed'][0]['created_at'] \
        if data['feed'] else contact.user.activated.isoformat()
    etree.SubElement(doc, "id").text = guid
    etree.SubElement(doc, "generator").text = 'Pyaspora'

    author = etree.SubElement(doc, 'author')
    etree.SubElement(author, "name").text = data['name']
    etree.SubElement(author, "uri").text = data['link']

    for post in data['feed']:
        entry = etree.SubElement(doc, 'entry')
        etree.SubElement(entry, "id").text = \
            "{0}-{1}".format(guid, post['id'])
        etree.SubElement(entry, "title").text = \
            post['parts'][0]['body']['text']
        etree.SubElement(entry, "updated").text = post['created_at']
        etree.SubElement(entry, "content").text = \
            "\n\n".join(p['body']['text'] for p in post['parts'])

    return send_xml(doc)
示例#6
0
def feed(contact_id):
    """
    An Atom feed of public events for the contact. Only available for contacts
    who are local to this server.
    """
    data, contact = _profile_base(contact_id, public=True)
    if not (contact.user and contact.user.activated):
        flask_abort(404, 'No such user')

    # Fake "guid" for the user, derived from the ID
    guid = '{0}-{1}'.format(get_server_name(), contact.user.id)

    ns = 'http://www.w3.org/2005/Atom'
    doc = etree.Element("{%s}feed" % ns, nsmap={None: ns})
    etree.SubElement(doc, "title").text = 'Pyaspora feed for {0}'.format(
        data['name'])
    etree.SubElement(doc, "link").text = data['link']
    etree.SubElement(doc, "updated").text = data['feed'][0]['created_at'] \
        if data['feed'] else contact.user.activated.isoformat()
    etree.SubElement(doc, "id").text = guid
    etree.SubElement(doc, "generator").text = 'Pyaspora'

    author = etree.SubElement(doc, 'author')
    etree.SubElement(author, "name").text = data['name']
    etree.SubElement(author, "uri").text = data['link']

    for post in data['feed']:
        entry = etree.SubElement(doc, 'entry')
        etree.SubElement(entry, "id").text = \
            "{0}-{1}".format(guid, post['id'])
        etree.SubElement(entry, "title").text = \
            post['parts'][0]['body']['text']
        etree.SubElement(entry, "updated").text = post['created_at']
        etree.SubElement(entry, "content").text = \
            "\n\n".join(p['body']['text'] for p in post['parts'])

    return send_xml(doc)
示例#7
0
def hcard(guid):
    """
    Returns the hCard for the User with GUID <guid>. I would have
    preferred to use the primary key, but the protocol insists on
    fetch-by-GUID.
    """
    diasp = DiasporaContact.get_by_guid(guid)
    if diasp is None or not diasp.contact.user:
        abort(404, 'No such contact')
    c = diasp.contact

    ns = 'http://www.w3.org/1999/xhtml'
    doc = etree.Element("{%s}div" % ns, nsmap={None: ns}, id="content")
    etree.SubElement(doc, "h1").text = c.realname
    content_inner = etree.SubElement(
        doc,
        'div',
        **{'class': "content_inner"}
    )
    author = etree.SubElement(
        content_inner,
        'div',
        id="i",
        **{'class': "entity_profile vcard author"}
    )

    etree.SubElement(author, "h2").text = "User profile"

    dl = etree.SubElement(author, 'dl', **{'class': "entity_nickname"})
    etree.SubElement(dl, 'dt').text = 'Nickname'
    dd = etree.SubElement(dl, 'dd')
    etree.SubElement(
        dd,
        'a',
        rel='me',
        href=url_for('index'),
        **{'class': "nickname url uid"}
    ).text = c.realname

    dl = etree.SubElement(author, 'dl', **{'class': "entity_fn"})
    etree.SubElement(dl, 'dt').text = 'Full name'
    dd = etree.SubElement(dl, 'dd').text = c.realname

    dl = etree.SubElement(author, 'dl', **{'class': "entity_url"})
    etree.SubElement(dl, 'dt').text = 'URL'
    dd = etree.SubElement(dl, 'dd')
    etree.SubElement(
        dd,
        'a',
        id='pod_location',
        rel='me',
        href=url_for('index', _external=True),
        **{'class': "url"}
    ).text = url_for('index', _external=True)

    # FIXME - need to resize photos
    photos = {
        "entity_photo": "300px",
        "entity_photo_medium": "100px",
        "entity_photo_small": "50px"
    }
    for k, v in photos.items():
        src = diasp.photo_url()
        dl = etree.SubElement(author, "dl", **{'class': k})
        etree.SubElement(dl, "dt").text = "Photo"
        dd = etree.SubElement(dl, "dd")
        etree.SubElement(
            dd,
            'img',
            height=v,
            width=v,
            src=src,
            **{'class': "photo avatar"}
        )

    dl = etree.SubElement(author, 'dl', **{'class': "entity_searchable"})
    etree.SubElement(dl, 'dt').text = 'Searchable'
    dd = etree.SubElement(dl, 'dd')
    etree.SubElement(dd, 'a', **{'class': "searchable"}).text = 'true'

    return send_xml(doc, content_type='text/html')
示例#8
0
def hcard(guid):
    """
    Returns the hCard for the User with GUID <guid>. I would have
    preferred to use the primary key, but the protocol insists on
    fetch-by-GUID.
    """
    diasp = DiasporaContact.get_by_guid(guid)
    if diasp is None or not diasp.contact.user:
        abort(404, 'No such contact')
    c = diasp.contact

    ns = 'http://www.w3.org/1999/xhtml'
    doc = etree.Element("{%s}div" % ns, nsmap={None: ns}, id="content")
    etree.SubElement(doc, "h1").text = c.realname
    content_inner = etree.SubElement(doc, 'div', **{'class': "content_inner"})
    author = etree.SubElement(content_inner,
                              'div',
                              id="i",
                              **{'class': "entity_profile vcard author"})

    etree.SubElement(author, "h2").text = "User profile"

    dl = etree.SubElement(author, 'dl', **{'class': "entity_nickname"})
    etree.SubElement(dl, 'dt').text = 'Nickname'
    dd = etree.SubElement(dl, 'dd')
    etree.SubElement(dd,
                     'a',
                     rel='me',
                     href=url_for('index'),
                     **{
                         'class': "nickname url uid"
                     }).text = c.realname

    dl = etree.SubElement(author, 'dl', **{'class': "entity_fn"})
    etree.SubElement(dl, 'dt').text = 'Full name'
    dd = etree.SubElement(dl, 'dd').text = c.realname

    dl = etree.SubElement(author, 'dl', **{'class': "entity_url"})
    etree.SubElement(dl, 'dt').text = 'URL'
    dd = etree.SubElement(dl, 'dd')
    etree.SubElement(dd,
                     'a',
                     id='pod_location',
                     rel='me',
                     href=url_for('index', _external=True),
                     **{
                         'class': "url"
                     }).text = url_for('index', _external=True)

    # FIXME - need to resize photos
    photos = {
        "entity_photo": "300px",
        "entity_photo_medium": "100px",
        "entity_photo_small": "50px"
    }
    for k, v in photos.items():
        src = diasp.photo_url()
        dl = etree.SubElement(author, "dl", **{'class': k})
        etree.SubElement(dl, "dt").text = "Photo"
        dd = etree.SubElement(dl, "dd")
        etree.SubElement(dd,
                         'img',
                         height=v,
                         width=v,
                         src=src,
                         **{'class': "photo avatar"})

    dl = etree.SubElement(author, 'dl', **{'class': "entity_searchable"})
    etree.SubElement(dl, 'dt').text = 'Searchable'
    dd = etree.SubElement(dl, 'dd')
    etree.SubElement(dd, 'a', **{'class': "searchable"}).text = 'true'

    return send_xml(doc, content_type='text/html')