Пример #1
0
def post_email(user, email, verified, primary):
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug('Trying to save unconfirmed email {!r} '
                             'for user {}'.format(email, proofing_user))

    new_mail = MailAddress(email=email,
                           application='email',
                           verified=False,
                           primary=False)

    try:
        proofing_user.mail_addresses.add(new_mail)
    except DuplicateElementViolation:
        return {'_status': 'error', 'message': 'emails.duplicated'}

    try:
        save_and_sync_user(proofing_user)
    except UserOutOfSync:
        current_app.logger.debug('Couldnt save email {} for user {}, '
                                 'data out of sync'.format(
                                     email, proofing_user))
        return {'_status': 'error', 'message': 'user-out-of-sync'}
    current_app.logger.info('Saved unconfirmed email {!r} '
                            'for user {}'.format(email, proofing_user))
    current_app.stats.count(name='email_save_unconfirmed_email', value=1)

    send_verification_code(email, proofing_user)
    current_app.stats.count(name='email_send_verification_code', value=1)

    emails = {
        'emails': proofing_user.mail_addresses.to_list_of_dicts(),
        'message': 'emails.save-success'
    }
    return EmailListPayload().dump(emails).data
Пример #2
0
def post_email(user, email, verified, primary):
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug('Trying to save unconfirmed email {!r} '
                             'for user {}'.format(email, proofing_user))

    new_mail = MailAddress.from_dict(
        dict(email=email, created_by='email', verified=False, primary=False))

    try:
        proofing_user.mail_addresses.add(new_mail)
    except DuplicateElementViolation:
        return error_response(message=EmailMsg.dupe)

    try:
        save_and_sync_user(proofing_user)
    except UserOutOfSync:
        current_app.logger.debug('Couldnt save email {} for user {}, '
                                 'data out of sync'.format(
                                     email, proofing_user))
        return error_response(message=CommonMsg.out_of_sync)
    current_app.logger.info('Saved unconfirmed email {!r} '
                            'for user {}'.format(email, proofing_user))
    current_app.stats.count(name='email_save_unconfirmed_email', value=1)

    sent = send_verification_code(email, proofing_user)
    emails = {'emails': proofing_user.mail_addresses.to_list_of_dicts()}
    email_list = EmailListPayload().dump(emails)

    if not sent:
        return success_response(payload=email_list,
                                message=EmailMsg.added_and_throttled)

    current_app.stats.count(name='email_send_verification_code', value=1)

    return success_response(payload=email_list, message=EmailMsg.saved)
Пример #3
0
def get_all_emails(user):
    emails = {
        'emails': user.mail_addresses.to_list_of_dicts(),
        'message': 'emails.get-success'
    }

    return EmailListPayload().dump(emails).data
Пример #4
0
def post_remove(user, email):
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug('Trying to remove email address {!r} '
                             'from user {}'.format(email, proofing_user))

    emails = proofing_user.mail_addresses.to_list()
    verified_emails = proofing_user.mail_addresses.verified.to_list()

    # Do not let the user remove all mail addresses
    if len(emails) == 1:
        current_app.logger.debug(
            'Cannot remove the last address: {}'.format(email))
        return error_response(message=EmailMsg.cannot_remove_last)

    # Do not let the user remove all verified mail addresses
    if len(verified_emails) == 1 and verified_emails[0].email == email:
        current_app.logger.debug(
            'Cannot remove last verified address: {}'.format(email))
        return error_response(message=EmailMsg.cannot_remove_last_verified)

    try:
        proofing_user.mail_addresses.remove(email)
    except PrimaryElementViolation:
        # Trying to remove the primary mail address, set next verified mail address as primary
        other_verified = [
            address for address in verified_emails if address.email != email
        ]
        proofing_user.mail_addresses.primary = other_verified[0].email
        # Now remove the unwanted and previous primary mail address
        proofing_user.mail_addresses.remove(email)

    try:
        save_and_sync_user(proofing_user)
    except UserOutOfSync:
        current_app.logger.debug(
            'Could not remove email {} for user, data out of sync'.format(
                email))
        return error_response(message=CommonMsg.out_of_sync)

    current_app.logger.info('Email address {} removed'.format(email))
    current_app.stats.count(name='email_remove_success', value=1)

    emails = {'emails': proofing_user.mail_addresses.to_list_of_dicts()}
    email_list = EmailListPayload().dump(emails)
    return success_response(payload=email_list,
                            message=EmailMsg.removal_success)
