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
|
import common
|
||||||
from common import add, DOMAIN_BLOCKLIST, DOMAINS, error
|
from common import add, DOMAIN_BLOCKLIST, DOMAINS, error
|
||||||
|
from flask_app import app
|
||||||
from models import Follower, Object, PROTOCOLS, Target, User
|
from models import Follower, Object, PROTOCOLS, Target, User
|
||||||
from oauth_dropins.webutil import util
|
from oauth_dropins.webutil import util
|
||||||
from oauth_dropins.webutil.util import json_dumps, json_loads
|
from oauth_dropins.webutil.util import json_dumps, json_loads
|
||||||
|
@ -961,3 +962,18 @@ class Protocol:
|
||||||
with objects_cache_lock:
|
with objects_cache_lock:
|
||||||
objects_cache[id] = obj
|
objects_cache[id] = obj
|
||||||
return 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',
|
'actor': 'fake:user',
|
||||||
'object': post_as1,
|
'object': post_as1,
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(create_as1))
|
self.assertEqual('OK', Fake.receive_as1(create_as1))
|
||||||
|
|
||||||
self.assert_object('fake:post',
|
self.assert_object('fake:post',
|
||||||
our_as1=post_as1,
|
our_as1=post_as1,
|
||||||
|
@ -365,7 +365,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'objectType': 'note',
|
'objectType': 'note',
|
||||||
'author': 'fake:user',
|
'author': 'fake:user',
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(post_as1))
|
self.assertEqual('OK', Fake.receive_as1(post_as1))
|
||||||
|
|
||||||
self.assert_object('fake:post',
|
self.assert_object('fake:post',
|
||||||
our_as1=post_as1,
|
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', our_as1=post_as1)
|
||||||
self.store_object(id='fake:post#bridgy-fed-create', status='failed')
|
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',
|
obj = self.assert_object('fake:post#bridgy-fed-create',
|
||||||
status='complete',
|
status='complete',
|
||||||
|
@ -424,7 +424,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
}
|
}
|
||||||
self.store_object(id='fake:post', our_as1=post_as1)
|
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',
|
obj = self.assert_object('fake:post#bridgy-fed-create',
|
||||||
status='complete',
|
status='complete',
|
||||||
|
@ -452,7 +452,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:user',
|
'actor': 'fake:user',
|
||||||
'object': post_as1,
|
'object': post_as1,
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(update_as1))
|
self.assertEqual('OK', Fake.receive_as1(update_as1))
|
||||||
|
|
||||||
self.assert_object('fake:post',
|
self.assert_object('fake:post',
|
||||||
our_as1=post_as1,
|
our_as1=post_as1,
|
||||||
|
@ -484,7 +484,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
|
|
||||||
post_as1['content'] = 'second'
|
post_as1['content'] = 'second'
|
||||||
with self.assertRaises(NoContent):
|
with self.assertRaises(NoContent):
|
||||||
Fake.receive(post_as1)
|
Fake.receive_as1(post_as1)
|
||||||
|
|
||||||
post_as1['updated'] = '2022-01-02T03:04:05+00:00'
|
post_as1['updated'] = '2022-01-02T03:04:05+00:00'
|
||||||
self.assert_object('fake:post',
|
self.assert_object('fake:post',
|
||||||
|
@ -531,7 +531,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:user',
|
'actor': 'fake:user',
|
||||||
'object': reply_as1,
|
'object': reply_as1,
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(create_as1))
|
self.assertEqual('OK', Fake.receive_as1(create_as1))
|
||||||
|
|
||||||
self.assert_object('fake:reply',
|
self.assert_object('fake:reply',
|
||||||
our_as1=reply_as1,
|
our_as1=reply_as1,
|
||||||
|
@ -562,7 +562,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'id': 'fake:post',
|
'id': 'fake:post',
|
||||||
'author': 'fake:bob',
|
'author': 'fake:bob',
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(reply_as1))
|
self.assertEqual('OK', Fake.receive_as1(reply_as1))
|
||||||
|
|
||||||
self.assert_object('fake:reply',
|
self.assert_object('fake:reply',
|
||||||
our_as1=reply_as1,
|
our_as1=reply_as1,
|
||||||
|
@ -610,7 +610,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:user',
|
'actor': 'fake:user',
|
||||||
'object': reply_as1,
|
'object': reply_as1,
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(update_as1))
|
self.assertEqual('OK', Fake.receive_as1(update_as1))
|
||||||
|
|
||||||
self.assert_object('fake:reply',
|
self.assert_object('fake:reply',
|
||||||
our_as1=reply_as1,
|
our_as1=reply_as1,
|
||||||
|
@ -640,7 +640,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:user',
|
'actor': 'fake:user',
|
||||||
'object': 'fake:post',
|
'object': 'fake:post',
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(repost_as1))
|
self.assertEqual('OK', Fake.receive_as1(repost_as1))
|
||||||
|
|
||||||
obj = self.assert_object('fake:repost',
|
obj = self.assert_object('fake:repost',
|
||||||
status='complete',
|
status='complete',
|
||||||
|
@ -679,7 +679,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'object': orig_url,
|
'object': orig_url,
|
||||||
}
|
}
|
||||||
with self.assertRaises(NoContent):
|
with self.assertRaises(NoContent):
|
||||||
Fake.receive(repost_as1)
|
Fake.receive_as1(repost_as1)
|
||||||
|
|
||||||
obj = self.assert_object('fake:repost',
|
obj = self.assert_object('fake:repost',
|
||||||
status='ignored',
|
status='ignored',
|
||||||
|
@ -703,7 +703,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:user',
|
'actor': 'fake:user',
|
||||||
'object': 'fake:post',
|
'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',
|
like_obj = self.assert_object('fake:like',
|
||||||
users=[g.user.key],
|
users=[g.user.key],
|
||||||
|
@ -734,7 +734,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:user',
|
'actor': 'fake:user',
|
||||||
'object': 'fake:post',
|
'object': 'fake:post',
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(delete_as1))
|
self.assertEqual('OK', Fake.receive_as1(delete_as1))
|
||||||
|
|
||||||
self.assert_object('fake:post',
|
self.assert_object('fake:post',
|
||||||
our_as1=post_as1,
|
our_as1=post_as1,
|
||||||
|
@ -763,7 +763,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'object': 'fake:post',
|
'object': 'fake:post',
|
||||||
}
|
}
|
||||||
with self.assertRaises(NoContent):
|
with self.assertRaises(NoContent):
|
||||||
self.assertEqual('OK', Fake.receive(delete_as1))
|
self.assertEqual('OK', Fake.receive_as1(delete_as1))
|
||||||
|
|
||||||
self.assert_object('fake:post',
|
self.assert_object('fake:post',
|
||||||
deleted=True,
|
deleted=True,
|
||||||
|
@ -790,7 +790,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
self.assertEqual(3, Follower.query().count())
|
self.assertEqual(3, Follower.query().count())
|
||||||
|
|
||||||
with self.assertRaises(NoContent):
|
with self.assertRaises(NoContent):
|
||||||
Fake.receive({
|
Fake.receive_as1({
|
||||||
'objectType': 'activity',
|
'objectType': 'activity',
|
||||||
'verb': 'delete',
|
'verb': 'delete',
|
||||||
'id': 'fake:delete',
|
'id': 'fake:delete',
|
||||||
|
@ -844,7 +844,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
|
|
||||||
mock_send.side_effect = send
|
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',
|
self.assert_object('fake:post',
|
||||||
our_as1=post_as1,
|
our_as1=post_as1,
|
||||||
|
@ -880,7 +880,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
Fake.receive(update_as1)
|
Fake.receive_as1(update_as1)
|
||||||
|
|
||||||
# profile object
|
# profile object
|
||||||
self.assert_object('fake:user',
|
self.assert_object('fake:user',
|
||||||
|
@ -922,7 +922,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'url': 'fake:bob',
|
'url': 'fake:bob',
|
||||||
}],
|
}],
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(mention_as1))
|
self.assertEqual('OK', Fake.receive_as1(mention_as1))
|
||||||
|
|
||||||
self.assert_object('fake:mention',
|
self.assert_object('fake:mention',
|
||||||
our_as1=mention_as1,
|
our_as1=mention_as1,
|
||||||
|
@ -976,7 +976,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'object': 'fake:user',
|
'object': 'fake:user',
|
||||||
**extra,
|
**extra,
|
||||||
}
|
}
|
||||||
self.assertEqual('OK', Fake.receive(follow_as1))
|
self.assertEqual('OK', Fake.receive_as1(follow_as1))
|
||||||
|
|
||||||
user = Fake.get_by_id('fake:user')
|
user = Fake.get_by_id('fake:user')
|
||||||
follow_obj = self.assert_object('fake:follow',
|
follow_obj = self.assert_object('fake:follow',
|
||||||
|
@ -1021,7 +1021,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
|
|
||||||
def test_follow_no_actor(self):
|
def test_follow_no_actor(self):
|
||||||
with self.assertRaises(BadRequest):
|
with self.assertRaises(BadRequest):
|
||||||
Fake.receive({
|
Fake.receive_as1({
|
||||||
'id': 'fake:follow',
|
'id': 'fake:follow',
|
||||||
'objectType': 'activity',
|
'objectType': 'activity',
|
||||||
'verb': 'follow',
|
'verb': 'follow',
|
||||||
|
@ -1033,7 +1033,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
|
|
||||||
def test_follow_no_object(self):
|
def test_follow_no_object(self):
|
||||||
with self.assertRaises(BadRequest):
|
with self.assertRaises(BadRequest):
|
||||||
Fake.receive({
|
Fake.receive_as1({
|
||||||
'id': 'fake:follow',
|
'id': 'fake:follow',
|
||||||
'objectType': 'activity',
|
'objectType': 'activity',
|
||||||
'verb': 'follow',
|
'verb': 'follow',
|
||||||
|
@ -1045,7 +1045,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
|
|
||||||
def test_follow_object_unknown_protocol(self):
|
def test_follow_object_unknown_protocol(self):
|
||||||
with self.assertRaises(BadRequest):
|
with self.assertRaises(BadRequest):
|
||||||
Fake.receive({
|
Fake.receive_as1({
|
||||||
'id': 'fake:follow',
|
'id': 'fake:follow',
|
||||||
'objectType': 'activity',
|
'objectType': 'activity',
|
||||||
'verb': 'follow',
|
'verb': 'follow',
|
||||||
|
@ -1069,7 +1069,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'actor': 'fake:alice',
|
'actor': 'fake:alice',
|
||||||
'object': 'fake:user',
|
'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',
|
stop_obj = self.assert_object('fake:stop-following',
|
||||||
our_as1=stop_as1,
|
our_as1=stop_as1,
|
||||||
|
@ -1088,7 +1088,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
g.user.obj.our_as1 = {'id': 'fake:user'}
|
g.user.obj.our_as1 = {'id': 'fake:user'}
|
||||||
g.user.obj.put()
|
g.user.obj.put()
|
||||||
|
|
||||||
self.assertEqual('OK', Fake.receive({
|
self.assertEqual('OK', Fake.receive_as1({
|
||||||
'id': 'fake:stop-following',
|
'id': 'fake:stop-following',
|
||||||
'objectType': 'activity',
|
'objectType': 'activity',
|
||||||
'verb': 'stop-following',
|
'verb': 'stop-following',
|
||||||
|
@ -1110,7 +1110,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
g.user.obj.our_as1 = {'id': 'fake:user'}
|
g.user.obj.our_as1 = {'id': 'fake:user'}
|
||||||
g.user.obj.put()
|
g.user.obj.put()
|
||||||
|
|
||||||
self.assertEqual('OK', Fake.receive({
|
self.assertEqual('OK', Fake.receive_as1({
|
||||||
'id': 'fake:stop-following',
|
'id': 'fake:stop-following',
|
||||||
'objectType': 'activity',
|
'objectType': 'activity',
|
||||||
'verb': 'stop-following',
|
'verb': 'stop-following',
|
||||||
|
@ -1128,14 +1128,14 @@ class ProtocolReceiveTest(TestCase):
|
||||||
@skip
|
@skip
|
||||||
def test_receive_from_bridgy_fed_domain_fails(self):
|
def test_receive_from_bridgy_fed_domain_fails(self):
|
||||||
with self.assertRaises(BadRequest):
|
with self.assertRaises(BadRequest):
|
||||||
Fake.receive({
|
Fake.receive_as1({
|
||||||
'id': 'https://fed.brid.gy/r/foo',
|
'id': 'https://fed.brid.gy/r/foo',
|
||||||
})
|
})
|
||||||
|
|
||||||
self.assertIsNone(Object.get_by_id('https://fed.brid.gy/r/foo'))
|
self.assertIsNone(Object.get_by_id('https://fed.brid.gy/r/foo'))
|
||||||
|
|
||||||
with self.assertRaises(BadRequest):
|
with self.assertRaises(BadRequest):
|
||||||
Fake.receive({
|
Fake.receive_as1({
|
||||||
'id': 'fake:foo',
|
'id': 'fake:foo',
|
||||||
'actor': 'https://ap.brid.gy/user.com',
|
'actor': 'https://ap.brid.gy/user.com',
|
||||||
})
|
})
|
||||||
|
@ -1159,7 +1159,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
'object': ['other:dan', 'fake:alice'],
|
'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(2, len(Fake.sent))
|
||||||
self.assertEqual('accept', Fake.sent[0][0].type)
|
self.assertEqual('accept', Fake.sent[0][0].type)
|
||||||
|
@ -1185,7 +1185,7 @@ class ProtocolReceiveTest(TestCase):
|
||||||
}
|
}
|
||||||
|
|
||||||
with self.assertRaises(NoContent):
|
with self.assertRaises(NoContent):
|
||||||
Fake.receive(follow_as1)
|
Fake.receive_as1(follow_as1)
|
||||||
|
|
||||||
(bob_obj, bob_target), (eve_obj, eve_target) = Fake.sent
|
(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',
|
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')],
|
ndb.Key(Fake, 'http://x.com/eve')],
|
||||||
)
|
)
|
||||||
self.assertEqual(2, Follower.query().count())
|
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'
|
return 'shared:target' if shared else f'{obj.key.id()}:target'
|
||||||
|
|
||||||
@classmethod
|
@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)
|
assert isinstance(our_as1, dict)
|
||||||
return super().receive(Object(id=our_as1['id'], our_as1=our_as1))
|
return super().receive(Object(id=our_as1['id'], our_as1=our_as1))
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue