kopia lustrzana https://github.com/snarfed/bridgy-fed
				
				
				
			
							rodzic
							
								
									990ec47c89
								
							
						
					
					
						commit
						2c6a470058
					
				| 
						 | 
				
			
			@ -13,7 +13,6 @@ from web import Web
 | 
			
		|||
class CommonTest(TestCase):
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super().setUp()
 | 
			
		||||
        g.user = Fake(id='user.com')
 | 
			
		||||
 | 
			
		||||
    def test_pretty_link(self):
 | 
			
		||||
        for expected, url, text in (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ class UserTest(TestCase):
 | 
			
		|||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super().setUp()
 | 
			
		||||
        g.user = self.make_user('y.z', cls=Web)
 | 
			
		||||
        self.user = self.make_user('y.z', cls=Web)
 | 
			
		||||
 | 
			
		||||
    def test_get_or_create(self):
 | 
			
		||||
        user = Fake.get_or_create('fake:user')
 | 
			
		||||
| 
						 | 
				
			
			@ -94,57 +94,57 @@ class UserTest(TestCase):
 | 
			
		|||
 | 
			
		||||
    def test_get_or_create_use_instead(self):
 | 
			
		||||
        user = Fake.get_or_create('a.b')
 | 
			
		||||
        user.use_instead = g.user.key
 | 
			
		||||
        user.use_instead = self.user.key
 | 
			
		||||
        user.put()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual('y.z', Fake.get_or_create('a.b').key.id())
 | 
			
		||||
 | 
			
		||||
    def test_public_pem(self):
 | 
			
		||||
        pem = g.user.public_pem()
 | 
			
		||||
        pem = self.user.public_pem()
 | 
			
		||||
        self.assertTrue(pem.decode().startswith('-----BEGIN PUBLIC KEY-----\n'), pem)
 | 
			
		||||
        self.assertTrue(pem.decode().endswith('-----END PUBLIC KEY-----'), pem)
 | 
			
		||||
 | 
			
		||||
    def test_private_pem(self):
 | 
			
		||||
        pem = g.user.private_pem()
 | 
			
		||||
        pem = self.user.private_pem()
 | 
			
		||||
        self.assertTrue(pem.decode().startswith('-----BEGIN RSA PRIVATE KEY-----\n'), pem)
 | 
			
		||||
        self.assertTrue(pem.decode().endswith('-----END RSA PRIVATE KEY-----'), pem)
 | 
			
		||||
 | 
			
		||||
    def test_user_page_path(self):
 | 
			
		||||
        self.assertEqual('/web/y.z', g.user.user_page_path())
 | 
			
		||||
        self.assertEqual('/web/y.z/followers', g.user.user_page_path('followers'))
 | 
			
		||||
        self.assertEqual('/web/y.z', self.user.user_page_path())
 | 
			
		||||
        self.assertEqual('/web/y.z/followers', self.user.user_page_path('followers'))
 | 
			
		||||
        self.assertEqual('/fa/foo', self.make_user('foo', cls=Fake).user_page_path())
 | 
			
		||||
 | 
			
		||||
    def test_user_link(self):
 | 
			
		||||
        self.assert_multiline_equals("""\
 | 
			
		||||
<a class="h-card u-author" href="https://y.z/">
 | 
			
		||||
  <img src="" class="profile">
 | 
			
		||||
  y.z</a>""", g.user.user_link())
 | 
			
		||||
  y.z</a>""", self.user.user_link())
 | 
			
		||||
 | 
			
		||||
        g.user.obj = Object(id='a', as2=ACTOR)
 | 
			
		||||
        self.user.obj = Object(id='a', as2=ACTOR)
 | 
			
		||||
        self.assert_multiline_equals("""\
 | 
			
		||||
<a class="h-card u-author" href="https://y.z/">
 | 
			
		||||
<img src="https://user.com/me.jpg" class="profile">
 | 
			
		||||
  Mrs. ☕ Foo</a>""", g.user.user_link())
 | 
			
		||||
  Mrs. ☕ Foo</a>""", self.user.user_link())
 | 
			
		||||
 | 
			
		||||
    def test_is_web_url(self):
 | 
			
		||||
        for url in 'y.z', '//y.z', 'http://y.z', 'https://y.z':
 | 
			
		||||
            self.assertTrue(g.user.is_web_url(url), url)
 | 
			
		||||
            self.assertTrue(self.user.is_web_url(url), url)
 | 
			
		||||
 | 
			
		||||
        for url in (None, '', 'user', 'com', 'com.user', 'ftp://y.z',
 | 
			
		||||
                    'https://user', '://y.z'):
 | 
			
		||||
            self.assertFalse(g.user.is_web_url(url), url)
 | 
			
		||||
            self.assertFalse(self.user.is_web_url(url), url)
 | 
			
		||||
 | 
			
		||||
    def test_name(self):
 | 
			
		||||
        self.assertEqual('y.z', g.user.name())
 | 
			
		||||
        self.assertEqual('y.z', self.user.name())
 | 
			
		||||
 | 
			
		||||
        g.user.obj = Object(id='a', as2={'id': 'abc'})
 | 
			
		||||
        self.assertEqual('y.z', g.user.name())
 | 
			
		||||
        self.user.obj = Object(id='a', as2={'id': 'abc'})
 | 
			
		||||
        self.assertEqual('y.z', self.user.name())
 | 
			
		||||
 | 
			
		||||
        g.user.obj = Object(id='a', as2={'name': 'alice'})
 | 
			
		||||
        self.assertEqual('alice', g.user.name())
 | 
			
		||||
        self.user.obj = Object(id='a', as2={'name': 'alice'})
 | 
			
		||||
        self.assertEqual('alice', self.user.name())
 | 
			
		||||
 | 
			
		||||
    def test_handle(self):
 | 
			
		||||
        self.assertEqual('y.z', g.user.handle)
 | 
			
		||||
        self.assertEqual('y.z', self.user.handle)
 | 
			
		||||
 | 
			
		||||
    def test_id_as(self):
 | 
			
		||||
        user = self.make_user('fake:user', cls=Fake)
 | 
			
		||||
