Changeset 1970


Ignore:
Timestamp:
08/01/07 16:45:40 (13 years ago)
Author:
pjkersha
Message:

All tests working.

python/ndg.security.test/ndg/security/test/AttCert/AttCertTest.py: added new tests test6aDictSet and
test6aDictGet to test setitem and getitem dictionary methods.

python/ndg.security.common/ndg/security/common/AttCert.py:

items are read-only. This is applied to idct type items returned from AttCert?.setitem

  • fixes to setitem to ensure exceptions are raised if an attempt is made to validity time or role

names via the 'validity' or 'attributes' keywords.

  • fix to parse so that it is possible to parse a cert. where the not before and not after times are set to

. In this case the corresponding to datetimes will be reset to None also.

Location:
TI12-security/trunk/python
Files:
2 edited

Legend:

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

    r1967 r1970  
    1515import os 
    1616import re 
     17import copy 
    1718 
    1819# XML Parsing 
     
    3435    """Exception handling for NDG Attribute Certificate class.""" 
    3536 
    36          
     37#_____________________________________________________________________________ 
     38class AttCertReadOnlyDict(dict): 
     39    def __init__(self, inputDict): 
     40        super(AttCertReadOnlyDict, self).__init__(inputDict) 
     41         
     42    def __setitem__(self, key, item): 
     43        raise KeyError, "Items are read-only in this dictionary" 
     44        
    3745#_____________________________________________________________________________ 
    3846class _MetaAttCert(type): 
     
    117125        self.__holderDN = None 
    118126 
    119  
     127        self.setProvenance(provenance) 
     128         
    120129        # Certificate life time interval in seconds 
    121130        self.__lifetime = lifetime 
     
    154163 
    155164            # key recognised 
    156             return self.__dat[key]                 
     165            item = self.__dat[key]                 
    157166 
    158167        elif key in self.__dat['validity']: 
     
    160169            # Allow indexing via validity keys - a shorthand way of  
    161170            # referencing for convenience 
    162             return self.__dat['validity'][key] 
     171            item = self.__dat['validity'][key] 
    163172 
    164173        elif key in self.__dat['attributes']: 
     
    166175            # Allow indexing via attributes keys - a shorthand way of  
    167176            # referencing for convenience 
    168             return self.__dat['attributes'][key] 
     177            item = self.__dat['attributes'][key] 
    169178 
    170179        else: 
    171180            # key not recognised as a short or long name version 
    172             raise AttCertError, 'Key "%s" not recognised for %s' % \ 
     181            raise KeyError, 'Key "%s" not recognised for %s' % \ 
    173182                               (key, self.__class__.__name__) 
     183 
     184        if isinstance(item, dict): 
     185            return AttCertReadOnlyDict(item) 
     186        else: 
     187            return item 
    174188 
    175189 
     
    191205            if key is "provenance": 
    192206                self.setProvenance(item) 
    193              
    194             self.__dat[key] = item 
    195  
    196         elif key in self.__dat['attributes']: 
    197  
    198             # Allow indexing via acInfo keys - a shorthand way of referencing 
    199             # for convenience 
    200             return self.__dat['attributes'][key] 
     207                 
     208            elif key == "validity": 
     209                raise KeyError, "'%s': use setValidityTime method " % \ 
     210                    key + "to set notBefore/notAfter times" 
     211                             
     212            elif key == "attributes": 
     213                raise KeyError, "'%s': use addRoles method to " % \ 
     214                    key + "set list of role attributes"             
     215            else:     
     216                self.__dat[key] = item 
     217 
     218        elif key in self.__dat['attributes'] or \ 
     219             key in self.__dat['attributes']['roleSet']: 
     220 
     221            # To complex to allow direct setting here 
     222            raise KeyError, "'%s': use addRoles method to " % key + \ 
     223                            "set list of roles"             
    201224 
    202225        elif key in self.__dat['validity']: 
    203226            # Prevent setting of notBefore/notAfter - restrict to method 
    204227            # setValidityTime 
    205             raise AttCertError, \ 
    206                 "Use setValidityTime method to set notBefore/notAfter times"             
     228            raise KeyError, "'%s': use setValidityTime method " % key + \ 
     229                            "to set notBefore/notAfter times"             
    207230        else: 
    208231            # key not recognised as a short or long name version 
    209             raise AttCertError, 'Key "%s" not recognised for %s' % \ 
     232            raise KeyError, "Key '%s' not recognised for %s'" % \ 
    210233                               (key, self.__class__.__name__) 
    211234         
     
    213236    #_________________________________________________________________________     
    214237    def __eq__(self, attCert): 
    215         """Return true if all elements are the same""" 
    216          
     238        """Return true if all elements are the same"""         
    217239        try: 
    218240            return min([self.__dat[key] == attCert[key] \ 
     
    236258    #_________________________________________________________________________     
    237259    def copy(self): 
    238  
    239         import copy 
    240260        return copy.copy(self) 
    241261 
     
    551571        if self.__dat['validity']['notBefore'] is None: 
    552572            raise AttCertError, "<notBefore> tag not found in \"%s\"" % \ 
    553                                self.filePath 
    554  
    555         # Update datetime object equivalent 
    556         self.__dtNotBefore = self.timeStr2datetime(\ 
     573                                                               self.filePath 
     574        elif self.__dat['validity']['notBefore'] == '': 
     575             
     576            # Allow empty string setting but re-initialise corresponding  
     577            # datetime value 
     578            self.__dtNotBefore = None 
     579        else: 
     580            # Update datetime object equivalent 
     581            self.__dtNotBefore = self.timeStr2datetime(\ 
    557582                                        self.__dat['validity']['notBefore']) 
    558583 
     
    564589            raise AttCertError, '<notAfter> tag not found in "%s"' % \ 
    565590                               self.filePath 
    566  
    567         # Update datetime object equivalent 
    568         self.__dtNotAfter = self.timeStr2datetime(\ 
     591        elif self.__dat['validity']['notBefore'] == '': 
     592             
     593            # Allow empty string setting but re-initialise corresponding  
     594            # datetime value 
     595            self.__dtNotAfter = None 
     596        else: 
     597            # Update datetime object equivalent 
     598            self.__dtNotAfter = self.timeStr2datetime(\ 
    569599                                        self.__dat['validity']['notAfter']) 
    570600 
     
    908938            except InvalidSignature, e: 
    909939                 if raiseExcep: 
    910                      raise AttCertError, \ 
    911                                 "Attribute Certificate signature:" + str(e) 
     940                     raise AttCertError, e 
    912941                 else: 
    913942                     return False 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttCert/AttCertTest.py

    r1967 r1970  
    7878        print "test6AddRoles: " + ', '.join(self.attCert.getRoles()) 
    7979 
     80  
     81    def test6aDictSet(self): 
     82        'test6aDictSet: test __setitem__' 
     83        self.attCert['issuer'] = '/O=NDG/OU=BADC/CN=Attribute Authority' 
     84        self.attCert['issuerName'] = 'BADC' 
     85        self.attCert['holder'] = '/O=NDG/OU=BADC/CN=pjkershaw' 
     86         
     87        try: 
     88            self.attCert['validity'] = 'invalid' 
     89        except KeyError, e: 
     90            print "test6aDictSet: PASSED - %s" % e 
     91             
     92        try: 
     93            self.attCert['attributes'] = 'roleSet' 
     94        except KeyError, e: 
     95            print "test6aDictSet: PASSED - %s" % e 
     96             
     97        try: 
     98            self.attCert['attributes']['roleSet'] = ['role1', 'role2'] 
     99        except KeyError, e: 
     100            print "test6aDictSet: PASSED - %s" % e 
     101 
     102    def test6bDictGet(self): 
     103        'test6bDictGet: test __getitem__' 
     104        print "test6bDictGet ..." 
     105        print self.test2SetProvenance() 
     106        print self.test4SetValidityTime() 
     107        print self.test6AddRoles() 
     108        print self.test6aDictSet() 
     109        print self.attCert['issuer'] 
     110        print self.attCert['holder'] 
     111        print self.attCert['validity'] 
     112        print self.attCert['attributes'] 
     113        print self.attCert['attributes']['roleSet']  
     114 
    80115    def test7CreateXML(self): 
    81116        'test7CreateXML: check for correct formatted string' 
     
    87122     
    88123    def test8Parse(self): 
    89         '''test8Parse: parse an XML document'''             
     124        '''test8Parse: parse an XML document'''   
    90125        self.attCert.parse(self.attCert.createXML()) 
    91  
     126        print 'test8Parse:\n\n' + repr(self.attCert) 
    92127 
    93128    def test9Sign(self):  
     
    96131        self.test5SetDefaultValidityTime() 
    97132        self.test6AddRoles() 
    98              
     133        self.test6aDictSet()     
     134         
    99135        self.attCert.filePath = self.cfg['test9Sign']['filepath'] 
    100136        self.attCert.certFilePathList=self.cfg['test9Sign']['certfile'] 
    101137        self.attCert.signingKeyFilePath=self.cfg['test9Sign']['keyfile'] 
    102138         
    103         self.attCert.signingKeyPwd = self.cfg['test9Sign'].get('keypwd') or\ 
     139        try: 
     140            self.attCert.signingKeyPwd=self.cfg['test9Sign'].get('keypwd') or\ 
    104141            getpass.getpass(prompt="\ntest9Sign private key password: ") 
     142        except KeyboardInterrupt: 
     143            self.fail("test9Sign: Aborting test") 
     144            return 
    105145         
    106146        self.attCert.applyEnvelopedSignature() 
Note: See TracChangeset for help on using the changeset viewer.