def _check_excessive_login_attempts(self, user): """ See if account has been locked out due to excessive login failures """ if user and LoginFailures.is_feature_enabled(): if LoginFailures.is_user_locked_out(user): raise AuthFailedError(_('This account has been temporarily locked due ' 'to excessive login failures. Try again later.'))
def _handle_failed_authentication(self, user): """ Handles updating the failed login count, inactive user notifications, and logging failed authentications. """ if user and LoginFailures.is_feature_enabled(): LoginFailures.increment_lockout_counter(user) raise AuthFailedError(_('Email or password is incorrect.'))
def _verify_user_password(self, request): """ If the user is logged in and we want to verify that they have submitted the correct password for a major account change (for example, retiring this user's account). Args: request (HttpRequest): A request object where the password should be included in the POST fields. """ try: self._check_excessive_login_attempts(request.user) user = authenticate(username=request.user.username, password=request.POST['password'], request=request) if user: if LoginFailures.is_feature_enabled(): LoginFailures.clear_lockout_counter(user) return Response(status=status.HTTP_204_NO_CONTENT) else: self._handle_failed_authentication(request.user) except AuthFailedError as err: return Response(text_type(err), status=status.HTTP_403_FORBIDDEN) except Exception as err: # pylint: disable=broad-except return Response(u"Could not verify user password: {}".format(err), status=status.HTTP_400_BAD_REQUEST)