feat: add saved SSH keys and terminal workspace tools

This commit is contained in:
Jocay
2026-10-05 00:58:22 +08:00
parent 0ea184f8e1
commit 3580ded915
15 changed files with 1606 additions and 373 deletions
+46
View File
@@ -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 = {}