diff options
author | Elrond <elrond+mediagoblin.org@samba-tng.org> | 2011-12-20 22:58:16 +0100 |
---|---|---|
committer | Elrond <elrond+mediagoblin.org@samba-tng.org> | 2011-12-20 22:58:16 +0100 |
commit | 463a5dcc433f6e4a442eeaee67bd22910cfb2d08 (patch) | |
tree | c4618ecf6ea9ced5633cd95814c304e1a92d50ff /mediagoblin/webfinger/views.py | |
parent | 4ae4012dad3f5638ea7b510d40f0b4d0b641fe2a (diff) | |
parent | 85c916919b1e1fe31472feac74f8c216a5df608f (diff) | |
download | mediagoblin-463a5dcc433f6e4a442eeaee67bd22910cfb2d08.tar.lz mediagoblin-463a5dcc433f6e4a442eeaee67bd22910cfb2d08.tar.xz mediagoblin-463a5dcc433f6e4a442eeaee67bd22910cfb2d08.zip |
Merge remote branch 'remotes/joar/webfinger'
* remotes/joar/webfinger:
Added references to docstring in mediagoblin.webfinger
Removed mediagoblin.tools.feed which was accidentally included
Polishing the webfinger implementation
webfinger fully compliant with webfinger.org! Still *preliminary* solution.
Changed some thngs to be compatible with webfinger.org, still *very preliminary*
Added *very preliminary* support for webfinger
Diffstat (limited to 'mediagoblin/webfinger/views.py')
-rw-r--r-- | mediagoblin/webfinger/views.py | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py new file mode 100644 index 00000000..22086396 --- /dev/null +++ b/mediagoblin/webfinger/views.py @@ -0,0 +1,117 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +''' +For references, see docstring in mediagoblin/webfinger/__init__.py +''' + +import re + +from urlparse import urlparse + +from mediagoblin.tools.response import render_to_response, render_404 + +def host_meta(request): + ''' + Webfinger host-meta + ''' + + placeholder = 'MG_LRDD_PLACEHOLDER' + + lrdd_title = 'GNU MediaGoblin - User lookup' + + lrdd_template = request.urlgen( + 'mediagoblin.webfinger.xrd', + uri=placeholder, + qualified=True) + + return render_to_response( + request, + 'mediagoblin/webfinger/host-meta.xml', + {'request': request, + 'lrdd_template': lrdd_template, + 'lrdd_title': lrdd_title, + 'placeholder': placeholder}) + +MATCH_SCHEME_PATTERN = re.compile(r'^acct:') + +def xrd(request): + ''' + Find user data based on a webfinger URI + ''' + param_uri = request.GET.get('uri') + + if not param_uri: + return render_404(request) + + ''' + :py:module:`urlparse` does not recognize usernames in URIs of the + form ``acct:user@example.org`` or ``user@example.org``. + ''' + if not MATCH_SCHEME_PATTERN.search(param_uri): + # Assume the URI is in the form ``user@example.org`` + uri = 'acct://' + param_uri + else: + # Assumes the URI looks like ``acct:user@example.org + uri = MATCH_SCHEME_PATTERN.sub( + 'acct://', param_uri) + + parsed = urlparse(uri) + + xrd_subject = param_uri + + # TODO: Verify that the user exists + # Q: Does webfinger support error handling in this case? + # Returning 404 seems intuitive, need to check. + if parsed.username: + # The user object + # TODO: Fetch from database instead of using the MockUser + user = MockUser() + user.username = parsed.username + + xrd_links = [ + {'attrs': { + 'rel': 'http://microformats.org/profile/hcard', + 'href': request.urlgen( + 'mediagoblin.user_pages.user_home', + user=user.username, + qualified=True)}}, + {'attrs': { + 'rel': 'http://schemas.google.com/g/2010#updates-from', + 'href': request.urlgen( + 'mediagoblin.user_pages.atom_feed', + user=user.username, + qualified=True)}}] + + xrd_alias = request.urlgen( + 'mediagoblin.user_pages.user_home', + user=user.username, + qualified=True) + + return render_to_response( + request, + 'mediagoblin/webfinger/xrd.xml', + {'request': request, + 'subject': xrd_subject, + 'alias': xrd_alias, + 'links': xrd_links }) + else: + return render_404(request) + +class MockUser(object): + ''' + TEMPORARY user object + ''' + username = None |