subscribe to default relay unless disabled in config

This commit is contained in:
Your Name 2023-09-03 21:25:30 +00:00 committed by Henri Dickson
parent e094e13132
commit 0ce78d546a
6 changed files with 117 additions and 0 deletions

View file

@ -91,8 +91,15 @@ SETUP_ADMIN_USERNAMES = [
u for u in os.environ.get("NEODB_ADMIN_USERNAMES", "").split(",") if u u for u in os.environ.get("NEODB_ADMIN_USERNAMES", "").split(",") if u
] ]
# True: user will not be able to register unless with invite token (generated by `neodb-manage invite --create`)
INVITE_ONLY = os.environ.get("NEODB_INVITE_ONLY", "") != "" INVITE_ONLY = os.environ.get("NEODB_INVITE_ONLY", "") != ""
# By default, NeoDB will relay with relay.neodb.net so that public user ratings/etc can be shared across instances
# If you are running a development server, set this to True to disable this behavior
DISABLE_DEFAULT_RELAY = (
os.environ.get("NEODB_DISABLE_DEFAULT_RELAY", "1" if DEBUG else "") != ""
)
# Mastodon/Pleroma instance allowed to login, keep empty to allow any instance to login # Mastodon/Pleroma instance allowed to login, keep empty to allow any instance to login
MASTODON_ALLOWED_SITES = [] MASTODON_ALLOWED_SITES = []
@ -430,3 +437,5 @@ OAUTH2_PROVIDER = {
OAUTH2_PROVIDER_APPLICATION_MODEL = "developer.Application" OAUTH2_PROVIDER_APPLICATION_MODEL = "developer.Application"
DEVELOPER_CONSOLE_APPLICATION_CLIENT_ID = "NEODB_DEVELOPER_CONSOLE" DEVELOPER_CONSOLE_APPLICATION_CLIENT_ID = "NEODB_DEVELOPER_CONSOLE"
DEFAULT_RELAY_SERVER = "https://relay.neodb.net/actor"

View file

@ -4,8 +4,10 @@ from loguru import logger
from catalog.search.typesense import Indexer from catalog.search.typesense import Indexer
from takahe.models import Config as TakaheConfig from takahe.models import Config as TakaheConfig
from takahe.models import Domain as TakaheDomain from takahe.models import Domain as TakaheDomain
from takahe.models import Follow as TakaheFollow
from takahe.models import Identity as TakaheIdentity from takahe.models import Identity as TakaheIdentity
from takahe.models import User as TakaheUser from takahe.models import User as TakaheUser
from takahe.utils import Takahe
from users.models import User from users.models import User
@ -90,6 +92,48 @@ class Setup:
TakaheUser.objects.filter(email=f"@{user.username}").update(admin=True) TakaheUser.objects.filter(email=f"@{user.username}").update(admin=True)
logger.info(f"Updated user {user.username} as admin") logger.info(f"Updated user {user.username} as admin")
def sync_relay(self):
relay_follow = TakaheFollow.objects.filter(
source__username="__relay__",
source__local=True,
target__actor_uri=settings.DEFAULT_RELAY_SERVER,
).first()
if settings.DISABLE_DEFAULT_RELAY:
if relay_follow:
logger.info("Default relay is disabled, unsubscribing...")
Takahe.create_internal_message(
{
"type": "UnfollowRelay",
"actor_uri": settings.DEFAULT_RELAY_SERVER,
}
)
else:
logger.debug(f"Default relay is disabled.")
else:
if relay_follow:
logger.debug(
f"Default relay is enabled and subscribed, state: {relay_follow.state}"
)
else:
logger.info("Default relay is enabled, subscribing...")
relay_actor = TakaheIdentity.objects.filter(
username="__relay__",
local=True,
).first()
if not relay_actor:
logger.warning(
f"Default relay is enabled but relay actor does not exist."
)
return
Takahe.create_internal_message(
{
"type": "AddFollow",
"source": relay_actor.pk,
"target_actor": settings.DEFAULT_RELAY_SERVER,
"boosts": False,
}
)
def run(self): def run(self):
logger.info("Running post-migration setup...") logger.info("Running post-migration setup...")
# Update site name if changed # Update site name if changed
@ -98,6 +142,9 @@ class Setup:
# Create/update admin user if configured in env # Create/update admin user if configured in env
self.sync_admin_user() self.sync_admin_user()
# Subscribe to default relay if enabled
self.sync_relay()
# Create basic emoji if not exists # Create basic emoji if not exists
# Create search index if not exists # Create search index if not exists

View file

@ -22,6 +22,7 @@ x-shared:
NEODB_SECRET_KEY: NEODB_SECRET_KEY:
NEODB_ADMIN_USERNAMES: NEODB_ADMIN_USERNAMES:
NEODB_INVITE_ONLY: NEODB_INVITE_ONLY:
NEODB_DISABLE_DEFAULT_RELAY:
NEODB_DB_NAME: neodb NEODB_DB_NAME: neodb
NEODB_DB_USER: neodb NEODB_DB_USER: neodb
NEODB_DB_PASSWORD: aubergine NEODB_DB_PASSWORD: aubergine

View file

@ -602,4 +602,27 @@ class Migration(migrations.Migration):
"unique_together": {("key", "user", "identity", "domain")}, "unique_together": {("key", "user", "identity", "domain")},
}, },
), ),
migrations.CreateModel(
name="Invite",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("token", models.CharField(max_length=500, unique=True)),
("note", models.TextField(blank=True, null=True)),
("uses", models.IntegerField(blank=True, null=True)),
("expires", models.DateTimeField(blank=True, null=True)),
("created", models.DateTimeField(auto_now_add=True)),
("updated", models.DateTimeField(auto_now=True)),
],
options={
"db_table": "users_invite",
},
),
] ]

View file

@ -130,6 +130,10 @@ class Takahe:
username__iexact=username, domain__domain__iexact=domain username__iexact=username, domain__domain__iexact=domain
).first() ).first()
@staticmethod
def create_internal_message(message: dict):
InboxMessage.create_internal(message)
@staticmethod @staticmethod
def fetch_remote_identity(handler: str) -> int | None: def fetch_remote_identity(handler: str) -> int | None:
InboxMessage.create_internal({"type": "FetchIdentity", "handle": handler}) InboxMessage.create_internal({"type": "FetchIdentity", "handle": handler})

View file

@ -0,0 +1,33 @@
from datetime import timedelta
from django.conf import settings
from django.core.management.base import BaseCommand
from django.urls import reverse
from django.utils import timezone
from loguru import logger
from takahe.utils import Invite
class Command(BaseCommand):
help = "Manage invite"
def add_arguments(self, parser):
parser.add_argument(
"--create",
action="store_true",
)
# parser.add_argument(
# "--revoke",
# action="store_true",
# )
def handle(self, *args, **options):
if options["create"]:
inv = Invite.create_random()
self.stdout.write(self.style.SUCCESS(f"Invite created: {inv.token}"))
self.stdout.write(
self.style.SUCCESS(
f"Link: {settings.SITE_INFO['site_url']}{reverse('users:login')}?invite={inv.token}"
)
)