query webfinger before mastodon sync

This commit is contained in:
Her Email 2023-11-11 00:53:03 -05:00 committed by Henri Dickson
parent 2a99ddd564
commit b4b2f199fb
3 changed files with 49 additions and 2 deletions

View file

@ -183,6 +183,20 @@ def create_app(domain_name):
return response
def webfinger(site, username) -> dict | None:
url = f"https://{site}/.well-known/webfinger?resource=acct:{username}@{site}"
try:
response = get(url, headers={"User-Agent": USER_AGENT})
if response.status_code != 200:
logger.error(f"Error webfinger {username}@{site} {response.status_code}")
return None
j = response.json()
return j
except Exception:
logger.error(f"Error webfinger {username}@{site}")
return None
# utils below
def random_string_generator(n):
s = string.ascii_letters + string.punctuation + string.digits

View file

@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-11-11 05:34
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("users", "0014_preference_mastodon_skip_relationship_and_more"),
]
operations = [
migrations.AddField(
model_name="user",
name="mastodon_last_reachable",
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -128,6 +128,7 @@ class User(AbstractUser):
mastodon_domain_blocks = models.JSONField(default=list)
mastodon_account = models.JSONField(default=dict)
mastodon_last_refresh = models.DateTimeField(default=timezone.now)
mastodon_last_reachable = models.DateTimeField(default=timezone.now)
# store the latest read announcement id,
# every time user read the announcement update this field
read_announcement_index = models.PositiveIntegerField(default=0)
@ -267,9 +268,14 @@ class User(AbstractUser):
identity.save()
def refresh_mastodon_data(self):
"""Try refresh account data from mastodon server, return true if refreshed successfully, note it will not save to db"""
"""Try refresh account data from mastodon server, return True if refreshed successfully"""
logger.debug(f"Refreshing Mastodon data for {self}")
self.mastodon_last_refresh = timezone.now()
if not webfinger(self.mastodon_site, self.mastodon_username):
logger.error(f"Unable to fetch web finger for {self}")
self.save(update_fields=["mastodon_last_refresh"])
return False
self.mastodon_last_reachable = timezone.now()
code, mastodon_account = verify_account(self.mastodon_site, self.mastodon_token)
if code == 401 and self.mastodon_refresh_token:
self.mastodon_token = refresh_access_token(
@ -317,7 +323,15 @@ class User(AbstractUser):
elif code == 401:
logger.error(f"Refresh mastodon data error 401 for {self}")
self.mastodon_token = ""
self.save(update_fields=["mastodon_token"])
else:
logger.error(f"Refresh mastodon data error 401 for {self}")
self.save(
update_fields=[
"mastodon_token",
"mastodon_last_refresh",
"mastodon_last_reachable",
]
)
return False
@property