kopia lustrzana https://github.com/snarfed/bridgy-fed
expand User.ap_subdomain to allow protocol subdomains like bsky
part of setting up per-protocol bot users for #880pull/968/head
rodzic
e1f9021696
commit
ed78090d2c
|
@ -38,15 +38,12 @@ SUPERDOMAIN = '.brid.gy'
|
||||||
# use it to canonicalize most UI routes from these to fed.brid.gy.
|
# use it to canonicalize most UI routes from these to fed.brid.gy.
|
||||||
PROTOCOL_DOMAINS = (
|
PROTOCOL_DOMAINS = (
|
||||||
'ap.brid.gy',
|
'ap.brid.gy',
|
||||||
'atp.brid.gy',
|
|
||||||
'atproto.brid.gy',
|
'atproto.brid.gy',
|
||||||
'bluesky.brid.gy',
|
|
||||||
'bsky.brid.gy',
|
'bsky.brid.gy',
|
||||||
|
'web.brid.gy',
|
||||||
'eefake.brid.gy',
|
'eefake.brid.gy',
|
||||||
'fa.brid.gy',
|
'fa.brid.gy',
|
||||||
'other.brid.gy',
|
'other.brid.gy',
|
||||||
'nostr.brid.gy',
|
|
||||||
'web.brid.gy',
|
|
||||||
)
|
)
|
||||||
OTHER_DOMAINS = (
|
OTHER_DOMAINS = (
|
||||||
'bridgy-federated.appspot.com',
|
'bridgy-federated.appspot.com',
|
||||||
|
|
22
ids.py
22
ids.py
|
@ -21,7 +21,9 @@ COPIES_PROTOCOLS = ('atproto',)
|
||||||
|
|
||||||
# Web user domains whose AP actor ids are on fed.brid.gy, not web.brid.gy, for
|
# Web user domains whose AP actor ids are on fed.brid.gy, not web.brid.gy, for
|
||||||
# historical compatibility. Loaded on first call to web_ap_subdomain().
|
# historical compatibility. Loaded on first call to web_ap_subdomain().
|
||||||
_FED_SUBDOMAIN_SITES = None
|
#
|
||||||
|
# Maps string domain to string subdomain (bsky, fed, or web).
|
||||||
|
_NON_WEB_SUBDOMAIN_SITES = None
|
||||||
|
|
||||||
|
|
||||||
def web_ap_base_domain(user_domain):
|
def web_ap_base_domain(user_domain):
|
||||||
|
@ -40,16 +42,18 @@ def web_ap_base_domain(user_domain):
|
||||||
if request.host in LOCAL_DOMAINS:
|
if request.host in LOCAL_DOMAINS:
|
||||||
return request.host_url
|
return request.host_url
|
||||||
|
|
||||||
global _FED_SUBDOMAIN_SITES
|
global _NON_WEB_SUBDOMAIN_SITES
|
||||||
if _FED_SUBDOMAIN_SITES is None:
|
if _NON_WEB_SUBDOMAIN_SITES is None:
|
||||||
_FED_SUBDOMAIN_SITES = {
|
_NON_WEB_SUBDOMAIN_SITES = {
|
||||||
key.id() for key in Query('MagicKey',
|
user.key.id(): user.ap_subdomain
|
||||||
filters=FilterNode('ap_subdomain', '=', 'fed')
|
for key in Query('MagicKey',
|
||||||
).fetch(keys_only=True)
|
filters=FilterNode('ap_subdomain', '!=', 'web'),
|
||||||
|
projection=['ap_subdomain'],
|
||||||
|
).fetch()
|
||||||
}
|
}
|
||||||
logger.info(f'Loaded {len(_FED_SUBDOMAIN_SITES)} fed subdomain Web users')
|
logger.info(f'Loaded {len(_NON_WEB_SUBDOMAIN_SITES)} non-web.brid.gy Web users')
|
||||||
|
|
||||||
subdomain = 'fed' if user_domain in _FED_SUBDOMAIN_SITES else 'web'
|
subdomain = _NON_WEB_SUBDOMAIN_SITES.get(user_domain, 'web')
|
||||||
return f'https://{subdomain}{SUPERDOMAIN}/'
|
return f'https://{subdomain}{SUPERDOMAIN}/'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2411,3 +2411,5 @@ class ActivityPubUtilsTest(TestCase):
|
||||||
'actor': 'https://fa.brid.gy/ap/fake:user',
|
'actor': 'https://fa.brid.gy/ap/fake:user',
|
||||||
'to': [as2.PUBLIC_AUDIENCE],
|
'to': [as2.PUBLIC_AUDIENCE],
|
||||||
}, json_loads(kwargs['data']))
|
}, json_loads(kwargs['data']))
|
||||||
|
|
||||||
|
# TODO: actor fetch and webfinger for @bsky.brid.gy@bsky.brid.gy both don't work. test and fix those.
|
||||||
|
|
|
@ -88,7 +88,10 @@ class IdsTest(TestCase):
|
||||||
self.assertEqual(expected, translate_user_id(
|
self.assertEqual(expected, translate_user_id(
|
||||||
id='https://www.user.com/', from_=Web, to=proto))
|
id='https://www.user.com/', from_=Web, to=proto))
|
||||||
|
|
||||||
@patch('ids._FED_SUBDOMAIN_SITES', new={'on-fed.com'})
|
@patch('ids._NON_WEB_SUBDOMAIN_SITES', new={
|
||||||
|
'on-bsky.com': 'bsky',
|
||||||
|
'on-fed.com': 'fed',
|
||||||
|
})
|
||||||
def test_translate_user_id_web_ap_subdomain_fed(self):
|
def test_translate_user_id_web_ap_subdomain_fed(self):
|
||||||
for base_url in ['https://web.brid.gy/', 'https://fed.brid.gy/']:
|
for base_url in ['https://web.brid.gy/', 'https://fed.brid.gy/']:
|
||||||
with app.test_request_context('/', base_url=base_url):
|
with app.test_request_context('/', base_url=base_url):
|
||||||
|
@ -96,6 +99,8 @@ class IdsTest(TestCase):
|
||||||
id='on-web.com', from_=Web, to=ActivityPub))
|
id='on-web.com', from_=Web, to=ActivityPub))
|
||||||
self.assertEqual('https://fed.brid.gy/on-fed.com', translate_user_id(
|
self.assertEqual('https://fed.brid.gy/on-fed.com', translate_user_id(
|
||||||
id='on-fed.com', from_=Web, to=ActivityPub))
|
id='on-fed.com', from_=Web, to=ActivityPub))
|
||||||
|
self.assertEqual('https://bsky.brid.gy/on-bsky.com', translate_user_id(
|
||||||
|
id='on-bsky.com', from_=Web, to=ActivityPub))
|
||||||
|
|
||||||
def test_translate_handle(self):
|
def test_translate_handle(self):
|
||||||
for from_, handle, to, expected in [
|
for from_, handle, to, expected in [
|
||||||
|
@ -185,7 +190,7 @@ class IdsTest(TestCase):
|
||||||
self.assertEqual(expected, translate_object_id(
|
self.assertEqual(expected, translate_object_id(
|
||||||
id=id, from_=from_, to=to))
|
id=id, from_=from_, to=to))
|
||||||
|
|
||||||
@patch('ids._FED_SUBDOMAIN_SITES', new={'on-fed.com'})
|
@patch('ids._NON_WEB_SUBDOMAIN_SITES', new={'on-fed.com': 'fed'})
|
||||||
def test_translate_object_id_web_ap_subdomain_fed(self):
|
def test_translate_object_id_web_ap_subdomain_fed(self):
|
||||||
for base_url in ['https://web.brid.gy/', 'https://fed.brid.gy/']:
|
for base_url in ['https://web.brid.gy/', 'https://fed.brid.gy/']:
|
||||||
with app.test_request_context('/', base_url=base_url):
|
with app.test_request_context('/', base_url=base_url):
|
||||||
|
|
|
@ -2541,6 +2541,8 @@ class WebUtilTest(TestCase):
|
||||||
self.assertIs(False, Web.owns_id('http://localhost:8080/foo'))
|
self.assertIs(False, Web.owns_id('http://localhost:8080/foo'))
|
||||||
self.assertIs(False, Web.owns_id('https://twitter.com/'))
|
self.assertIs(False, Web.owns_id('https://twitter.com/'))
|
||||||
self.assertIs(False, Web.owns_id('https://ap.brid.gy/foo'))
|
self.assertIs(False, Web.owns_id('https://ap.brid.gy/foo'))
|
||||||
|
# TODO: this still needs to be false
|
||||||
|
# special-case PROTOCOL_DOMAINS homepages in Web.owns_id, otherwise False
|
||||||
|
|
||||||
def test_owns_handle(self, *_):
|
def test_owns_handle(self, *_):
|
||||||
self.assertIsNone(Web.owns_handle('foo.com'))
|
self.assertIsNone(Web.owns_handle('foo.com'))
|
||||||
|
@ -2552,7 +2554,7 @@ class WebUtilTest(TestCase):
|
||||||
self.assertEqual(False, Web.owns_handle('@foo@bar.com'))
|
self.assertEqual(False, Web.owns_handle('@foo@bar.com'))
|
||||||
self.assertEqual(False, Web.owns_handle('foo@bar.com'))
|
self.assertEqual(False, Web.owns_handle('foo@bar.com'))
|
||||||
self.assertEqual(False, Web.owns_handle('localhost'))
|
self.assertEqual(False, Web.owns_handle('localhost'))
|
||||||
self.assertEqual(False, Web.owns_handle('bsky.brid.gy'))
|
self.assertEqual(True, Web.owns_handle('bsky.brid.gy'))
|
||||||
|
|
||||||
def test_handle_to_id(self, *_):
|
def test_handle_to_id(self, *_):
|
||||||
self.assertEqual('foo.com', Web.handle_to_id('foo.com'))
|
self.assertEqual('foo.com', Web.handle_to_id('foo.com'))
|
||||||
|
|
15
web.py
15
web.py
|
@ -76,7 +76,9 @@ def is_valid_domain(domain):
|
||||||
# logger.debug(f"{domain} doesn't look like a domain")
|
# logger.debug(f"{domain} doesn't look like a domain")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if Web.is_blocklisted(domain) and domain != common.PRIMARY_DOMAIN:
|
if (Web.is_blocklisted(domain)
|
||||||
|
and domain != PRIMARY_DOMAIN
|
||||||
|
and domain not in PROTOCOL_DOMAINS):
|
||||||
logger.debug(f'{domain} is blocklisted')
|
logger.debug(f'{domain} is blocklisted')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -112,9 +114,14 @@ class Web(User, Protocol):
|
||||||
# Originally, BF served Web users' AP actor ids on fed.brid.gy, eg
|
# Originally, BF served Web users' AP actor ids on fed.brid.gy, eg
|
||||||
# https://fed.brid.gy/snarfed.org . When we started adding new protocols, we
|
# https://fed.brid.gy/snarfed.org . When we started adding new protocols, we
|
||||||
# switched to per-protocol subdomains, eg https://web.brid.gy/snarfed.org .
|
# switched to per-protocol subdomains, eg https://web.brid.gy/snarfed.org .
|
||||||
# However, we need to preserve the old users' actor ids as is. So, this
|
# However, we need to preserve the old users' actor ids as is.
|
||||||
# property tracks which subdomain a given Web user's AP actor uses.
|
#
|
||||||
ap_subdomain = ndb.StringProperty(choices=['fed', 'web'], default='web')
|
# Also, our per-protocol bot accounts in ActivityPub are on their own
|
||||||
|
# subdomains, eg @bsky.brid.gy@bsky.brid.gy.
|
||||||
|
#
|
||||||
|
# So, this property tracks which subdomain a given Web user's AP actor uses.
|
||||||
|
ap_subdomain = ndb.StringProperty(choices=['bsky', 'fed', 'web'],
|
||||||
|
default='web')
|
||||||
|
|
||||||
# OLD. some stored entities still have these; do not reuse.
|
# OLD. some stored entities still have these; do not reuse.
|
||||||
# superfeedr_subscribed = ndb.DateTimeProperty(tzinfo=timezone.utc)
|
# superfeedr_subscribed = ndb.DateTimeProperty(tzinfo=timezone.utc)
|
||||||
|
|
Ładowanie…
Reference in New Issue