コード例 #1
0
def find_user_by_by_send_reset_password_link_data(
        data: Dict[str, Any], **kwargs) -> 'AbstractBaseUser':
    """
    Return user if matching given criteria (login fields / e-mail).
    Return ``None`` otherwise.
    """
    serializer = kwargs.get('serializer')
    if serializer:
        # TODO: Issue #114 - remove code supporting deprecated behavior
        get_user_or_none = getattr(serializer, 'get_user_or_none', None)
        if callable(get_user_or_none):
            user = get_user_or_none()
            if not user:
                raise UserNotFound()
            return user
    login_field_names = get_user_login_field_names()
    finder_tests = [('login', login_field_names)]
    finder_tests.extend((f, [f]) for f in login_field_names)

    for field_name, db_field_names in finder_tests:
        value = data.get(field_name)
        if value is None:
            continue
        for db_fn in db_field_names:
            user = get_user_by_lookup_dict({db_fn: value},
                                           default=None,
                                           require_verified=False)
            if user is not None:
                return user

    raise UserNotFound()
コード例 #2
0
def send_reset_password_link(request):
    '''
    Send email with reset password link.
    '''
    serializer = SendResetPasswordLinkSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    login = serializer.data['login']

    user = None
    for login_field in get_login_fields():
        user = get_user_by_lookup_dict({login_field: login}, default=None)
        if user:
            break

    if not user:
        raise UserNotFound()

    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')
コード例 #3
0
def send_reset_password_link(request):
    '''
    Send email with reset password link.
    '''
    if not registration_settings.RESET_PASSWORD_VERIFICATION_ENABLED:
        raise Http404()
    serializer_class = registration_settings.SEND_RESET_PASSWORD_LINK_SERIALIZER_CLASS  # noqa: E501
    serializer = serializer_class(
        data=request.data,
        context={'request': request},
    )
    serializer.is_valid(raise_exception=True)
    if registration_settings.RESET_PASSWORD_FAIL_WHEN_USER_NOT_FOUND:
        success_message = _("Reset link sent")
    else:
        success_message = _("Reset link sent if the user exists in database")
    user = serializer.get_user_or_none()
    if not user:
        if registration_settings.RESET_PASSWORD_FAIL_WHEN_USER_NOT_FOUND:
            raise UserNotFound()
        return get_ok_response(success_message)
    signer = ResetPasswordSigner({
        'user_id': get_user_verification_id(user),
    },
                                 request=request)

    template_config_data = registration_settings.RESET_PASSWORD_VERIFICATION_EMAIL_TEMPLATES  # noqa: E501
    notification_data = {
        'params_signer': signer,
    }
    send_verification_notification(
        NotificationType.RESET_PASSWORD_VERIFICATION, user, notification_data,
        template_config_data)

    return get_ok_response(success_message)
コード例 #4
0
def authenticate_by_login_data(data: Dict[str, Any],
                               **kwargs) -> 'AbstractBaseUser':
    serializer = kwargs.get('serializer')
    if serializer:
        # TODO: Issue #114 - remove code supporting deprecated behavior
        get_authenticated_user = getattr(serializer, 'get_authenticated_user',
                                         None)
        if callable(get_authenticated_user):
            user = get_authenticated_user()
            if not user:
                raise UserNotFound()
            return user

    login_field_names = get_user_login_field_names()
    password = data.get('password')
    login = data.get('login')
    if password is None:
        raise UserNotFound()
    auth_tests = []  # type: List[Dict[str, Any]]
    if login is not None:
        auth_tests.extend({
            field_name: login,
            'password': password,
        } for field_name in login_field_names)

    for field_name in login_field_names:
        field_value = data.get(field_name)
        if field_value is None:
            continue
        auth_tests.append({
            field_name: field_value,
            'password': password,
        })

    for auth_kwargs in auth_tests:
        user = auth.authenticate(**auth_kwargs)
        if user:
            return user

    raise UserNotFound()
コード例 #5
0
def get_user_by_lookup_dict(
        lookup_dict, default=_RAISE_EXCEPTION, require_verified=True):
    verification_enabled = registration_settings.REGISTER_VERIFICATION_ENABLED
    verification_flag_field = get_user_setting('VERIFICATION_FLAG_FIELD')
    user_class = get_user_model()
    kwargs = {}
    kwargs.update(lookup_dict)
    if require_verified and verification_enabled and verification_flag_field:
        kwargs[verification_flag_field] = True
    try:
        user = get_object_or_404(user_class.objects.all(), **kwargs)
    except Http404:
        if default is _RAISE_EXCEPTION:
            raise UserNotFound() from None
        return default
    else:
        return user
コード例 #6
0
def send_reset_password_link(request):
    '''
    Send email with reset password link.
    '''
    if not registration_settings.RESET_PASSWORD_VERIFICATION_ENABLED:
        raise Http404()
    serializer_class = registration_settings.SEND_RESET_PASSWORD_LINK_SERIALIZER_CLASS  # noqa: E501
    serializer = serializer_class(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.get_user_or_none()
    if not user:
        raise UserNotFound()
    signer = ResetPasswordSigner({
        'user_id': user.pk,
    }, request=request)

    template_config = (
        registration_settings.RESET_PASSWORD_VERIFICATION_EMAIL_TEMPLATES)
    send_verification_notification(user, signer, template_config)

    return get_ok_response('Reset link sent')
コード例 #7
0
def get_user_by_lookup_dict(
        lookup_dict: Dict[str, Any],
        default: Union[_DefaultT,
                       Literal[_RAISE_EXCEPTION]] = _RAISE_EXCEPTION,
        require_verified: bool = True) -> Union['AbstractBaseUser', _DefaultT]:
    verification_enabled = registration_settings.REGISTER_VERIFICATION_ENABLED
    verification_flag_field = get_user_setting('VERIFICATION_FLAG_FIELD')
    user_class = get_user_model()
    kwargs = {}
    kwargs.update(lookup_dict)
    if require_verified and verification_enabled and verification_flag_field:
        kwargs[verification_flag_field] = True
    try:
        queryset = user_class.objects.all()  # type: QuerySet[AbstractBaseUser]
        user = get_object_or_404(queryset, **kwargs)
    except Http404:
        if default is _RAISE_EXCEPTION:
            raise UserNotFound() from None
        return default
    else:
        return user