kopia lustrzana https://github.com/snarfed/bridgy-fed
Protocol: add receive task handler
rodzic
55f96c428e
commit
cae19172c9
16
protocol.py
16
protocol.py
|
@ -12,6 +12,7 @@ import werkzeug.exceptions
|
|||
|
||||
import common
|
||||
from common import add, DOMAIN_BLOCKLIST, DOMAINS, error
|
||||
from flask_app import app
|
||||
from models import Follower, Object, PROTOCOLS, Target, User
|
||||
from oauth_dropins.webutil import util
|
||||
from oauth_dropins.webutil.util import json_dumps, json_loads
|
||||
|
@ -961,3 +962,18 @@ class Protocol:
|
|||
with objects_cache_lock:
|
||||
objects_cache[id] = obj
|
||||
return obj
|
||||
|
||||
|
||||
@app.post('/_ah/queue/receive')
|
||||
def receive_task():
|
||||
"""Task handler for a newly received :class:`Object`.
|
||||
|
||||
Form parameters:
|
||||
* key: urlsafe :class:`ndb.Key` of the :class:`Object` to handle
|
||||
"""
|
||||
logger.info(f'Params: {list(request.form.items())}')
|
||||
|
||||
obj = ndb.Key(urlsafe=request.form['key']).get()
|
||||
assert obj
|
||||
|
||||
return PROTOCOLS[obj.source_protocol].receive(obj)
|
||||
|
|
|
@ -339,7 +339,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': post_as1,
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(create_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(create_as1))
|
||||
|
||||
self.assert_object('fake:post',
|
||||
our_as1=post_as1,
|
||||
|
@ -365,7 +365,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'objectType': 'note',
|
||||
'author': 'fake:user',
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(post_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(post_as1))
|
||||
|
||||
self.assert_object('fake:post',
|
||||
our_as1=post_as1,
|
||||
|
@ -402,7 +402,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
self.store_object(id='fake:post', our_as1=post_as1)
|
||||
self.store_object(id='fake:post#bridgy-fed-create', status='failed')
|
||||
|
||||
self.assertEqual('OK', Fake.receive(post_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(post_as1))
|
||||
|
||||
obj = self.assert_object('fake:post#bridgy-fed-create',
|
||||
status='complete',
|
||||
|
@ -424,7 +424,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
}
|
||||
self.store_object(id='fake:post', our_as1=post_as1)
|
||||
|
||||
self.assertEqual('OK', Fake.receive(post_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(post_as1))
|
||||
|
||||
obj = self.assert_object('fake:post#bridgy-fed-create',
|
||||
status='complete',
|
||||
|
@ -452,7 +452,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': post_as1,
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(update_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(update_as1))
|
||||
|
||||
self.assert_object('fake:post',
|
||||
our_as1=post_as1,
|
||||
|
@ -484,7 +484,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
|
||||
post_as1['content'] = 'second'
|
||||
with self.assertRaises(NoContent):
|
||||
Fake.receive(post_as1)
|
||||
Fake.receive_as1(post_as1)
|
||||
|
||||
post_as1['updated'] = '2022-01-02T03:04:05+00:00'
|
||||
self.assert_object('fake:post',
|
||||
|
@ -531,7 +531,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': reply_as1,
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(create_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(create_as1))
|
||||
|
||||
self.assert_object('fake:reply',
|
||||
our_as1=reply_as1,
|
||||
|
@ -562,7 +562,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'id': 'fake:post',
|
||||
'author': 'fake:bob',
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(reply_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(reply_as1))
|
||||
|
||||
self.assert_object('fake:reply',
|
||||
our_as1=reply_as1,
|
||||
|
@ -610,7 +610,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': reply_as1,
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(update_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(update_as1))
|
||||
|
||||
self.assert_object('fake:reply',
|
||||
our_as1=reply_as1,
|
||||
|
@ -640,7 +640,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': 'fake:post',
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(repost_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(repost_as1))
|
||||
|
||||
obj = self.assert_object('fake:repost',
|
||||
status='complete',
|
||||
|
@ -679,7 +679,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'object': orig_url,
|
||||
}
|
||||
with self.assertRaises(NoContent):
|
||||
Fake.receive(repost_as1)
|
||||
Fake.receive_as1(repost_as1)
|
||||
|
||||
obj = self.assert_object('fake:repost',
|
||||
status='ignored',
|
||||
|
@ -703,7 +703,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': 'fake:post',
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(like_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(like_as1))
|
||||
|
||||
like_obj = self.assert_object('fake:like',
|
||||
users=[g.user.key],
|
||||
|
@ -734,7 +734,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:user',
|
||||
'object': 'fake:post',
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(delete_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(delete_as1))
|
||||
|
||||
self.assert_object('fake:post',
|
||||
our_as1=post_as1,
|
||||
|
@ -763,7 +763,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'object': 'fake:post',
|
||||
}
|
||||
with self.assertRaises(NoContent):
|
||||
self.assertEqual('OK', Fake.receive(delete_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(delete_as1))
|
||||
|
||||
self.assert_object('fake:post',
|
||||
deleted=True,
|
||||
|
@ -790,7 +790,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
self.assertEqual(3, Follower.query().count())
|
||||
|
||||
with self.assertRaises(NoContent):
|
||||
Fake.receive({
|
||||
Fake.receive_as1({
|
||||
'objectType': 'activity',
|
||||
'verb': 'delete',
|
||||
'id': 'fake:delete',
|
||||
|
@ -844,7 +844,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
|
||||
mock_send.side_effect = send
|
||||
|
||||
self.assertEqual('OK', Fake.receive(create_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(create_as1))
|
||||
|
||||
self.assert_object('fake:post',
|
||||
our_as1=post_as1,
|
||||
|
@ -880,7 +880,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
},
|
||||
}
|
||||
|
||||
Fake.receive(update_as1)
|
||||
Fake.receive_as1(update_as1)
|
||||
|
||||
# profile object
|
||||
self.assert_object('fake:user',
|
||||
|
@ -922,7 +922,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'url': 'fake:bob',
|
||||
}],
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(mention_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(mention_as1))
|
||||
|
||||
self.assert_object('fake:mention',
|
||||
our_as1=mention_as1,
|
||||
|
@ -976,7 +976,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'object': 'fake:user',
|
||||
**extra,
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(follow_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(follow_as1))
|
||||
|
||||
user = Fake.get_by_id('fake:user')
|
||||
follow_obj = self.assert_object('fake:follow',
|
||||
|
@ -1021,7 +1021,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
|
||||
def test_follow_no_actor(self):
|
||||
with self.assertRaises(BadRequest):
|
||||
Fake.receive({
|
||||
Fake.receive_as1({
|
||||
'id': 'fake:follow',
|
||||
'objectType': 'activity',
|
||||
'verb': 'follow',
|
||||
|
@ -1033,7 +1033,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
|
||||
def test_follow_no_object(self):
|
||||
with self.assertRaises(BadRequest):
|
||||
Fake.receive({
|
||||
Fake.receive_as1({
|
||||
'id': 'fake:follow',
|
||||
'objectType': 'activity',
|
||||
'verb': 'follow',
|
||||
|
@ -1045,7 +1045,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
|
||||
def test_follow_object_unknown_protocol(self):
|
||||
with self.assertRaises(BadRequest):
|
||||
Fake.receive({
|
||||
Fake.receive_as1({
|
||||
'id': 'fake:follow',
|
||||
'objectType': 'activity',
|
||||
'verb': 'follow',
|
||||
|
@ -1069,7 +1069,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'actor': 'fake:alice',
|
||||
'object': 'fake:user',
|
||||
}
|
||||
self.assertEqual('OK', Fake.receive(stop_as1))
|
||||
self.assertEqual('OK', Fake.receive_as1(stop_as1))
|
||||
|
||||
stop_obj = self.assert_object('fake:stop-following',
|
||||
our_as1=stop_as1,
|
||||
|
@ -1088,7 +1088,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
g.user.obj.our_as1 = {'id': 'fake:user'}
|
||||
g.user.obj.put()
|
||||
|
||||
self.assertEqual('OK', Fake.receive({
|
||||
self.assertEqual('OK', Fake.receive_as1({
|
||||
'id': 'fake:stop-following',
|
||||
'objectType': 'activity',
|
||||
'verb': 'stop-following',
|
||||
|
@ -1110,7 +1110,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
g.user.obj.our_as1 = {'id': 'fake:user'}
|
||||
g.user.obj.put()
|
||||
|
||||
self.assertEqual('OK', Fake.receive({
|
||||
self.assertEqual('OK', Fake.receive_as1({
|
||||
'id': 'fake:stop-following',
|
||||
'objectType': 'activity',
|
||||
'verb': 'stop-following',
|
||||
|
@ -1128,14 +1128,14 @@ class ProtocolReceiveTest(TestCase):
|
|||
@skip
|
||||
def test_receive_from_bridgy_fed_domain_fails(self):
|
||||
with self.assertRaises(BadRequest):
|
||||
Fake.receive({
|
||||
Fake.receive_as1({
|
||||
'id': 'https://fed.brid.gy/r/foo',
|
||||
})
|
||||
|
||||
self.assertIsNone(Object.get_by_id('https://fed.brid.gy/r/foo'))
|
||||
|
||||
with self.assertRaises(BadRequest):
|
||||
Fake.receive({
|
||||
Fake.receive_as1({
|
||||
'id': 'fake:foo',
|
||||
'actor': 'https://ap.brid.gy/user.com',
|
||||
})
|
||||
|
@ -1159,7 +1159,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
'object': ['other:dan', 'fake:alice'],
|
||||
}
|
||||
|
||||
self.assertEqual('OK', OtherFake.receive(follow_as1))
|
||||
self.assertEqual('OK', OtherFake.receive_as1(follow_as1))
|
||||
|
||||
self.assertEqual(2, len(Fake.sent))
|
||||
self.assertEqual('accept', Fake.sent[0][0].type)
|
||||
|
@ -1185,7 +1185,7 @@ class ProtocolReceiveTest(TestCase):
|
|||
}
|
||||
|
||||
with self.assertRaises(NoContent):
|
||||
Fake.receive(follow_as1)
|
||||
Fake.receive_as1(follow_as1)
|
||||
|
||||
(bob_obj, bob_target), (eve_obj, eve_target) = Fake.sent
|
||||
self.assertEqual('http://localhost/fa/http://x.com/bob/followers#accept-http://x.com/follow',
|
||||
|
@ -1203,3 +1203,16 @@ class ProtocolReceiveTest(TestCase):
|
|||
ndb.Key(Fake, 'http://x.com/eve')],
|
||||
)
|
||||
self.assertEqual(2, Follower.query().count())
|
||||
|
||||
def test_task_handler(self):
|
||||
note = {
|
||||
'id': 'fake:post',
|
||||
'objectType': 'note',
|
||||
'author': 'fake:other',
|
||||
}
|
||||
obj = self.store_object(id='fake:post', our_as1=note,
|
||||
source_protocol='fake')
|
||||
|
||||
self.client.post('/_ah/queue/receive', data={'key': obj.key.urlsafe()})
|
||||
obj = Object.get_by_id('fake:post#bridgy-fed-create')
|
||||
self.assertEqual('ignored', obj.status)
|
||||
|
|
|
@ -123,7 +123,12 @@ class Fake(User, protocol.Protocol):
|
|||
return 'shared:target' if shared else f'{obj.key.id()}:target'
|
||||
|
||||
@classmethod
|
||||
def receive(cls, our_as1):
|
||||
def receive(cls, obj):
|
||||
assert isinstance(obj, Object)
|
||||
return super().receive(obj=obj)
|
||||
|
||||
@classmethod
|
||||
def receive_as1(cls, our_as1):
|
||||
assert isinstance(our_as1, dict)
|
||||
return super().receive(Object(id=our_as1['id'], our_as1=our_as1))
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue