webssh

Web based ssh client https://github.com/huashengdun/webssh webssh.huashengdun.org/
git clone http://git.hanabi.in/repos/webssh.git
Log | Files | Refs | README | LICENSE

commit d6e43395408105710ca34c099e2b62100be20e19
parent d1177bc2c593290e72cd0c59406a7e4a49561a98
Author: Sheng <webmaster0115@gmail.com>
Date:   Wed, 25 Apr 2018 21:05:01 +0800

Updated test_handler.py

Diffstat:
Atests/test_ed25519.key | 8++++++++
Atests/test_ed25519_password.key | 8++++++++
Mtests/test_handler.py | 61++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Atests/test_rsa.key | 15+++++++++++++++
Atests/test_rsa_password.key | 18++++++++++++++++++
Mwebssh/handler.py | 2++
6 files changed, 111 insertions(+), 1 deletion(-)

diff --git a/tests/test_ed25519.key b/tests/test_ed25519.key @@ -0,0 +1,8 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACB69SvZKJh/9VgSL0G27b5xVYa8nethH3IERbi0YqJDXwAAAKhjwAdrY8AH +awAAAAtzc2gtZWQyNTUxOQAAACB69SvZKJh/9VgSL0G27b5xVYa8nethH3IERbi0YqJDXw +AAAEA9tGQi2IrprbOSbDCF+RmAHd6meNSXBUQ2ekKXm4/8xnr1K9komH/1WBIvQbbtvnFV +hryd62EfcgRFuLRiokNfAAAAI2FsZXhfZ2F5bm9yQEFsZXhzLU1hY0Jvb2stQWlyLmxvY2 +FsAQI= +-----END OPENSSH PRIVATE KEY----- diff --git a/tests/test_ed25519_password.key b/tests/test_ed25519_password.key @@ -0,0 +1,8 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABDaKD4ac7 +kieb+UfXaLaw68AAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIOQn7fjND5ozMSV3 +CvbEtIdT73hWCMRjzS/lRdUDw50xAAAAsE8kLGyYBnl9ihJNqv378y6mO3SkzrDbWXOnK6 +ij0vnuTAvcqvWHAnyu6qBbplu/W2m55ZFeAItgaEcV2/V76sh/sAKlERqrLFyXylN0xoOW +NU5+zU08aTlbSKGmeNUU2xE/xfJq12U9XClIRuVUkUpYANxNPbmTRpVrbD3fgXMhK97Jrb +DEn8ca1IqMPiYmd/hpe5+tq3OxyRljXjCUFWTnqkp9VvUdzSTdSGZHsW9i +-----END OPENSSH PRIVATE KEY----- diff --git a/tests/test_handler.py b/tests/test_handler.py @@ -1,7 +1,10 @@ import unittest +import os.path +import paramiko +from paramiko import RSAKey, DSSKey, Ed25519Key, ECDSAKey from tornado.httputil import HTTPServerRequest -from handler import MixinHandler +from handler import MixinHandler, IndexHandler class TestMixinHandler(unittest.TestCase): @@ -26,3 +29,59 @@ class TestMixinHandler(unittest.TestCase): handler.request.headers.update({'X-Real-Port': '12345x'}) self.assertEqual(handler.get_real_client_addr(), False) + + +class TestIndexHandler(unittest.TestCase): + + def read_privatekey(self, filename): + with open(filename, 'rb') as f: + return f.read().decode('utf-8') + + def test_get_specific_pkey_with_plain_key(self): + + fname = 'test_rsa.key' + cls = paramiko.RSAKey + key = self.read_privatekey(os.path.join('tests', fname)) + pkey = IndexHandler.get_specific_pkey(cls, key, None) + self.assertIsInstance(pkey, cls) + pkey = IndexHandler.get_specific_pkey(cls, key, b'iginored') + self.assertIsInstance(pkey, cls) + pkey = IndexHandler.get_specific_pkey(cls, 'x'+key, None) + self.assertIsNone(pkey) + + def test_get_specific_pkey_with_encrypted_key(self): + fname = 'test_rsa_password.key' + cls = paramiko.RSAKey + password = b'television' + + key = self.read_privatekey(os.path.join('tests', fname)) + pkey = IndexHandler.get_specific_pkey(cls, key, password) + self.assertIsInstance(pkey, cls) + pkey = IndexHandler.get_specific_pkey(cls, 'x'+key, None) + self.assertIsNone(pkey) + + with self.assertRaises(ValueError): + pkey = IndexHandler.get_specific_pkey(cls, key, None) + + def test_get_pkey_obj_with_plain_key(self): + fname = 'test_ed25519.key' + cls = paramiko.Ed25519Key + key = self.read_privatekey(os.path.join('tests', fname)) + pkey = IndexHandler.get_pkey_obj(key, None) + self.assertIsInstance(pkey, cls) + pkey = IndexHandler.get_pkey_obj(key, u'iginored') + self.assertIsInstance(pkey, cls) + with self.assertRaises(ValueError): + pkey = IndexHandler.get_pkey_obj('x'+key, None) + + def test_get_pkey_obj_with_encrypted_key(self): + fname = 'test_ed25519_password.key' + password = 'abc123' + cls = paramiko.Ed25519Key + key = self.read_privatekey(os.path.join('tests', fname)) + pkey = IndexHandler.get_pkey_obj(key, password) + self.assertIsInstance(pkey, cls) + with self.assertRaises(ValueError): + pkey = IndexHandler.get_pkey_obj(key, u'wrongpass') + with self.assertRaises(ValueError): + pkey = IndexHandler.get_pkey_obj('x'+key, password) diff --git a/tests/test_rsa.key b/tests/test_rsa.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWgIBAAKBgQDTj1bqB4WmayWNPB+8jVSYpZYk80Ujvj680pOTh2bORBjbIAyz +oWGW+GUjzKxTiiPvVmxFgx5wdsFvF03v34lEVVhMpouqPAYQ15N37K/ir5XY+9m/ +d8ufMCkjeXsQkKqFbAlQcnWMCRnOoPHS3I4vi6hmnDDeeYTSRvfLbW0fhwIBIwKB +gBIiOqZYaoqbeD9OS9z2K9KR2atlTxGxOJPXiP4ESqP3NVScWNwyZ3NXHpyrJLa0 +EbVtzsQhLn6rF+TzXnOlcipFvjsem3iYzCpuChfGQ6SovTcOjHV9z+hnpXvQ/fon +soVRZY65wKnF7IAoUwTmJS9opqgrN6kRgCd3DASAMd1bAkEA96SBVWFt/fJBNJ9H +tYnBKZGw0VeHOYmVYbvMSstssn8un+pQpUm9vlG/bp7Oxd/m+b9KWEh2xPfv6zqU +avNwHwJBANqzGZa/EpzF4J8pGti7oIAPUIDGMtfIcmqNXVMckrmzQ2vTfqtkEZsA +4rE1IERRyiJQx6EJsz21wJmGV9WJQ5kCQQDwkS0uXqVdFzgHO6S++tjmjYcxwr3g +H0CoFYSgbddOT6miqRskOQF3DZVkJT3kyuBgU2zKygz52ukQZMqxCb1fAkASvuTv +qfpH87Qq5kQhNKdbbwbmd2NxlNabazPijWuphGTdW0VfJdWfklyS2Kr+iqrs/5wV +HhathJt636Eg7oIjAkA8ht3MQ+XSl9yIJIS8gVpbPxSw5OMfw0PjVE7tBdQruiSc +nvuQES5C9BMHjF39LZiGH1iLQy7FgdHyoP+eodI7 +-----END RSA PRIVATE KEY----- diff --git a/tests/test_rsa_password.key b/tests/test_rsa_password.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,DAA422E8A5A8EFB7 + ++nssHGmWl91IcmGiE6DdCIqGvAP04tuLh60wLjWBvdjtF9CjztPnF57xe+6pBk7o +YgF/Ry3ik9ZV9rHNcRXifDKM9crxtYlpUlkM2C0SP89sXaO0P1Q1yCnrtZUwDIKO +BNV8et5X7+AGMFsy/nmv0NFMrbpoG03Dppsloecd29NTRlIXwxHRFyHxy6BdEib/ +Dn0mEVbwg3dTvKrd/sODWR9hRwpDGM9nkEbUNJCh7vMwFKkIZZF8yqFvmGckuO5C +HZkDJ6RkEDYrSZJAavQaiOPF5bu3cHughRfnrIKVrQuTTDiWjwX9Ny8e4p4k7dy7 +rLpbPhtxUOUbpOF7T1QxljDi1Tcq3Ebk3kN/ZLPRFnDrJfyUx+m9BXmAa78Wxs/l +KaS8DTkYykd3+EGOeJFjZg2bvgqil4V+5JIt/+MQ5pZ/ui7i4GcH2bvZyGAbrXzP +3LipSAdN5RG+fViLe3HUtfCx4ZAgtU78TWJrLk2FwKQGglFxKLnswp+IKZb09rZV +uxmG4pPLUnH+mMYdiy5ugzj+5C8iZ0/IstpHVmO6GWROfedpJ82eMztTOtdhfMep +8Z3HwAwkDtksL7Gq9klb0Wq5+uRlBWetixddAvnmqXNzYhaANWcAF/2a2Hz06Rb0 +e6pe/g0Ek5KV+6YI+D+oEblG0Sr+d4NtxtDTmIJKNVkmzlhI2s53bHp6txCb5JWJ +S8mKLPBBBzaNXYd3odDvGXguuxUntWSsD11KyR6B9DXMIfWQW5dT7hp5kTMGlXWJ +lD2hYab13DCCuAkwVTdpzhHYLZyxLYoSu05W6z8SAOs= +-----END RSA PRIVATE KEY----- diff --git a/webssh/handler.py b/webssh/handler.py @@ -54,6 +54,7 @@ class IndexHandler(MixinHandler, tornado.web.RequestHandler): return return data.decode('utf-8') + @classmethod def get_specific_pkey(self, pkeycls, privatekey, password): logging.info('Trying {}'.format(pkeycls.__name__)) try: @@ -66,6 +67,7 @@ class IndexHandler(MixinHandler, tornado.web.RequestHandler): else: return pkey + @classmethod def get_pkey_obj(self, privatekey, password): password = password.encode('utf-8') if password else None