feat: add saved SSH keys and terminal workspace tools
This commit is contained in:
@@ -160,6 +160,7 @@ class TestPrivateKey(unittest.TestCase):
|
||||
with self.assertRaises(InvalidValueError) as ctx:
|
||||
pk.get_pkey_obj()
|
||||
self.assertIn('wrong passphrase', str(ctx.exception))
|
||||
self.assertNotIn('wrongpass', str(ctx.exception))
|
||||
|
||||
pk = self.get_pk_obj(fname, password=password)
|
||||
self.assertIsInstance(pk.get_pkey_obj(), klass)
|
||||
@@ -318,12 +319,41 @@ class TestWsockHandler(unittest.TestCase):
|
||||
obj.close.assert_called_with(reason='Worker closed')
|
||||
|
||||
class TestIndexHandler(unittest.TestCase):
|
||||
def test_saved_encrypted_key_uses_supplied_or_saved_passphrase(self):
|
||||
privatekey = read_file(
|
||||
make_tests_data_path('test_rsa_password.key')
|
||||
)
|
||||
for supplied in ('', 'television'):
|
||||
obj = Mock(spec=IndexHandler)
|
||||
obj.get_hostname.return_value = '127.0.0.1'
|
||||
obj.get_port.return_value = 22
|
||||
obj.get_value.return_value = 'root'
|
||||
obj.get_privatekey.return_value = ('', '')
|
||||
obj.get_saved_privatekey.return_value = (
|
||||
privatekey, 'television' if not supplied else 'wrong'
|
||||
)
|
||||
obj.get_saved_password.return_value = ''
|
||||
obj.get_directory.return_value = ''
|
||||
obj.policy = paramiko.WarningPolicy()
|
||||
obj.ssh_client = Mock()
|
||||
values = {'passphrase': supplied, 'save_credentials': '1',
|
||||
'save_passphrase': '1'}
|
||||
obj.get_argument.side_effect = (
|
||||
lambda name, default=u'': values.get(name, default)
|
||||
)
|
||||
args = IndexHandler.get_args(obj)
|
||||
self.assertIsInstance(args[4], paramiko.RSAKey)
|
||||
self.assertEqual('television', obj.connection_info['passphrase'])
|
||||
self.assertEqual('privatekey', obj.connection_info['auth_type'])
|
||||
self.assertTrue(obj.connection_info['save_credentials'])
|
||||
|
||||
def test_get_args_keeps_password_for_saved_connection(self):
|
||||
obj = Mock(spec=IndexHandler)
|
||||
obj.get_hostname.return_value = '127.0.0.1'
|
||||
obj.get_port.return_value = 22
|
||||
obj.get_value.return_value = 'root'
|
||||
obj.get_privatekey.return_value = ('', '')
|
||||
obj.get_saved_privatekey.return_value = ('', '')
|
||||
obj.get_directory.return_value = ''
|
||||
obj.policy = paramiko.WarningPolicy()
|
||||
obj.ssh_client = Mock()
|
||||
@@ -352,6 +382,7 @@ class TestIndexHandler(unittest.TestCase):
|
||||
obj.get_port.return_value = 22
|
||||
obj.get_value.return_value = 'root'
|
||||
obj.get_privatekey.return_value = ('', '')
|
||||
obj.get_saved_privatekey.return_value = ('', '')
|
||||
obj.get_directory.return_value = '/var/www'
|
||||
obj.policy = paramiko.WarningPolicy()
|
||||
obj.ssh_client = Mock()
|
||||
@@ -362,6 +393,21 @@ class TestIndexHandler(unittest.TestCase):
|
||||
self.assertEqual('/var/www', args[6])
|
||||
self.assertEqual('/var/www', obj.connection_info['directory'])
|
||||
|
||||
def test_websocket_cannot_attach_twice_to_same_worker(self):
|
||||
obj = Mock(spec=WsockHandler)
|
||||
obj.current_user = 'admin'
|
||||
obj.get_client_addr.return_value = ('127.0.0.1', 1234)
|
||||
obj.get_client_key.return_value = 'user:test-double-attach'
|
||||
obj.get_value.return_value = 'existing'
|
||||
active_worker = Mock(handler=Mock())
|
||||
worker.clients['user:test-double-attach'] = {'existing': active_worker}
|
||||
try:
|
||||
WsockHandler.open(obj)
|
||||
obj.close.assert_called_once_with(reason='Websocket authentication failed.')
|
||||
active_worker.set_handler.assert_not_called()
|
||||
finally:
|
||||
worker.clients.pop('user:test-double-attach', None)
|
||||
|
||||
def test_get_directory(self):
|
||||
obj = Mock(spec=IndexHandler)
|
||||
values = {}
|
||||
|
||||
Reference in New Issue
Block a user