Handle errors when a Post references an invalid ancestor (#417)

This commit is contained in:
Michael Manfre 2023-01-15 12:28:44 -05:00 committed by GitHub
parent 1f44e93518
commit 94fe247b17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 6 deletions

View File

@ -23,6 +23,7 @@ from activities.models.post_types import (
PostTypeDataDecoder, PostTypeDataDecoder,
PostTypeDataEncoder, PostTypeDataEncoder,
) )
from core.exceptions import capture_message
from core.html import ContentRenderer, strip_html from core.html import ContentRenderer, strip_html
from core.ld import ( from core.ld import (
canonicalise, canonicalise,
@ -853,7 +854,12 @@ class Post(StatorModel):
try: try:
parent = cls.by_object_uri(post.in_reply_to) parent = cls.by_object_uri(post.in_reply_to)
except cls.DoesNotExist: except cls.DoesNotExist:
try:
cls.ensure_object_uri(post.in_reply_to, reason=post.object_uri) cls.ensure_object_uri(post.in_reply_to, reason=post.object_uri)
except ValueError:
capture_message(
f"Cannot fetch ancestor of Post={post.pk}, ancestor_uri={post.in_reply_to}"
)
else: else:
parent.calculate_stats() parent.calculate_stats()
return post return post
@ -905,8 +911,8 @@ class Post(StatorModel):
Sees if the post is in our local set, and if not, schedules a fetch Sees if the post is in our local set, and if not, schedules a fetch
for it (in the background) for it (in the background)
""" """
if not object_uri: if not object_uri or "://" not in object_uri:
raise ValueError("No URI provided!") raise ValueError("URI missing or invalid")
try: try:
cls.by_object_uri(object_uri) cls.by_object_uri(object_uri)
except cls.DoesNotExist: except cls.DoesNotExist:
@ -977,8 +983,10 @@ class Post(StatorModel):
Handles an internal fetch-request inbox message Handles an internal fetch-request inbox message
""" """
try: try:
cls.by_object_uri(data["object"]["object"], fetch=True) uri = data["object"]["object"]
except cls.DoesNotExist: if "://" in uri:
cls.by_object_uri(uri, fetch=True)
except (cls.DoesNotExist, KeyError):
pass pass
### OpenGraph API ### ### OpenGraph API ###

View File

@ -5,6 +5,7 @@ from activities.models import (
PostStates, PostStates,
TimelineEvent, TimelineEvent,
) )
from core.exceptions import capture_message
from users.models import Identity from users.models import Identity
@ -91,7 +92,12 @@ class PostService:
reason = ancestor.object_uri reason = ancestor.object_uri
ancestor = self.queryset().filter(object_uri=object_uri).first() ancestor = self.queryset().filter(object_uri=object_uri).first()
if ancestor is None: if ancestor is None:
try:
Post.ensure_object_uri(object_uri, reason=reason) Post.ensure_object_uri(object_uri, reason=reason)
except ValueError:
capture_message(
f"Cannot fetch ancestor Post={self.post.pk}, ancestor_uri={object_uri}"
)
break break
if ancestor.state in [PostStates.deleted, PostStates.deleted_fanned_out]: if ancestor.state in [PostStates.deleted, PostStates.deleted_fanned_out]:
break break