Added *very preliminary* support for webfinger
authorJoar Wandborg <git@wandborg.com>
Wed, 14 Dec 2011 23:46:10 +0000 (00:46 +0100)
committerJoar Wandborg <git@wandborg.com>
Wed, 14 Dec 2011 23:46:10 +0000 (00:46 +0100)
mediagoblin/routing.py
mediagoblin/templates/mediagoblin/webfinger/host-meta.xml [new file with mode: 0644]
mediagoblin/templates/mediagoblin/webfinger/xrd.xml [new file with mode: 0644]
mediagoblin/webfinger/__init__.py [new file with mode: 0644]
mediagoblin/webfinger/routing.py [new file with mode: 0644]
mediagoblin/webfinger/views.py [new file with mode: 0644]

index ae56f8cb54a69083636f01183136c19821014326..bd727db5c955e686f8a70ad97ccb25e28331e669 100644 (file)
@@ -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 (file)
index 0000000..dff2c9a
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+-#}
+<?xml version='1.0' encoding='UTF-8'?>
+<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
+     xmlns:hm='http://host-meta.net/xrd/1.0'>
+    <hm:Host>{{ request.host }}</hm:Host>
+    <Link rel='lrdd'
+          template='{{ lrdd_template }}'>
+        <Title>{{ llrd_title }}</Title>
+    </Link>
+</XRD>
diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
new file mode 100644 (file)
index 0000000..2ef9b81
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+-#}
+<?xml version='1.0' encoding='UTF-8'?>
+<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
+    <Subject>{{ uri }}</Subject>
+    <Alias>http://{{ request.host }}/u/{{ username }}</Alias>
+    <Link rel="http://schemas.google.com/g/2010#updates-from"
+          type="application/atom+xml"
+          href="http://{{ request.host }}/u/{{ username }}/atom/" />
+</XRD>
diff --git a/mediagoblin/webfinger/__init__.py b/mediagoblin/webfinger/__init__.py
new file mode 100644 (file)
index 0000000..ba347c6
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
diff --git a/mediagoblin/webfinger/routing.py b/mediagoblin/webfinger/routing.py
new file mode 100644 (file)
index 0000000..effb2bf
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+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 (file)
index 0000000..f6294da
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+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)})