summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Collins <elic@assurancetechnologies.com>2012-06-27 16:55:49 -0400
committerEli Collins <elic@assurancetechnologies.com>2012-06-27 16:55:49 -0400
commite6bdbce71624c38417c6ffb2993ac4eae7a42c2c (patch)
tree3f2bf111f055d12e598784f308f21ec4424b00a2
parentaf2c8c5f4ab5e5ce9c117dedb9f137fc632a0206 (diff)
downloadpasslib-e6bdbce71624c38417c6ffb2993ac4eae7a42c2c.tar.gz
removed some unused files, tweaked some internal comments
-rw-r--r--admin/test_release.py256
-rw-r--r--docs/notes.txt53
-rw-r--r--passlib/handlers/ldap_digests.py14
3 files changed, 4 insertions, 319 deletions
diff --git a/admin/test_release.py b/admin/test_release.py
deleted file mode 100644
index d62e18b..0000000
--- a/admin/test_release.py
+++ /dev/null
@@ -1,256 +0,0 @@
-"""helper script that tries to build & test passlib for various python versions.
-
-note that this script is very Linux-specific,
-and in fact contains various hardcoded assumptions
-that are only true for the systems used by passlib's developers.
-
-it also calls "rm -rf" a lot, so be wary :)
-"""
-#=========================================================================
-# imports
-#=========================================================================
-import re
-import sys
-import os.path
-import subprocess
-
-#=========================================================================
-# helpers
-#=========================================================================
-def absjoin(*args):
- return os.path.abspath(os.path.join(*args))
-
-def discard_paths(*paths, **kwds):
- cmd = [ "rm", "-rf" ]
- if kwds.get("sudo"):
- cmd.insert(0, "sudo")
- paths = filter(os.path.exists, paths)
- if paths:
- subprocess.check_call(cmd + list(paths))
-
-#=========================================================================
-# main
-#=========================================================================
-class PlatformTestApp(object):
- "command line program that runs passlib's unittest suite for all python versions"
-
- #=========================================================================
- # class attrs
- #=========================================================================
- # names of vms to test
- vm_names = [
- # normal python versions
- "2.5",
- "2.6",
- "2.7",
- "3.1",
- "3.2",
-
- # other vms
- "y2.7-1.5", # pypy 1.5
- "y2.7-1.6", # pypy 1.6
- "j2.5", # jython 2.5
- "gae",
- ]
-
- #=========================================================================
- # instance attrs
- #=========================================================================
- root_dir = None # root dir of source
- version = None #current version string
- sdist_dir = None # unpacked sdist dir
-
- #=========================================================================
- # init
- #=========================================================================
- def __init__(self, args):
- self.args = args
-
- #=========================================================================
- # run
- #=========================================================================
- def run(self):
- # change dir root dir
- self.root_dir = absjoin(__file__, os.pardir, os.pardir)
- os.chdir(self.root_dir)
-
- # get version
- self.version = subprocess.check_output(
- ["python", "setup.py","--version"]).strip()
-
- # purge build & dist
- discard_paths(
- absjoin(self.root_dir, "dist"),
- absjoin(self.root_dir, "build"),
- )
-
- # create new source dist, extract it, and work from that
- subprocess.check_call(["python", "setup.py", "sdist"])
- os.chdir(absjoin(self.root_dir, "dist"))
- subprocess.check_call(["tar", "zxvf", "passlib-" + self.version + ".tar.gz"])
- self.sdist_dir = absjoin(self.root_dir, "dist", "passlib-" + self.version)
-
- # run test for each of the vms
- for name in self.vm_names:
- self.run_vm_test(name)
-
- return 0
-
- def run_vm_test(self, name):
- # cd to sdist dir, purge everything
- os.chdir(self.sdist_dir)
- discard_paths(
- absjoin(self.sdist_dir, "dist"),
- absjoin(self.sdist_dir, "build"),
- )
- self.uninstall_passlib(name)
-
- # if gae, run unittests directly in source
- if name == "gae":
- self.run_gae_test()
- else:
- self.run_vm_test_egg(name)
- if not self.parse_vm(name)[0]:
- self.uninstall_passlib(name)
- self.run_vm_test_pip(name)
-
- self.uninstall_passlib(name)
-
- def run_gae_test(self):
- # cd to preconfigured gae app
- gae_dir = absjoin(self.root_dir, os.pardir, "gae")
- os.chdir(gae_dir)
-
- # cleanup and init symlink for passlib
- target_dir = absjoin(gae_dir, "passlib")
- discard_paths(target_dir)
- os.symlink(absjoin(self.sdist_dir, "passlib"), target_dir)
-
- # run nose w/ gae integration
- subprocess.check_call([
- self.get_vm_exe("gae", "nosetests"),
- "--with-gae",
- "--exe", # later versions set exe bit on test_xxx.py files
- "--tests", "passlib/tests",
- ])
-
- def run_vm_test_pip(self, name):
- os.chdir(absjoin(self.root_dir, "dist"))
-
- # install via pip
- pkg = "passlib-" + self.version + ".tar.gz"
- if self.is_vm_sitewide(name):
- subprocess.check_call([
- "sudo",
- self.get_vm_exe(name, "pip"),
- "install",
- pkg,
- ])
- else:
- subprocess.check_call([
- self.get_vm_exe(name, "pip"),
- "install", "--user",
- pkg,
- ])
-
- # cd to install location and run tests
- # NOTE: just testing that pip worked, so skipping expensive tests
- os.chdir(absjoin(self.get_vm_dir(name)))
- subprocess.check_call([
- self.get_vm_exe(name, "nosetests"),
- "--exe", # later versions set exe bit on test_xxx.py files
- "--tests", "passlib/tests/test_context.py",
- ])
-
- def run_vm_test_egg(self, name):
-
- # build & install egg
- subprocess.check_call([
- self.get_vm_exe(name, "python"),
- "setup.py",
- "bdist_egg",
- ])
- egg_name = "passlib-%s-py%s.egg" % (self.version, self.get_vm_suffix(name))
- exe = self.get_vm_exe(name, "easy_install")
- if self.is_vm_sitewide(name):
- subprocess.check_call(["sudo", exe, "dist/" + egg_name])
- else:
- subprocess.check_call([exe, "--user", "dist/" + egg_name])
-
- # cd to install location and run tests
- os.chdir(absjoin(self.get_vm_dir(name), egg_name))
- subprocess.check_call([
- self.get_vm_exe(name, "nosetests"),
- "--exe", # later versions set exe bit on test_xxx.py files
- "--tests", "passlib/tests",
- ])
-
- def uninstall_passlib(self, name):
- vm_dir = self.get_vm_dir(name)
- discard_paths(*[
- absjoin(vm_dir, fname)
- for fname in os.listdir(vm_dir)
- if fname.startswith("passlib")
- ], sudo=self.is_vm_sitewide(name))
-
- #=========================================================================
- # vm info
- #=========================================================================
- def parse_vm(self, name):
- "parse 'vm name' string into (vm id, py version, vm release)"
- if name == "gae":
- name = "2.5"
- m = re.match(r"^(?P<vm>[a-z]*)(?P<ver>[\d.]+)(-(?P<rel>[\d.]+))?$", name)
- if not m:
- raise ValueError("can't parse vm name: %r" % (name,))
- return m.group("vm", "ver", "rel")
-
- def is_vm_sitewide(self, name):
- "does vm require installing site-wide?"
- vm, ver, rel = self.parse_vm(name)
- return vm == "y" or ver == "2.5"
-
- def get_vm_suffix(self, name):
- "return suffix used by egg built using specified vm"
- return self.parse_vm(name)[1]
-
- def get_vm_dir(self, name):
- "get name of dir where eggs will be installed for specified vm"
- vm, ver, rel = self.parse_vm(name)
- if vm == "y":
- return "/opt/pypy-" + rel + "/site-packages"
- elif vm in ["j", ""] and ver == "2.5":
- prefix = "/usr/lib"
- else:
- prefix = os.path.expanduser("~/.local/lib")
- return prefix + "/python" + self.get_vm_suffix(name) + "/site-packages"
-
- def get_vm_exe(self, name, exe):
- "return path to appropriate exe for specified vm"
- vm, ver, rel = self.parse_vm(name)
- if vm:
- if vm == "y":
- if exe == "python":
- exe = "pypy"
- return "/opt/pypy-" + rel + "/bin/" + exe
- elif vm == "j" and exe == "python":
- return "jython"
- else:
- return exe + "-" + name
- else:
- if exe == "python":
- return "python" + ver
- else:
- return exe + "-" + ver
-
- #=========================================================================
- # eoc
- #=========================================================================
-
-if __name__ == "__main__":
- app = PlatformTestApp(sys.argv[1:])
- sys.exit(app.run())
-
-#=========================================================================
-# eof
-#=========================================================================
diff --git a/docs/notes.txt b/docs/notes.txt
deleted file mode 100644
index ebafa5f..0000000
--- a/docs/notes.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-====
-Todo
-====
-
-Internal Changes
-----------------
-* C extensions to speed up some implementations
-
-Other Hash Formats
-------------------
-* Mac OSX hash formats
-
-* SCrypt
- http://www.tarsnap.com/scrypt.html
- https://bitbucket.org/mhallin/py-scrypt/src
-
-Notes on various hash formats
-=============================
-
-Mac OSX
--------
-Summary of info from http://www.dribin.org/dave/blog/archives/2006/04/28/os_x_passwords_2/
-
-osx < 10.2 used /etc/passwd w/ DES-CRYPT
-
-osx 10.3 hash file (passwd "macintosh")
-
-D47F3AF827A48F7DFA4F2C1F12D68CD6 <-- nthash
-08460EB13C5CA0C4CA9516712F7FED95 <-- lmhash
-01424f955c11f92efef0b79d7fa3fb6be56a9f99 <-- sha1
-
-osx 10.4 hash file (passwd "macintosh")
-00000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-000000000E6A48F765D0FFFFF6247FA80D748E615F91DD0C7431E4D9000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-00000000000000000000000000000000000000000000000000000000000000000000000000000000\
-0000000000000000000000000000000000000000
-
-offset 0-64 - nt hash + lm hash OR all zeros
-offset 64 - 40 chars - raw sha1 password OR all zeroes (if from upgraded from 10.3)
-offset 169-216 ( 48 chars) - salted sha1 hash - unhex first 8 chars + password | sha1 -> hexdigest
diff --git a/passlib/handlers/ldap_digests.py b/passlib/handlers/ldap_digests.py
index 17c9686..ed12e86 100644
--- a/passlib/handlers/ldap_digests.py
+++ b/passlib/handlers/ldap_digests.py
@@ -110,8 +110,6 @@ class ldap_md5(_Base64DigestHelper):
The :meth:`~passlib.ifc.PasswordHash.encrypt` and :meth:`~passlib.ifc.PasswordHash.genconfig` methods have no optional keywords.
"""
name = "ldap_md5"
- setting_kwds = ()
-
ident = u("{MD5}")
_hash_func = md5
_hash_regex = re.compile(u(r"^\{MD5\}(?P<chk>[+/a-zA-Z0-9]{22}==)$"))
@@ -122,8 +120,6 @@ class ldap_sha1(_Base64DigestHelper):
The :meth:`~passlib.ifc.PasswordHash.encrypt` and :meth:`~passlib.ifc.PasswordHash.genconfig` methods have no optional keywords.
"""
name = "ldap_sha1"
- setting_kwds = ()
-
ident = u("{SHA}")
_hash_func = sha1
_hash_regex = re.compile(u(r"^\{SHA\}(?P<chk>[+/a-zA-Z0-9]{27}=)$"))
@@ -241,17 +237,15 @@ class ldap_plaintext(plaintext):
return bool(hash) and cls._2307_pat.match(hash) is None
#=========================================================
-#{CRYPT} wrappers
-#=========================================================
-
+# {CRYPT} wrappers
# the following are wrappers around the base crypt algorithms,
# which add the ldap required {CRYPT} prefix
-
+#=========================================================
ldap_crypt_schemes = [ 'ldap_' + name for name in unix_crypt_schemes ]
def _init_ldap_crypt_handlers():
- #XXX: it's not nice to play in globals like this,
- # but don't want to write all all these handlers
+ # NOTE: I don't like to implicitly modify globals() like this,
+ # but don't want to write out all these handlers out either :)
g = globals()
for wname in unix_crypt_schemes:
name = 'ldap_' + wname