6cad0d0 Ticket #3008: DN objects hash differently depending on case

3 files Authored by jdennis 11 years ago, Committed by abbra 11 years ago,
    Ticket #3008: DN objects hash differently depending on case
    
    Because the attrs & values in DN's, RDN's and AVA's are comparison case-
    insensitive the hash value between two objects which compare as equal but
    differ in case must also yield the same hash value. This is critical when
    these objects are used as a dict key or in a set because dicts and sets
    use the object's __hash__ value in conjunction with the objects __eq__
    method to lookup the object.
    
    The defect is the DN, RDN & AVA objects computed their hash from the case-
    preserving string representation thus two otherwise equal objects
    incorrectly yielded different hash values.
    
    The problem manifests itself when one of these objects is used as a key in
    a dict, for example a dn.
    
    dn1 = DN(('cn', 'Bob'))
    dn2 = DN(('cn', 'bob'))
    
    dn1 == dn2 --> True
    
    hash(dn1) == hash(dn2) --> False
    
    d = {}
    
    d[dn1] = x
    d[dn2] = y
    
    len(d) --> 2
    
    The patch fixes the above by lower casing the string representation of
    the object prior to computing it's hash.
    
    The patch also corrects a spelling mistake and a bogus return value in
    ldapupdate.py which happened to be discovered while researching this
    bug.
    
        
file modified
+29 -14
file modified
+15 -15