Add workaround for parsing a buggy older Hubzilla version nodeinfo

This has been fixed in later versions but there are quite a few
versions out with the bug so add a workaround to not crash on those.
merge-requests/130/head
Jason Robinson 2018-05-13 20:47:55 +03:00
rodzic 7590e65f79
commit 1066502591
3 zmienionych plików z 26 dodań i 4 usunięć

Wyświetl plik

@ -13,10 +13,15 @@ def fetch_nodeinfo_document(host):
doc = json.loads(doc)
url, highest_version = '', 0.0
for link in doc.get('links'):
version = float(link.get('rel').split('/')[-1])
if version > highest_version and version <= HIGHEST_SUPPORTED_NODEINFO_VERSION:
url, highest_version = link.get('href'), version
if doc.get('0'):
# Buggy NodeInfo from certain old Hubzilla versions
url = doc.get('0', {}).get('href')
else:
for link in doc.get('links'):
version = float(link.get('rel').split('/')[-1])
if version > highest_version and version <= HIGHEST_SUPPORTED_NODEINFO_VERSION:
url, highest_version = link.get('href'), version
if not url:
return

Wyświetl plik

@ -11,6 +11,11 @@ NODEINFO_20_DOC = '{"version":"2.0","software":{"name":"diaspora","version":"0.7
'22,"localComments":17671},"metadata":{"nodeName":"I Like Toast","xmppChat":false,"camo":{"' \
'markdown":false,"opengraph":false,"remotePods":false},"adminAccount":"podmin"}}'
# Buggy NodeInfo well known found in certain older Hubzilla versions
NODEINFO_WELL_KNOWN_BUGGY = '{"links":{"rel":"http:\/\/nodeinfo.diaspora.software\/ns\/schema\/1.0","href":"h' \
'ttps:\/\/example.com\/nodeinfo\/1.0"},"0":{"rel":"http:\/\/nodeinfo.diaspo' \
'ra.software\/ns\/schema\/2.0","href":"https:\/\/example.com\/nodeinfo\/2.0"}}'
NODEINFO2_10_DOC = """
{
"version": "1.0",

Wyświetl plik

@ -3,6 +3,7 @@ from unittest.mock import patch
from federation.hostmeta.fetchers import (
fetch_nodeinfo_document, fetch_nodeinfo2_document, fetch_statisticsjson_document)
from federation.tests.fixtures.hostmeta import NODEINFO_WELL_KNOWN_BUGGY
class TestFetchNodeInfoDocument:
@ -23,6 +24,17 @@ class TestFetchNodeInfoDocument:
assert kwargs['url'] == 'https://example.com/2.0'
mock_parse.assert_called_once_with(json.loads(self.dummy_doc), 'example.com')
@patch("federation.hostmeta.fetchers.fetch_document",
return_value=(NODEINFO_WELL_KNOWN_BUGGY, 200, None), autospec=True)
@patch("federation.hostmeta.fetchers.parse_nodeinfo_document", autospec=True)
def test_makes_right_calls__buggy_nodeinfo_wellknown(self, mock_parse, mock_fetch):
fetch_nodeinfo_document('example.com')
args, kwargs = mock_fetch.call_args_list[0]
assert kwargs['host'] == 'example.com'
assert kwargs['path'] == '/.well-known/nodeinfo'
args, kwargs = mock_fetch.call_args_list[1]
assert kwargs['url'] == 'https://example.com/nodeinfo/2.0'
class TestFetchNodeInfo2Document:
@patch("federation.hostmeta.fetchers.fetch_document", return_value=('{"foo": "bar"}', 200, None), autospec=True)