diff options
author | Jessica Tallon <jessica@megworld.co.uk> | 2014-09-08 16:26:48 +0100 |
---|---|---|
committer | Jessica Tallon <jessica@megworld.co.uk> | 2014-09-08 17:54:03 +0100 |
commit | 1bce996181d9ae18756e6bbc0750bb6dc9d09609 (patch) | |
tree | 3a98a23aa1e8e8c46ce2e8aeb2bcf23bacd07646 | |
parent | 0af1b859989e6a910360b5ac87c5b7c8dc2e5a91 (diff) | |
download | mediagoblin-1bce996181d9ae18756e6bbc0750bb6dc9d09609.tar.lz mediagoblin-1bce996181d9ae18756e6bbc0750bb6dc9d09609.tar.xz mediagoblin-1bce996181d9ae18756e6bbc0750bb6dc9d09609.zip |
Add /.well-known/webfinger API to lookup user hrefs
-rw-r--r-- | mediagoblin/federation/routing.py | 8 | ||||
-rw-r--r-- | mediagoblin/federation/views.py | 63 |
2 files changed, 69 insertions, 2 deletions
diff --git a/mediagoblin/federation/routing.py b/mediagoblin/federation/routing.py index c1c5a264..e9fa6252 100644 --- a/mediagoblin/federation/routing.py +++ b/mediagoblin/federation/routing.py @@ -73,7 +73,13 @@ add_route( ) add_route( + "mediagoblin.webfinger.well-known.webfinger", + "/.well-known/webfinger", + "mediagoblin.federation.views:lrdd_lookup" +) + +add_route( "mediagoblin.webfinger.whoami", "/api/whoami", "mediagoblin.federation.views:whoami" -) +)
\ No newline at end of file diff --git a/mediagoblin/federation/views.py b/mediagoblin/federation/views.py index 350aa36c..724d349c 100644 --- a/mediagoblin/federation/views.py +++ b/mediagoblin/federation/views.py @@ -434,6 +434,14 @@ def host_meta(request): links = [ { + "rel": "lrdd", + "type": "application/json", + "href": request.urlgen( + "mediagoblin.webfinger.well-known.webfinger", + qualified=True + ) + }, + { "rel": "registration_endpoint", "href": request.urlgen( "mediagoblin.oauth.client_register", @@ -467,7 +475,7 @@ def host_meta(request): "mediagoblin.webfinger.whoami", qualified=True ), - } + }, ] if "application/json" in request.accept_mimetypes: @@ -481,6 +489,59 @@ def host_meta(request): mimetype="application/xrd+xml" ) +def lrdd_lookup(request): + """ + This is the lrdd endpoint which can lookup a user (or + other things such as activities). This is as specified by + RFC6415. + + The cleint must provide a 'resource' as a GET parameter which + should be the query to be looked up. + """ + + if "resource" not in request.args: + return json_error("No resource parameter", status=400) + + resource = request.args["resource"] + + if "@" in resource: + # Lets pull out the username + resource = resource[5:] if resource.startswith("acct:") else resource + username, host = resource.split("@", 1) + + # Now lookup the user + user = User.query.filter_by(username=username).first() + + if user is None: + return json_error( + "Can't find 'user' with username '{0}'".format(username)) + + return json_response([ + { + "rel": "http://webfinger.net/rel/profile-page", + "href": user.url_for_self(request.urlgen), + "type": "text/html" + }, + { + "rel": "self", + "href": request.urlgen( + "mediagoblin.federation.user", + username=user.username, + qualified=True + ) + }, + { + "rel": "activity-outbox", + "href": request.urlgen( + "mediagoblin.federation.feed", + username=user.username, + qualified=True + ) + } + ]) + else: + return json_error("Unrecognized resource parameter", status=404) + def whoami(request): """ /api/whoami - HTTP redirect to API profile """ |