def test_gets_passwords_correctly(self, mock_post): pm = PasswordManager(key='tests/fixtures/privkey.pem') def encrypt_text(text): public_key = pm._rsa_verifier.public_key() encrypted_key = public_key.encrypt(text.encode('ascii'), padding.PKCS1v15()) return base64.b64encode(bytes(encrypted_key)) mock_response = Mock() mock_response.json.return_value = { 'status': 'success', 'password': { 'url': encrypt_text('a'), 'login': encrypt_text('b'), 'passwd': encrypt_text('c'), 'description': encrypt_text('d'), } } mock_post.return_value = mock_response passwords = pm.get_passwords('folder-name', 'password-name') self.assertEqual(passwords['password-name']['url'], 'a') self.assertEqual(passwords['password-name']['login'], 'b') self.assertEqual(passwords['password-name']['password'], 'c') self.assertEqual(passwords['password-name']['description'], 'd')
def test_request_to_get_password_returns_error(self, mock_post): mock_response = Mock() mock_response.json.return_value = {'status': 'error', 'password': ''} mock_post.return_value = mock_response pm = PasswordManager(key='tests/fixtures/privkey.pem') passwords = pm.get_passwords('folder-name', 'password-name') self.assertDictEqual(passwords, {})
def test_response_to_get_token_returns_error(self, mock_post): mock_post.side_effect = Exception('Boom!') with self.assertRaises(Exception) as context_manager: PasswordManager(key='tests/fixtures/privkey.pem') self.assertEqual(str(context_manager.exception), 'There was error requesting token. Error was: Boom!')
def test_response_to_get_token_is_not_ok(self, mock_post): mock_response = Mock() mock_response.ok = False mock_post.return_value = mock_response pm = PasswordManager(key='tests/fixtures/privkey.pem') self.assertIsNone(pm._token)
def test_response_to_get_token_is_ok(self, mock_post): mock_response = Mock() mock_response.ok = True mock_response.json.return_value = {'token': 'my-fake-token'} mock_post.return_value = mock_response pm = PasswordManager(key='tests/fixtures/privkey.pem') self.assertEqual(pm._token, 'my-fake-token')
def test_response_to_get_token_is_ok_but_there_is_no_token( self, mock_post): mock_response = Mock() mock_response.ok = True mock_response.json.return_value = {} mock_post.return_value = mock_response pm = PasswordManager(key='tests/fixtures/privkey.pem') self.assertIsNone(pm._token)
def test_response_to_get_token_is_not_ok(self, mock_post): mock_response = Mock() mock_response.ok = False mock_response.status_code = 500 mock_post.return_value = mock_response with self.assertRaises(TokenError) as context_manager: PasswordManager(key='tests/fixtures/privkey.pem') self.assertEqual( str(context_manager.exception), 'Response status code to get token is not ok. Status code was: 500' )
def test_gets_passwords_correctly_vault_true(self, mock_post): pm = PasswordManager(key='tests/fixtures/privkey.pem') def b64_encode(text): return base64.b64encode(bytes(text, 'utf-8')).decode() mock_response = Mock() mock_response.json.return_value = { 'status': 'success', 'password': { 'url': b64_encode('a'), 'login': b64_encode('b'), 'passwd': b64_encode('c'), 'description': b64_encode('d'), 'vault': True } } mock_post.return_value = mock_response passwords = pm.get_passwords('folder-name', 'password-name') self.assertEqual(passwords['password-name']['url'], 'a') self.assertEqual(passwords['password-name']['login'], 'b') self.assertEqual(passwords['password-name']['password'], 'c') self.assertEqual(passwords['password-name']['description'], 'd')
def test_try_to_get_password_but_password_name_is_not_passed(self): pm = PasswordManager(key='tests/fixtures/privkey.pem') passwords = pm.get_passwords('folder-name') self.assertDictEqual(passwords, {})
def test_invalid_key_path_raises_exception(self): with self.assertRaises(ValueError) as context_manager: PasswordManager(key='/this/path/does/not/exists') self.assertEqual(str(context_manager.exception), 'Key File does not exist')
def test_invalid_key_raises_exception(self): with self.assertRaises(Exception) as context_manager: PasswordManager(key='') self.assertEqual(str(context_manager.exception), 'Error loading private key')
def test_key_load_error(): with pytest.raises(Exception) as excinfo: PasswordManager(key='') assert "key load error" in str(excinfo.value)
'-n', help='Name of password', multiple=True, required=True) @click.option('--prefix', '-p', help='Prefix for exports', default="GSENHA_") def get(folder, name, prefix): export_string = '' passwd = PM.get_passwords(folder, *name) for p in passwd: export_string += '\n' export_string += '#' * 20 export_string += ' Keys for {name} \n\n'.format(name=p) for key in passwd[p]: key_name = EXPORT_KEYS.sub( '', '{p}_{key}'.format(p=p.upper(), key=key.upper())) export_string += 'export {prefix}{key}=\'{value}\' \n'.format( prefix=prefix, key=key_name, value=passwd[p][key]) click.echo(export_string) gsenha = click.CommandCollection(sources=[password]) if __name__ == '__main__': if validate_env('GSENHA_ENDPOINT') and validate_env( 'GSENHA_USER') and validate_env('GSENHA_PASS') and validate_env( 'GSENHA_KEY', 'GSENHA_KEY_PATH'): PM = PasswordManager() gsenha() else: exit(1)