diff --git a/config/settings/base.py b/config/settings/base.py index 280f088..028feae 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -163,6 +163,7 @@ CELERY_RESULT_SERIALIZER = 'json' SAAS_MODE = os.environ.get('SAAS_MODE', 'False').lower() == 'true' BILLING_ENABLED = SAAS_MODE USAGE_LIMITS_ENABLED = SAAS_MODE +ALLOW_SELF_REGISTRATION = os.environ.get('ALLOW_SELF_REGISTRATION', 'False').lower() == 'true' # Login settings LOGIN_URL = '/login/' diff --git a/templates/users/login.html b/templates/users/login.html index f4820e4..5b34ad9 100644 --- a/templates/users/login.html +++ b/templates/users/login.html @@ -33,8 +33,10 @@ + {% if allow_self_registration %}
+ {% endif %} {% endblock %} diff --git a/users/views.py b/users/views.py index b5fa1c6..8a91c57 100644 --- a/users/views.py +++ b/users/views.py @@ -3,6 +3,7 @@ User views for KeepItGoing. """ from django.contrib.auth import get_user_model, login, logout +from django.conf import settings from django.shortcuts import render, redirect from django.utils import timezone from django.views import View @@ -27,6 +28,13 @@ from .throttles import LoginRateThrottle, RegisterRateThrottle User = get_user_model() +def self_registration_disabled_response(): + """Standard response payload for disabled self-registration.""" + return { + 'detail': 'Self-registration is disabled. Contact an administrator to create your account.' + } + + # ============================================================================= # API Views # ============================================================================= @@ -36,18 +44,18 @@ class UsersAPIRoot(APIView): permission_classes = [permissions.AllowAny] def get(self, request): - return Response({ - 'endpoints': { - 'register': '/api/users/register/', - 'login': '/api/users/token/', - 'refresh_token': '/api/users/token/refresh/', - 'verify_email': '/api/users/verify-email/', - 'resend_verification': '/api/users/resend-verification/', - 'profile': '/api/users/profile/', - 'change_password': '/api/users/change-password/', - 'devices': '/api/users/devices/', - } - }) + endpoints = { + 'login': '/api/users/token/', + 'refresh_token': '/api/users/token/refresh/', + 'verify_email': '/api/users/verify-email/', + 'resend_verification': '/api/users/resend-verification/', + 'profile': '/api/users/profile/', + 'change_password': '/api/users/change-password/', + 'devices': '/api/users/devices/', + } + if settings.ALLOW_SELF_REGISTRATION: + endpoints['register'] = '/api/users/register/' + return Response({'endpoints': endpoints}) class RegisterAPIView(generics.CreateAPIView): @@ -59,6 +67,12 @@ class RegisterAPIView(generics.CreateAPIView): throttle_classes = [RegisterRateThrottle] def create(self, request, *args, **kwargs): + if not settings.ALLOW_SELF_REGISTRATION: + return Response( + self_registration_disabled_response(), + status=status.HTTP_403_FORBIDDEN + ) + serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() @@ -284,6 +298,7 @@ class LoginView(View): 'error': error, 'email': email, 'can_resend': can_resend, + 'allow_self_registration': settings.ALLOW_SELF_REGISTRATION, }) def post(self, request): @@ -319,6 +334,7 @@ class LoginView(View): 'error': error, 'email': email, 'can_resend': can_resend, + 'allow_self_registration': settings.ALLOW_SELF_REGISTRATION, }) @@ -340,9 +356,20 @@ class RegisterView(View): def get(self, request): if request.user.is_authenticated: return redirect('dashboard') + if not settings.ALLOW_SELF_REGISTRATION: + return render(request, 'users/login.html', { + 'error': 'Self-registration is disabled. Contact an administrator to create your account.', + 'allow_self_registration': False, + }, status=403) return render(request, 'users/register.html') def post(self, request): + if not settings.ALLOW_SELF_REGISTRATION: + return render(request, 'users/login.html', { + 'error': 'Self-registration is disabled. Contact an administrator to create your account.', + 'allow_self_registration': False, + }, status=403) + email = request.POST.get('email') username = request.POST.get('username') password = request.POST.get('password')