diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py
index ae56f8cb..bd727db5 100644
--- a/mediagoblin/routing.py
+++ b/mediagoblin/routing.py
@@ -21,6 +21,8 @@ from mediagoblin.submit.routing import submit_routes
from mediagoblin.user_pages.routing import user_routes
from mediagoblin.edit.routing import edit_routes
from mediagoblin.listings.routing import tag_routes
+from mediagoblin.webfinger.routing import webfinger_well_known_routes, \
+ webfinger_routes
def get_mapper():
@@ -36,5 +38,7 @@ def get_mapper():
mapping.extend(user_routes, '/u')
mapping.extend(edit_routes, '/edit')
mapping.extend(tag_routes, '/tag')
+ mapping.extend(webfinger_well_known_routes, '/.well-known')
+ mapping.extend(webfinger_routes, '/api/webfinger')
return mapping
diff --git a/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml
new file mode 100644
index 00000000..dff2c9aa
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml
@@ -0,0 +1,27 @@
+{# 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 .
+-#}
+
+
+
+ {{ request.host }}
+
+
+ {{ llrd_title }}
+
+
diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
new file mode 100644
index 00000000..2ef9b814
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
@@ -0,0 +1,26 @@
+{# 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 .
+-#}
+
+
+
+ {{ uri }}
+ http://{{ request.host }}/u/{{ username }}
+
+
+
diff --git a/mediagoblin/webfinger/__init__.py b/mediagoblin/webfinger/__init__.py
new file mode 100644
index 00000000..ba347c69
--- /dev/null
+++ b/mediagoblin/webfinger/__init__.py
@@ -0,0 +1,15 @@
+# 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 .
diff --git a/mediagoblin/webfinger/routing.py b/mediagoblin/webfinger/routing.py
new file mode 100644
index 00000000..effb2bf2
--- /dev/null
+++ b/mediagoblin/webfinger/routing.py
@@ -0,0 +1,25 @@
+# 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 .
+
+from routes.route import Route
+
+webfinger_well_known_routes = [
+ Route('mediagoblin.webfinger.host_meta', '/host-meta',
+ controller='mediagoblin.webfinger.views:host_meta')]
+
+webfinger_routes = [
+ Route('mediagoblin.webfinger.xrd', '/xrd',
+ controller='mediagoblin.webfinger.views:xrd')]
diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py
new file mode 100644
index 00000000..f6294da9
--- /dev/null
+++ b/mediagoblin/webfinger/views.py
@@ -0,0 +1,46 @@
+# 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 .
+
+import re
+import mediagoblin.mg_globals as mg_globals
+
+from mediagoblin.tools.response import render_to_response
+
+LRDD_TEMPLATE = '{protocol}://{host}/api/webfinger/xrd?uri={{uri}}'
+
+def host_meta(request):
+ '''
+ Webfinger host-meta
+ '''
+ return render_to_response(
+ request,
+ 'mediagoblin/webfinger/host-meta.xml',
+ {'request': request,
+ 'lrdd_template': LRDD_TEMPLATE.format(
+ protocol='http',
+ host=request.host)})
+
+def xrd(request):
+ '''
+ Find user data based on a webfinger URI
+ '''
+ return render_to_response(
+ request,
+ 'mediagoblin/webfinger/xrd.xml',
+ {'request': request,
+ 'username': re.search(
+ r'^acct:([^@]*)',
+ request.GET.get('uri')).group(1)})