fetch well-known url for nodeinfo

This commit is contained in:
Izalia Mae 2020-12-04 01:43:49 -05:00
parent 1727425bec
commit f0e08f26b3
2 changed files with 25 additions and 3 deletions

View file

@ -104,8 +104,25 @@ async def push_message_to_actor(actor, message, our_key_id):
async def fetch_nodeinfo(domain): 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') software = nodeinfo_data.get('software')
return software.get('name') if software else None return software.get('name') if software else None

View file

@ -12,13 +12,18 @@ CACHE_TTL = CONFIG.get('cache-ttl', 3600)
ACTORS = TTLCache(CACHE_SIZE, CACHE_TTL) 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: if uri in ACTORS and not force:
return ACTORS[uri] return ACTORS[uri]
new_headers = {'Accept': 'application/activity+json'}
for k,v in headers.items():
new_headers[k.capitalize()] = v
try: try:
async with aiohttp.ClientSession(trace_configs=[http_debug()]) as session: 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: if resp.status != 200:
return None return None
ACTORS[uri] = (await resp.json(encoding='utf-8', content_type=None)) ACTORS[uri] = (await resp.json(encoding='utf-8', content_type=None))