fetch well-known url for nodeinfo
authorIzalia Mae <izalia@barkshark.xyz>
Fri, 4 Dec 2020 06:43:49 +0000 (01:43 -0500)
committerIzalia Mae <izalia@barkshark.xyz>
Fri, 4 Dec 2020 06:43:49 +0000 (01:43 -0500)
relay/actor.py
relay/remote_actor.py

index b304721..d0e1f8b 100644 (file)
@@ -104,8 +104,25 @@ async def push_message_to_actor(actor, message, our_key_id):
 
 
 async def fetch_nodeinfo(domain):
-    nodeinfo_data = await fetch_actor(f'https://{domain}/nodeinfo/2.0.json')
+    headers = {'Accept': 'application/activity+json'}
+    nodeinfo_url = None
+
+    wk_nodeinfo = await fetch_actor(f'https://{domain}/.well-known/nodeinfo', headers=headers)
+
+    if not wk_nodeinfo:
+        return
+
+    for link in wk_nodeinfo.get('links', ''):
+        if link['rel'] == 'http://nodeinfo.diaspora.software/ns/schema/2.0':
+            nodeinfo_url = link['href']
+            break
+
+    if not nodeinfo_url:
+        return
+
+    nodeinfo_data = await fetch_actor(nodeinfo_url)
     software = nodeinfo_data.get('software')
+
     return software.get('name') if software else None
 
 
index faa0ced..279ada7 100644 (file)
@@ -12,13 +12,18 @@ CACHE_TTL = CONFIG.get('cache-ttl', 3600)
 ACTORS = TTLCache(CACHE_SIZE, CACHE_TTL)
 
 
-async def fetch_actor(uri, force=False):
+async def fetch_actor(uri, headers={}, force=False):
     if uri in ACTORS and not force:
         return ACTORS[uri]
 
+    new_headers = {'Accept': 'application/activity+json'}
+
+    for k,v in headers.items():
+        new_headers[k.capitalize()] = v
+
     try:
         async with aiohttp.ClientSession(trace_configs=[http_debug()]) as session:
-            async with session.get(uri, headers={'Accept': 'application/activity+json'}) as resp:
+            async with session.get(uri, headers=new_headers) as resp:
                 if resp.status != 200:
                     return None
                 ACTORS[uri] = (await resp.json(encoding='utf-8', content_type=None))