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)
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)
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)
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)
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)
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')
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')