improve mastodon app registration

This commit is contained in:
Your Name 2024-05-25 23:36:11 -04:00 committed by Henri Dickson
parent 7c03fc13aa
commit ce68abb9cc
2 changed files with 26 additions and 13 deletions

View file

@ -326,10 +326,10 @@ def detect_server_info(login_domain: str) -> tuple[str, str, str]:
try: try:
response = get(url, headers={"User-Agent": USER_AGENT}) response = get(url, headers={"User-Agent": USER_AGENT})
except Exception as e: except Exception as e:
logger.error(f"Error connecting {login_domain}: {e}") logger.error(f"Error connecting {login_domain}", extra={"exception": e})
raise Exception(f"Error connecting to instance {login_domain}") raise Exception(f"Error connecting to instance {login_domain}")
if response.status_code != 200: if response.status_code != 200:
logger.error(f"Error connecting {login_domain}: {response.status_code}") logger.error(f"Error connecting {login_domain}", extra={"response": response})
raise Exception( raise Exception(
f"Instance {login_domain} returned error code {response.status_code}" f"Instance {login_domain} returned error code {response.status_code}"
) )
@ -337,7 +337,7 @@ def detect_server_info(login_domain: str) -> tuple[str, str, str]:
j = response.json() j = response.json()
domain = j["uri"].lower().split("//")[-1].split("/")[0] domain = j["uri"].lower().split("//")[-1].split("/")[0]
except Exception as e: except Exception as e:
logger.error(f"Error connecting {login_domain}: {e}") logger.error(f"Error connecting {login_domain}", extra={"exception": e})
raise Exception(f"Instance {login_domain} returned invalid data") raise Exception(f"Instance {login_domain} returned invalid data")
server_version = j["version"] server_version = j["version"]
api_domain = domain api_domain = domain
@ -360,11 +360,7 @@ def get_or_create_fediverse_application(login_domain):
if not app: if not app:
app = MastodonApplication.objects.filter(api_domain__iexact=domain).first() app = MastodonApplication.objects.filter(api_domain__iexact=domain).first()
if app: if app:
if verify_client(app): return app
return app
else:
logger.warning(f"Invalid client app for {domain}")
app.delete()
if not settings.MASTODON_ALLOW_ANY_SITE: if not settings.MASTODON_ALLOW_ANY_SITE:
logger.warning(f"Disallowed to create app for {domain}") logger.warning(f"Disallowed to create app for {domain}")
raise ValueError("Unsupported instance") raise ValueError("Unsupported instance")
@ -377,7 +373,7 @@ def get_or_create_fediverse_application(login_domain):
): ):
raise ValueError("Unsupported instance") raise ValueError("Unsupported instance")
if "neodb/" in server_version: if "neodb/" in server_version:
raise ValueError("Unsupported instance") raise ValueError("Unsupported instance type")
if login_domain != domain: if login_domain != domain:
app = MastodonApplication.objects.filter(domain_name__iexact=domain).first() app = MastodonApplication.objects.filter(domain_name__iexact=domain).first()
if app: if app:
@ -406,6 +402,11 @@ def get_or_create_fediverse_application(login_domain):
client_secret=data["client_secret"], client_secret=data["client_secret"],
vapid_key=data.get("vapid_key", ""), vapid_key=data.get("vapid_key", ""),
) )
# create a client token to avoid vacuum by Mastodon 4.2+
try:
verify_client(app)
except Exception as e:
logger.error(f"Error creating client token for {domain}", extra={"error": e})
return app return app

View file

@ -5,7 +5,7 @@ from django.utils import timezone
from loguru import logger from loguru import logger
from common.models import BaseJob, JobManager from common.models import BaseJob, JobManager
from mastodon.api import detect_server_info from mastodon.api import detect_server_info, verify_client
from mastodon.models import MastodonApplication from mastodon.models import MastodonApplication
@ -29,9 +29,10 @@ class MastodonSiteCheck(BaseJob):
api_domain = site.api_domain or site.domain_name api_domain = site.api_domain or site.domain_name
domain, api_domain, v = detect_server_info(api_domain) domain, api_domain, v = detect_server_info(api_domain)
site.last_reachable_date = timezone.now() site.last_reachable_date = timezone.now()
except Exception: except Exception as e:
logger.warning( logger.error(
f"Failed to detect server info for {site.domain_name}/{site.api_domain}" f"Failed to detect server info for {site.domain_name}/{site.api_domain}",
extra={"exception": e},
) )
count_unreachable += 1 count_unreachable += 1
if site.last_reachable_date is None: if site.last_reachable_date is None:
@ -43,6 +44,17 @@ class MastodonSiteCheck(BaseJob):
count_disabled += 1 count_disabled += 1
finally: finally:
site.save(update_fields=["last_reachable_date", "disabled"]) site.save(update_fields=["last_reachable_date", "disabled"])
try:
if not verify_client(site):
logger.error(
f"Unable to verify client app for {site.api_domain}, consider deleting it."
)
# site.delete()
except Exception as e:
logger.error(
f"Failed to verify client app for {site.api_domain}",
extra={"exception": e},
)
logger.info( logger.info(
f"Mastodon Site Check finished, {count_checked} checked, {count_unreachable} unreachable, {count_disabled} disabled." f"Mastodon Site Check finished, {count_checked} checked, {count_unreachable} unreachable, {count_disabled} disabled."
) )