webfinger verification: handle URL-encoded Location header

fixes #535
pull/538/head
Ryan Barrett 2023-06-08 11:04:11 -07:00
rodzic de7201fd77
commit 861552f455
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 27 dodań i 6 usunięć

Wyświetl plik

@ -1391,7 +1391,9 @@ class WebTest(TestCase):
def test_verify_neither(self, mock_get, _):
empty = requests_response('')
mock_get.side_effect = [empty, empty]
self._test_verify(False, False, None)
self._test_verify(False, False, None, """\
<pre>https://user.com/.well-known/webfinger?resource=acct:user.com@user.com
returned HTTP 200</pre>""")
def test_verify_redirect_strips_query_params(self, mock_get, _):
half_redir = requests_response(
@ -1422,6 +1424,15 @@ Current vs expected:<pre>- http://localhost/.well-known/webfinger
http://this/404s
returned HTTP 404</pre>""")
def test_verify_webfinger_urlencoded(self, mock_get, _):
mock_get.side_effect = [
requests_response(
status=302,
redirected_url='http://localhost/.well-known/webfinger?resource=acct%3Auser.com%40user.com'),
requests_response(''),
]
self._test_verify(True, False, None)
def test_verify_no_hcard(self, mock_get, _):
mock_get.side_effect = [
FULL_REDIR,

Wyświetl plik

@ -159,6 +159,14 @@ class WebfingerTest(testutil.TestCase):
self.assertEqual('application/jrd+json', got.headers['Content-Type'])
self.assert_equals(WEBFINGER, got.json)
def test_webfinger_urlencoded(self):
"""https://github.com/snarfed/bridgy-fed/issues/535"""
got = self.client.get('/.well-known/webfinger?resource=acct%3Auser.com%40user.com',
headers={'Accept': 'application/json'})
self.assertEqual(200, got.status_code, got.get_data(as_text=True))
self.assertEqual('application/jrd+json', got.headers['Content-Type'])
self.assert_equals(WEBFINGER, got.json)
def test_webfinger_custom_username(self):
self.user.actor_as2 = {
**self.actor_as2,

12
web.py
Wyświetl plik

@ -2,6 +2,7 @@
import datetime
import difflib
import logging
import urllib.parse
from urllib.parse import urlencode, urljoin, urlparse
import feedparser
@ -157,15 +158,16 @@ class Web(User, Protocol):
domain_urls = ([f'https://{domain}/' for domain in common.DOMAINS] +
[common.host_url()])
expected = [urljoin(url, path) for url in domain_urls]
if resp.ok:
if resp.url in expected:
if resp.ok and resp.url:
got = urllib.parse.unquote(resp.url)
if got in expected:
self.has_redirects = True
elif resp.url:
diff = '\n'.join(difflib.Differ().compare([resp.url], [expected[0]]))
elif got:
diff = '\n'.join(difflib.Differ().compare([got], [expected[0]]))
self.redirects_error = f'Current vs expected:<pre>{diff}</pre>'
else:
lines = [url, f' returned HTTP {resp.status_code}']
if resp.url != url:
if resp.url and resp.url != url:
lines[1:1] = [' redirected to:', resp.url]
self.redirects_error = '<pre>' + '\n'.join(lines) + '</pre>'
except RequestException: