From 93ccb5dd32f4e3942d08814e5a86fb30c90c9ff6 Mon Sep 17 00:00:00 2001
From: Andrew Godwin
Date: Sun, 4 Dec 2022 21:13:33 -0700
Subject: Make search work with URLs

---
 activities/models/post.py | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

(limited to 'activities/models')

diff --git a/activities/models/post.py b/activities/models/post.py
index aa4be16..f8a5e75 100644
--- a/activities/models/post.py
+++ b/activities/models/post.py
@@ -3,7 +3,7 @@ from typing import Dict, Iterable, List, Optional, Set
 
 import httpx
 import urlman
-from asgiref.sync import sync_to_async
+from asgiref.sync import async_to_sync, sync_to_async
 from django.contrib.postgres.indexes import GinIndex
 from django.db import models, transaction
 from django.template.defaultfilters import linebreaks_filter
@@ -16,6 +16,7 @@ from core.html import sanitize_post, strip_html
 from core.ld import canonicalise, format_ld_date, get_list, parse_ld_date
 from stator.models import State, StateField, StateGraph, StatorModel
 from users.models.identity import Identity
+from users.models.system_actor import SystemActor
 
 
 class PostStates(StateGraph):
@@ -609,19 +610,28 @@ class Post(StatorModel):
             return cls.objects.get(object_uri=object_uri)
         except cls.DoesNotExist:
             if fetch:
-                # Go grab the data from the URI
-                response = httpx.get(
-                    object_uri,
-                    headers={"Accept": "application/json"},
-                    follow_redirects=True,
-                )
-                if 200 <= response.status_code < 300:
-                    return cls.by_ap(
-                        canonicalise(response.json(), include_security=True),
-                        create=True,
-                        update=True,
+                try:
+                    response = async_to_sync(SystemActor().signed_request)(
+                        method="get", uri=object_uri
+                    )
+                except (httpx.RequestError, httpx.ConnectError):
+                    raise cls.DoesNotExist(f"Could not fetch {object_uri}")
+                if response.status_code in [404, 410]:
+                    raise cls.DoesNotExist(f"No post at {object_uri}")
+                if response.status_code >= 500:
+                    raise cls.DoesNotExist(f"Server error fetching {object_uri}")
+                if response.status_code >= 400:
+                    raise cls.DoesNotExist(
+                        f"Error fetching post from {object_uri}: {response.status_code}",
+                        {response.content},
                     )
-            raise cls.DoesNotExist(f"Cannot find Post with URI {object_uri}")
+                return cls.by_ap(
+                    canonicalise(response.json(), include_security=True),
+                    create=True,
+                    update=True,
+                )
+            else:
+                raise cls.DoesNotExist(f"Cannot find Post with URI {object_uri}")
 
     @classmethod
     def handle_create_ap(cls, data):
-- 
cgit v1.2.3