Ignore:
Timestamp:
03/11/09 16:30:06 (10 years ago)
Author:
pjkersha
Message:

Important fix for parsing Distinguished Names - handle the case where the CN contains a slash as used for MyProxy/Globus? host certificates e.g. /.../CN=host/myhost.mydomain

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg_security_common/ndg/security/common/X509.py

    r5924 r5953  
    708708        'userid':                       'UID' 
    709709    } 
    710  
     710    PARSER_RE_STR = '/(%s)=' % '|'.join(__shortNameLUT.keys() +  
     711                                        __shortNameLUT.values()) 
     712     
     713    PARSER_RE = re.compile(PARSER_RE_STR) 
    711714     
    712715    def __init__(self, dn=None, m2CryptoX509Name=None, separator=None): 
     
    761764        """ 
    762765        return cls(dn=dn) 
    763      
    764     def __repr__(self): 
    765         """Override default behaviour to return internal dictionary content""" 
    766         return self.serialise() 
    767766 
    768767    def __str__(self): 
     
    851850    # 'in' operator 
    852851    def __contains__(self, key): 
    853         return key in self.__tags 
     852        return self.has_key(key) 
    854853 
    855854    def get(self, *arg): 
     
    907906 
    908907        try: 
    909             dnFields = dn.split(self.__separator) 
     908#            dnFields = dn.split(self.__separator) 
     909#            if len(dnFields) < 2: 
     910#                raise X500DNError("Error parsing DN string: \"%s\"" % dn) 
     911# 
     912#             
     913#            # Split fields into key/value and also filter null fields if 
     914#            # found e.g. a leading '/' in the DN would yield a null field 
     915#            # when split 
     916#             
     917#            items = [field.split('=') for field in dnFields if field] 
     918            dnFields = X500DN.PARSER_RE.split(dn) 
    910919            if len(dnFields) < 2: 
    911920                raise X500DNError("Error parsing DN string: \"%s\"" % dn) 
    912921 
    913              
    914             # Split fields into key/value and also filter null fields if 
    915             # found e.g. a leading '/' in the DN would yield a null field 
    916             # when split 
    917              
    918             items = [field.split('=') for field in dnFields if field] 
    919  
     922            items = zip(dnFields[1::2], dnFields[2::2]) 
     923             
    920924            # Reset existing dictionary values 
    921925            self.__dat.fromkeys(self.__dat, '') 
     
    924928            # dictionary 
    925929            parsedDN = {} 
    926             for (key, val) in items: 
     930            for key, val in items: 
    927931                key = key.strip() 
    928932                if key in parsedDN: 
    929933                    if isinstance(parsedDN[key], tuple): 
    930                         parsedDN[key] = tuple(list(parsedDN[key]) + [val])                     
     934                        parsedDN[key] = tuple(list(parsedDN[key]) + [val]) 
    931935                    else: 
    932936                        parsedDN[key] = (parsedDN[key], val) 
Note: See TracChangeset for help on using the changeset viewer.