summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Collins <elic@assurancetechnologies.com>2012-03-11 18:40:35 -0400
committerEli Collins <elic@assurancetechnologies.com>2012-03-11 18:40:35 -0400
commitb970d6ee145122005f1e6808466900a94e00dfcc (patch)
tree6e77a5d3698e90691c084203932716dd8b0deb79
parentbacfd1448703a106d1ed45e787a03ad671ad5c6c (diff)
downloadpasslib-b970d6ee145122005f1e6808466900a94e00dfcc.tar.gz
misc bugfixes dealing with changes from last 8 or so commits
-rw-r--r--passlib/context.py7
-rw-r--r--passlib/handlers/windows.py5
-rw-r--r--passlib/registry.py1
-rw-r--r--passlib/tests/test_context.py9
-rw-r--r--passlib/tests/test_registry.py2
-rw-r--r--passlib/tests/utils.py19
6 files changed, 27 insertions, 16 deletions
diff --git a/passlib/context.py b/passlib/context.py
index 23eb0dc..e1b5de5 100644
--- a/passlib/context.py
+++ b/passlib/context.py
@@ -335,9 +335,12 @@ class CryptPolicy(object):
handler = elem
scheme = handler.name
_validate_handler_name(scheme)
- else:
+ elif isinstance(elem, str):
handler = get_crypt_handler(elem)
scheme = handler.name
+ else:
+ raise TypeError("scheme must be name or crypt handler, "
+ "not %r" % type(elem))
#check scheme hasn't been re-used
if scheme in schemes:
@@ -1048,7 +1051,7 @@ class _CryptRecord(object):
#relative costs of different hashes if under migration)
warn("CryptContext: verify exceeded min_verify_time: "
"scheme=%r min_verify_time=%r elapsed=%r" %
- (self.scheme, mvt, end-start), PasslibContextWarning)
+ (self.scheme, mvt, end-start), PasslibConfigWarning)
return False
#================================================================
diff --git a/passlib/handlers/windows.py b/passlib/handlers/windows.py
index e4a5199..9805037 100644
--- a/passlib/handlers/windows.py
+++ b/passlib/handlers/windows.py
@@ -156,11 +156,12 @@ class nthash(uh.StaticHandler):
return md4(secret.encode("utf-16-le")).digest()
@classmethod
- def raw_nthash(cls, secret):
+ def raw_nthash(cls, secret, hex=False):
warn("nthash.raw_nthash() is deprecated, and will be removed "
"in Passlib 1.8, please use nthash.raw() instead",
DeprecationWarning)
- return nthash_hex.raw(secret)
+ ret = nthash.raw(secret)
+ return hexlify(ret) if hex else ret
#=========================================================
# eoc
diff --git a/passlib/registry.py b/passlib/registry.py
index 5806816..e9781d9 100644
--- a/passlib/registry.py
+++ b/passlib/registry.py
@@ -294,6 +294,7 @@ def get_crypt_handler(name, default=_NOTSET):
return handler
#normalize name (and if changed, check dict again)
+ assert isinstance(name, str), "name must be str instance"
alt = name.replace("-","_").lower()
if alt != name:
warn("handler names should be lower-case, and use underscores instead "
diff --git a/passlib/tests/test_context.py b/passlib/tests/test_context.py
index efeaaeb..46cd3f5 100644
--- a/passlib/tests/test_context.py
+++ b/passlib/tests/test_context.py
@@ -209,7 +209,12 @@ admin__context__deprecated = des_crypt, bsdi_crypt
)
#check nameless handler rejected
- self.assertRaises(ValueError, CryptPolicy, schemes=[uh.StaticHandler])
+ class nameless(uh.StaticHandler):
+ name = None
+ self.assertRaises(ValueError, CryptPolicy, schemes=[nameless])
+
+ # check scheme must be name or crypt handler
+ self.assertRaises(TypeError, CryptPolicy, schemes=[uh.StaticHandler])
#check name conflicts are rejected
class dummy_1(uh.StaticHandler):
@@ -941,7 +946,7 @@ class CryptContextTest(TestCase):
return True
def _calc_checksum(self, secret):
- time.sleep(cls.delay)
+ time.sleep(self.delay)
return to_unicode(secret + 'x')
# silence deprecation warnings for min verify time
diff --git a/passlib/tests/test_registry.py b/passlib/tests/test_registry.py
index df2f618..c6fa9f6 100644
--- a/passlib/tests/test_registry.py
+++ b/passlib/tests/test_registry.py
@@ -123,7 +123,7 @@ class RegistryTest(TestCase):
self.assertRaises(TypeError, register_crypt_handler, {})
- self.assertRaises(ValueError, register_crypt_handler, uh.StaticHandler)
+ self.assertRaises(ValueError, register_crypt_handler, type('x', (uh.StaticHandler,), dict(name=None)))
self.assertRaises(ValueError, register_crypt_handler, type('x', (uh.StaticHandler,), dict(name="AB_CD")))
self.assertRaises(ValueError, register_crypt_handler, type('x', (uh.StaticHandler,), dict(name="ab-cd")))
diff --git a/passlib/tests/utils.py b/passlib/tests/utils.py
index c309bc4..2f36d3e 100644
--- a/passlib/tests/utils.py
+++ b/passlib/tests/utils.py
@@ -562,13 +562,14 @@ class HandlerCase(TestCase):
def supports_config_string(self):
return self.do_genconfig() is not None
- def iter_known_hashes(self):
+ @classmethod
+ def iter_known_hashes(cls):
"iterate through known (secret, hash) pairs"
- for secret, hash in self.known_correct_hashes:
+ for secret, hash in cls.known_correct_hashes:
yield secret, hash
- for config, secret, hash in self.known_correct_configs:
+ for config, secret, hash in cls.known_correct_configs:
yield secret, hash
- for alt, secret, hash in self.known_alternate_hashes:
+ for alt, secret, hash in cls.known_alternate_hashes:
yield secret, hash
def get_sample_hash(self):
@@ -1152,7 +1153,7 @@ class HandlerCase(TestCase):
self.assertFalse(self.do_verify(secret2, hash),
"full password not used in digest")
- def test_61_case_sensitive(self):
+ def test_61_secret_case_sensitive(self):
"test password case sensitivity"
hash_insensitive = self.secret_case_insensitive is True
verify_insensitive = self.secret_case_insensitive in [True,
@@ -1161,7 +1162,7 @@ class HandlerCase(TestCase):
lower = 'test'
upper = 'TEST'
h1 = self.do_encrypt(lower)
- if verify_insensitive:
+ if verify_insensitive and not self.is_disabled_handler:
self.assertTrue(self.do_verify(upper, h1),
"verify() should not be case sensitive")
else:
@@ -1169,14 +1170,14 @@ class HandlerCase(TestCase):
"verify() should be case sensitive")
h2 = self.do_genhash(upper, h1)
- if hash_insensitive:
+ if hash_insensitive or self.is_disabled_handler:
self.assertEqual(h2, h1,
"genhash() should not be case sensitive")
else:
self.assertNotEqual(h2, h1,
"genhash() should be case sensitive")
- def test_62_null(self):
+ def test_62_secret_null(self):
"test password=None"
_, hash = self.get_sample_hash()
self.assertRaises(TypeError, self.do_encrypt, None)
@@ -1782,7 +1783,7 @@ class temporary_backend(object):
return orig
def __exit__(self, *exc_info):
- registry._unload_handler_name(self.name, locations=False)
+ self.handler.set_backend(self._orig)
#=========================================================
#helper for creating temp files - all cleaned up when prog exits