Пример #5
0
def verify(user, code, email):
    """
    """
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug(
        'Trying to save email address {} as verified'.format(email))

    db = current_app.proofing_statedb
    try:
        state = db.get_state_by_eppn_and_email(proofing_user.eppn, email)
        timeout = current_app.config['EMAIL_VERIFICATION_TIMEOUT']
        if state.is_expired(timeout):
            current_app.logger.info(
                "Verification code is expired. Removing the state")
            current_app.logger.debug("Proofing state: {}".format(state))
            current_app.proofing_statedb.remove_state(state)
            return {
                '_status': 'error',
                'message': 'emails.code_invalid_or_expired'
            }
    except DocumentDoesNotExist:
        current_app.logger.info(
            'Could not find proofing state for email {}'.format(email))
        return {'_status': 'error', 'message': 'emails.unknown_email'}

    if code == state.verification.verification_code:
        try:
            verify_mail_address(state, proofing_user)
            current_app.logger.info('Email successfully verified')
            current_app.logger.debug('Email address: {}'.format(email))
            emails = {
                'emails': proofing_user.mail_addresses.to_list_of_dicts(),
                'message': 'emails.verification-success'
            }
            return EmailListPayload().dump(emails).data
        except UserOutOfSync:
            current_app.logger.info(
                'Could not confirm email, data out of sync')
            current_app.logger.debug('Mail address: {}'.format(email))
            return {'_status': 'error', 'message': 'user-out-of-sync'}
    current_app.logger.info("Invalid verification code")
    current_app.logger.debug("Email address: {}".format(
        state.verification.email))
    return {'_status': 'error', 'message': 'emails.code_invalid_or_expired'}
Пример #6
0
def resend_code(user, email):
    current_app.logger.debug('Trying to send new verification code for email '
                             'address {} for user {}'.format(email, user))

    if not user.mail_addresses.find(email):
        current_app.logger.debug('Unknown email {!r} in resend_code_action,'
                                 ' user {}'.format(email, user))
        return {'_status': 'error', 'message': 'user-out-of-sync'}

    send_verification_code(email, user)
    current_app.logger.debug('New verification code sended to '
                             'address {} for user {}'.format(email, user))
    current_app.stats.count(name='email_resend_code', value=1)

    emails = {
        'emails': user.mail_addresses.to_list_of_dicts(),
        'message': 'emails.code-sent'
    }
    return EmailListPayload().dump(emails).data
Пример #7
0
def verify(user, code, email):
    """
    """
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug(
        'Trying to save email address {} as verified'.format(email))

    db = current_app.proofing_statedb
    try:
        state = db.get_state_by_eppn_and_email(proofing_user.eppn, email)
        timeout = current_app.config.email_verification_timeout
        if state.is_expired(timeout):
            current_app.logger.info(
                "Verification code is expired. Removing the state")
            current_app.logger.debug("Proofing state: {}".format(state))
            current_app.proofing_statedb.remove_state(state)
            return error_response(message=EmailMsg.invalid_code)
    except DocumentDoesNotExist:
        current_app.logger.info(
            'Could not find proofing state for email {}'.format(email))
        return error_response(message=EmailMsg.unknown_email)

    if code == state.verification.verification_code:
        try:
            verify_mail_address(state, proofing_user)
            current_app.logger.info('Email successfully verified')
            current_app.logger.debug('Email address: {}'.format(email))
            emails = {
                'emails': proofing_user.mail_addresses.to_list_of_dicts(),
            }
            email_list = EmailListPayload().dump(emails)
            return success_response(payload=email_list,
                                    message=EmailMsg.verify_success)
        except UserOutOfSync:
            current_app.logger.info(
                'Could not confirm email, data out of sync')
            current_app.logger.debug('Mail address: {}'.format(email))
            return error_response(message=CommonMsg.out_of_sync)
    current_app.logger.info("Invalid verification code")
    current_app.logger.debug("Email address: {}".format(
        state.verification.email))
    return error_response(message=EmailMsg.invalid_code)
