def test_auth(creds): handler = GenericAuthHandler(creds['provider']) email = creds['settings']['email'] account = handler.create_account(email, creds['settings']) # Test that the account was successfully created by the handler. if 'smtp_password' in creds['settings']: assert account.imap_password == creds['settings']['imap_password'] assert account.smtp_password == creds['settings']['smtp_password'] else: assert account.imap_password == creds['settings']['password'] assert account.smtp_password == creds['settings']['password'] # Test that the account is valid. assert handler.verify_account(account) is True # Test that the password can be updated... bad_creds = {'email': creds['settings']['email'], 'smtp_password': '******', 'imap_server_host': creds['settings'].get('imap_server_host'), 'imap_server_port': 993, 'smtp_server_host': creds['settings'].get('smtp_server_host'), 'smtp_server_port': 587 } handler.update_account(account, bad_creds) assert account.smtp_password == 'bad_password' # ...but logging in again won't work. with pytest.raises(UserRecoverableConfigError): handler.verify_account(account)
def test_successful_reauth_resets_sync_state(db): settings = { 'provider': 'yahoo', 'settings': { 'name': 'Y.Y!', 'locale': 'fr', 'email': '*****@*****.**', 'password': '******' } } email = settings['settings']['email'] handler = GenericAuthHandler(settings['provider']) account = handler.create_account(email, settings['settings']) assert handler.verify_account(account) is True # Brand new accounts have `sync_state`=None. assert account.sync_state is None db.session.add(account) db.session.commit() # Pretend account sync starts, and subsequently the password changes, # causing the account to be in `sync_state`='invalid'. account.mark_invalid() db.session.commit() assert account.sync_state == 'invalid' # Verify the `sync_state` is reset to 'running' on a successful "re-auth". account = handler.update_account(account, settings['settings']) assert handler.verify_account(account) is True assert account.sync_state == 'running' db.session.add(account) db.session.commit()
def test_successful_reauth_resets_sync_state(db): settings = { 'provider': 'yahoo', 'settings': { 'name': 'Y.Y!', 'locale': 'fr', 'email': '*****@*****.**', 'password': '******'} } email = settings['settings']['email'] handler = GenericAuthHandler(settings['provider']) account = handler.create_account(email, settings['settings']) assert handler.verify_account(account) is True # Brand new accounts have `sync_state`=None. assert account.sync_state is None db.session.add(account) db.session.commit() # Pretend account sync starts, and subsequently the password changes, # causing the account to be in `sync_state`='invalid'. account.mark_invalid() db.session.commit() assert account.sync_state == 'invalid' # Verify the `sync_state` is reset to 'running' on a successful "re-auth". account = handler.update_account(account, settings['settings']) assert handler.verify_account(account) is True assert account.sync_state == 'running' db.session.add(account) db.session.commit()
def test_successful_reauth_resets_sync_state(db, mock_imapclient): email = account_data.email password = account_data.imap_password mock_imapclient._add_login(email, password) handler = GenericAuthHandler() account = handler.create_account(account_data) assert handler.verify_account(account) is True # Brand new accounts have `sync_state`=None. assert account.sync_state is None db.session.add(account) db.session.commit() # Pretend account sync starts, and subsequently the password changes, # causing the account to be in `sync_state`='invalid'. account.mark_invalid() db.session.commit() assert account.sync_state == "invalid" # Verify the `sync_state` is reset to 'running' on a successful "re-auth". account = handler.update_account(account, account_data) assert handler.verify_account(account) is True assert account.sync_state == "running" db.session.add(account) db.session.commit()
def test_auth(creds): handler = GenericAuthHandler(creds['provider']) email = creds['settings']['email'] account = handler.create_account(email, creds['settings']) # Test that the account was successfully created by the handler. if 'smtp_password' in creds['settings']: assert account.imap_password == creds['settings']['imap_password'] assert account.smtp_password == creds['settings']['smtp_password'] else: assert account.imap_password == creds['settings']['password'] assert account.smtp_password == creds['settings']['password'] # Test that the account is valid. assert handler.verify_account(account) is True # Test that the password can be updated... bad_creds = {'email': creds['settings']['email'], 'imap_password': '******', 'imap_server_host': creds['settings'].get('imap_server_host'), 'imap_server_port': 993, 'smtp_server_host': creds['settings'].get('smtp_server_host'), 'smtp_server_port': 587 } handler.update_account(account, bad_creds) assert account.imap_password == 'bad_password' # ...but logging in again won't work. with pytest.raises(ValidationError): handler.verify_account(account)
def test_double_auth(db): settings = { 'provider': 'yahoo', 'settings': { 'name': 'Y.Y!', 'locale': 'fr', 'email': '*****@*****.**', 'password': '******' } } email = settings['settings']['email'] password = settings['settings']['password'] handler = GenericAuthHandler(settings['provider']) # First authentication, using a valid password, succeeds. valid_settings = copy.deepcopy(settings) account = handler.create_account(email, valid_settings['settings']) assert handler.verify_account(account) is True db.session.add(account) db.session.commit() id_ = account.id account = db.session.query(Account).get(id_) assert account.email_address == email assert account.imap_username == email assert account.smtp_username == email assert account.password == password assert account.imap_password == password assert account.smtp_password == password # Second auth using an invalid password should fail. invalid_settings = copy.deepcopy(settings) invalid_settings['settings']['password'] = '******' with pytest.raises(ValidationError): account = handler.update_account(account, invalid_settings['settings']) handler.verify_account(account) db.session.expire(account) # Ensure original account is unaffected account = db.session.query(Account).get(id_) assert account.email_address == email assert account.imap_username == email assert account.smtp_username == email assert account.password == password assert account.imap_password == password assert account.smtp_password == password
def test_double_auth(db, mock_auth_imapclient): settings = { 'provider': 'yahoo', 'settings': { 'name': 'Y.Y!', 'locale': 'fr', 'email': '*****@*****.**', 'password': '******'} } email = settings['settings']['email'] password = settings['settings']['password'] mock_auth_imapclient._add_login(email, password) handler = GenericAuthHandler(settings['provider']) # First authentication, using a valid password, succeeds. valid_settings = copy.deepcopy(settings) account = handler.create_account(email, valid_settings['settings']) assert handler.verify_account(account) is True db.session.add(account) db.session.commit() id_ = account.id account = db.session.query(Account).get(id_) assert account.email_address == email assert account.imap_username == email assert account.smtp_username == email assert account.password == password assert account.imap_password == password assert account.smtp_password == password # Second auth using an invalid password should fail. invalid_settings = copy.deepcopy(settings) invalid_settings['settings']['password'] = '******' with pytest.raises(ValidationError): account = handler.update_account(account, invalid_settings['settings']) handler.verify_account(account) db.session.expire(account) # Ensure original account is unaffected account = db.session.query(Account).get(id_) assert account.email_address == email assert account.imap_username == email assert account.smtp_username == email assert account.password == password assert account.imap_password == password assert account.smtp_password == password
def test_imap_not_fully_enabled(monkeypatch): def folder_list_fail(conn): raise Exception("LIST failed: '[ALERT] full IMAP support " "is NOT enabled for this account'") monkeypatch.setattr('imapclient.IMAPClient.list_folders', folder_list_fail) def fake_connect(account): return MockIMAPClient() response = { 'email': '*****@*****.**', 'password': '******', 'imap_server_host': '0.0.0.0', 'imap_server_port': 22, 'smtp_server_host': '0.0.0.0', 'smtp_server_port': 23 } handler = GenericAuthHandler('custom') acct = handler.create_account( '*****@*****.**', response) handler.connect_account = fake_connect handler._supports_condstore = lambda x: True with pytest.raises(UserRecoverableConfigError): verified = handler.verify_account(acct) assert verified is not True
def test_double_auth(db, mock_imapclient): password = "******" email = account_data.email mock_imapclient._add_login(email, password) handler = GenericAuthHandler() # First authentication, using a valid password, succeeds. valid_settings = attr.evolve(account_data, imap_password=password, smtp_password=password) account = handler.create_account(valid_settings) assert handler.verify_account(account) is True db.session.add(account) db.session.commit() id_ = account.id account = db.session.query(Account).get(id_) assert account.email_address == email assert account.imap_username == email assert account.smtp_username == email assert account.imap_password == password assert account.smtp_password == password # Second auth using an invalid password should fail. invalid_settings = attr.evolve(account_data, imap_password="******") with pytest.raises(ValidationError): account = handler.update_account(account, invalid_settings) handler.verify_account(account) db.session.expire(account) # Ensure original account is unaffected account = db.session.query(Account).get(id_) assert account.email_address == email assert account.imap_username == email assert account.smtp_username == email assert account.imap_password == password assert account.smtp_password == password
def test_auth(creds, mock_imapclient): imap_username = creds['settings'].get('imap_username') if imap_username is None: imap_username = creds['settings']['email'] imap_password = creds['settings'].get('imap_password') if imap_password is None: imap_password = creds['settings']['password'] mock_imapclient._add_login(imap_username, imap_password) handler = GenericAuthHandler(creds['provider']) email = creds['settings']['email'] account = handler.create_account(email, creds['settings']) # Test that the account was successfully created by the handler. assert account.imap_password == imap_password if 'smtp_password' in creds['settings']: assert account.smtp_password == creds['settings']['smtp_password'] else: assert account.imap_password == creds['settings']['password'] assert account.smtp_password == creds['settings']['password'] # Test that the account is valid. assert handler.verify_account(account) is True # Test that the password can be updated... bad_creds = {'email': creds['settings']['email'], 'imap_password': '******', 'imap_server_host': creds['settings'].get('imap_server_host'), 'imap_server_port': 993, 'smtp_server_host': creds['settings'].get('smtp_server_host'), 'smtp_server_port': 587 } handler.update_account(account, bad_creds) assert account.imap_password == 'bad_password' # ...but logging in again won't work. with pytest.raises(ValidationError): handler.verify_account(account)
def test_auth(settings): handler = GenericAuthHandler(settings['provider']) has_starttls = ('aol' in settings['settings']['imap_server_host']) if has_starttls: account = _create_account(settings, ssl=True) handler.verify_account(account) else: account = _create_account(settings, ssl=True) with pytest.raises(Exception): handler.verify_account(account) account = _create_account(settings, ssl=False) handler.verify_account(account)