| 
						 | 
				
			
			@ -175,7 +175,7 @@ class UserTest(TestCase):
 | 
			
		|||
        bob = Fake(id='bob.com', obj_key=Object(id='bob').key)
 | 
			
		||||
        bob.put()
 | 
			
		||||
 | 
			
		||||
        user = g.user.key.get()
 | 
			
		||||
        user = self.user.key.get()
 | 
			
		||||
        self.assertFalse(hasattr(user, '_obj'))
 | 
			
		||||
        self.assertFalse(hasattr(alice, '_obj'))
 | 
			
		||||
        self.assertIsNone(bob._obj)
 | 
			
		||||
| 
						 | 
				
			
			@ -186,7 +186,7 @@ class UserTest(TestCase):
 | 
			
		|||
        self.assertIsNone(bob._obj)
 | 
			
		||||
 | 
			
		||||
    def test_status(self):
 | 
			
		||||
        self.assertIsNone(g.user.status)
 | 
			
		||||
        self.assertIsNone(self.user.status)
 | 
			
		||||
 | 
			
		||||
        user = self.make_user('fake:user', cls=Fake, obj_as1={
 | 
			
		||||
            'summary': 'I like this',
 | 
			
		||||
| 
						 | 
				
			
			@ -217,25 +217,25 @@ class UserTest(TestCase):
 | 
			
		|||
        self.assertEqual('other:foo', user.get_copy(OtherFake))
 | 
			
		||||
 | 
			
		||||
    def test_count_followers(self):
 | 
			
		||||
        self.assertEqual((0, 0), g.user.count_followers())
 | 
			
		||||
        self.assertEqual((0, 0), self.user.count_followers())
 | 
			
		||||
 | 
			
		||||
        Follower(from_=g.user.key, to=Fake(id='a').key).put()
 | 
			
		||||
        Follower(from_=g.user.key, to=Fake(id='b').key).put()
 | 
			
		||||
        Follower(from_=Fake(id='c').key, to=g.user.key).put()
 | 
			
		||||
        Follower(from_=self.user.key, to=Fake(id='a').key).put()
 | 
			
		||||
        Follower(from_=self.user.key, to=Fake(id='b').key).put()
 | 
			
		||||
        Follower(from_=Fake(id='c').key, to=self.user.key).put()
 | 
			
		||||
 | 
			
		||||
        # still cached
 | 
			
		||||
        user = Web.get_by_id('y.z')
 | 
			
		||||
        self.assertEqual((0, 0), user.count_followers())
 | 
			
		||||
 | 
			
		||||
        User.count_followers.cache.clear()
 | 
			
		||||
        del g.user
 | 
			
		||||
        del self.user
 | 
			
		||||
        self.assertEqual((1, 2), user.count_followers())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ObjectTest(TestCase):
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super().setUp()
 | 
			
		||||
        g.user = None
 | 
			
		||||
        self.user = None
 | 
			
		||||
 | 
			
		||||
    def test_target_hashable(self):
 | 
			
		||||
        target = Target(protocol='ui', uri='http://foo')
 | 
			
		||||
| 
						 | 
				
			
			@ -448,9 +448,10 @@ class ObjectTest(TestCase):
 | 
			
		|||
            Object(id='x', our_as1={'actor': {'id': 'http://foo'}}).actor_link())
 | 
			
		||||
 | 
			
		||||
    def test_actor_link_user(self):
 | 
			
		||||
        g.user = Fake(id='fake:user', obj=Object(id='a', as2={"name": "Alice"}))
 | 
			
		||||
        obj = Object(id='x', source_protocol='ui', users=[g.user.key])
 | 
			
		||||
        self.user = Fake(id='fake:user', obj=Object(id='a', as2={"name": "Alice"}))
 | 
			
		||||
        obj = Object(id='x', source_protocol='ui', users=[self.user.key])
 | 
			
		||||
 | 
			
		||||
        g.user = self.user
 | 
			
		||||
        got = obj.actor_link()
 | 
			
		||||
        self.assertIn('href="fake:user">', got)
 | 
			
		||||
        self.assertIn('Alice', got)
 | 
			
		||||
| 
						 | 
				
			
			@ -809,7 +810,7 @@ class FollowerTest(TestCase):
 | 
			
		|||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super().setUp()
 | 
			
		||||
        g.user = self.make_user('foo', cls=Fake)
 | 
			
		||||
        self.user = self.make_user('foo', cls=Fake)
 | 
			
		||||
        self.other_user = self.make_user('bar', cls=Fake)
 | 
			
		||||
 | 
			
		||||
    def test_from_to_same_type_fails(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -820,22 +821,22 @@ class FollowerTest(TestCase):
 | 
			
		|||
            Follower.get_or_create(from_=Web(id='foo.com'), to=Web(id='bar.com'))
 | 
			
		||||
 | 
			
		||||
    def test_get_or_create(self):
 | 
			
		||||
        follower = Follower.get_or_create(from_=g.user, to=self.other_user)
 | 
			
		||||
        follower = Follower.get_or_create(from_=self.user, to=self.other_user)
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(g.user.key, follower.from_)
 | 
			
		||||
        self.assertEqual(self.user.key, follower.from_)
 | 
			
		||||
        self.assertEqual(self.other_user.key, follower.to)
 | 
			
		||||
        self.assertEqual(1, Follower.query().count())
 | 
			
		||||
 | 
			
		||||
        follower2 = Follower.get_or_create(from_=g.user, to=self.other_user)
 | 
			
		||||
        follower2 = Follower.get_or_create(from_=self.user, to=self.other_user)
 | 
			
		||||
        self.assert_entities_equal(follower, follower2)
 | 
			
		||||
        self.assertEqual(1, Follower.query().count())
 | 
			
		||||
 | 
			
		||||
        Follower.get_or_create(to=g.user, from_=self.other_user)
 | 
			
		||||
        Follower.get_or_create(from_=g.user, to=self.make_user('baz', cls=Fake))
 | 
			
		||||
        Follower.get_or_create(to=self.user, from_=self.other_user)
 | 
			
		||||
        Follower.get_or_create(from_=self.user, to=self.make_user('baz', cls=Fake))
 | 
			
		||||
        self.assertEqual(3, Follower.query().count())
 | 
			
		||||
 | 
			
		||||
        # check that kwargs get set on existing entity
 | 
			
		||||
        follower = Follower.get_or_create(from_=g.user, to=self.other_user,
 | 
			
		||||
        follower = Follower.get_or_create(from_=self.user, to=self.other_user,
 | 
			
		||||
                                          status='inactive')
 | 
			
		||||
        got = follower.key.get()
 | 
			
		||||
        self.assertEqual('inactive', got.status)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,7 +37,6 @@ class ProtocolTest(TestCase):
 | 
			
		|||
    def setUp(self):
 | 
			
		||||
        super().setUp()
 | 
			
		||||
        self.user = self.make_user('foo.com', cls=Web, has_hcard=True)
 | 
			
		||||
        g.user = None
 | 
			
		||||
 | 
			
		||||
    def tearDown(self):
 | 
			
		||||
        PROTOCOLS.pop('greedy', None)
 | 
			
		||||
| 
						 | 
				
			
			@ -1024,7 +1023,6 @@ class ProtocolReceiveTest(TestCase):
 | 
			
		|||
        })
 | 
			
		||||
 | 
			
		||||
    def test_delete(self):
 | 
			
		||||
        g.user = None  # should use activity's actor
 | 
			
		||||
        self.make_followers()
 | 
			
		||||
 | 
			
		||||
        post_as1 = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -396,7 +396,7 @@ class WebTest(TestCase):
 | 
			
		|||
 | 
			
		||||
        obj = Object(id='https://user.com/', mf2=ACTOR_MF2, source_protocol='web')
 | 
			
		||||
        obj.put()
 | 
			
		||||
        g.user = self.make_user('user.com', cls=Web, has_redirects=True, obj=obj)
 | 
			
		||||
        self.user = self.make_user('user.com', cls=Web, has_redirects=True, obj=obj)
 | 
			
		||||
 | 
			
		||||
        self.mrs_foo = ndb.Key(ActivityPub, 'https://mas.to/mrs-foo')
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -408,7 +408,7 @@ class WebTest(TestCase):
 | 
			
		|||
        for args, kwargs in mock_post.call_args_list:
 | 
			
		||||
            self.assertEqual(as2.CONTENT_TYPE, kwargs['headers']['Content-Type'])
 | 
			
		||||
            rsa_key = kwargs['auth'].header_signer._rsa._key
 | 
			
		||||
            self.assertEqual(g.user.private_pem(), rsa_key.exportKey())
 | 
			
		||||
            self.assertEqual(self.user.private_pem(), rsa_key.exportKey())
 | 
			
		||||
            calls[args[0]] = json_loads(kwargs['data'])
 | 
			
		||||
 | 
			
		||||
        for inbox in inboxes:
 | 
			
		||||
| 
						 | 
				
			
			@ -445,7 +445,7 @@ class WebTest(TestCase):
 | 
			
		|||
            }),
 | 
			
		||||
        ]:
 | 
			
		||||
            from_ = self.make_user(id, cls=ActivityPub, obj_as2=actor)
 | 
			
		||||
            f = Follower.get_or_create(to=g.user, from_=from_, **kwargs)
 | 
			
		||||
            f = Follower.get_or_create(to=self.user, from_=from_, **kwargs)
 | 
			
		||||
            if f.status != 'inactive':
 | 
			
		||||
                self.followers.append(from_.key)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -497,30 +497,30 @@ class WebTest(TestCase):
 | 
			
		|||
            self.assertEqual(orig_count, Object.query().count())
 | 
			
		||||
 | 
			
		||||
    def test_username(self, *mocks):
 | 
			
		||||
        self.assertEqual('user.com', g.user.username())
 | 
			
		||||
        self.assertEqual('user.com', self.user.username())
 | 
			
		||||
 | 
			
		||||
        g.user.obj = Object(id='a', as2={
 | 
			
		||||
        self.user.obj = Object(id='a', as2={
 | 
			
		||||
            'type': 'Person',
 | 
			
		||||
            'name': 'foo',
 | 
			
		||||
            'url': ['bar'],
 | 
			
		||||
            'preferredUsername': 'baz',
 | 
			
		||||
        })
 | 
			
		||||
        g.user.direct = True
 | 
			
		||||
        self.assertEqual('user.com', g.user.username())
 | 
			
		||||
        self.user.direct = True
 | 
			
		||||
        self.assertEqual('user.com', self.user.username())
 | 
			
		||||
 | 
			
		||||
        # bad acct: URI, util.parse_acct_uri raises ValueError
 | 
			
		||||
        # https://console.cloud.google.com/errors/detail/CPLmrpzFs4qTUA;time=P30D?project=bridgy-federated
 | 
			
		||||
        g.user.obj.as2['url'].append('acct:@user.com')
 | 
			
		||||
        self.assertEqual('user.com', g.user.username())
 | 
			
		||||
        self.user.obj.as2['url'].append('acct:@user.com')
 | 
			
		||||
        self.assertEqual('user.com', self.user.username())
 | 
			
		||||
 | 
			
		||||
        g.user.obj.as2['url'].append('acct:alice@foo.com')
 | 
			
		||||
        self.assertEqual('user.com', g.user.username())
 | 
			
		||||
        self.user.obj.as2['url'].append('acct:alice@foo.com')
 | 
			
		||||
        self.assertEqual('user.com', self.user.username())
 | 
			
		||||
 | 
			
		||||
        g.user.obj.as2['url'].append('acct:alice@user.com')
 | 
			
		||||
        self.assertEqual('alice', g.user.username())
 | 
			
		||||
        self.user.obj.as2['url'].append('acct:alice@user.com')
 | 
			
		||||
        self.assertEqual('alice', self.user.username())
 | 
			
		||||
 | 
			
		||||
        g.user.direct = False
 | 
			
		||||
        self.assertEqual('user.com', g.user.username())
 | 
			
		||||
        self.user.direct = False
 | 
			
		||||
        self.assertEqual('user.com', self.user.username())
 | 
			
		||||
 | 
			
		||||
    @patch('oauth_dropins.webutil.appengine_config.tasks_client.create_task')
 | 
			
		||||
    def test_make_task(self, mock_create_task, mock_get, mock_post):
 | 
			
		||||
| 
						 | 
				
			
			@ -634,7 +634,7 @@ class WebTest(TestCase):
 | 
			
		|||
                           labels=['activity', 'user'],
 | 
			
		||||
                           ignore=['our_as1'],
 | 
			
		||||
                           status='ignored',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           )
 | 
			
		||||
 | 
			
		||||
    def test_target_fetch_fails(self, mock_get, mock_post):
 | 
			
		||||
| 
						 | 
				
			
			@ -725,7 +725,7 @@ class WebTest(TestCase):
 | 
			
		|||
                           )
 | 
			
		||||
        author = ndb.Key(ActivityPub, 'https://mas.to/author')
 | 
			
		||||
        self.assert_object('https://user.com/reply#bridgy-fed-create',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           notify=[author],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           status='complete',
 | 
			
		||||
| 
						 | 
				
			
			@ -879,12 +879,12 @@ class WebTest(TestCase):
 | 
			
		|||
        for args, kwargs in mock_get.call_args_list[1:]:
 | 
			
		||||
            with self.subTest(url=args[0]):
 | 
			
		||||
                rsa_key = kwargs['auth'].header_signer._rsa._key
 | 
			
		||||
                self.assertEqual(g.user.private_pem(), rsa_key.exportKey())
 | 
			
		||||
                self.assertEqual(self.user.private_pem(), rsa_key.exportKey())
 | 
			
		||||
 | 
			
		||||
        mf2 = util.parse_mf2(html)['items'][0]
 | 
			
		||||
        author_key = ndb.Key('ActivityPub', 'https://mas.to/author')
 | 
			
		||||
        self.assert_object('https://user.com/repost',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           notify=[author_key],
 | 
			
		||||
                           feed=self.followers,
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
| 
						 | 
				
			
			@ -945,7 +945,7 @@ class WebTest(TestCase):
 | 
			
		|||
        mock_post.assert_not_called()
 | 
			
		||||
 | 
			
		||||
        self.assert_object('https://user.com/like',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           mf2=LIKE_MF2,
 | 
			
		||||
                           type='like',
 | 
			
		||||
| 
						 | 
				
			
			@ -1062,7 +1062,7 @@ class WebTest(TestCase):
 | 
			
		|||
        repost_mf2 = copy.deepcopy(REPOST_MF2)
 | 
			
		||||
        repost_mf2['properties']['author'] = ['https://user.com/']
 | 
			
		||||
        self.assert_object('https://user.com/repost',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           mf2=repost_mf2,  # includes author https://user.com/
 | 
			
		||||
                           type='share',
 | 
			
		||||
| 
						 | 
				
			
			@ -1094,7 +1094,7 @@ class WebTest(TestCase):
 | 
			
		|||
 | 
			
		||||
        inboxes = ['https://inbox/', 'https://public/inbox', 'https://shared/inbox']
 | 
			
		||||
        self.assert_object('https://user.com/post#bridgy-fed-create',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           our_as1=CREATE_AS1,
 | 
			
		||||
                           type='post',
 | 
			
		||||
| 
						 | 
				
			
			@ -1104,7 +1104,7 @@ class WebTest(TestCase):
 | 
			
		|||
                           )
 | 
			
		||||
 | 
			
		||||
    def test_create_post_use_instead_strip_www(self, mock_get, mock_post):
 | 
			
		||||
        g.user.obj.mf2 = {
 | 
			
		||||
        self.user.obj.mf2 = {
 | 
			
		||||
            'type': ['h-card'],
 | 
			
		||||
            'properties': {
 | 
			
		||||
                # this is the key part to test; Object.as1 uses this as id
 | 
			
		||||
| 
						 | 
				
			
			@ -1112,8 +1112,8 @@ class WebTest(TestCase):
 | 
			
		|||
                'name': ['Ms. ☕ Baz'],
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
        g.user.obj.put()
 | 
			
		||||
        self.make_user('www.user.com', cls=Web, use_instead=g.user.key)
 | 
			
		||||
        self.user.obj.put()
 | 
			
		||||
        self.make_user('www.user.com', cls=Web, use_instead=self.user.key)
 | 
			
		||||
        self.make_followers()
 | 
			
		||||
 | 
			
		||||
        note_html = NOTE_HTML.replace('https://user.com/', 'https://www.user.com/')
 | 
			
		||||
| 
						 | 
				
			
			@ -1166,7 +1166,7 @@ class WebTest(TestCase):
 | 
			
		|||
                           source_protocol='web',
 | 
			
		||||
                           )
 | 
			
		||||
        self.assert_object('https://user.com/post#bridgy-fed-create',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           status='complete',
 | 
			
		||||
                           our_as1=CREATE_AS1,
 | 
			
		||||
| 
						 | 
				
			
			@ -1180,7 +1180,7 @@ class WebTest(TestCase):
 | 
			
		|||
 | 
			
		||||
        mf2 = copy.deepcopy(NOTE_MF2)
 | 
			
		||||
        mf2['properties']['content'] = 'different'
 | 
			
		||||
        Object(id='https://user.com/post', users=[g.user.key], mf2=mf2).put()
 | 
			
		||||
        Object(id='https://user.com/post', users=[self.user.key], mf2=mf2).put()
 | 
			
		||||
 | 
			
		||||
        self.make_followers()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1208,7 +1208,7 @@ class WebTest(TestCase):
 | 
			
		|||
        }
 | 
			
		||||
        self.assert_object(
 | 
			
		||||
            f'https://user.com/post#bridgy-fed-update-2022-01-02T03:04:05+00:00',
 | 
			
		||||
            users=[g.user.key],
 | 
			
		||||
            users=[self.user.key],
 | 
			
		||||
            source_protocol='web',
 | 
			
		||||
            status='complete',
 | 
			
		||||
            our_as1=update_as1,
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,7 +1228,7 @@ class WebTest(TestCase):
 | 
			
		|||
        mock_post.return_value = requests_response('abc xyz ')
 | 
			
		||||
 | 
			
		||||
        Follower.get_or_create(
 | 
			
		||||
            to=g.user,
 | 
			
		||||
            to=self.user,
 | 
			
		||||
            from_=self.make_user('http://a', cls=ActivityPub,
 | 
			
		||||
                                 obj_as2={'inbox': 'https://inbox'}))
 | 
			
		||||
        got = self.post('/queue/webmention', data={
 | 
			
		||||
| 
						 | 
				
			
			@ -1263,7 +1263,7 @@ class WebTest(TestCase):
 | 
			
		|||
        self.assert_deliveries(mock_post, ['https://mas.to/inbox'], FOLLOW_AS2)
 | 
			
		||||
 | 
			
		||||
        obj = self.assert_object('https://user.com/follow',
 | 
			
		||||
                                 users=[g.user.key],
 | 
			
		||||
                                 users=[self.user.key],
 | 
			
		||||
                                 notify=[self.mrs_foo],
 | 
			
		||||
                                 source_protocol='web',
 | 
			
		||||
                                 status='complete',
 | 
			
		||||
| 
						 | 
				
			
			@ -1283,13 +1283,13 @@ class WebTest(TestCase):
 | 
			
		|||
 | 
			
		||||
        followers = Follower.query().fetch()
 | 
			
		||||
        self.assertEqual(1, len(followers))
 | 
			
		||||
        self.assertEqual(g.user.key, followers[0].from_)
 | 
			
		||||
        self.assertEqual(self.user.key, followers[0].from_)
 | 
			
		||||
        self.assertEqual(to.key, followers[0].to)
 | 
			
		||||
        self.assert_equals(obj.key, followers[0].follow)
 | 
			
		||||
 | 
			
		||||
    def test_follow_no_actor(self, mock_get, mock_post):
 | 
			
		||||
        g.user.obj_key = Object(id='a', as2=ACTOR_AS2).put()
 | 
			
		||||
        g.user.put()
 | 
			
		||||
        self.user.obj_key = Object(id='a', as2=ACTOR_AS2).put()
 | 
			
		||||
        self.user.put()
 | 
			
		||||
 | 
			
		||||
        html = FOLLOW_HTML.replace(
 | 
			
		||||
            '<a class="p-author h-card" href="https://user.com/">Ms. ☕ Baz</a>', '')
 | 
			
		||||
| 
						 | 
				
			
			@ -1350,7 +1350,7 @@ class WebTest(TestCase):
 | 
			
		|||
                               FOLLOW_FRAGMENT_AS2)
 | 
			
		||||
 | 
			
		||||
        self.assert_object('https://user.com/follow#2',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           notify=[self.mrs_foo],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           status='complete',
 | 
			
		||||
| 
						 | 
				
			
			@ -1363,7 +1363,7 @@ class WebTest(TestCase):
 | 
			
		|||
 | 
			
		||||
        followers = Follower.query().fetch()
 | 
			
		||||
        self.assert_equals(1, len(followers))
 | 
			
		||||
        self.assert_equals(g.user.key, followers[0].from_)
 | 
			
		||||
        self.assert_equals(self.user.key, followers[0].from_)
 | 
			
		||||
        self.assert_equals(ActivityPub(id='https://mas.to/mrs-foo').key,
 | 
			
		||||
                           followers[0].to)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1411,7 +1411,7 @@ class WebTest(TestCase):
 | 
			
		|||
        mf2 = util.parse_mf2(html)['items'][0]
 | 
			
		||||
        mr_biff = ndb.Key(ActivityPub, 'https://mas.to/mr-biff')
 | 
			
		||||
        obj = self.assert_object('https://user.com/follow',
 | 
			
		||||
                                 users=[g.user.key],
 | 
			
		||||
                                 users=[self.user.key],
 | 
			
		||||
                                 notify=[self.mrs_foo, mr_biff],
 | 
			
		||||
                                 source_protocol='web',
 | 
			
		||||
                                 status='complete',
 | 
			
		||||
| 
						 | 
				
			
			@ -1427,12 +1427,12 @@ class WebTest(TestCase):
 | 
			
		|||
        followers = Follower.query().fetch()
 | 
			
		||||
        self.assertEqual(2, len(followers))
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(g.user.key, followers[0].from_)
 | 
			
		||||
        self.assertEqual(self.user.key, followers[0].from_)
 | 
			
		||||
        self.assertEqual(ActivityPub(id='https://mas.to/mr-biff').key,
 | 
			
		||||
                         followers[0].to)
 | 
			
		||||
        self.assert_equals(obj.key, followers[0].follow)
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(g.user.key, followers[1].from_)
 | 
			
		||||
        self.assertEqual(self.user.key, followers[1].from_)
 | 
			
		||||
        self.assertEqual(ActivityPub(id='https://mas.to/mrs-foo').key,
 | 
			
		||||
                         followers[1].to)
 | 
			
		||||
        self.assert_equals(obj.key, followers[1].follow)
 | 
			
		||||
| 
						 | 
				
			
			@ -1470,7 +1470,7 @@ class WebTest(TestCase):
 | 
			
		|||
        self.assert_deliveries(mock_post, inboxes, DELETE_AS2)
 | 
			
		||||
 | 
			
		||||
        self.assert_object('https://user.com/post#bridgy-fed-delete',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           status='complete',
 | 
			
		||||
                           our_as1={
 | 
			
		||||
| 
						 | 
				
			
			@ -1530,7 +1530,7 @@ class WebTest(TestCase):
 | 
			
		|||
        self.assert_deliveries(mock_post, ['https://mas.to/inbox'], FOLLOW_AS2)
 | 
			
		||||
 | 
			
		||||
        self.assert_object('https://user.com/follow',
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           notify=[self.mrs_foo],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           status='failed',
 | 
			
		||||
| 
						 | 
				
			
			@ -1563,13 +1563,13 @@ class WebTest(TestCase):
 | 
			
		|||
    def test_update_profile(self, mock_get, mock_post):
 | 
			
		||||
        mock_get.side_effect = [ACTOR_HTML_RESP]
 | 
			
		||||
        mock_post.return_value = requests_response('abc xyz')
 | 
			
		||||
        Follower.get_or_create(to=g.user, from_=self.make_user(
 | 
			
		||||
        Follower.get_or_create(to=self.user, from_=self.make_user(
 | 
			
		||||
            'http://ccc', cls=ActivityPub, obj_as2={
 | 
			
		||||
                'endpoints': {
 | 
			
		||||
                    'sharedInbox': 'https://shared/inbox',
 | 
			
		||||
                },
 | 
			
		||||
            }))
 | 
			
		||||
        Follower.get_or_create(to=g.user, from_=self.make_user(
 | 
			
		||||
        Follower.get_or_create(to=self.user, from_=self.make_user(
 | 
			
		||||
            'http://ddd', cls=ActivityPub, obj_as2={'inbox': 'https://inbox'}))
 | 
			
		||||
 | 
			
		||||
        got = self.post('/queue/webmention', data={
 | 
			
		||||
| 
						 | 
				
			
			@ -1638,7 +1638,7 @@ class WebTest(TestCase):
 | 
			
		|||
            'object': actor,
 | 
			
		||||
        }
 | 
			
		||||
        self.assert_object(id,
 | 
			
		||||
                           users=[g.user.key],
 | 
			
		||||
                           users=[self.user.key],
 | 
			
		||||
                           source_protocol='web',
 | 
			
		||||
                           status='complete',
 | 
			
		||||
                           our_as1=expected_as1,
 | 
			
		||||
| 
						 | 
				
			
			@ -1670,23 +1670,23 @@ class WebTest(TestCase):
 | 
			
		|||
            logs.output)
 | 
			
		||||
 | 
			
		||||
    def _test_verify(self, redirects, hcard, actor, redirects_error=None):
 | 
			
		||||
        g.user.has_redirects = False
 | 
			
		||||
        g.user.put()
 | 
			
		||||
        self.user.has_redirects = False
 | 
			
		||||
        self.user.put()
 | 
			
		||||
 | 
			
		||||
        got = g.user.verify()
 | 
			
		||||
        self.assertEqual(g.user.key, got.key)
 | 
			
		||||
        got = self.user.verify()
 | 
			
		||||
        self.assertEqual(self.user.key, got.key)
 | 
			
		||||
 | 
			
		||||
        with self.subTest(redirects=redirects, hcard=hcard, actor=actor,
 | 
			
		||||
                          redirects_error=redirects_error):
 | 
			
		||||
            self.assert_equals(redirects, bool(g.user.has_redirects))
 | 
			
		||||
            self.assert_equals(hcard, bool(g.user.has_hcard))
 | 
			
		||||
            self.assert_equals(redirects, bool(self.user.has_redirects))
 | 
			
		||||
            self.assert_equals(hcard, bool(self.user.has_hcard))
 | 
			
		||||
            if actor is None:
 | 
			
		||||
                assert not g.user.obj or not g.user.obj.as1
 | 
			
		||||
                assert not self.user.obj or not self.user.obj.as1
 | 
			
		||||
            else:
 | 
			
		||||
                got = {k: v for k, v in g.user.obj.as1.items()
 | 
			
		||||
                got = {k: v for k, v in self.user.obj.as1.items()
 | 
			
		||||
                       if k in actor}
 | 
			
		||||
                self.assert_equals(actor, got)
 | 
			
		||||
            self.assert_equals(redirects_error, g.user.redirects_error)
 | 
			
		||||
            self.assert_equals(redirects_error, self.user.redirects_error)
 | 
			
		||||
 | 
			
		||||
    def test_verify_neither(self, mock_get, _):
 | 
			
		||||
        empty = requests_response('')
 | 
			
		||||
| 
						 | 
				
			
			@ -1839,41 +1839,42 @@ http://this/404s
 | 
			
		|||
        # preferredUsername stays y.z despite user's username. since Mastodon
 | 
			
		||||
        # queries Webfinger for preferredUsername@fed.brid.gy
 | 
			
		||||
        # https://github.com/snarfed/bridgy-fed/issues/77#issuecomment-949955109
 | 
			
		||||
        postprocessed = ActivityPub.convert(g.user.obj)
 | 
			
		||||
        g.user = self.user
 | 
			
		||||
        postprocessed = ActivityPub.convert(self.user.obj)
 | 
			
		||||
        self.assertEqual('user.com', postprocessed['preferredUsername'])
 | 
			
		||||
 | 
			
		||||
    def test_web_url(self, _, __):
 | 
			
		||||
        self.assertEqual('https://user.com/', g.user.web_url())
 | 
			
		||||
        self.assertEqual('https://user.com/', self.user.web_url())
 | 
			
		||||
 | 
			
		||||
    def test_is_web_url(self, *_):
 | 
			
		||||
        self.assertTrue(g.user.is_web_url('https://user.com/'))
 | 
			
		||||
        self.assertTrue(g.user.is_web_url('https://www.user.com/'))
 | 
			
		||||
        self.assertFalse(g.user.is_web_url('https://other.com/'))
 | 
			
		||||
        self.assertTrue(self.user.is_web_url('https://user.com/'))
 | 
			
		||||
        self.assertTrue(self.user.is_web_url('https://www.user.com/'))
 | 
			
		||||
        self.assertFalse(self.user.is_web_url('https://other.com/'))
 | 
			
		||||
 | 
			
		||||
    def test_ap_address(self, *_):
 | 
			
		||||
        self.assertEqual('@user.com@user.com', g.user.ap_address())
 | 
			
		||||
        self.assertEqual('@user.com@user.com', self.user.ap_address())
 | 
			
		||||
 | 
			
		||||
        g.user.obj = Object(id='a', as2={'type': 'Person'})
 | 
			
		||||
        self.assertEqual('@user.com@user.com', g.user.ap_address())
 | 
			
		||||
        self.user.obj = Object(id='a', as2={'type': 'Person'})
 | 
			
		||||
        self.assertEqual('@user.com@user.com', self.user.ap_address())
 | 
			
		||||
 | 
			
		||||
        g.user.obj.as2 = {'url': 'http://foo'}
 | 
			
		||||
        self.assertEqual('@user.com@user.com', g.user.ap_address())
 | 
			
		||||
        self.user.obj.as2 = {'url': 'http://foo'}
 | 
			
		||||
        self.assertEqual('@user.com@user.com', self.user.ap_address())
 | 
			
		||||
 | 
			
		||||
        g.user.obj.as2 = {'url': ['http://foo', 'acct:bar@foo', 'acct:baz@user.com']}
 | 
			
		||||
        self.assertEqual('@baz@user.com', g.user.ap_address())
 | 
			
		||||
        self.user.obj.as2 = {'url': ['http://foo', 'acct:bar@foo', 'acct:baz@user.com']}
 | 
			
		||||
        self.assertEqual('@baz@user.com', self.user.ap_address())
 | 
			
		||||
 | 
			
		||||
        g.user.direct = False
 | 
			
		||||
        self.assertEqual('@user.com@web.brid.gy', g.user.ap_address())
 | 
			
		||||
        self.user.direct = False
 | 
			
		||||
        self.assertEqual('@user.com@web.brid.gy', self.user.ap_address())
 | 
			
		||||
 | 
			
		||||
    def test_ap_actor(self, *_):
 | 
			
		||||
        self.assertEqual('http://localhost/user.com', g.user.ap_actor())
 | 
			
		||||
        self.assertEqual('http://localhost/user.com', self.user.ap_actor())
 | 
			
		||||
 | 
			
		||||
        g.user.direct = False
 | 
			
		||||
        self.assertEqual('http://localhost/user.com', g.user.ap_actor())
 | 
			
		||||
        self.assertEqual('http://localhost/user.com/inbox', g.user.ap_actor('inbox'))
 | 
			
		||||
        self.user.direct = False
 | 
			
		||||
        self.assertEqual('http://localhost/user.com', self.user.ap_actor())
 | 
			
		||||
        self.assertEqual('http://localhost/user.com/inbox', self.user.ap_actor('inbox'))
 | 
			
		||||
 | 
			
		||||
    def test_handle_as(self, *_):
 | 
			
		||||
        self.assertEqual('user.com.web.brid.gy', g.user.handle_as('atproto'))
 | 
			
		||||
        self.assertEqual('user.com.web.brid.gy', self.user.handle_as('atproto'))
 | 
			
		||||
 | 
			
		||||
    def test_check_web_site(self, mock_get, _):
 | 
			
		||||
        redir = 'http://localhost/.well-known/webfinger?resource=acct:user.com@user.com'
 | 
			
		||||
| 
						 | 
				
			
			@ -1965,7 +1966,7 @@ class WebUtilTest(TestCase):
 | 
			
		|||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        super().setUp()
 | 
			
		||||
        g.user = self.make_user('user.com', cls=Web)
 | 
			
		||||
        self.user = self.make_user('user.com', cls=Web)
 | 
			
		||||
 | 
			
		||||
    def test_key_for(self, *_):
 | 
			
		||||
        for id in 'user.com', 'http://user.com', 'https://user.com/':
 | 
			
		||||
| 
						 | 
				
			
			@ -1979,11 +1980,11 @@ class WebUtilTest(TestCase):
 | 
			
		|||
        self.assertEqual(Web(id='foo.com').key, Web.key_for('foo.com'))
 | 
			
		||||
 | 
			
		||||
    def test_key_for_use_instead(self, *_):
 | 
			
		||||
        Web(id='www.user.com', use_instead=g.user.key).put()
 | 
			
		||||
        self.assertEqual(g.user.key, Web.key_for('www.user.com'))
 | 
			
		||||
        Web(id='www.user.com', use_instead=self.user.key).put()
 | 
			
		||||
        self.assertEqual(self.user.key, Web.key_for('www.user.com'))
 | 
			
		||||
 | 
			
		||||
    def test_handle(self, *_):
 | 
			
		||||
        self.assertEqual('user.com', g.user.handle)
 | 
			
		||||
        self.assertEqual('user.com', self.user.handle)
 | 
			
		||||
 | 
			
		||||
    def test_owns_id(self, *_):
 | 
			
		||||
        self.assertIsNone(Web.owns_id('http://foo.com'))
 | 
			
		||||
| 
						 | 
				
			
			@ -1994,10 +1995,10 @@ class WebUtilTest(TestCase):
 | 
			
		|||
        self.assertFalse(Web.owns_id('e45fab982'))
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(Web.owns_id('user.com'))
 | 
			
		||||
        g.user.has_redirects = True
 | 
			
		||||
        g.user.put()
 | 
			
		||||
        self.user.has_redirects = True
 | 
			
		||||
        self.user.put()
 | 
			
		||||
        self.assertTrue(Web.owns_id('user.com'))
 | 
			
		||||
        g.user.key.delete()
 | 
			
		||||
        self.user.key.delete()
 | 
			
		||||
        self.assertIsNone(Web.owns_id('user.com'))
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(Web.owns_id('https://twitter.com/foo'))
 | 
			
		||||
| 
						 | 
				
			
			@ -2169,7 +2170,7 @@ class WebUtilTest(TestCase):
 | 
			
		|||
    def test_send_note_does_nothing(self, mock_get, mock_post):
 | 
			
		||||
        Follower.get_or_create(
 | 
			
		||||
            to=self.make_user('https://mas.to/bob', cls=ActivityPub),
 | 
			
		||||
            from_=g.user)
 | 
			
		||||
            from_=self.user)
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(Web.send(
 | 
			
		||||
            Object(id='http://mas.to/note', as2=test_activitypub.NOTE),
 | 
			
		||||
| 
						 | 
				
			
			@ -2180,7 +2181,7 @@ class WebUtilTest(TestCase):
 | 
			
		|||
    def test_send_unrelated_repost_does_nothing(self, mock_get, mock_post):
 | 
			
		||||
        Follower.get_or_create(
 | 
			
		||||
            to=self.make_user('https://mas.to/bob', cls=ActivityPub),
 | 
			
		||||
            from_=g.user)
 | 
			
		||||
            from_=self.user)
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(Web.send(
 | 
			
		||||
            Object(id='http://mas.to/note', as2={
 | 
			
		||||
| 
						 | 
				
			
			@ -2194,7 +2195,7 @@ class WebUtilTest(TestCase):
 | 
			
		|||
    def test_send_unrelated_reply_does_nothing(self, mock_get, mock_post):
 | 
			
		||||
        Follower.get_or_create(
 | 
			
		||||
            to=self.make_user('https://mas.to/bob', cls=ActivityPub),
 | 
			
		||||
            from_=g.user)
 | 
			
		||||
            from_=self.user)
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(Web.send(
 | 
			
		||||
            Object(id='http://mas.to/note', as2={
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue