From 648e7a75818a8e9c4bc91f0e854c60fdb3baf2f5 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 12 Nov 2020 11:59:34 -0800 Subject: [PATCH] Special error for catching activitypub serialization issues --- bookwyrm/activitypub/base_activity.py | 12 +++++++++--- bookwyrm/incoming.py | 6 +++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index ee4eefbdd..6ae7883ef 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -8,6 +8,10 @@ from django.db.models.fields.related_descriptors \ import ForwardManyToOneDescriptor +class ActivitySerializerError(ValueError): + ''' routine problems serializing activitypub json ''' + + class ActivityEncoder(JSONEncoder): ''' used to convert an Activity object into json ''' def default(self, o): @@ -66,7 +70,8 @@ class ActivityObject: value = kwargs[field.name] except KeyError: if field.default == MISSING: - raise TypeError('Missing required field: %s' % field.name) + raise ActivitySerializerError(\ + 'Missing required field: %s' % field.name) value = field.default setattr(self, field.name, value) @@ -74,7 +79,7 @@ class ActivityObject: def to_model(self, model, instance=None): ''' convert from an activity to a model instance ''' if not isinstance(self, model.activity_serializer): - raise TypeError('Wrong activity type for model') + raise ActivitySerializerError('Wrong activity type for model') # check for an existing instance, if we're not updating a known obj if not instance: @@ -136,6 +141,7 @@ def resolve_foreign_key(model, remote_id): ).first() if not result: - raise ValueError('Could not resolve remote_id in %s model: %s' % \ + raise ActivitySerializerError( + 'Could not resolve remote_id in %s model: %s' % \ (model.__name__, remote_id)) return result diff --git a/bookwyrm/incoming.py b/bookwyrm/incoming.py index e9c5f6a8b..2421a3cb8 100644 --- a/bookwyrm/incoming.py +++ b/bookwyrm/incoming.py @@ -282,7 +282,11 @@ def handle_unfavorite(activity): @app.task def handle_boost(activity): ''' someone gave us a boost! ''' - boost = activitypub.Boost(**activity).to_model(models.Boost) + try: + boost = activitypub.Boost(**activity).to_model(models.Boost) + except activitypub.ActivitySerializerError: + # this probably just means we tried to boost an unknown status + return if not boost.user.local: status_builder.create_notification(