mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2025-01-11 09:45:27 +00:00
Catch error in serializing unknown boosts
This commit is contained in:
parent
1f4b3e9586
commit
919b166241
4 changed files with 25 additions and 7 deletions
|
@ -258,10 +258,9 @@ def resolve_remote_id(remote_id, model=None, refresh=False, save=True):
|
||||||
# load the data and create the object
|
# load the data and create the object
|
||||||
try:
|
try:
|
||||||
data = get_data(remote_id)
|
data = get_data(remote_id)
|
||||||
except (ConnectorException, ConnectionError):
|
except ConnectorException:
|
||||||
raise ActivitySerializerError(
|
raise ActivitySerializerError(
|
||||||
"Could not connect to host for remote_id in %s model: %s"
|
"Could not connect to host for remote_id in: %s" % (remote_id)
|
||||||
% (model.__name__, remote_id)
|
|
||||||
)
|
)
|
||||||
# determine the model implicitly, if not provided
|
# determine the model implicitly, if not provided
|
||||||
if not model:
|
if not model:
|
||||||
|
|
|
@ -244,7 +244,7 @@ def get_data(url):
|
||||||
"User-Agent": settings.USER_AGENT,
|
"User-Agent": settings.USER_AGENT,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
except (RequestError, SSLError) as e:
|
except (RequestError, SSLError, ConnectionError) as e:
|
||||||
logger.exception(e)
|
logger.exception(e)
|
||||||
raise ConnectorException()
|
raise ConnectorException()
|
||||||
|
|
||||||
|
|
|
@ -115,13 +115,18 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel):
|
||||||
def ignore_activity(cls, activity):
|
def ignore_activity(cls, activity):
|
||||||
""" keep notes if they are replies to existing statuses """
|
""" keep notes if they are replies to existing statuses """
|
||||||
if activity.type == "Announce":
|
if activity.type == "Announce":
|
||||||
# keep it if the booster or the boosted are local
|
try:
|
||||||
boosted = activitypub.resolve_remote_id(activity.object, save=False)
|
boosted = activitypub.resolve_remote_id(activity.object, save=False)
|
||||||
|
except activitypub.ActivitySerializerError:
|
||||||
|
# if we can't load the status, definitely ignore it
|
||||||
|
return True
|
||||||
|
# keep the boost if we would keep the status
|
||||||
return cls.ignore_activity(boosted.to_activity_dataclass())
|
return cls.ignore_activity(boosted.to_activity_dataclass())
|
||||||
|
|
||||||
# keep if it if it's a custom type
|
# keep if it if it's a custom type
|
||||||
if activity.type != "Note":
|
if activity.type != "Note":
|
||||||
return False
|
return False
|
||||||
|
# keep it if it's a reply to an existing status
|
||||||
if cls.objects.filter(remote_id=activity.inReplyTo).exists():
|
if cls.objects.filter(remote_id=activity.inReplyTo).exists():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,9 @@ from django.core.files.base import ContentFile
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
import responses
|
||||||
|
|
||||||
from bookwyrm import models, settings
|
from bookwyrm import activitypub, models, settings
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-public-methods
|
# pylint: disable=too-many-public-methods
|
||||||
|
@ -385,3 +386,16 @@ class Status(TestCase):
|
||||||
status.mention_users.set([self.remote_user])
|
status.mention_users.set([self.remote_user])
|
||||||
|
|
||||||
self.assertEqual(status.recipients, [self.remote_user])
|
self.assertEqual(status.recipients, [self.remote_user])
|
||||||
|
|
||||||
|
@responses.activate
|
||||||
|
def test_ignore_activity_boost(self, _):
|
||||||
|
""" don't bother with most remote statuses """
|
||||||
|
activity = activitypub.Announce(
|
||||||
|
id="http://www.faraway.com/boost/12",
|
||||||
|
actor=self.remote_user.remote_id,
|
||||||
|
object="http://fish.com/nothing",
|
||||||
|
)
|
||||||
|
|
||||||
|
responses.add(responses.GET, "http://fish.com/nothing", status=404)
|
||||||
|
|
||||||
|
self.assertTrue(models.Status.ignore_activity(activity))
|
||||||
|
|
Loading…
Reference in a new issue