1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
######################################################################
#
# utils A collection of utility functions
#
# This software is governed by a license. See
# LICENSE.txt for the terms of this license.
#
######################################################################
__version__='$Revision: 1.15 $'[11:-2]
from types import UnicodeType, StringType
import urllib, sha, SSHA, random, base64, codecs, string
#################################################
# "Safe" imports for use in the other modules
#################################################
try:
import crypt
HAVE_CRYPT = 1
except ImportError:
crypt = None
HAVE_CRYPT = 0
import ldap
#################################################
# Constants used in other modules
#################################################
HTTP_METHODS = ('GET', 'PUT', 'POST')
ldap_scopes = (ldap.SCOPE_BASE, ldap.SCOPE_ONELEVEL, ldap.SCOPE_SUBTREE)
GROUP_MEMBER_MAP = { 'groupOfUniqueNames' : 'uniqueMember'
, 'groupOfNames' : 'member'
, 'accessGroup' : 'member'
, 'group' : 'member'
}
encoding = 'latin1'
#################################################
# Helper methods for other modules
#################################################
def _verifyUnicode(st):
""" Verify that the string is unicode """
if type(st) is UnicodeType:
return st
else:
try:
return unicode(st)
except UnicodeError:
return unicode(st, encoding).encode(encoding)
def _createLDAPPassword(password, encoding='SHA'):
""" Create a password string suitable for userPassword """
if encoding == 'SSHA':
pwd_str = '{SSHA}' + SSHA.encrypt(password)
elif encoding == 'crypt':
saltseeds = list('%s%s' % ( string.lowercase[:26]
, string.uppercase[:26]
) )
salt = ''
for n in range(2):
salt += random.choice(saltseeds)
pwd_str = '{crypt}%s' % crypt.crypt(password, salt)
elif encoding == 'clear':
pwd_str = password
else:
sha_obj = sha.new(password)
sha_dig = sha_obj.digest()
pwd_str = '{SHA}' + base64.encodestring(sha_dig)
return pwd_str.strip()
try:
encodeLocal, decodeLocal, reader = codecs.lookup(encoding)[:3]
encodeUTF8, decodeUTF8 = codecs.lookup('UTF-8')[:2]
if getattr(reader, '__module__', '') == 'encodings.utf_8':
# Everything stays UTF-8, so we can make this cheaper
to_utf8 = from_utf8 = str
else:
def from_utf8(s):
return encodeLocal(decodeUTF8(s)[0])[0]
def to_utf8(s):
return encodeUTF8(decodeLocal(s)[0])[0]
except LookupError:
raise LookupError, 'Unknown encoding "%s"' % encoding
|