|
@@ -32,6 +32,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(is_password_usable(encoded))
|
|
|
self.assertTrue(check_password('lètmein', encoded))
|
|
|
self.assertFalse(check_password('lètmeinz', encoded))
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('')
|
|
|
+ self.assertTrue(blank_encoded.startswith('pbkdf2_sha256$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
def test_pkbdf2(self):
|
|
|
encoded = make_password('lètmein', 'seasalt', 'pbkdf2_sha256')
|
|
@@ -41,6 +47,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(check_password('lètmein', encoded))
|
|
|
self.assertFalse(check_password('lètmeinz', encoded))
|
|
|
self.assertEqual(identify_hasher(encoded).algorithm, "pbkdf2_sha256")
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', 'seasalt', 'pbkdf2_sha256')
|
|
|
+ self.assertTrue(blank_encoded.startswith('pbkdf2_sha256$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
def test_sha1(self):
|
|
|
encoded = make_password('lètmein', 'seasalt', 'sha1')
|
|
@@ -50,6 +62,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(check_password('lètmein', encoded))
|
|
|
self.assertFalse(check_password('lètmeinz', encoded))
|
|
|
self.assertEqual(identify_hasher(encoded).algorithm, "sha1")
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', 'seasalt', 'sha1')
|
|
|
+ self.assertTrue(blank_encoded.startswith('sha1$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
def test_md5(self):
|
|
|
encoded = make_password('lètmein', 'seasalt', 'md5')
|
|
@@ -59,6 +77,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(check_password('lètmein', encoded))
|
|
|
self.assertFalse(check_password('lètmeinz', encoded))
|
|
|
self.assertEqual(identify_hasher(encoded).algorithm, "md5")
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', 'seasalt', 'md5')
|
|
|
+ self.assertTrue(blank_encoded.startswith('md5$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
def test_unsalted_md5(self):
|
|
|
encoded = make_password('lètmein', '', 'unsalted_md5')
|
|
@@ -72,6 +96,11 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(is_password_usable(alt_encoded))
|
|
|
self.assertTrue(check_password('lètmein', alt_encoded))
|
|
|
self.assertFalse(check_password('lètmeinz', alt_encoded))
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', '', 'unsalted_md5')
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
def test_unsalted_sha1(self):
|
|
|
encoded = make_password('lètmein', '', 'unsalted_sha1')
|
|
@@ -83,6 +112,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
# Raw SHA1 isn't acceptable
|
|
|
alt_encoded = encoded[6:]
|
|
|
self.assertFalse(check_password('lètmein', alt_encoded))
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', '', 'unsalted_sha1')
|
|
|
+ self.assertTrue(blank_encoded.startswith('sha1$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
@skipUnless(crypt, "no crypt module to generate password.")
|
|
|
def test_crypt(self):
|
|
@@ -92,6 +127,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(check_password('lètmei', encoded))
|
|
|
self.assertFalse(check_password('lètmeiz', encoded))
|
|
|
self.assertEqual(identify_hasher(encoded).algorithm, "crypt")
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', 'ab', 'crypt')
|
|
|
+ self.assertTrue(blank_encoded.startswith('crypt$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
@skipUnless(bcrypt, "bcrypt not installed")
|
|
|
def test_bcrypt_sha256(self):
|
|
@@ -108,6 +149,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
encoded = make_password(password, hasher='bcrypt_sha256')
|
|
|
self.assertTrue(check_password(password, encoded))
|
|
|
self.assertFalse(check_password(password[:72], encoded))
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', hasher='bcrypt_sha256')
|
|
|
+ self.assertTrue(blank_encoded.startswith('bcrypt_sha256$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
@skipUnless(bcrypt, "bcrypt not installed")
|
|
|
def test_bcrypt(self):
|
|
@@ -117,6 +164,12 @@ class TestUtilsHashPass(unittest.TestCase):
|
|
|
self.assertTrue(check_password('lètmein', encoded))
|
|
|
self.assertFalse(check_password('lètmeinz', encoded))
|
|
|
self.assertEqual(identify_hasher(encoded).algorithm, "bcrypt")
|
|
|
+ # Blank passwords
|
|
|
+ blank_encoded = make_password('', hasher='bcrypt')
|
|
|
+ self.assertTrue(blank_encoded.startswith('bcrypt$'))
|
|
|
+ self.assertTrue(is_password_usable(blank_encoded))
|
|
|
+ self.assertTrue(check_password('', blank_encoded))
|
|
|
+ self.assertFalse(check_password(' ', blank_encoded))
|
|
|
|
|
|
def test_unusable(self):
|
|
|
encoded = make_password(None)
|