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
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)
def get_all_emails(user): emails = { 'emails': user.mail_addresses.to_list_of_dicts(), 'message': 'emails.get-success' } return EmailListPayload().dump(emails).data
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)
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'}
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
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)
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
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
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)
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)