c013a389fe
- Added is_valid_directory function to validate directory paths, ensuring they do not contain control characters and are within a specified length. - Introduced quote_shell_arg to safely quote shell arguments, preventing command injection. - Created build_cd_command to generate a command for changing directories in a shell. - Enhanced the LoginHandler to utilize a login rate limiter, preventing brute-force attacks by tracking failed login attempts. - Implemented an EncodingCache to optimize encoding detection for SSH connections. - Updated the UI to include an input field for specifying an initial directory upon login, with appropriate validation and hints. - Added a quickbar in the terminal interface for easy access to copy and paste functionality. - Introduced a toast notification system to provide feedback on copy actions. - Refactored connection storage to encrypt passwords at rest, improving security. - Updated various templates and styles to accommodate new features and improve user experience.
165 lines
6.3 KiB
Python
165 lines
6.3 KiB
Python
import unittest
|
|
|
|
from webssh.utils import (
|
|
is_valid_ip_address, is_valid_port, is_valid_hostname, to_str, to_bytes,
|
|
to_int, is_ip_hostname, is_same_primary_domain, parse_origin_from_url,
|
|
is_valid_directory, quote_shell_arg, build_cd_command
|
|
)
|
|
|
|
|
|
class TestUitls(unittest.TestCase):
|
|
|
|
def test_to_str(self):
|
|
b = b'hello'
|
|
u = u'hello'
|
|
self.assertEqual(to_str(b), u)
|
|
self.assertEqual(to_str(u), u)
|
|
|
|
def test_to_bytes(self):
|
|
b = b'hello'
|
|
u = u'hello'
|
|
self.assertEqual(to_bytes(b), b)
|
|
self.assertEqual(to_bytes(u), b)
|
|
|
|
def test_to_int(self):
|
|
self.assertEqual(to_int(''), None)
|
|
self.assertEqual(to_int(None), None)
|
|
self.assertEqual(to_int('22'), 22)
|
|
self.assertEqual(to_int(' 22 '), 22)
|
|
|
|
def test_is_valid_ip_address(self):
|
|
self.assertFalse(is_valid_ip_address('127.0.0'))
|
|
self.assertFalse(is_valid_ip_address(b'127.0.0'))
|
|
self.assertTrue(is_valid_ip_address('127.0.0.1'))
|
|
self.assertTrue(is_valid_ip_address(b'127.0.0.1'))
|
|
self.assertFalse(is_valid_ip_address('abc'))
|
|
self.assertFalse(is_valid_ip_address(b'abc'))
|
|
self.assertTrue(is_valid_ip_address('::1'))
|
|
self.assertTrue(is_valid_ip_address(b'::1'))
|
|
self.assertTrue(is_valid_ip_address('fe80::1111:2222:3333:4444'))
|
|
self.assertTrue(is_valid_ip_address(b'fe80::1111:2222:3333:4444'))
|
|
self.assertTrue(is_valid_ip_address('fe80::1111:2222:3333:4444%eth0'))
|
|
self.assertTrue(is_valid_ip_address(b'fe80::1111:2222:3333:4444%eth0'))
|
|
|
|
def test_is_valid_port(self):
|
|
self.assertTrue(is_valid_port(80))
|
|
self.assertFalse(is_valid_port(0))
|
|
self.assertFalse(is_valid_port(65536))
|
|
|
|
def test_is_valid_hostname(self):
|
|
self.assertTrue(is_valid_hostname('google.com'))
|
|
self.assertTrue(is_valid_hostname('google.com.'))
|
|
self.assertTrue(is_valid_hostname('www.google.com'))
|
|
self.assertTrue(is_valid_hostname('www.google.com.'))
|
|
self.assertFalse(is_valid_hostname('.www.google.com'))
|
|
self.assertFalse(is_valid_hostname('http://www.google.com'))
|
|
self.assertFalse(is_valid_hostname('https://www.google.com'))
|
|
self.assertFalse(is_valid_hostname('127.0.0.1'))
|
|
self.assertFalse(is_valid_hostname('::1'))
|
|
|
|
def test_is_valid_directory(self):
|
|
self.assertTrue(is_valid_directory('/var/www'))
|
|
self.assertTrue(is_valid_directory('~/projects'))
|
|
self.assertTrue(is_valid_directory('/tmp/a b'))
|
|
self.assertTrue(is_valid_directory('/srv/项目'))
|
|
self.assertTrue(is_valid_directory("/tmp/o'brien"))
|
|
self.assertFalse(is_valid_directory(''))
|
|
self.assertFalse(is_valid_directory(None))
|
|
self.assertFalse(is_valid_directory('/tmp\nrm -rf /'))
|
|
self.assertFalse(is_valid_directory('/tmp\rwhoami'))
|
|
self.assertFalse(is_valid_directory('/tmp\x00'))
|
|
self.assertFalse(is_valid_directory('/tmp\x1b[31m'))
|
|
self.assertTrue(is_valid_directory('/' + 'a' * 1023))
|
|
self.assertFalse(is_valid_directory('/' + 'a' * 1024))
|
|
|
|
def test_quote_shell_arg(self):
|
|
self.assertEqual(quote_shell_arg('/var/www'), "'/var/www'")
|
|
self.assertEqual(quote_shell_arg('/tmp/a b'), "'/tmp/a b'")
|
|
self.assertEqual(
|
|
quote_shell_arg('/tmp; rm -rf /'), "'/tmp; rm -rf /'"
|
|
)
|
|
self.assertEqual(
|
|
quote_shell_arg('/tmp/$(whoami)'), "'/tmp/$(whoami)'"
|
|
)
|
|
# a single quote is closed, escaped, then reopened
|
|
self.assertEqual(quote_shell_arg("o'brien"), "'o'\\''brien'")
|
|
self.assertEqual(
|
|
quote_shell_arg("'; rm -rf /; '"), "''\\''; rm -rf /; '\\'''"
|
|
)
|
|
|
|
def test_build_cd_command(self):
|
|
self.assertEqual(build_cd_command('/var/www'), "cd '/var/www'\r")
|
|
self.assertEqual(
|
|
build_cd_command('/tmp; reboot'), "cd '/tmp; reboot'\r"
|
|
)
|
|
|
|
def test_is_ip_hostname(self):
|
|
self.assertTrue(is_ip_hostname('[::1]'))
|
|
self.assertTrue(is_ip_hostname('127.0.0.1'))
|
|
self.assertFalse(is_ip_hostname('localhost'))
|
|
self.assertFalse(is_ip_hostname('www.google.com'))
|
|
|
|
def test_is_same_primary_domain(self):
|
|
domain1 = 'localhost'
|
|
domain2 = 'localhost'
|
|
self.assertTrue(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'localhost'
|
|
domain2 = 'test'
|
|
self.assertFalse(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'com'
|
|
domain2 = 'example.com'
|
|
self.assertFalse(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'example.com'
|
|
domain2 = 'example.com'
|
|
self.assertTrue(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'www.example.com'
|
|
domain2 = 'example.com'
|
|
self.assertTrue(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'wwwexample.com'
|
|
domain2 = 'example.com'
|
|
self.assertFalse(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'www.example.com'
|
|
domain2 = 'www2.example.com'
|
|
self.assertTrue(is_same_primary_domain(domain1, domain2))
|
|
|
|
domain1 = 'xxx.www.example.com'
|
|
domain2 = 'xxx.www2.example.com'
|
|
self.assertTrue(is_same_primary_domain(domain1, domain2))
|
|
|
|
def test_parse_origin_from_url(self):
|
|
url = ''
|
|
self.assertIsNone(parse_origin_from_url(url))
|
|
|
|
url = 'www.example.com'
|
|
self.assertEqual(parse_origin_from_url(url), 'http://www.example.com')
|
|
|
|
url = 'http://www.example.com'
|
|
self.assertEqual(parse_origin_from_url(url), 'http://www.example.com')
|
|
|
|
url = 'www.example.com:80'
|
|
self.assertEqual(parse_origin_from_url(url), 'http://www.example.com')
|
|
|
|
url = 'http://www.example.com:80'
|
|
self.assertEqual(parse_origin_from_url(url), 'http://www.example.com')
|
|
|
|
url = 'www.example.com:443'
|
|
self.assertEqual(parse_origin_from_url(url), 'https://www.example.com')
|
|
|
|
url = 'https://www.example.com'
|
|
self.assertEqual(parse_origin_from_url(url), 'https://www.example.com')
|
|
|
|
url = 'https://www.example.com:443'
|
|
self.assertEqual(parse_origin_from_url(url), 'https://www.example.com')
|
|
|
|
url = 'https://www.example.com:80'
|
|
self.assertEqual(parse_origin_from_url(url), url)
|
|
|
|
url = 'http://www.example.com:443'
|
|
self.assertEqual(parse_origin_from_url(url), url)
|