from django.contrib.auth import login from django.utils.translation import gettext as _ from django.conf import settings from django.urls import reverse from rest_framework.response import Response from rest_framework.permissions import AllowAny from pingcap_sso.api.base import Endpoint from pingcap_sso.forms import SignupForm, SignupSendCodeForm from pingcap_sso.exceptions import RateLimitError, CaptchaRequiredError from pingcap_sso.lib.sso import sync_cookie_url from pingcap_sso.lib.captcha import generate_new_captcha class SignupEndpoint(Endpoint): permission_classes = (AllowAny, ) def post(self, request, *args, **kwargs): form = SignupForm(request, data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) else: user = form.save() user.backend = 'pingcap_sso.backends.SimpleModelBackend' login(request, user) return Response({ 'detail': _('success'), 'data': { 'redirect_to': sync_cookie_url(form.cleaned_data['redirect_to']), 'sso_callbacks': [ '{}?sys={}'.format(reverse('set-cookie'), sys) for sys in settings.SSO_SET_COOKIES.keys() ] } }) class SignupSendCodeEndpoint(Endpoint): permission_classes = (AllowAny, ) def post(self, request, *args, **kwargs): form = SignupSendCodeForm(request=request, data=request.data) try: if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) except CaptchaRequiredError: return Response({ 'detail': _('captcha required'), 'data': generate_new_captcha() }, status=428) try: form.save() except RateLimitError: return Response({ 'detail': _('rate limit') }, status=429) else: return Response({'detail': _('success')})