Changeset 5953


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

Location:
TI12-security/trunk/python
Files:
4 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) 
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/myproxy/certificate_extapp/saml_attribute_assertion.py

    r5935 r5953  
    383383     
    384384import optparse 
    385 import sys 
    386385import os 
    387386 
  • TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/x509/test_x509.py

    r5560 r5953  
    5555         
    5656        if 'NDGSEC_X509_UNITTEST_DIR' not in os.environ: 
    57             os.environ['NDGSEC_X509_UNITTEST_DIR'] = \ 
    58                 os.path.abspath(os.path.dirname(__file__)) 
     57            os.environ['NDGSEC_X509_UNITTEST_DIR'] = os.path.abspath( 
     58                                                    os.path.dirname(__file__)) 
    5959         
    6060        configParser = SafeConfigParser() 
     
    6666        for section in configParser.sections(): 
    6767            self.cfg[section] = dict(configParser.items(section)) 
    68          
    69              
    70     def test1X509CertRead(self): 
    71         'test1X509CertRead: read in a cert from file' 
    72         print(self.test1X509CertRead.__doc__) 
    73         self.x509Cert = \ 
    74             X509CertRead(xpdVars(self.cfg['test1X509CertRead']['certfile'])) 
     68                     
     69    def test01X509CertRead(self): 
     70        # test01X509CertRead: read in a cert from file 
     71        self.x509Cert = X509CertRead( 
     72                            xpdVars(self.cfg['test01X509CertRead']['certfile'])) 
    7573        self.assert_(self.x509Cert) 
    7674 
    77     def test2X509CertAsPEM(self): 
    78         'test2X509CertAsPEM: display as a PEM format string' 
    79         self.test1X509CertRead() 
    80         print(self.test2X509CertAsPEM.__doc__) 
     75    def test02X509CertAsPEM(self): 
     76        # test02X509CertAsPEM: display as a PEM format string 
     77        self.test01X509CertRead() 
    8178        self.pemString = self.x509Cert.asPEM() 
    8279        print(self.pemString) 
    8380 
    8481 
    85     def test3X509CertParse(self): 
    86         'test3X509CertParse: parse from a PEM format string' 
    87         self.test2X509CertAsPEM() 
    88         print(self.test3X509CertParse.__doc__) 
     82    def test03X509CertParse(self): 
     83        # test03X509CertParse: parse from a PEM format string 
     84        self.test02X509CertAsPEM() 
    8985        self.assert_(X509CertParse(self.pemString)) 
    9086 
    9187 
    92     def test4GetDN(self): 
    93         'test4GetDN: extract distinguished name' 
    94         self.test1X509CertRead() 
    95         print(self.test4GetDN.__doc__) 
     88    def test04GetDN(self): 
     89        # test04GetDN: extract distinguished name 
     90        self.test01X509CertRead() 
    9691        self.dn = self.x509Cert.dn 
    9792        print(self.dn) 
    9893         
    99     def test5DN(self): 
    100         'test5DN: test X.500 Distinguished Name attributes' 
    101         print(self.test5DN.__doc__) 
    102         self.test4GetDN() 
     94    def test05DN(self): 
     95        # test05DN: test X.500 Distinguished Name attributes 
     96        self.test04GetDN() 
    10397        for item in self.dn.items(): 
    10498            print("%s=%s" % item) 
    10599         
    106     def test6DNCmp(self): 
    107         '''test6DNCmp: test X.500 Distinguished Name comparison 
    108         operators''' 
    109         print(self.test6DNCmp.__doc__) 
    110         self.test4GetDN() 
     100    def test06DNCmp(self): 
     101        # test06DNCmp: test X.500 Distinguished Name comparison operators 
     102        self.test04GetDN() 
    111103        testDN = X500DN(dn="/O=a/OU=b/CN=c") 
    112104 
     
    116108        self.assert_(not(self.dn != self.dn)) 
    117109             
    118     def test7X509Stack(self): 
    119         '''test7X509Stack: test X509Stack functionality''' 
    120         print(self.test7X509Stack.__doc__) 
    121         self.test1X509CertRead() 
     110    def test07x509Stack(self): 
     111        # test07X509Stack: test X509Stack functionality 
     112 
     113        self.test01X509CertRead() 
    122114        stack = X509Stack() 
    123115        self.assert_(len(stack)==0) 
     
    130122        self.assert_(len(stack)==0) 
    131123             
    132     def test8X509StackVerifyCertChain(self): 
    133         '''test8X509StackVerifyCertChain: testVerifyCertChain method''' 
    134         print(self.test8X509StackVerifyCertChain.__doc__) 
    135         self.test1X509CertRead() 
     124    def test08x509StackVerifyCertChain(self): 
     125        # test08X509StackVerifyCertChain: testVerifyCertChain method 
     126 
     127        self.test01X509CertRead() 
    136128        proxyCert=X509CertRead(xpdVars( 
    137                    self.cfg['test8X509StackVerifyCertChain']['proxycertfile'])) 
     129                   self.cfg['test08X509StackVerifyCertChain']['proxycertfile'])) 
    138130 
    139131        stack1 = X509Stack() 
     
    141133         
    142134        caCert=X509CertRead(xpdVars(\ 
    143                    self.cfg['test8X509StackVerifyCertChain']['cacertfile'])) 
     135                   self.cfg['test08X509StackVerifyCertChain']['cacertfile'])) 
    144136        caStack = X509Stack() 
    145137        caStack.push(caCert) 
     
    192184            pass 
    193185 
    194     def test9ExpiryTime(self): 
    195         self.test1X509CertRead() 
     186    def test09ExpiryTime(self): 
     187        self.test01X509CertRead() 
    196188         
    197189        # Set ridiculous bounds for expiry warning to ensure a warning message 
    198190        # is output 
    199         self.assert_(self.x509Cert.isValidTime( 
    200                                             nDaysBeforeExpiryLimit=36500),  
    201                                             "Certificate has expired") 
     191        self.assert_(self.x509Cert.isValidTime(nDaysBeforeExpiryLimit=36500),  
     192                                               "Certificate has expired") 
    202193        if not _warningMsg: 
    203194            self.fail("No warning message was set") 
     
    205196            print("PASSED - Got warning message from X509Cert." 
    206197                  "isValidTime: %s" % _warningMsg) 
    207                                         
     198 
     199 
     200class X500DNTestCase(BaseTestCase): 
     201    def test01VerifyParsingForFieldsContainingSlash(self): 
     202        # Slash is the delimiter but fields can contain a slash too - ensure 
     203        # correct parsing based on a regular expression which handles this 
     204        # scenario 
     205        dnStr = ("/C=UK/O=eScience/OU=CLRC/L=RAL/CN=host/localhost/" 
     206                 "emailAddress=somebody@somewhere.ac.uk") 
     207        dn = X500DN.fromString(dnStr) 
     208        self.assert_(str(dn)) 
     209        print(dn) 
     210                                       
    208211if __name__ == "__main__": 
    209212    unittest.main() 
  • TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/x509/x509Test.cfg

    r5465 r5953  
    88[setUp] 
    99 
    10 [test1X509CertRead] 
     10[test01X509CertRead] 
    1111certfile: $NDGSEC_TEST_CONFIG_DIR/pki/user.crt 
    1212 
    13 [test8X509StackVerifyCertChain] 
     13[test08X509StackVerifyCertChain] 
    1414certfile: $NDGSEC_TEST_CONFIG_DIR/pki/user.crt 
    1515proxycertfile: $NDGSEC_X509_UNITTEST_DIR/proxy.crt 
Note: See TracChangeset for help on using the changeset viewer.