Download and store user avatars locally if small

This commit is contained in:
Andrew Godwin 2022-12-17 12:53:13 -07:00
parent 24a4fbe1f8
commit 2eb07a5f5f
2 changed files with 16 additions and 0 deletions

View File

@ -107,6 +107,10 @@ class Settings(BaseSettings):
#: is necessary for compatibility with Mastodons image proxy. #: is necessary for compatibility with Mastodons image proxy.
MEDIA_MAX_IMAGE_FILESIZE_MB: int = 10 MEDIA_MAX_IMAGE_FILESIZE_MB: int = 10
#: Maximum filesize for Avatars. Remote avatars larger than this size will
#: not be fetched and served from media, but served through the image proxy.
AVATAR_MAX_IMAGE_FILESIZE_KB: int = 1000
#: Maximum filesize for Emoji. Attempting to upload Local Emoji larger than this size will be #: Maximum filesize for Emoji. Attempting to upload Local Emoji larger than this size will be
#: blocked. Remote Emoji larger than this size will not be fetched and served from media, but #: blocked. Remote Emoji larger than this size will not be fetched and served from media, but
#: served through the image proxy. #: served through the image proxy.

View File

@ -5,12 +5,14 @@ from urllib.parse import urlparse
import httpx import httpx
import urlman import urlman
from asgiref.sync import async_to_sync, sync_to_async from asgiref.sync import async_to_sync, sync_to_async
from django.conf import settings
from django.db import IntegrityError, models from django.db import IntegrityError, models
from django.template.defaultfilters import linebreaks_filter from django.template.defaultfilters import linebreaks_filter
from django.utils import timezone from django.utils import timezone
from django.utils.functional import lazy from django.utils.functional import lazy
from core.exceptions import ActorMismatchError from core.exceptions import ActorMismatchError
from core.files import get_remote_file
from core.html import sanitize_post, strip_html from core.html import sanitize_post, strip_html
from core.ld import canonicalise, format_ld_date, get_list, media_type_from_filename from core.ld import canonicalise, format_ld_date, get_list, media_type_from_filename
from core.models import Config from core.models import Config
@ -42,6 +44,16 @@ class IdentityStates(StateGraph):
return cls.updated return cls.updated
# Run the actor fetch and progress to updated if it succeeds # Run the actor fetch and progress to updated if it succeeds
if await identity.fetch_actor(): if await identity.fetch_actor():
# Also stash their icon if we can
if identity.icon_uri:
file, mimetype = await get_remote_file(
identity.icon_uri,
timeout=settings.SETUP.REMOTE_TIMEOUT,
max_size=settings.SETUP.AVATAR_MAX_IMAGE_FILESIZE_KB * 1024,
)
if file:
identity.icon = file
await sync_to_async(identity.save)()
return cls.updated return cls.updated
@classmethod @classmethod