def send_reset_password_link(request): ''' Send email with reset password link. --- serializer: SendResetPasswordLinkSerializer ''' serializer = SendResetPasswordLinkSerializer(data=request.data) serializer.is_valid(raise_exception=True) login = serializer.data['login'] user_class = get_user_model_class() user_queryset = user_class.objects.all() user = None for login_field in get_login_fields(): try: user = get_object_or_404(user_queryset, **{login_field: login}) break except Http404: pass if not user: raise BadRequest('User not found') signer = ResetPasswordSigner({ 'user_id': user.pk, }, request=request) template_config = ( registration_settings.RESET_PASSWORD_VERIFICATION_EMAIL_TEMPLATES) send_verification(user, signer, template_config) return get_ok_response('Reset link sent')
def post(self, request, format=None): serializer = LoginSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.data user_class = get_user_model_class() login_fields = (registration_settings.USER_LOGIN_FIELDS or getattr(user_class, 'LOGIN_FIELDS', None) or [user_class.USERNAME_FIELD]) for field_name in login_fields: kwargs = { field_name: data['login'], 'password': data['password'], } user = auth.authenticate(**kwargs) if user: break if not user: raise BadRequest('Login or password invalid.') if should_authenticate_session(): auth.login(request, user) extra_data = {} if should_retrieve_token(): token, _ = Token.objects.get_or_create(user=user) extra_data['token'] = token.key return get_ok_response('Login successful', extra_data=extra_data)
def verify_email(request): ''' Verify email via signature. --- serializer: VerifyEmailSerializer ''' if not registration_settings.REGISTER_EMAIL_VERIFICATION_ENABLED: raise Http404() user_class = get_user_model_class() serializer = VerifyEmailSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.data signer = RegisterEmailSigner(data, request=request) verify_signer_or_bad_request(signer) email_field = get_user_setting('EMAIL_FIELD') user = get_object_or_404(user_class.objects.all(), pk=data['user_id']) setattr(user, email_field, data['email']) user.save() return get_ok_response('Email verified successfully')
def verify_registration(request): ''' Verify registration via signature. --- serializer: VerifyRegistrationSerializer ''' if not registration_settings.REGISTER_VERIFICATION_ENABLED: raise Http404() user_class = get_user_model_class() serializer = VerifyRegistrationSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.data signer = RegisterSigner(data, request=request) verify_signer_or_bad_request(signer) verification_flag_field = get_user_setting('VERIFICATION_FLAG_FIELD') user = get_object_or_404(user_class.objects.all(), pk=data['user_id']) setattr(user, verification_flag_field, True) user.save() return get_ok_response('User verified successfully')
def reset_password(request): ''' Reset password, given the signature and timestamp from the link. --- serializer: ResetPasswordSerializer ''' serializer = ResetPasswordSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.data.copy() password = data.pop('password') signer = ResetPasswordSigner(data, request=request) verify_signer_or_bad_request(signer) user_class = get_user_model_class() user = get_object_or_404(user_class.objects.all(), pk=data['user_id']) try: validate_password(password, user=user) except ValidationError as exc: raise serializers.ValidationError(exc.messages[0]) user.set_password(password) user.save() return get_ok_response('Reset password successful')
def get_login_fields(): user_class = get_user_model_class() return get_user_setting('LOGIN_FIELDS') or [user_class.USERNAME_FIELD]