Пример #8
0
def post_primary(user, email):
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug('Trying to save email address {!r} as primary '
                             'for user {}'.format(email, proofing_user))

    try:
        mail = proofing_user.mail_addresses.find(email)
    except IndexError:
        current_app.logger.debug('Couldnt save email {!r} as primary for user'
                                 ' {}, data out of sync'.format(
                                     email, proofing_user))
        return {'_status': 'error', 'message': 'user-out-of-sync'}

    if not mail.is_verified:
        current_app.logger.debug('Couldnt save email {!r} as primary for user'
                                 ' {}, email unconfirmed'.format(
                                     email, proofing_user))
        return {
            '_status': 'error',
            'message': 'emails.unconfirmed_address_not_primary'
        }

    proofing_user.mail_addresses.primary = mail.email
    try:
        save_and_sync_user(proofing_user)
    except UserOutOfSync:
        current_app.logger.debug('Couldnt save email {!r} as primary for user'
                                 ' {}, data out of sync'.format(
                                     email, proofing_user))
        return {'_status': 'error', 'message': 'user-out-of-sync'}
    current_app.logger.info('Email address {!r} made primary '
                            'for user {}'.format(email, proofing_user))
    current_app.stats.count(name='email_set_primary', value=1)

    emails = {
        'emails': proofing_user.mail_addresses.to_list_of_dicts(),
        'message': 'emails.primary-success'
    }
    return EmailListPayload().dump(emails).data
Пример #9
0
def post_remove(user, email):
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug('Trying to remove email address {!r} '
                             'from user {}'.format(email, proofing_user))

    emails = proofing_user.mail_addresses.to_list()
    if len(emails) == 1:
        msg = "Cannot remove unique address: {!r}".format(email)
        current_app.logger.debug(msg)
        return {'_status': 'error', 'message': 'emails.cannot_remove_unique'}

    try:
        proofing_user.mail_addresses.remove(email)
    except PrimaryElementViolation:
        new_index = 1 if emails[0].email == email else 0
        proofing_user.mail_addresses.primary = emails[new_index].email
        proofing_user.mail_addresses.remove(email)

    try:
        save_and_sync_user(proofing_user)
    except UserOutOfSync:
        current_app.logger.debug('Couldnt remove email {!r} for user'
                                 ' {}, data out of sync'.format(
                                     email, proofing_user))
        return {'_status': 'error', 'message': 'user-out-of-sync'}

    except PrimaryElementViolation:
        return {'_status': 'error', 'message': 'emails.cannot_remove_primary'}

    current_app.logger.info('Email address {!r} removed '
                            'for user {}'.format(email, proofing_user))
    current_app.stats.count(name='email_remove_success', value=1)

    emails = {
        'emails': proofing_user.mail_addresses.to_list_of_dicts(),
        'message': 'emails.removal-success'
    }
    return EmailListPayload().dump(emails).data
Пример #10
0
def post_primary(user, email):
    proofing_user = ProofingUser.from_user(user, current_app.private_userdb)
    current_app.logger.debug(
        'Trying to save email address {!r} as primary for user {}'.format(
            email, proofing_user))

    try:
        mail = proofing_user.mail_addresses.find(email)
    except IndexError:
        current_app.logger.debug(
            'Couldnt save email {!r} as primary for user {}, data out of sync'.
            format(email, proofing_user))
        return error_response(message=CommonMsg.out_of_sync)

    if not mail.is_verified:
        current_app.logger.debug(
            'Couldnt save email {!r} as primary for user {}, email unconfirmed'
            .format(email, proofing_user))
        return error_response(message=EmailMsg.unconfirmed_not_primary)

    proofing_user.mail_addresses.primary = mail.email
    try:
        save_and_sync_user(proofing_user)
    except UserOutOfSync:
        current_app.logger.debug('Couldnt save email {!r} as primary for user'
                                 ' {}, data out of sync'.format(
                                     email, proofing_user))
        return error_response(message=CommonMsg.out_of_sync)
    current_app.logger.info('Email address {!r} made primary '
                            'for user {}'.format(email, proofing_user))
    current_app.stats.count(name='email_set_primary', value=1)

    emails = {'emails': proofing_user.mail_addresses.to_list_of_dicts()}
    email_list = EmailListPayload().dump(emails)
    return success_response(payload=email_list,
                            message=EmailMsg.success_primary)
Пример #11
0
def get_all_emails(user):
    emails = {'emails': user.mail_addresses.to_list_of_dicts()}

    email_list = EmailListPayload().dump(emails)

    return success_response(payload=email_list, message=EmailMsg.get_success)