diff --git a/activities/models/post.py b/activities/models/post.py index 1017694..b0c89ac 100644 --- a/activities/models/post.py +++ b/activities/models/post.py @@ -5,6 +5,7 @@ from typing import Optional import httpx import urlman from asgiref.sync import async_to_sync, sync_to_async +from django.conf import settings from django.contrib.postgres.indexes import GinIndex from django.db import models, transaction from django.template.defaultfilters import linebreaks_filter @@ -696,7 +697,10 @@ class Post(StatorModel): """ response = httpx.get( self.object_uri, - headers={"Accept": "application/json"}, + headers={ + "Accept": "application/json", + "User-Agent": settings.TAKAHE_USER_AGENT, + }, follow_redirects=True, ) if 200 <= response.status_code < 300: diff --git a/core/signatures.py b/core/signatures.py index d0443c3..45e6ff4 100644 --- a/core/signatures.py +++ b/core/signatures.py @@ -220,6 +220,10 @@ class HttpSignature: "algorithm": "rsa-sha256", } ) + + # Announce ourselves with an agent similar to Mastodon + headers["User-Agent"] = settings.TAKAHE_USER_AGENT + # Send the request with all those headers except the pseudo one del headers["(request-target)"] async with httpx.AsyncClient(timeout=timeout) as client: diff --git a/takahe/settings.py b/takahe/settings.py index 981bb96..f508952 100644 --- a/takahe/settings.py +++ b/takahe/settings.py @@ -7,6 +7,7 @@ from typing import Literal import dj_database_url import django_cache_url +import httpx import sentry_sdk from pydantic import AnyUrl, BaseSettings, EmailStr, Field, validator from sentry_sdk.integrations.django import DjangoIntegration @@ -354,3 +355,8 @@ CACHES = {"default": django_cache_url.parse(SETUP.CACHES_DEFAULT or "dummy://")} if SETUP.ERROR_EMAILS: ADMINS = [("Admin", e) for e in SETUP.ERROR_EMAILS] + +TAKAHE_USER_AGENT = ( + f"python-httpx/{httpx.__version__} " + f"(Takahe/{__version__}; +https://{SETUP.MAIN_DOMAIN}/)" +)