aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJessica Tallon <jessica@megworld.co.uk>2014-09-08 16:26:48 +0100
committerJessica Tallon <jessica@megworld.co.uk>2014-09-08 17:54:03 +0100
commit1bce996181d9ae18756e6bbc0750bb6dc9d09609 (patch)
tree3a98a23aa1e8e8c46ce2e8aeb2bcf23bacd07646
parent0af1b859989e6a910360b5ac87c5b7c8dc2e5a91 (diff)
downloadmediagoblin-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.py8
-rw-r--r--mediagoblin/federation/views.py63
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 """