commit d6e43395408105710ca34c099e2b62100be20e19
parent d1177bc2c593290e72cd0c59406a7e4a49561a98
Author: Sheng <webmaster0115@gmail.com>
Date: Wed, 25 Apr 2018 21:05:01 +0800
Updated test_handler.py
Diffstat:
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