From 97e6a07e89eb434cff9a04272a5077f65beccd02 Mon Sep 17 00:00:00 2001 From: Ryan Barrett Date: Wed, 1 Jan 2025 19:46:15 -0800 Subject: [PATCH] Web.poll_feed_task: handle badly formatted published property fixes https://console.cloud.google.com/errors/detail/CPKcrsS-noOZrAE;locations=global;time=P30D?project=bridgy-federated&inv=1&invt=AblugQ --- tests/test_web.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ web.py | 12 +++++++----- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/tests/test_web.py b/tests/test_web.py index 1e5d4f0b..c6d39f8f 100644 --- a/tests/test_web.py +++ b/tests/test_web.py @@ -1981,6 +1981,52 @@ def test_poll_feed_atom(self, mock_create_task, mock_get, _): self.assert_task(mock_create_task, 'poll-feed', domain='user.com', last_polled=NOW.isoformat(), eta_seconds=expected_eta) + @patch('oauth_dropins.webutil.appengine_config.tasks_client.create_task') + def test_poll_feed_atom_bad_published_timestamps(self, mock_create_task, + mock_get, _): + common.RUN_TASKS_INLINE = False + self.user.last_polled_feed = NOW + self.user.put() + self.user.obj.mf2 = ACTOR_MF2_REL_FEED_URL + self.user.obj.put() + + feed = """\ + + + + + I hereby ☕ post + 2024-12-02 00:00.0 + + + + ok then + 2024-12-30 01:02.1 + + +""" + # mock_get.return_value = requests_response() + mock_get.side_effect = [ + requests_response(feed, headers={'Content-Type': atom.CONTENT_TYPE}), + # fetch post to look for image + WEBMENTION_NO_REL_LINK, + WEBMENTION_NO_REL_LINK, + ] + + got = self.post('/queue/poll-feed', data={ + 'domain': 'user.com', + 'last_polled': NOW.isoformat(), + }) + self.assertEqual(200, got.status_code) + + user = self.user.key.get() + self.assertEqual(NOW, user.last_polled_feed) + self.assertEqual('https://user.com/a', user.feed_last_item) + + expected_eta = NOW_SECONDS + web.MIN_FEED_POLL_PERIOD.total_seconds() + self.assert_task(mock_create_task, 'poll-feed', domain='user.com', + last_polled=NOW.isoformat(), eta_seconds=expected_eta) + @patch('oauth_dropins.webutil.appengine_config.tasks_client.create_task') def test_poll_feed_rss(self, mock_create_task, mock_get, _): common.RUN_TASKS_INLINE = False diff --git a/web.py b/web.py index bc6ca16f..443668a7 100644 --- a/web.py +++ b/web.py @@ -911,11 +911,13 @@ def poll_feed_task(): published_last = None published_deltas = [] # timedeltas between entry published times for activity in activities: - published = activity['object'].get('published') - if published and published_last: - published_deltas.append( - abs(util.parse_iso8601(published) - - util.parse_iso8601(published_last))) + try: + published = util.parse_iso8601(activity['object']['published']) + except (KeyError, ValueError): + continue + + if published_last: + published_deltas.append(abs(published - published_last)) published_last = published # create next poll task