subscribe to default relay unless disabled in config
This commit is contained in:
parent
e094e13132
commit
0ce78d546a
6 changed files with 117 additions and 0 deletions
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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",
|
||||||
|
},
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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})
|
||||||
|
|
33
users/management/commands/invite.py
Normal file
33
users/management/commands/invite.py
Normal 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}"
|
||||||
|
)
|
||||||
|
)
|
Loading…
Add table
Reference in a new issue