Protocol.receive bug fix: resolve ids before checking for bot user follow, not after

for #1017
pull/926/merge
Ryan Barrett 2024-05-14 17:01:20 -07:00
rodzic 031d8b9cd2
commit 03c5638bc1
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 40 dodań i 6 usunięć

Wyświetl plik

@ -761,6 +761,9 @@ class Protocol:
if actor != authed_as:
logger.warning(f"actor {actor} isn't authed user {authed_as}")
# update copy ids to originals
obj.resolve_ids()
# refresh profile for follows of bot users to re-check whether they're
# opted out
if obj.type == 'follow':
@ -771,10 +774,7 @@ class Protocol:
# load actor user
from_user = from_cls.get_or_create(id=actor)
if not from_user:
error(f'Actor {actor} is opted out', status=204)
# update copy ids to originals
obj.resolve_ids()
error(f'Actor {actor} is opted out or blocked', status=204)
# write Object to datastore
orig = obj

Wyświetl plik

@ -2018,7 +2018,39 @@ class ProtocolReceiveTest(TestCase):
'id': 'eefake:follow',
'actor': 'eefake:user',
'object': 'fa.brid.gy',
})
})
user = user.key.get()
self.assertTrue(user.is_enabled(Fake))
self.assertEqual(['eefake:user'], ExplicitEnableFake.fetched)
def test_follow_bot_user_copy_id_refreshes_profile(self):
# bot user
self.make_user('fa.brid.gy', cls=Web,
copies=[Target(uri='eefake:bot', protocol='eefake')])
# profile that's opted out
user = self.make_user('eefake:user', cls=ExplicitEnableFake, obj_as1={
'id': 'eefake:user',
'summary': '#nobridge',
})
self.assertFalse(user.is_enabled(Fake))
# updated profile isn't opted out
ExplicitEnableFake.fetchable = {'eefake:user': {
'id': 'eefake:user',
'summary': 'never mind',
}}
# follow should refresh profile
with self.assertRaises(NoContent):
ExplicitEnableFake.receive_as1({
'objectType': 'activity',
'verb': 'follow',
'id': 'eefake:follow',
'actor': 'eefake:user',
'object': 'eefake:bot',
})
user = user.key.get()
self.assertTrue(user.is_enabled(Fake))

Wyświetl plik

@ -159,7 +159,9 @@ class Fake(User, protocol.Protocol):
@classmethod
def receive_as1(cls, our_as1, **kwargs):
assert isinstance(our_as1, dict)
return super().receive(Object(id=our_as1['id'], our_as1=our_as1), **kwargs)
return super().receive(Object(id=our_as1['id'], our_as1=our_as1,
source_protocol=cls.LABEL),
**kwargs)
class OtherFake(Fake):