Changeset 404


Ignore:
Timestamp:
29/04/05 16:46:12 (15 years ago)
Author:
pjkersha
Message:

AttrAuthority?: working version for creation of original and
mapped certificates. Check needed that user proxy cert DN matches
holder tag in external Attribute Certificate.

AttrCert?: added exception handler for isValid(). Call base class
xmlSigDoc.read method in AttrCert?.read to ensure libxml2.xmlDoc
is initialised.

xmlSigDoc: make sure libxml2.xmlDoc is created when file is read.
This ensures that isValidSig() will work OK.

Location:
security/trunk/python
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • security/trunk/python/NDG.BAK/AttAuthority.py

    r402 r404  
    2626# Attribute Certificate 
    2727from AttrCert import AttrCert 
     28from AttrCert import AttrCertError 
    2829 
    2930 
     
    3839    # Also, draws from Neil Bennett's ACServer class used in the Java 
    3940    # implementation of NDG Security 
    40  
    41     def __init__(self, 
    42                  propFilePath=None, 
    43                  mapConfigFilePath=None): 
     41     
     42     
     43    def __init__(self, propertiesFilePath): 
     44 
     45        # Initialise role mapping look-ups - These are set in readMapConfig() 
     46        self.__mapConfig = None 
     47        self.__role2Host = None 
     48        self.__roleMap = None 
     49 
    4450 
    4551        # Read Attribute Authority Properties file 
    46  
    47         # These parameters will be read from the properties file 
    48         # 
    49         # Hard code for now - P J Kershaw 26/04/05 
    50         self.__issuerName = 'BADC' 
    51         self.__issuerSerialNumber = 1 
    52  
    53         # Default to 2 days 
    54         self.__attrCertLifeTime = 86400 * 2 
    55  
    56          
    57         # Private key for attribute authority 
    58         self.__keyFilePath = './certs/attrAuth.pem' 
    59          
    60  
    61         # ... and Certificate 
    62         self.__certFilePath = './certs/attrAuth.crt' 
     52        # 
     53        # These parameters will be read from the properties file.  - Hard 
     54        # code for now 
     55        # 
     56        # P J Kershaw 26/04/05 
     57        self.readPropertiesFile(propertiesFilePath) 
     58         
     59 
     60        # Instantiate Certificate object 
    6361        self.__cert = X509Cert(self.__certFilePath) 
    6462        self.__cert.read() 
     
    6664        # Issuer details 
    6765        self.__issuer = self.__cert.getDN().serialise() 
    68         self.__issuerSerialNumber = issuerSerialNumber 
     66        self.__issuerSerialNumber = 999 
    6967         
    7068         
     
    7472 
    7573        # Server name and port for user/role details 
     74        # 
     75        # Need in Properties file?? 
     76        # P J Kershaw 29/04/05 
    7677        self.__usrRoleSrvr = None 
    7778        self.__usrRolePort = -1 
    78  
    79          
    80         # Map Configuration file 
    81         self.__mapConfigFilePath = './mapConfig.xml' 
    8279         
    8380         
     
    8885        # 
    8986        # P J Kershaw 27/04/05 
    90         credReposDir = "." 
    91         self.__credRepos = CredentialsRepository(credReposDir) 
    92  
    93  
    94         # --- End of Atrribute Authority Properties File Parameters --- 
     87        self.__credRepos=CredentialsRepository(self.__credReposDir) 
     88 
    9589 
    9690        # Read Map Configuration 
    9791        # 
    9892        # Read at creation time of new mapped certificate - see 
    99         # __createAttrCert() 
     93        # createAttrCert() 
    10094        # 
    10195        # P J Kershaw 27/04/05 
    10296        # self.readMapConfig() 
    103          
    104  
    105  
    106  
    107     def __createAttrCert(self, 
    108                          usrProxyCertFilePath, 
    109                          extAttrCertFilePath=None): 
     97 
     98         
     99 
     100 
     101    def createAttrCert(self, usrProxyCertFilePath, extAttrCertFilePath=None): 
    110102 
    111103        """Create a new Attribute Certificate 
     
    151143 
    152144        # Set validity time 
    153         attrCert.setValidity(lifeTime=self.__attrCertLifeTime) 
     145        attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
    154146 
    155147 
     
    157149        # user roles are found, the user is not registered 
    158150        usrRoles = self.getRoles(usrDN) 
    159         pdb.set_trace() 
    160         if usrRoles is not None: 
     151        if usrRoles: 
    161152             
    162153            # Set as an Original Certificate 
     
    178169            if extAttrCertFilePath is None: 
    179170                raise "User \"%s\" is not registered " % attrCert['holder'] +\ 
    180                       "and no external attribute certificate is avaliable " +\ 
     171                      "and no external attribute certificate is available " +\ 
    181172                      " to make a mapping" 
    182173 
     
    184175            # centre) 
    185176            extAttrCert = AttrCert(extAttrCertFilePath, 
    186                             trustedCertFilePath=self.__trustedCertFilePath) 
     177                            trustedCertFilePath=self.__caCertFilePath) 
    187178            extAttrCert.read() 
    188179 
    189180 
    190181            # Check it's valid and signed 
    191             if not extAttrCert.isValid(): 
    192                 raise "Invalid Remote Attribute Certificate \"%s\"" % \ 
    193                     extAttrCertFilePath            
     182            try: 
     183                extAttrCert.isValid(raiseExcep=True) 
     184                 
     185            except AttrCertError, excep: 
     186                pdb.set_trace() 
     187                raise "Invalid Remote Attribute Certificate \"%s\": %s" % \ 
     188                    (extAttrCertFilePath, excep)          
    194189 
    195190 
     
    204199            extRoles = extAttrCert.getRoles() 
    205200 
    206             # Parse Map Configuration to map from roles in 
    207             # external Attribute Certificate 
     201 
     202            # Parse Map Configuration to map from roles in external Attribute 
     203            # Certificate 
    208204            self.readMapConfig() 
    209205 
     206 
     207            # Map external roles to local ones 
     208            localRoles = self.mapRoles(extAttrCert['issuerName'], extRoles) 
     209            if not localRoles: 
     210                raise "No local roles mapped to the %s roles: %s" % \ 
     211                      (extAttrCert['issuerName'], str(extRoles)) 
     212 
     213            attrCert.addRoles(localRoles) 
     214             
    210215             
    211216            # Mark new Attribute Certificate as mapped 
    212             localAttrCert['provenance'] = 'mapped' 
     217            attrCert['provenance'] = 'mapped' 
    213218 
    214219               
    215220        # Digitally sign certificate using Attribute Authority's certificate 
    216221        # and private key 
    217         attrCert.sign() 
     222        attrCert.sign(signingKeyPwd=self.__keyPwd) 
    218223 
    219224 
     
    229234     
    230235 
     236 
     237    def readPropertiesFile(self, propertiesFilePath=None): 
     238 
     239        """Read the configuration properties for the Attribute Authority 
     240 
     241        propertiesFilePath: file path to properties file 
     242        """ 
     243 
     244        if propertiesFilePath is not None: 
     245            if not isinstance(propertiesFilePath, basestring): 
     246                raise "Input Properties file path " + \ 
     247                      "must be a valid string." 
     248             
     249            self.__propertiesFilePath = propertiesFilePath 
     250 
     251 
     252        tree = ElementTree.parse(self.__propertiesFilePath) 
     253        aaProp = tree.getroot() 
     254 
     255        # Copy properties from file as member variables 
     256        properties = dict([(elem.tag, elem.text) for elem in aaProp]) 
     257         
     258        self.__issuerName = properties['name'] 
     259        self.__issuerSerialNumber = properties['serialNumber'] 
     260        self.__keyFilePath = properties['keyFile'] 
     261        self.__keyPwd = properties['keyPwd'] 
     262        self.__certFilePath = properties['certFile'] 
     263        self.__caCertFilePath = properties['caCertFile'] 
     264        self.__attrCertLifeTime = float(properties['attrCertLifeTime']) 
     265        self.__mapConfigFilePath = properties['mapConfigFile'] 
     266        self.__credReposDir = properties['credReposDir'] 
     267 
     268         
     269         
    231270         
    232271    def readMapConfig(self, mapConfigFilePath=None): 
     
    253292        # Dictionaries: 
    254293        # 1) to hold all the data 
    255         self.__dat = {} 
     294        self.__mapConfig = {} 
    256295 
    257296        # ... look-up 
    258297        # 2) hosts corresponding to a given role and 
    259         # 3) role map for a given host name 
     298        # 3) roles of external data centre to this data centre 
    260299        self.__role2Host = {} 
    261         self.__host2RoleMap = {} 
     300        self.__roleMap = {} 
    262301         
    263302        for elem in trustedElem: 
     
    274313             
    275314            # Add signatureFile and list of roles 
    276             self.__dat[trustedHost] = \ 
     315            self.__mapConfig[trustedHost] = \ 
    277316                { 
    278317                    'signatureFile':    elem.findtext('signatureFile'), 
     
    281320 
    282321 
    283             for role in self.__dat[trustedHost]['role']: 
     322            for role in self.__mapConfig[trustedHost]['role']: 
    284323 
    285324                # Role to host look-up 
     
    293332 
    294333                # Host to role map look-up 
    295                 if self.__host2RoleMap.has_key(trustedHost): 
    296                     self.__host2RoleMap[trustedHost][role['remote']] = \ 
     334                if self.__roleMap.has_key(trustedHost): 
     335                    self.__roleMap[trustedHost][role['remote']] = \ 
    297336                                                                role['local']                    
    298337                else: 
    299                     self.__host2RoleMap[trustedHost] = \ 
     338                    self.__roleMap[trustedHost] = \ 
    300339                                                {role['remote']:role['local']} 
    301         pdb.set_trace() 
    302  
     340  
    303341 
    304342            
     
    312350        # 
    313351        # P J Kershaw 26/04/05 
    314         return True 
    315  
     352        #return True 
     353        return False 
    316354 
    317355 
     
    323361 
    324362        # Check user is registered 
    325         if not usrIsRegistered(usrDN): 
     363        if not self.usrIsRegistered(usrDN): 
    326364            return [] 
    327365         
     
    340378 
    341379        Returns None if no role not recognised""" 
    342          
     380 
     381        if not self.__role2Host: 
     382            raise "Roles to host look-up is not set - " + \ 
     383                  "ensure readMapConfig() has been called." 
     384        
    343385        if not self.__role2Host.has_key(role): 
    344386            return None 
    345387         
    346388        return self.__role2Host[role] 
     389 
     390 
     391 
     392     
     393    def mapRoles(self, host, extRoles): 
     394 
     395        """Map external roles to roles for this data centre 
     396 
     397        host:       name of external trusted data centre 
     398        extRoles:   list of external roles to map""" 
     399 
     400        if not self.__roleMap: 
     401            raise "Roles map is not set - ensure readMapConfig() " + \ 
     402                  "has been called." 
     403 
     404        # Check the host name is a trusted one recorded in the map 
     405        # configuration 
     406        if not self.__roleMap.has_key(host): 
     407            return [] 
     408 
     409         
     410        localRoles = [] 
     411        for extRole in extRoles: 
     412            # Add local roles, skipping if no mapping is found 
     413            try: 
     414                localRoles.append(self.__roleMap[host][extRole]) 
     415            except: 
     416                pass 
     417             
     418        return localRoles 
     419 
     420 
    347421 
    348422 
  • security/trunk/python/NDG.BAK/AttCert.py

    r402 r404  
    11"""NDG Attribute Certificate (Authentication -or Access- Token) 
    22 
    3 Nerc Data Grid Project 
     3NERC Data Grid Project 
    44 
    55P J Kershaw 05/04/05 
     
    1818import types 
    1919import os 
     20import re 
    2021 
    2122# XML signature module based on xmlsec and libxml2 
     
    2627 
    2728# Time module for use with validity times 
    28 import datetime 
     29from datetime import datetime 
     30from datetime import timedelta 
    2931 
    3032from X509 import X500DN 
    3133 
     34class AttrCertError(Exception): 
     35     
     36     def __init__(self, value): 
     37         self.value = value 
     38          
     39     def __str__(self): 
     40        return repr(self.value) 
     41     
    3242 
    3343class AttrCert(UserDict, xmlSigDoc): 
     
    115125            self.__lifeTime = lifeTime 
    116126         
     127        self.__dtNotBefore = None 
     128        self.__dtNotAfter = None 
     129 
     130 
     131 
     132         
     133    def __repr__(self): 
     134        """Override default behaviour to return internal dictionary content""" 
     135        return self.__dat 
    117136 
    118137                 
     
    349368                                [{'role': {'name': i}} for i in roleName]) 
    350369 
     370 
     371 
    351372         
    352373    def read(self, filePath=None, bRetStringBuf=False): 
     
    395416        if self.__dat['validity']['notBefore'] is None: 
    396417            raise "<notBefore> tag not found in \"%s\"" % filePath 
     418 
     419        # Update datetime object equivalent 
     420        self.__dtNotBefore = self.timeStr2datetime(\ 
     421                                        self.__dat['validity']['notBefore']) 
     422 
    397423         
    398424        self.__dat['validity']['notAfter'] = \ 
     
    401427        if self.__dat['validity']['notAfter'] is None: 
    402428            raise "<notAfter> tag not found in \"%s\"" % filePath 
     429 
     430 
     431        # Update datetime object equivalent 
     432        self.__dtNotAfter = self.timeStr2datetime(\ 
     433                                        self.__dat['validity']['notAfter']) 
    403434 
    404435 
     
    418449 
    419450 
     451        # Call base class read method to initialise libxml2 objects for 
     452        # signature validation 
     453        xmlSigDoc.read(self) 
     454 
     455 
     456 
     457 
    420458    def createXML(self): 
    421459 
     
    431469 
    432470        # Check for valid provenance 
    433         pdb.set_trace() 
    434471        if not self.isValidProvenance(): 
    435472            raise "Provenance must be set to \"" + \ 
     
    445482            <issuer>""" + self.__dat['issuer'] + """</issuer> 
    446483            <issuerName>""" + self.__dat['issuerName'] + """</issuerName> 
    447             <issuerSerialNumber>""" + self.__dat['issuerSerialNumber'] + \ 
     484            <issuerSerialNumber>""" + str(self.__dat['issuerSerialNumber']) +\ 
    448485            """</issuerSerialNumber>  
    449486        <validity> 
     
    460497                </role> 
    461498                """ for i in self.__dat['attributes']['roleSet']]) +\ 
    462             """ 
    463             </roleSet> 
     499            """</roleSet> 
    464500        </attributes> 
    465501        <provenance>""" + self.__dat['provenance'] + """</provenance>  
     
    472508 
    473509 
     510 
     511 
    474512    def setValidityTime(self, dtNotBefore=None, lifeTime=-1): 
    475513 
     
    481519 
    482520        if dtNotBefore is not None: 
    483             if not isinstance(dtNotBefore, datetime.datetime): 
     521            if not isinstance(dtNotBefore, datetime): 
    484522                raise "Input not before time must be datetime type" 
    485523             
    486             self.dtNotBefore = dtNotBefore 
     524            self.__dtNotBefore = dtNotBefore 
    487525             
    488526        else: 
    489527            # Use current UTC 
    490             self.dtNotBefore = datetime.utcnow() 
     528            self.__dtNotBefore = datetime.utcnow() 
    491529 
    492530        # Check for input certificate life time interval 
     
    495533 
    496534        try: 
    497             dtDeltaLifeTime = datetime.timedelta(self.__lifeTime) 
     535            # Make a time delta object with days set to 0 and seconds 
     536            # as 2nd argument 
     537            dtDeltaLifeTime = timedelta(0, self.__lifeTime) 
    498538        except: 
    499             raise "Invalid Certificate lifetime set", self.__lifeTime 
     539            raise "Invalid Certificate lifetime set %.3f" % self.__lifeTime 
    500540 
    501541         
    502542        # Add certificate lifetime to calculate not after time 
    503         dtNotAfter = dtNotBefore + dtDeltaLifeTime 
    504  
    505  
     543        self.__dtNotAfter = self.__dtNotBefore + dtDeltaLifeTime 
     544 
     545         
     546        self.__dat['validity']['notBefore'] = \ 
     547                                self.datetime2timeStr(self.__dtNotBefore) 
     548         
     549        self.__dat['validity']['notAfter'] = \ 
     550                                self.datetime2timeStr(self.__dtNotAfter) 
     551 
     552 
     553 
     554 
     555    def datetime2timeStr(self, dtVal): 
     556 
     557        """Convert a datetime object to a notBefore/notAfter time string""" 
     558 
     559        if not isinstance(dtVal, datetime): 
     560            raise "Invalid datetime object for conversion to string" 
     561         
    506562        # Convert from 1-12 to 0-11 month format used in XML file 
    507         lNotBefore = list(dtNotBefore.utctimetuple()[0:6]) 
    508         lNotBefore[1] -= 1 
    509  
    510         lNotAfter = list(dtNotAfter.utctimetuple()[0:6]) 
    511         lNotAfter[1] -= 1 
    512          
    513         self.__dat['validity']['notBefore'] = ' '.join(lNotBefore)         
    514         self.__dat['validity']['notAfter'] = ' '.join(lNotAfter) 
    515  
    516  
     563        lDateTime = list(dtVal.utctimetuple()[0:6]) 
     564        lDateTime[1] -= 1 
     565 
     566        # Format as a single string with no commas or brackets 
     567        return ''.join(re.findall('[0-9 ]', str(lDateTime))) 
     568 
     569 
     570     
     571 
     572    def timeStr2datetime(self, sTime): 
     573 
     574        """Convert a notBefore/notAfter time string to a datetime object""" 
     575 
     576        # Convert from 0-11 to 1-12 month format used by datetime() 
     577        try: 
     578            lTime = [int(i) for i in sTime.split()] 
     579            lTime[1] += 1 
     580         
     581            return datetime(lTime[0], lTime[1], lTime[2], 
     582                            lTime[3], lTime[4], lTime[5]) 
     583        except: 
     584            raise "Error converting time string into datetime object" 
     585         
     586 
     587 
     588     
    517589    def isValidTime(self): 
    518590 
    519591        """Check Attribute Certificate for expiry""" 
    520592 
     593        if not isinstance(self.__dtNotBefore, datetime): 
     594            raise "notBefore datetime is not set" 
     595 
     596        if not isinstance(self.__dtNotAfter, datetime): 
     597            raise "notAfter datetime is not set" 
     598        
    521599        dtNow = datetime.utcnow() 
    522         return dtNow > self.dtNotBefore and dtNow < self.dtNotAfter 
     600        return dtNow > self.__dtNotBefore and dtNow < self.__dtNotAfter 
     601 
     602 
    523603         
    524604         
     
    529609 
    530610 
    531     def isValid(self): 
     611 
     612 
     613    def isValid(self, raiseExcep=False): 
    532614 
    533615        """Check Attribute Certificate is valid: 
    534616 
    535         - XML version is OK 
    536617        - Time validity is OK 
     618        - XML file version is OK 
     619        - valid provenance setting 
    537620        - Signature is valid. 
     621 
     622        raiseExcep: set to true to raise an exception if invalid instead 
     623                    of returning False.  Default is to set this flag to False 
    538624        """ 
    539625 
    540         # Carry out checks in turn - alter later to raise specific exception 
    541         # error messages? 
     626        # Carry out checks in turn - Specific exception error messages are 
     627        # raised if flag is set 
    542628        if not self.isValidTime(): 
     629            if raiseExcep: 
     630                raise AttrCertError("Attribute Certificate time is invalid") 
     631             
    543632            return False 
     633 
    544634         
    545635        if not self.isValidVersion(): 
     636            if raiseExcep: 
     637                raise AttrCertError('Attribute Certificate version is ' + \ 
     638                                  self.__dat['version'] + ' but version ' + \ 
     639                                  AttrCert.__version + ' expected') 
     640             
    546641            return False 
    547642 
     643 
    548644        if not self.isValidProvenance(): 
     645            if raiseExcep: 
     646                raise AttrCertError(\ 
     647                    "Attribute Certificate Provenance must be set to \"" + \ 
     648                    "\" or \"".join(AttrCert.__provenance) + "\"") 
     649                 
    549650            return False 
    550651 
     652 
    551653        if not self.isValidSig(): 
     654            if raiseExcep: 
     655                raise AttrCertError(\ 
     656                                "Attribute Certificate signature is invalid") 
     657             
    552658            return False 
    553659 
     
    555661        # All tests passed 
    556662        return True 
    557      
    558  
    559 # Test harness 
    560 def AttrCert_Test(): 
    561  
    562     # read in an existing cert 
    563     ac = NDG.AttrCert.AttrCert(filePath='attrCert.xml') 
    564     ac.read() 
    565  
    566     # Create text for o/p xml 
    567     xmlTxt = ac.create() 
    568  
    569     # sign 
    570     ac.sign(xmlTxt, 'certs/attrAuth.pem','certs/attrAuth.crt') 
    571  
    572     return ac 
    573  
    574      
    575 if __name__ == "__main__": 
    576  
    577     AttrCert_Test 
  • security/trunk/python/NDG.BAK/X509.py

    r402 r404  
    141141            self.deserialise(dn) 
    142142 
    143              
     143 
     144    def __repr__(self): 
     145        """Override default behaviour to return internal dictionary content""" 
     146        return self.__dat 
     147 
     148     
    144149    def __eq__(self, x500dn): 
    145150 
     
    230235            self.__separator = separator 
    231236 
    232         dn = separator.join(["%s=%s" % i for i in self.__dat.items()]) 
     237        dn = self.__separator.join(["%s=%s" % i for i in self.__dat.items()]) 
    233238        return dn 
    234239 
  • security/trunk/python/NDG.BAK/xmlSigDoc.py

    r400 r404  
    2626 
    2727 
    28 class xmlSigDoc(UserDict): 
     28class xmlSigDoc: 
    2929 
    3030    """Implements Digital Signature for XML Document.""" 
     
    4141 
    4242         
    43         UserDict.__init__(self) 
    44  
    4543        self.__filePath = None 
    4644        self.__signingKeyFilePath = None 
     
    144142        # Shutdown LibXML2 
    145143        libxml2.cleanupParser() 
    146        
    147          
    148     def __delitem__(self, key): 
    149  
    150         "Attribute Certificate keys cannot be removed" 
    151          
    152         raise 'Keys cannot be deleted from ' + xmlSigDoc.__name__ 
    153  
    154  
    155     def __getitem__(self, key): 
    156  
    157         xmlSigDoc.__name__ + """ behaves as data dictionary of Attribute 
    158         Certificate properties""" 
    159          
    160         # Check input key 
    161         if self.__dat.has_key(key): 
    162  
    163             # key recognised 
    164             return self.__dat[key]                 
    165  
    166  
    167     def __setitem__(self, key, item): 
    168          
    169         xmlSigDoc.__name__ + """ behaves as data dictionary of Attribute 
    170         Certificate properties""" 
    171  
    172         # Check input key 
    173         if self.__dat.has_key(key): 
    174  
    175             # key recognised 
    176             self.__dat[key] = item 
    177              
    178         else: 
    179             # key not recognised as a short or long name version 
    180             raise 'Key "' + key + '" not recognised for ' + xmlSigDoc.__name__ 
    181          
     144         
     145 
     146 
    182147 
    183148    def __libxml2ParseDoc(self, xmlTxt): 
     
    198163             
    199164        self.__bLibxml2DocFreed = False 
    200          
     165          
     166 
     167 
     168 
     169    def __libxml2ParseFile(self): 
     170 
     171        """Wrapper for libxml2.parseFile() - enables inclusion of flag to 
     172        indicate to __cleanup method if libxml2.freeDoc() needs to be 
     173        called.""" 
     174         
     175        if self.__libxml2Doc is not None and not self.__bLibxml2DocFreed: 
     176            self.__libxml2Doc.freeDoc() 
     177 
     178        # Create new doc and reset flag 
     179        self.__libxml2Doc = libxml2.parseFile(self.__filePath) 
     180         
     181        if self.__libxml2Doc is None or \ 
     182           self.__libxml2Doc.getRootElement() is None: 
     183            raise "Error parsing Attribute Certificate \"%s\"" % \ 
     184                  self.__filePath 
     185             
     186        self.__bLibxml2DocFreed = False 
     187        
     188 
     189 
    201190 
    202191    def __libxml2XPathNewContext(self): 
     
    219208 
    220209        self.__bLibxml2CtxtFreed = False 
     210 
     211 
    221212 
    222213 
     
    238229 
    239230 
     231 
     232 
    240233    def __xmlsecKeysMngr(self): 
    241234 
     
    254247        self.__bkeysMngrFreed = False 
    255248 
     249 
     250 
    256251          
    257252    def __cleanup(self): 
     
    281276 
    282277 
     278 
     279     
     280    def read(self, filePath=None): 
     281 
     282        """Read XML into a libxml2 document to allow signature validation""" 
     283 
     284        # Check for file path passed as input argument otherwise use member 
     285        # variable 
     286        if filePath is not None: 
     287            self.__filePath = filePath 
     288 
     289        self.__libxml2ParseFile() 
     290 
     291 
     292 
    283293    def write(self, filePath=None, bSign=False, **signArgs): 
    284294 
     
    342352 
    343353     
    344     def read(self, filePath=None): 
    345  
    346         """Read XML into a string buffer""" 
    347  
    348         # Check for file path passed as input argument otherwise use member 
    349         # variable 
    350         if filePath is not None: 
    351             self.__filePath = filePath 
    352  
    353         try: 
    354             # Open and read file into a string buffer 
    355             xmlFile = open(self.__filePath, "rb") 
    356             xmlTxt = xmlFile.read() 
    357              
    358         except IOError, ioError:            
    359             raise "Error reading \"" + ioError.filename + "\": " + \ 
    360                   ioError.strerror 
    361  
    362         return xmlTxt 
    363  
    364      
    365354    def sign(self, 
    366355             xmlTxt=None, 
    367356             signingKeyFilePath=None, 
     357             signingKeyPwd=None, 
    368358             signingCertFilePath=None): 
    369359         
     
    466456                                                    self.__signingKeyFilePath, 
    467457                                                    xmlsec.KeyDataFormatPem, 
    468                                                     None, None, None) 
     458                                                    signingKeyPwd, 
     459                                                    None, None) 
    469460        if self.__dSigCtxt.signKey is None: 
    470461            raise "Error loading private pem key from \"%s\"" % \ 
     
    515506                                """ 
    516507         
    517         if xmlTxt is None:            
    518             xmlTxt = self.readXML(filePath) 
     508        #if xmlTxt is None:            
     509        #    xmlTxt = self.createXML() 
    519510 
    520511 
     
    550541 
    551542 
    552         # Create libxml2 doc instance 
    553         self.__libxml2ParseDoc(xmlTxt) 
     543        # If xml text was input update libxml2 doc instance with it's content 
     544        if xmlTxt is not None: self.__libxml2ParseDoc(xmlTxt) 
    554545         
    555546 
  • security/trunk/python/NDG/AttAuthority.py

    r402 r404  
    2626# Attribute Certificate 
    2727from AttrCert import AttrCert 
     28from AttrCert import AttrCertError 
    2829 
    2930 
     
    3839    # Also, draws from Neil Bennett's ACServer class used in the Java 
    3940    # implementation of NDG Security 
    40  
    41     def __init__(self, 
    42                  propFilePath=None, 
    43                  mapConfigFilePath=None): 
     41     
     42     
     43    def __init__(self, propertiesFilePath): 
     44 
     45        # Initialise role mapping look-ups - These are set in readMapConfig() 
     46        self.__mapConfig = None 
     47        self.__role2Host = None 
     48        self.__roleMap = None 
     49 
    4450 
    4551        # Read Attribute Authority Properties file 
    46  
    47         # These parameters will be read from the properties file 
    48         # 
    49         # Hard code for now - P J Kershaw 26/04/05 
    50         self.__issuerName = 'BADC' 
    51         self.__issuerSerialNumber = 1 
    52  
    53         # Default to 2 days 
    54         self.__attrCertLifeTime = 86400 * 2 
    55  
    56          
    57         # Private key for attribute authority 
    58         self.__keyFilePath = './certs/attrAuth.pem' 
    59          
    60  
    61         # ... and Certificate 
    62         self.__certFilePath = './certs/attrAuth.crt' 
     52        # 
     53        # These parameters will be read from the properties file.  - Hard 
     54        # code for now 
     55        # 
     56        # P J Kershaw 26/04/05 
     57        self.readPropertiesFile(propertiesFilePath) 
     58         
     59 
     60        # Instantiate Certificate object 
    6361        self.__cert = X509Cert(self.__certFilePath) 
    6462        self.__cert.read() 
     
    6664        # Issuer details 
    6765        self.__issuer = self.__cert.getDN().serialise() 
    68         self.__issuerSerialNumber = issuerSerialNumber 
     66        self.__issuerSerialNumber = 999 
    6967         
    7068         
     
    7472 
    7573        # Server name and port for user/role details 
     74        # 
     75        # Need in Properties file?? 
     76        # P J Kershaw 29/04/05 
    7677        self.__usrRoleSrvr = None 
    7778        self.__usrRolePort = -1 
    78  
    79          
    80         # Map Configuration file 
    81         self.__mapConfigFilePath = './mapConfig.xml' 
    8279         
    8380         
     
    8885        # 
    8986        # P J Kershaw 27/04/05 
    90         credReposDir = "." 
    91         self.__credRepos = CredentialsRepository(credReposDir) 
    92  
    93  
    94         # --- End of Atrribute Authority Properties File Parameters --- 
     87        self.__credRepos=CredentialsRepository(self.__credReposDir) 
     88 
    9589 
    9690        # Read Map Configuration 
    9791        # 
    9892        # Read at creation time of new mapped certificate - see 
    99         # __createAttrCert() 
     93        # createAttrCert() 
    10094        # 
    10195        # P J Kershaw 27/04/05 
    10296        # self.readMapConfig() 
    103          
    104  
    105  
    106  
    107     def __createAttrCert(self, 
    108                          usrProxyCertFilePath, 
    109                          extAttrCertFilePath=None): 
     97 
     98         
     99 
     100 
     101    def createAttrCert(self, usrProxyCertFilePath, extAttrCertFilePath=None): 
    110102 
    111103        """Create a new Attribute Certificate 
     
    151143 
    152144        # Set validity time 
    153         attrCert.setValidity(lifeTime=self.__attrCertLifeTime) 
     145        attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
    154146 
    155147 
     
    157149        # user roles are found, the user is not registered 
    158150        usrRoles = self.getRoles(usrDN) 
    159         pdb.set_trace() 
    160         if usrRoles is not None: 
     151        if usrRoles: 
    161152             
    162153            # Set as an Original Certificate 
     
    178169            if extAttrCertFilePath is None: 
    179170                raise "User \"%s\" is not registered " % attrCert['holder'] +\ 
    180                       "and no external attribute certificate is avaliable " +\ 
     171                      "and no external attribute certificate is available " +\ 
    181172                      " to make a mapping" 
    182173 
     
    184175            # centre) 
    185176            extAttrCert = AttrCert(extAttrCertFilePath, 
    186                             trustedCertFilePath=self.__trustedCertFilePath) 
     177                            trustedCertFilePath=self.__caCertFilePath) 
    187178            extAttrCert.read() 
    188179 
    189180 
    190181            # Check it's valid and signed 
    191             if not extAttrCert.isValid(): 
    192                 raise "Invalid Remote Attribute Certificate \"%s\"" % \ 
    193                     extAttrCertFilePath            
     182            try: 
     183                extAttrCert.isValid(raiseExcep=True) 
     184                 
     185            except AttrCertError, excep: 
     186                pdb.set_trace() 
     187                raise "Invalid Remote Attribute Certificate \"%s\": %s" % \ 
     188                    (extAttrCertFilePath, excep)          
    194189 
    195190 
     
    204199            extRoles = extAttrCert.getRoles() 
    205200 
    206             # Parse Map Configuration to map from roles in 
    207             # external Attribute Certificate 
     201 
     202            # Parse Map Configuration to map from roles in external Attribute 
     203            # Certificate 
    208204            self.readMapConfig() 
    209205 
     206 
     207            # Map external roles to local ones 
     208            localRoles = self.mapRoles(extAttrCert['issuerName'], extRoles) 
     209            if not localRoles: 
     210                raise "No local roles mapped to the %s roles: %s" % \ 
     211                      (extAttrCert['issuerName'], str(extRoles)) 
     212 
     213            attrCert.addRoles(localRoles) 
     214             
    210215             
    211216            # Mark new Attribute Certificate as mapped 
    212             localAttrCert['provenance'] = 'mapped' 
     217            attrCert['provenance'] = 'mapped' 
    213218 
    214219               
    215220        # Digitally sign certificate using Attribute Authority's certificate 
    216221        # and private key 
    217         attrCert.sign() 
     222        attrCert.sign(signingKeyPwd=self.__keyPwd) 
    218223 
    219224 
     
    229234     
    230235 
     236 
     237    def readPropertiesFile(self, propertiesFilePath=None): 
     238 
     239        """Read the configuration properties for the Attribute Authority 
     240 
     241        propertiesFilePath: file path to properties file 
     242        """ 
     243 
     244        if propertiesFilePath is not None: 
     245            if not isinstance(propertiesFilePath, basestring): 
     246                raise "Input Properties file path " + \ 
     247                      "must be a valid string." 
     248             
     249            self.__propertiesFilePath = propertiesFilePath 
     250 
     251 
     252        tree = ElementTree.parse(self.__propertiesFilePath) 
     253        aaProp = tree.getroot() 
     254 
     255        # Copy properties from file as member variables 
     256        properties = dict([(elem.tag, elem.text) for elem in aaProp]) 
     257         
     258        self.__issuerName = properties['name'] 
     259        self.__issuerSerialNumber = properties['serialNumber'] 
     260        self.__keyFilePath = properties['keyFile'] 
     261        self.__keyPwd = properties['keyPwd'] 
     262        self.__certFilePath = properties['certFile'] 
     263        self.__caCertFilePath = properties['caCertFile'] 
     264        self.__attrCertLifeTime = float(properties['attrCertLifeTime']) 
     265        self.__mapConfigFilePath = properties['mapConfigFile'] 
     266        self.__credReposDir = properties['credReposDir'] 
     267 
     268         
     269         
    231270         
    232271    def readMapConfig(self, mapConfigFilePath=None): 
     
    253292        # Dictionaries: 
    254293        # 1) to hold all the data 
    255         self.__dat = {} 
     294        self.__mapConfig = {} 
    256295 
    257296        # ... look-up 
    258297        # 2) hosts corresponding to a given role and 
    259         # 3) role map for a given host name 
     298        # 3) roles of external data centre to this data centre 
    260299        self.__role2Host = {} 
    261         self.__host2RoleMap = {} 
     300        self.__roleMap = {} 
    262301         
    263302        for elem in trustedElem: 
     
    274313             
    275314            # Add signatureFile and list of roles 
    276             self.__dat[trustedHost] = \ 
     315            self.__mapConfig[trustedHost] = \ 
    277316                { 
    278317                    'signatureFile':    elem.findtext('signatureFile'), 
     
    281320 
    282321 
    283             for role in self.__dat[trustedHost]['role']: 
     322            for role in self.__mapConfig[trustedHost]['role']: 
    284323 
    285324                # Role to host look-up 
     
    293332 
    294333                # Host to role map look-up 
    295                 if self.__host2RoleMap.has_key(trustedHost): 
    296                     self.__host2RoleMap[trustedHost][role['remote']] = \ 
     334                if self.__roleMap.has_key(trustedHost): 
     335                    self.__roleMap[trustedHost][role['remote']] = \ 
    297336                                                                role['local']                    
    298337                else: 
    299                     self.__host2RoleMap[trustedHost] = \ 
     338                    self.__roleMap[trustedHost] = \ 
    300339                                                {role['remote']:role['local']} 
    301         pdb.set_trace() 
    302  
     340  
    303341 
    304342            
     
    312350        # 
    313351        # P J Kershaw 26/04/05 
    314         return True 
    315  
     352        #return True 
     353        return False 
    316354 
    317355 
     
    323361 
    324362        # Check user is registered 
    325         if not usrIsRegistered(usrDN): 
     363        if not self.usrIsRegistered(usrDN): 
    326364            return [] 
    327365         
     
    340378 
    341379        Returns None if no role not recognised""" 
    342          
     380 
     381        if not self.__role2Host: 
     382            raise "Roles to host look-up is not set - " + \ 
     383                  "ensure readMapConfig() has been called." 
     384        
    343385        if not self.__role2Host.has_key(role): 
    344386            return None 
    345387         
    346388        return self.__role2Host[role] 
     389 
     390 
     391 
     392     
     393    def mapRoles(self, host, extRoles): 
     394 
     395        """Map external roles to roles for this data centre 
     396 
     397        host:       name of external trusted data centre 
     398        extRoles:   list of external roles to map""" 
     399 
     400        if not self.__roleMap: 
     401            raise "Roles map is not set - ensure readMapConfig() " + \ 
     402                  "has been called." 
     403 
     404        # Check the host name is a trusted one recorded in the map 
     405        # configuration 
     406        if not self.__roleMap.has_key(host): 
     407            return [] 
     408 
     409         
     410        localRoles = [] 
     411        for extRole in extRoles: 
     412            # Add local roles, skipping if no mapping is found 
     413            try: 
     414                localRoles.append(self.__roleMap[host][extRole]) 
     415            except: 
     416                pass 
     417             
     418        return localRoles 
     419 
     420 
    347421 
    348422 
  • security/trunk/python/NDG/AttCert.py

    r402 r404  
    11"""NDG Attribute Certificate (Authentication -or Access- Token) 
    22 
    3 Nerc Data Grid Project 
     3NERC Data Grid Project 
    44 
    55P J Kershaw 05/04/05 
     
    1818import types 
    1919import os 
     20import re 
    2021 
    2122# XML signature module based on xmlsec and libxml2 
     
    2627 
    2728# Time module for use with validity times 
    28 import datetime 
     29from datetime import datetime 
     30from datetime import timedelta 
    2931 
    3032from X509 import X500DN 
    3133 
     34class AttrCertError(Exception): 
     35     
     36     def __init__(self, value): 
     37         self.value = value 
     38          
     39     def __str__(self): 
     40        return repr(self.value) 
     41     
    3242 
    3343class AttrCert(UserDict, xmlSigDoc): 
     
    115125            self.__lifeTime = lifeTime 
    116126         
     127        self.__dtNotBefore = None 
     128        self.__dtNotAfter = None 
     129 
     130 
     131 
     132         
     133    def __repr__(self): 
     134        """Override default behaviour to return internal dictionary content""" 
     135        return self.__dat 
    117136 
    118137                 
     
    349368                                [{'role': {'name': i}} for i in roleName]) 
    350369 
     370 
     371 
    351372         
    352373    def read(self, filePath=None, bRetStringBuf=False): 
     
    395416        if self.__dat['validity']['notBefore'] is None: 
    396417            raise "<notBefore> tag not found in \"%s\"" % filePath 
     418 
     419        # Update datetime object equivalent 
     420        self.__dtNotBefore = self.timeStr2datetime(\ 
     421                                        self.__dat['validity']['notBefore']) 
     422 
    397423         
    398424        self.__dat['validity']['notAfter'] = \ 
     
    401427        if self.__dat['validity']['notAfter'] is None: 
    402428            raise "<notAfter> tag not found in \"%s\"" % filePath 
     429 
     430 
     431        # Update datetime object equivalent 
     432        self.__dtNotAfter = self.timeStr2datetime(\ 
     433                                        self.__dat['validity']['notAfter']) 
    403434 
    404435 
     
    418449 
    419450 
     451        # Call base class read method to initialise libxml2 objects for 
     452        # signature validation 
     453        xmlSigDoc.read(self) 
     454 
     455 
     456 
     457 
    420458    def createXML(self): 
    421459 
     
    431469 
    432470        # Check for valid provenance 
    433         pdb.set_trace() 
    434471        if not self.isValidProvenance(): 
    435472            raise "Provenance must be set to \"" + \ 
     
    445482            <issuer>""" + self.__dat['issuer'] + """</issuer> 
    446483            <issuerName>""" + self.__dat['issuerName'] + """</issuerName> 
    447             <issuerSerialNumber>""" + self.__dat['issuerSerialNumber'] + \ 
     484            <issuerSerialNumber>""" + str(self.__dat['issuerSerialNumber']) +\ 
    448485            """</issuerSerialNumber>  
    449486        <validity> 
     
    460497                </role> 
    461498                """ for i in self.__dat['attributes']['roleSet']]) +\ 
    462             """ 
    463             </roleSet> 
     499            """</roleSet> 
    464500        </attributes> 
    465501        <provenance>""" + self.__dat['provenance'] + """</provenance>  
     
    472508 
    473509 
     510 
     511 
    474512    def setValidityTime(self, dtNotBefore=None, lifeTime=-1): 
    475513 
     
    481519 
    482520        if dtNotBefore is not None: 
    483             if not isinstance(dtNotBefore, datetime.datetime): 
     521            if not isinstance(dtNotBefore, datetime): 
    484522                raise "Input not before time must be datetime type" 
    485523             
    486             self.dtNotBefore = dtNotBefore 
     524            self.__dtNotBefore = dtNotBefore 
    487525             
    488526        else: 
    489527            # Use current UTC 
    490             self.dtNotBefore = datetime.utcnow() 
     528            self.__dtNotBefore = datetime.utcnow() 
    491529 
    492530        # Check for input certificate life time interval 
     
    495533 
    496534        try: 
    497             dtDeltaLifeTime = datetime.timedelta(self.__lifeTime) 
     535            # Make a time delta object with days set to 0 and seconds 
     536            # as 2nd argument 
     537            dtDeltaLifeTime = timedelta(0, self.__lifeTime) 
    498538        except: 
    499             raise "Invalid Certificate lifetime set", self.__lifeTime 
     539            raise "Invalid Certificate lifetime set %.3f" % self.__lifeTime 
    500540 
    501541         
    502542        # Add certificate lifetime to calculate not after time 
    503         dtNotAfter = dtNotBefore + dtDeltaLifeTime 
    504  
    505  
     543        self.__dtNotAfter = self.__dtNotBefore + dtDeltaLifeTime 
     544 
     545         
     546        self.__dat['validity']['notBefore'] = \ 
     547                                self.datetime2timeStr(self.__dtNotBefore) 
     548         
     549        self.__dat['validity']['notAfter'] = \ 
     550                                self.datetime2timeStr(self.__dtNotAfter) 
     551 
     552 
     553 
     554 
     555    def datetime2timeStr(self, dtVal): 
     556 
     557        """Convert a datetime object to a notBefore/notAfter time string""" 
     558 
     559        if not isinstance(dtVal, datetime): 
     560            raise "Invalid datetime object for conversion to string" 
     561         
    506562        # Convert from 1-12 to 0-11 month format used in XML file 
    507         lNotBefore = list(dtNotBefore.utctimetuple()[0:6]) 
    508         lNotBefore[1] -= 1 
    509  
    510         lNotAfter = list(dtNotAfter.utctimetuple()[0:6]) 
    511         lNotAfter[1] -= 1 
    512          
    513         self.__dat['validity']['notBefore'] = ' '.join(lNotBefore)         
    514         self.__dat['validity']['notAfter'] = ' '.join(lNotAfter) 
    515  
    516  
     563        lDateTime = list(dtVal.utctimetuple()[0:6]) 
     564        lDateTime[1] -= 1 
     565 
     566        # Format as a single string with no commas or brackets 
     567        return ''.join(re.findall('[0-9 ]', str(lDateTime))) 
     568 
     569 
     570     
     571 
     572    def timeStr2datetime(self, sTime): 
     573 
     574        """Convert a notBefore/notAfter time string to a datetime object""" 
     575 
     576        # Convert from 0-11 to 1-12 month format used by datetime() 
     577        try: 
     578            lTime = [int(i) for i in sTime.split()] 
     579            lTime[1] += 1 
     580         
     581            return datetime(lTime[0], lTime[1], lTime[2], 
     582                            lTime[3], lTime[4], lTime[5]) 
     583        except: 
     584            raise "Error converting time string into datetime object" 
     585         
     586 
     587 
     588     
    517589    def isValidTime(self): 
    518590 
    519591        """Check Attribute Certificate for expiry""" 
    520592 
     593        if not isinstance(self.__dtNotBefore, datetime): 
     594            raise "notBefore datetime is not set" 
     595 
     596        if not isinstance(self.__dtNotAfter, datetime): 
     597            raise "notAfter datetime is not set" 
     598        
    521599        dtNow = datetime.utcnow() 
    522         return dtNow > self.dtNotBefore and dtNow < self.dtNotAfter 
     600        return dtNow > self.__dtNotBefore and dtNow < self.__dtNotAfter 
     601 
     602 
    523603         
    524604         
     
    529609 
    530610 
    531     def isValid(self): 
     611 
     612 
     613    def isValid(self, raiseExcep=False): 
    532614 
    533615        """Check Attribute Certificate is valid: 
    534616 
    535         - XML version is OK 
    536617        - Time validity is OK 
     618        - XML file version is OK 
     619        - valid provenance setting 
    537620        - Signature is valid. 
     621 
     622        raiseExcep: set to true to raise an exception if invalid instead 
     623                    of returning False.  Default is to set this flag to False 
    538624        """ 
    539625 
    540         # Carry out checks in turn - alter later to raise specific exception 
    541         # error messages? 
     626        # Carry out checks in turn - Specific exception error messages are 
     627        # raised if flag is set 
    542628        if not self.isValidTime(): 
     629            if raiseExcep: 
     630                raise AttrCertError("Attribute Certificate time is invalid") 
     631             
    543632            return False 
     633 
    544634         
    545635        if not self.isValidVersion(): 
     636            if raiseExcep: 
     637                raise AttrCertError('Attribute Certificate version is ' + \ 
     638                                  self.__dat['version'] + ' but version ' + \ 
     639                                  AttrCert.__version + ' expected') 
     640             
    546641            return False 
    547642 
     643 
    548644        if not self.isValidProvenance(): 
     645            if raiseExcep: 
     646                raise AttrCertError(\ 
     647                    "Attribute Certificate Provenance must be set to \"" + \ 
     648                    "\" or \"".join(AttrCert.__provenance) + "\"") 
     649                 
    549650            return False 
    550651 
     652 
    551653        if not self.isValidSig(): 
     654            if raiseExcep: 
     655                raise AttrCertError(\ 
     656                                "Attribute Certificate signature is invalid") 
     657             
    552658            return False 
    553659 
     
    555661        # All tests passed 
    556662        return True 
    557      
    558  
    559 # Test harness 
    560 def AttrCert_Test(): 
    561  
    562     # read in an existing cert 
    563     ac = NDG.AttrCert.AttrCert(filePath='attrCert.xml') 
    564     ac.read() 
    565  
    566     # Create text for o/p xml 
    567     xmlTxt = ac.create() 
    568  
    569     # sign 
    570     ac.sign(xmlTxt, 'certs/attrAuth.pem','certs/attrAuth.crt') 
    571  
    572     return ac 
    573  
    574      
    575 if __name__ == "__main__": 
    576  
    577     AttrCert_Test 
  • security/trunk/python/NDG/X509.py

    r402 r404  
    141141            self.deserialise(dn) 
    142142 
    143              
     143 
     144    def __repr__(self): 
     145        """Override default behaviour to return internal dictionary content""" 
     146        return self.__dat 
     147 
     148     
    144149    def __eq__(self, x500dn): 
    145150 
     
    230235            self.__separator = separator 
    231236 
    232         dn = separator.join(["%s=%s" % i for i in self.__dat.items()]) 
     237        dn = self.__separator.join(["%s=%s" % i for i in self.__dat.items()]) 
    233238        return dn 
    234239 
  • security/trunk/python/NDG/XMLSecDoc.py

    r400 r404  
    2626 
    2727 
    28 class xmlSigDoc(UserDict): 
     28class xmlSigDoc: 
    2929 
    3030    """Implements Digital Signature for XML Document.""" 
     
    4141 
    4242         
    43         UserDict.__init__(self) 
    44  
    4543        self.__filePath = None 
    4644        self.__signingKeyFilePath = None 
     
    144142        # Shutdown LibXML2 
    145143        libxml2.cleanupParser() 
    146        
    147          
    148     def __delitem__(self, key): 
    149  
    150         "Attribute Certificate keys cannot be removed" 
    151          
    152         raise 'Keys cannot be deleted from ' + xmlSigDoc.__name__ 
    153  
    154  
    155     def __getitem__(self, key): 
    156  
    157         xmlSigDoc.__name__ + """ behaves as data dictionary of Attribute 
    158         Certificate properties""" 
    159          
    160         # Check input key 
    161         if self.__dat.has_key(key): 
    162  
    163             # key recognised 
    164             return self.__dat[key]                 
    165  
    166  
    167     def __setitem__(self, key, item): 
    168          
    169         xmlSigDoc.__name__ + """ behaves as data dictionary of Attribute 
    170         Certificate properties""" 
    171  
    172         # Check input key 
    173         if self.__dat.has_key(key): 
    174  
    175             # key recognised 
    176             self.__dat[key] = item 
    177              
    178         else: 
    179             # key not recognised as a short or long name version 
    180             raise 'Key "' + key + '" not recognised for ' + xmlSigDoc.__name__ 
    181          
     144         
     145 
     146 
    182147 
    183148    def __libxml2ParseDoc(self, xmlTxt): 
     
    198163             
    199164        self.__bLibxml2DocFreed = False 
    200          
     165          
     166 
     167 
     168 
     169    def __libxml2ParseFile(self): 
     170 
     171        """Wrapper for libxml2.parseFile() - enables inclusion of flag to 
     172        indicate to __cleanup method if libxml2.freeDoc() needs to be 
     173        called.""" 
     174         
     175        if self.__libxml2Doc is not None and not self.__bLibxml2DocFreed: 
     176            self.__libxml2Doc.freeDoc() 
     177 
     178        # Create new doc and reset flag 
     179        self.__libxml2Doc = libxml2.parseFile(self.__filePath) 
     180         
     181        if self.__libxml2Doc is None or \ 
     182           self.__libxml2Doc.getRootElement() is None: 
     183            raise "Error parsing Attribute Certificate \"%s\"" % \ 
     184                  self.__filePath 
     185             
     186        self.__bLibxml2DocFreed = False 
     187        
     188 
     189 
    201190 
    202191    def __libxml2XPathNewContext(self): 
     
    219208 
    220209        self.__bLibxml2CtxtFreed = False 
     210 
     211 
    221212 
    222213 
     
    238229 
    239230 
     231 
     232 
    240233    def __xmlsecKeysMngr(self): 
    241234 
     
    254247        self.__bkeysMngrFreed = False 
    255248 
     249 
     250 
    256251          
    257252    def __cleanup(self): 
     
    281276 
    282277 
     278 
     279     
     280    def read(self, filePath=None): 
     281 
     282        """Read XML into a libxml2 document to allow signature validation""" 
     283 
     284        # Check for file path passed as input argument otherwise use member 
     285        # variable 
     286        if filePath is not None: 
     287            self.__filePath = filePath 
     288 
     289        self.__libxml2ParseFile() 
     290 
     291 
     292 
    283293    def write(self, filePath=None, bSign=False, **signArgs): 
    284294 
     
    342352 
    343353     
    344     def read(self, filePath=None): 
    345  
    346         """Read XML into a string buffer""" 
    347  
    348         # Check for file path passed as input argument otherwise use member 
    349         # variable 
    350         if filePath is not None: 
    351             self.__filePath = filePath 
    352  
    353         try: 
    354             # Open and read file into a string buffer 
    355             xmlFile = open(self.__filePath, "rb") 
    356             xmlTxt = xmlFile.read() 
    357              
    358         except IOError, ioError:            
    359             raise "Error reading \"" + ioError.filename + "\": " + \ 
    360                   ioError.strerror 
    361  
    362         return xmlTxt 
    363  
    364      
    365354    def sign(self, 
    366355             xmlTxt=None, 
    367356             signingKeyFilePath=None, 
     357             signingKeyPwd=None, 
    368358             signingCertFilePath=None): 
    369359         
     
    466456                                                    self.__signingKeyFilePath, 
    467457                                                    xmlsec.KeyDataFormatPem, 
    468                                                     None, None, None) 
     458                                                    signingKeyPwd, 
     459                                                    None, None) 
    469460        if self.__dSigCtxt.signKey is None: 
    470461            raise "Error loading private pem key from \"%s\"" % \ 
     
    515506                                """ 
    516507         
    517         if xmlTxt is None:            
    518             xmlTxt = self.readXML(filePath) 
     508        #if xmlTxt is None:            
     509        #    xmlTxt = self.createXML() 
    519510 
    520511 
     
    550541 
    551542 
    552         # Create libxml2 doc instance 
    553         self.__libxml2ParseDoc(xmlTxt) 
     543        # If xml text was input update libxml2 doc instance with it's content 
     544        if xmlTxt is not None: self.__libxml2ParseDoc(xmlTxt) 
    554545         
    555546 
Note: See TracChangeset for help on using the changeset viewer.