Ejemplo n.º 1
0
def test_query_user_info_user_does_not_exist(session_override):
    response_xml = """<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><GetUserInfoResponse xmlns="https://schemas.symantec.com/vip/2011/04/vipuserservices"><requestId>e656f6e2_c144_4e15_b56e_b14284b926e0</requestId><status>6003</status><statusMessage>User does not exist.</statusMessage></GetUserInfoResponse></S:Body></S:Envelope>"""
    session_override.post(
        'https://userservices-auth.vip.symantec.com/vipuserservices/QueryService_1_8',
        text=response_xml)
    result = utils.query_user_info('*****@*****.**')
    assert result == {}
Ejemplo n.º 2
0
def test_query_user_info_user_exists(session_override):
    response_xml = get_user_info_credentials_xml()
    response_json = get_user_info_credentials_json()
    session_override.post(
        'https://userservices-auth.vip.symantec.com/vipuserservices/QueryService_1_8',
        text=response_xml)
    result = utils.query_user_info('*****@*****.**')
    assert sorted(result) == sorted(response_json)
Ejemplo n.º 3
0
def multi_factor(request, display_template='otp_vip/validate_vip.html'):
    """Perform second factor.

  This function is to perform 'other' user validation, for example 2nd factor
  checks. Override this view per the documentation if using this functionality.
  """
    logger.debug('In multi_factor view')
    display_template = 'otp_vip/validate_vip.html'

    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # This should always exist as we set it via our template.
        final_destination = request.POST.get('next')

        # create form instances and populate with data from the request
        # https://stackoverflow.com/a/20802107
        # https://github.com/malept/pyoath-toolkit/blob/master/examples/django/example/views.py#L116
        push_form = forms.PushForm(request.user, request, data=request.POST)
        token_form = forms.TokenForm(request.user, request, data=request.POST)

        logger.debug(request.POST)

        # If a token code is provided check if token is valid
        if request.POST.get('otp_token'):
            logger.debug("attempting to log in via pin")
            if token_form.is_valid():
                logger.debug('Second factor token worked using {0}'.format(
                    request.user.otp_device))
                # Persist login using same method as used by upstreams user_logged_in signal handler
                _handle_auth_login('', request, request.user)
                return HttpResponseRedirect(final_destination)
            else:
                logger.debug(
                    "Second factor pin failed; %s will not be permitted to log in"
                    % request.user)
                # Otherwise they should not be logging in.
                deny_login = True

        # If we don't have a token assume its a push, so check if the push is valid
        elif request.POST.get('otp_challenge'):
            logger.debug('Attempting to log in via push')
            if push_form.is_valid():
                # OTPAuthenticationFormMixin doesn't set otp_device for interactive
                # devices
                requesting_device = request.POST.get('otp_device')
                current_cred = credential_models.VipPushCredential.objects.get(
                    id=requesting_device.split('/')[1])
                request.user.otp_device = current_cred
                logger.debug('Second factor push worked using {0}'.format(
                    request.user.otp_device))
                # Persist login using same method as used by upstreams user_logged_in signal handler
                _handle_auth_login('', request, request.user)
                return HttpResponseRedirect(final_destination)
        else:
            deny_login = True
            logger.debug('Neither auth succeeded')
            if token_form.errors:
                logger.debug('Token form errors')
                logger.debug(token_form.errors.as_data())
            if push_form.errors:
                logger.debug('Push form errors')
                logger.debug(push_form.errors.as_data())

        if deny_login:
            # logout(request)
            raise PermissionDenied("Second authentication factor failed")

    # If a GET (or any other method) we'll create a blank form
    else:
        # 'next' is only available via GET, if we want it in our POST data we need
        # to add it here.
        if request.GET.get('next'):
            going_to = request.GET.get('next')
        else:
            going_to = '/myitpa/'

        logger.debug('Attempting to update user details')
        full_user_details = utils.query_user_info(request.user.email)

        if update_vip_user_records(full_user_details):
            logger.debug("Records for {0} were updated".format(request.user))
        else:
            logger.debug('Unable to update records for {0}'.format(
                request.user))

        logger.debug('creating some empty forms')
        # if some push credentials are available, show form. Otherwise don't show.
        push_form = forms.PushForm(request.user)
        # ditto token credentials
        token_form = forms.TokenForm(request.user)

    return render(request, display_template, {
        'formpush': push_form,
        'formtoken': token_form,
        'going_to': going_to
    })
Ejemplo n.º 4
0
def manage_two_factor(request, *args, **kwargs):
    """Stub credential management page for users.

  This is a basic page to 'get things going', its expected to be replaced by
  something nicer per site.
  Template needs to be supplied
  """
    add_vip_token_credentials = None
    remove_vip_credentials = None
    try:
        users_vip_record = models.VipUser.objects.get(user=request.user)
    except models.VipUser.DoesNotExist as dne:
        logger.debug(
            '{0} does not have a VipUser object. Are they permitted here?'.
            format(request.user))
        raise Http404

    # Only process posts if _something_ was included (CSRF token is always included)
    if request.method == "POST" and len(request.POST) > 1:
        if request.POST.has_key('credential_id') or request.POST.has_key(
                'name'):
            print 'credential_id code path'  # string
            add_vip_token_credentials = forms.AddTokenCredential(request.POST)
            if add_vip_token_credentials.is_valid():
                added_cred = utils.add_credential_to_vip(
                    request.user.email,
                    add_vip_token_credentials.cleaned_data['credential_id'],
                    add_vip_token_credentials.cleaned_data['name'],
                )
                if not added_cred.status == '0000':
                    add_vip_token_credentials.add_error(
                        None,
                        'An error occurred ({1} - {0}) while adding {2} via the API.'
                        .format(
                            added_cred.statusMessage, added_cred.status,
                            add_vip_token_credentials.
                            cleaned_data['credential_id']))
                # Attempt to update the DB based on API data now they have changed their tokens
                user_record_updated = utils.update_user_record(
                    utils.query_user_info(request.user.email))
                token_credential_updated = credential_models.update_user_credentials(
                    utils.query_user_info(request.user.email))

        if request.POST.has_key('credentials_list'):
            remove_vip_credentials = forms.RemoveCredentials(request.POST,
                                                             user=request.user)
            if remove_vip_credentials.is_valid():
                for removing_device in remove_vip_credentials.cleaned_data[
                        'credentials_list']:
                    logger.debug('removing {0}'.format(removing_device))
                    # Remove single credential
                    removed_cred = utils.remove_credential_from_vip(
                        request.user.email, removing_device.credential_id)
                    if not removed_cred.status == '0000':
                        remove_vip_credentials.add_error(
                            None,
                            'An error occurred ({1} - {0}) while removing {2} from {3} via the API.'
                            .format(removed_cred.statusMessage,
                                    removed_cred.status,
                                    removing_device.credential_id,
                                    request.user.email))
                    else:
                        # Only remove from DB if successfully removed from API.
                        # update db with new credential data, including removing this one
                        token_credential_updated = credential_models.update_user_credentials(
                            utils.query_user_info(request.user.email))

    if not add_vip_token_credentials:
        add_vip_token_credentials = forms.AddTokenCredential()
    if not remove_vip_credentials:
        remove_vip_credentials = forms.RemoveCredentials(user=request.user)


# TODO: include update_vip_user_records here?

    return render(
        request, kwargs['template'], {
            'remove_credentials': remove_vip_credentials,
            'add_token_credentials': add_vip_token_credentials,
        })