Changeset 418


Ignore:
Timestamp:
03/06/05 17:40:31 (14 years ago)
Author:
pjkersha
Message:

UserCredentials?: added ProxyServer? class to wrap MyProxy? functionality,
added to CredRepos? class

X509: added parse method to X509Cert class - enables instantiation from
certificate string text. The method uses M2Crypto.BIO.MemoryBuffer? and
M2Crypto.load_cert_bio().

login.cgi: made into class Login and integrated ProxyServer? class.

Location:
security/trunk/python
Files:
2 added
4 edited

Legend:

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

    r417 r418  
    1919import pdb 
    2020 
     21# Create unique name for certificate temporary file 
     22import tempfile 
     23 
     24from X509 import * 
    2125from AttrCert import * 
    2226 
     
    2428 
    2529 
    26 class UsrCredentialsError(Exception): 
     30#_____________________________________________________________________________ 
     31class UserCredentialsError(Exception): 
    2732     
    2833    """Exception handling for NDG User Credentials classes.""" 
     
    3641 
    3742 
    38 class UsrSession: 
     43#_____________________________________________________________________________ 
     44class UserSession: 
    3945    """Created when a user logins into NDG holds user's details""" 
    4046 
    41     def __init__(self, usrName, proxyCert=None): 
     47    def __init__(self, proxyCert): 
    4248        """Create a new user session""" 
    4349 
    4450        try: 
    45             if not isintance(usrName, basestring): 
    46                 raise UsrCredentialsError("User name must be a valisd string") 
    47         except Exception, e: 
    48             raise UsrCredentialsError("Input username: " + str(e)) 
    49  
    50         self.__usrName = usrName 
    51          
    52         self.proxyCert = proxyCert 
    53         self.credWallet = CredWallet(usrName) 
     51            if not isintance(proxyCert, basestring): 
     52                raise UserCredentialsError(\ 
     53                    "Proxy Certificate must be input as a string") 
     54        except Exception, e: 
     55            raise UserCredentialsError("Input proxy certificate: " + str(e)) 
     56 
     57 
     58        self.__proxyCert = X509Cert() 
     59        self.__proxyCert.parse(proxyCert) 
     60         
     61        # Get the distinguished name from the proxy certificate 
     62        dn = self.__proxyCert.getDN().serialise() 
     63         
     64        # Make a new credentials wallet - this holds authorisation 
     65        # credentials for the current session 
     66        self.credWallet = CredWallet(dn) 
     67 
     68 
     69 
     70 
     71#_____________________________________________________________________________ 
     72class ProxyServer: 
     73    """Wrapper to MyProxy server interface - use to serve proxy certificate 
     74    from user sign on""" 
     75 
     76     
     77    def __init__(self): 
     78        """Initialise proxy certificate generation settings""" 
     79        self.__getProxyCertExe = \ 
     80            "/usr/local/globus-3.9.5/bin/myproxy-get-delegation" 
     81        self.__proxyCertLifetime = 8 # hours 
     82        self.__proxySrvrHostname = 'localhost' 
     83        self.__proxyCertArgsTmpl = "-S -s %s -l %s -t %s -o %s > /dev/null" 
     84 
     85 
     86    def getProxyCert(self, userName, passPhrase): 
     87        """Generate a proxy certificate given the MyProxy username and 
     88        passphrase""" 
     89 
     90        # Temporary file to hold proxy certificate output 
     91        try: 
     92            (proxyCertFd, proxyCertFilePath) = tempfile.mkstemp() 
     93            os.close(proxyCertFd) 
     94 
     95            # Set up command + arguments 
     96            getProxyCertArgs = self.__proxyCertArgsTmpl % \ 
     97                                                   (self.__proxySrvrHostname, 
     98                                                    userName, 
     99                                                    self.__proxyCertLifetime, 
     100                                                    proxyCertFilePath) 
     101             
     102            getProxyCertCmd = "%s %s" % (getProxyCertExe, getProxyCertArgs) 
     103 
     104 
     105            # Calling proxy request command inputting passphrase from stdin         
     106            pipe = os.popen(getProxyCertCmd, "w") 
     107            pipe.write(passPhrase)     
     108            exitStat = pipe.close() 
     109            if exitStat is None: 
     110 
     111                # Return certificate as a string 
     112                proxyCertFile = open(proxyCertFilePath) 
     113                sProxyCert = proxyCertFile.read() 
     114                proxyCertFile.close() 
     115                remove(proxyCertFilePath) 
     116                 
     117                return sProxyCert 
     118            else: 
     119                raise UserCredentialsError(\ 
     120                        "Error getting proxy certificate for %s" % userName) 
     121         
     122        except Exception, e: 
     123            try: remove(proxyCertFilePath) 
     124            except: pass 
     125            raise UserCredentialsError(\ 
     126                "Error getting proxy certificate for %s: %s" % \ 
     127                                                            (userName, str(e)) 
     128 
     129 
    54130 
    55131         
     
    57133    """Volatile store of user credentials associated with a user session""" 
    58134 
    59     def __init__(self, usrName): 
    60         """Create store of user credentials for their current session""" 
    61  
    62         try: 
    63             if not isinstance(usrName, basestring): 
    64                 raise UsrCredentialsError("User name must be a valisd string") 
    65         except Exception, e: 
    66             raise UsrCredentialsError("Input username: " + str(e)) 
    67  
    68         self.__usrName = usrName 
     135    def __init__(self, dn, credReposDbURI=None): 
     136        """Create store of user credentials for their current session 
     137 
     138        dn:             users Distinguished Name 
     139        credReposDbURI: Credential Repository Database URI""" 
     140 
     141        try: 
     142            if not isinstance(dn, basestring): 
     143                raise UserCredentialsError("User DN must be a valid string") 
     144        except Exception, e: 
     145            raise UserCredentialsError("Input userName: " + str(e)) 
     146 
     147        self.__dn = dn 
    69148 
    70149         
     
    91170        try: 
    92171            if not isinstance(attrCert, AttrCert): 
    93                 raise UsrCredentialsError(\ 
     172                raise UserCredentialsError(\ 
    94173                    "Attribute Certificate must be an AttrCert type object") 
    95174                     
    96175        except Exception, e: 
    97             raise UsrCredentialsError(\ 
     176            raise UserCredentialsError(\ 
    98177                "Attribute Certificate input: %s" % str(e)) 
    99178 
     
    104183             
    105184        except AttrCertError, e: 
    106             raise UsrCredentialError("Adding Credential: " + str(e)) 
     185            raise UserCredentialError("Adding Credential: " + str(e)) 
    107186         
    108187        # Append to list 
     
    121200        perminent repository.""" 
    122201 
     202        # Filter out invalid certs unless auditCred flag is explicitly set to 
     203        # false 
    123204        if auditCred: self.audit() 
    124205 
    125  
    126          
     206        # Update the database 
     207        self.__credRepos.addCredentials(self.__dn, self.__attrCertList) 
     208 
     209 
     210 
     211 
     212#_____________________________________________________________________________ 
    127213class CredRepos: 
    128214    """Interface to Credentials Repository Database""" 
    129215 
    130216    def __init__(self, dbURI=None): 
    131         """Set the connection string for repository database 
     217        """Initialise Credentials Repository Database object. 
     218 
     219        If the connection string is set a connection will be made 
    132220 
    133221        dbURI: '<db type>://<username>:<passwd>:<hostname>/dbname""" 
    134222        self.__con = None 
    135         if dbURI: self.connect(dbURI) 
    136  
    137  
    138     def connect(self, dbURI): 
    139          
    140             try: 
    141                 self.__con = connectionForURI(dbURI) 
    142             except Exception, e: 
    143                 raise UserCredentialsError("Error connecting to database: " +\ 
    144                                            str(e)) 
    145  
    146             CredRepos.User._connection = self.__con 
    147             CredRepos.UserCredential._connection = self.__con 
    148              
    149  
    150     def addCredentials(userName, attrCertList): 
    151  
    152         # Check for duplicate attribute certificates against the new ones to 
    153         # be added  
    154         try: 
    155             userCred = self.User.selectBy(userName=userName) 
    156  
    157             if userCred.count() > 0: 
    158                 uniqAttrCertList = [] 
    159  
    160                 lambda def attrCertNotEq(attrCert): 
    161                      
    162                 uniqAttrCert = filter(attrCert.__eq__(),  
    163                 for attrCert in attrCertList: 
    164                     if min([attrCert == cred.attrCert for cred in userCred]): 
    165                         uniqAttrCertList.extend(attrCert) 
    166  
    167         else: 
    168             uniqAttrCertList = attrCertList 
    169                      
    170  
     223        if dbURI: self.setConnection(dbURI) 
     224 
     225 
     226    def setConnection(self, dbURI): 
     227        """Establish a database connection from a database URI 
     228         
     229        dbURI: '<db type>://<username>:<passwd>:<hostname>/dbname""" 
     230 
     231        try: 
     232            self.__con = connectionForURI(dbURI) 
     233        except Exception, e: 
     234            raise UserCredentialsError("Error connecting to database: " +\ 
     235                                       str(e)) 
     236 
     237        # Copy the connection object into the table classess 
     238        CredRepos.User._connection = self.__con 
     239        CredRepos.UserCredential._connection = self.__con 
     240             
     241 
     242    def auditCredentials(self): 
     243        """Check the attribute certificates held in the repository and delete 
     244        any that have expired""" 
     245 
     246        try: 
     247            credList = self.UserCredential.select() 
     248             
     249        except Exception, e: 
     250            raise UserCredentialsError("Selecting credentials for %s: %s", 
     251                                       userName, str(e)) 
     252 
     253        # Iterate through list of credentials deleting records where the 
     254        # certifcate is invalid 
     255        for cred in credList: 
     256            if not cred.attrCert.IsValid(): 
     257                self.UserCredential.delete(cred.id) 
     258                 
     259         
     260    def addCredentials(self, dn, attrCertList): 
     261        """Add new attribute certificates for a user.  The user must have 
     262        been previously registered in the repository 
     263 
     264        dn:             users Distinguished name 
     265        attrCertList:   list of attribute certificates""" 
     266         
     267        try: 
     268            userCred = self.UserCredential.selectBy(userName=userName) 
     269             
     270        except Exception, e: 
     271            raise UserCredentialsError("Selecting credentials for %s: %s", 
     272                                       dn, str(e)) 
     273 
     274 
     275        nUserCred = userCred.count() 
     276        if nUserCred == 0: 
     277            raise UserCredentialsError("User % is not registered" % dn) 
     278         
     279        # Carry out check? - filter out certs in db where a new cert 
     280        # supercedes it - i.e. expires later and has the same roles 
     281        # assigned - May be too complicated to implement 
     282        #uniqAttrCertList = [attrCert for attrCert in attrCertList \ 
     283        #    if min([attrCert == cred.attrCert for cred in userCred])] 
     284         
     285                 
    171286        # Update database with new entries 
    172         for attrCert in uniqAttrCertList: 
    173             self.UserCredentials(userName=userName, attrCert=attrCert) 
    174  
    175  
     287        for attrCert in attrCertList: 
     288            self.UserCredentials(dn=dn, attrCert=attrCert) 
     289 
     290 
     291 
     292    #_________________________________________________________________________ 
    176293    # Database tables defined using SQLObject derived classes 
    177294    # Nb. These are class variables of the CredRepos class 
     
    183300        _connection = None 
    184301 
    185         # Table field names are expected to be in Camel-case - initial letters 
    186         # of words are capitalized and the rest of the word is in lower case. 
    187         # Field names MUST match those in the database. 
    188         _style = MixedCaseStyle() 
    189  
    190         userName = StringCol(length=30) 
    191         firstName = StringCol(length=30) 
    192         lastName = StringCol(length=30) 
     302        # Force table name 
     303        _table = "User" 
     304 
     305        userName = StringCol(dbName='userName', length=30) 
     306        dn = StringCol(dbName='dn', length=128) 
    193307 
    194308 
     
    200314        _connection = None 
    201315 
    202         # Table field names are expected to be in Camel-case - initial letters 
    203         # of words are capitalized and the rest of the word is in lower case. 
    204         # Field names MUST match those in the database. 
    205         _style = MixedCaseStyle() 
    206  
    207          
    208         # User name field binds with usrCredential table 
    209         userName = StringCol(length=30) 
     316        # Force table name 
     317        _table = "UserCredential" 
     318 
     319         
     320        # User name field binds with UserCredential table 
     321        dn = StringCol(dbName='dn', length=128) 
    210322 
    211323        # Store complete attribute certificate text 
    212         attrCert = StringCol() 
    213  
    214      
    215 def crtTbl(dbURI): 
    216  
    217     con = connectionForURI(dbURI) 
    218      
    219          
    220     pdb.set_trace() 
    221     Session.createTable() 
    222         
    223 if __name__ == '__main__': 
    224  
    225     if len(sys.argv) > 1: 
    226         crtTbl(sys.argv[1]) 
    227      
     324        attrCert = StringCol(dbName='attrCert') 
  • security/trunk/python/NDG.BAK/X509.py

    r414 r418  
    4646        self.__m2CryptoX509 = None 
    4747        self.__dn = None 
     48 
     49 
     50    def __str__(self): 
     51        """Override to display current certificate file setting.""" 
     52 
     53        if self.__filePath is None: 
     54            return '<X509 Cert>' 
     55        else: 
     56            return '<X509 Cert \'%s\'>' % self.__filePath 
     57 
     58 
     59    def __repr__(self): 
     60        """Override to display current certificate file setting.""" 
     61         
     62        return str(self) 
    4863         
    4964 
    5065    def read(self, filePath=None): 
    51  
     66        """Read a certificate from file""" 
     67         
    5268        # Check for optional input certificate file path 
    5369        if filePath is not None: 
     
    6177        try: 
    6278            self.__m2CryptoX509 = M2Crypto.X509.load_cert(self.__filePath) 
    63         except: 
    64             raise X509CertError(\ 
    65                 "Error loading certificate \"" + self.__filePath + "\"") 
     79        except Exception, e: 
     80            raise X509CertError("Error loading certificate \""%s"\": %s" % \ 
     81                                (self.__filePath, str(e))) 
    6682 
    6783        # Get distinguished name 
     
    7086        # Instiantiate X500 Distinguished name 
    7187        self.__dn = X500DN(m2CryptoX509Name=m2CryptoX509Name) 
    72              
    73  
    74         return self 
    75  
    76  
    77     def __str__(self): 
    78         """Override to display current certificate file setting.""" 
    79  
    80         if self.__filePath is None: 
    81             return '<X509 Cert>' 
    82         else: 
    83             return '<X509 Cert \'%s\'>' % self.__filePath 
    84  
    85  
    86     def __repr__(self): 
    87         """Override to display current certificate file setting.""" 
    88          
    89         return str(self) 
    90              
     88 
     89 
     90    def parse(self, certTxt): 
     91        """Read a certificate input as a string""" 
     92 
     93        try: 
     94            certBIO = M2Crypto.BIO.MemoryBuffer(certTxt) 
     95            self.__m2CryptoX509 = M2Crypto.X509.load_cert_bio(certBIO) 
     96             
     97        except Exception, e: 
     98            raise X509CertError("Error loading certificate: %s" % str(e)) 
     99         
    91100         
    92101    def string(self, filePath=None): 
  • security/trunk/python/NDG/UserCredentials.py

    r417 r418  
    1919import pdb 
    2020 
     21# Create unique name for certificate temporary file 
     22import tempfile 
     23 
     24from X509 import * 
    2125from AttrCert import * 
    2226 
     
    2428 
    2529 
    26 class UsrCredentialsError(Exception): 
     30#_____________________________________________________________________________ 
     31class UserCredentialsError(Exception): 
    2732     
    2833    """Exception handling for NDG User Credentials classes.""" 
     
    3641 
    3742 
    38 class UsrSession: 
     43#_____________________________________________________________________________ 
     44class UserSession: 
    3945    """Created when a user logins into NDG holds user's details""" 
    4046 
    41     def __init__(self, usrName, proxyCert=None): 
     47    def __init__(self, proxyCert): 
    4248        """Create a new user session""" 
    4349 
    4450        try: 
    45             if not isintance(usrName, basestring): 
    46                 raise UsrCredentialsError("User name must be a valisd string") 
    47         except Exception, e: 
    48             raise UsrCredentialsError("Input username: " + str(e)) 
    49  
    50         self.__usrName = usrName 
    51          
    52         self.proxyCert = proxyCert 
    53         self.credWallet = CredWallet(usrName) 
     51            if not isintance(proxyCert, basestring): 
     52                raise UserCredentialsError(\ 
     53                    "Proxy Certificate must be input as a string") 
     54        except Exception, e: 
     55            raise UserCredentialsError("Input proxy certificate: " + str(e)) 
     56 
     57 
     58        self.__proxyCert = X509Cert() 
     59        self.__proxyCert.parse(proxyCert) 
     60         
     61        # Get the distinguished name from the proxy certificate 
     62        dn = self.__proxyCert.getDN().serialise() 
     63         
     64        # Make a new credentials wallet - this holds authorisation 
     65        # credentials for the current session 
     66        self.credWallet = CredWallet(dn) 
     67 
     68 
     69 
     70 
     71#_____________________________________________________________________________ 
     72class ProxyServer: 
     73    """Wrapper to MyProxy server interface - use to serve proxy certificate 
     74    from user sign on""" 
     75 
     76     
     77    def __init__(self): 
     78        """Initialise proxy certificate generation settings""" 
     79        self.__getProxyCertExe = \ 
     80            "/usr/local/globus-3.9.5/bin/myproxy-get-delegation" 
     81        self.__proxyCertLifetime = 8 # hours 
     82        self.__proxySrvrHostname = 'localhost' 
     83        self.__proxyCertArgsTmpl = "-S -s %s -l %s -t %s -o %s > /dev/null" 
     84 
     85 
     86    def getProxyCert(self, userName, passPhrase): 
     87        """Generate a proxy certificate given the MyProxy username and 
     88        passphrase""" 
     89 
     90        # Temporary file to hold proxy certificate output 
     91        try: 
     92            (proxyCertFd, proxyCertFilePath) = tempfile.mkstemp() 
     93            os.close(proxyCertFd) 
     94 
     95            # Set up command + arguments 
     96            getProxyCertArgs = self.__proxyCertArgsTmpl % \ 
     97                                                   (self.__proxySrvrHostname, 
     98                                                    userName, 
     99                                                    self.__proxyCertLifetime, 
     100                                                    proxyCertFilePath) 
     101             
     102            getProxyCertCmd = "%s %s" % (getProxyCertExe, getProxyCertArgs) 
     103 
     104 
     105            # Calling proxy request command inputting passphrase from stdin         
     106            pipe = os.popen(getProxyCertCmd, "w") 
     107            pipe.write(passPhrase)     
     108            exitStat = pipe.close() 
     109            if exitStat is None: 
     110 
     111                # Return certificate as a string 
     112                proxyCertFile = open(proxyCertFilePath) 
     113                sProxyCert = proxyCertFile.read() 
     114                proxyCertFile.close() 
     115                remove(proxyCertFilePath) 
     116                 
     117                return sProxyCert 
     118            else: 
     119                raise UserCredentialsError(\ 
     120                        "Error getting proxy certificate for %s" % userName) 
     121         
     122        except Exception, e: 
     123            try: remove(proxyCertFilePath) 
     124            except: pass 
     125            raise UserCredentialsError(\ 
     126                "Error getting proxy certificate for %s: %s" % \ 
     127                                                            (userName, str(e)) 
     128 
     129 
    54130 
    55131         
     
    57133    """Volatile store of user credentials associated with a user session""" 
    58134 
    59     def __init__(self, usrName): 
    60         """Create store of user credentials for their current session""" 
    61  
    62         try: 
    63             if not isinstance(usrName, basestring): 
    64                 raise UsrCredentialsError("User name must be a valisd string") 
    65         except Exception, e: 
    66             raise UsrCredentialsError("Input username: " + str(e)) 
    67  
    68         self.__usrName = usrName 
     135    def __init__(self, dn, credReposDbURI=None): 
     136        """Create store of user credentials for their current session 
     137 
     138        dn:             users Distinguished Name 
     139        credReposDbURI: Credential Repository Database URI""" 
     140 
     141        try: 
     142            if not isinstance(dn, basestring): 
     143                raise UserCredentialsError("User DN must be a valid string") 
     144        except Exception, e: 
     145            raise UserCredentialsError("Input userName: " + str(e)) 
     146 
     147        self.__dn = dn 
    69148 
    70149         
     
    91170        try: 
    92171            if not isinstance(attrCert, AttrCert): 
    93                 raise UsrCredentialsError(\ 
     172                raise UserCredentialsError(\ 
    94173                    "Attribute Certificate must be an AttrCert type object") 
    95174                     
    96175        except Exception, e: 
    97             raise UsrCredentialsError(\ 
     176            raise UserCredentialsError(\ 
    98177                "Attribute Certificate input: %s" % str(e)) 
    99178 
     
    104183             
    105184        except AttrCertError, e: 
    106             raise UsrCredentialError("Adding Credential: " + str(e)) 
     185            raise UserCredentialError("Adding Credential: " + str(e)) 
    107186         
    108187        # Append to list 
     
    121200        perminent repository.""" 
    122201 
     202        # Filter out invalid certs unless auditCred flag is explicitly set to 
     203        # false 
    123204        if auditCred: self.audit() 
    124205 
    125  
    126          
     206        # Update the database 
     207        self.__credRepos.addCredentials(self.__dn, self.__attrCertList) 
     208 
     209 
     210 
     211 
     212#_____________________________________________________________________________ 
    127213class CredRepos: 
    128214    """Interface to Credentials Repository Database""" 
    129215 
    130216    def __init__(self, dbURI=None): 
    131         """Set the connection string for repository database 
     217        """Initialise Credentials Repository Database object. 
     218 
     219        If the connection string is set a connection will be made 
    132220 
    133221        dbURI: '<db type>://<username>:<passwd>:<hostname>/dbname""" 
    134222        self.__con = None 
    135         if dbURI: self.connect(dbURI) 
    136  
    137  
    138     def connect(self, dbURI): 
    139          
    140             try: 
    141                 self.__con = connectionForURI(dbURI) 
    142             except Exception, e: 
    143                 raise UserCredentialsError("Error connecting to database: " +\ 
    144                                            str(e)) 
    145  
    146             CredRepos.User._connection = self.__con 
    147             CredRepos.UserCredential._connection = self.__con 
    148              
    149  
    150     def addCredentials(userName, attrCertList): 
    151  
    152         # Check for duplicate attribute certificates against the new ones to 
    153         # be added  
    154         try: 
    155             userCred = self.User.selectBy(userName=userName) 
    156  
    157             if userCred.count() > 0: 
    158                 uniqAttrCertList = [] 
    159  
    160                 lambda def attrCertNotEq(attrCert): 
    161                      
    162                 uniqAttrCert = filter(attrCert.__eq__(),  
    163                 for attrCert in attrCertList: 
    164                     if min([attrCert == cred.attrCert for cred in userCred]): 
    165                         uniqAttrCertList.extend(attrCert) 
    166  
    167         else: 
    168             uniqAttrCertList = attrCertList 
    169                      
    170  
     223        if dbURI: self.setConnection(dbURI) 
     224 
     225 
     226    def setConnection(self, dbURI): 
     227        """Establish a database connection from a database URI 
     228         
     229        dbURI: '<db type>://<username>:<passwd>:<hostname>/dbname""" 
     230 
     231        try: 
     232            self.__con = connectionForURI(dbURI) 
     233        except Exception, e: 
     234            raise UserCredentialsError("Error connecting to database: " +\ 
     235                                       str(e)) 
     236 
     237        # Copy the connection object into the table classess 
     238        CredRepos.User._connection = self.__con 
     239        CredRepos.UserCredential._connection = self.__con 
     240             
     241 
     242    def auditCredentials(self): 
     243        """Check the attribute certificates held in the repository and delete 
     244        any that have expired""" 
     245 
     246        try: 
     247            credList = self.UserCredential.select() 
     248             
     249        except Exception, e: 
     250            raise UserCredentialsError("Selecting credentials for %s: %s", 
     251                                       userName, str(e)) 
     252 
     253        # Iterate through list of credentials deleting records where the 
     254        # certifcate is invalid 
     255        for cred in credList: 
     256            if not cred.attrCert.IsValid(): 
     257                self.UserCredential.delete(cred.id) 
     258                 
     259         
     260    def addCredentials(self, dn, attrCertList): 
     261        """Add new attribute certificates for a user.  The user must have 
     262        been previously registered in the repository 
     263 
     264        dn:             users Distinguished name 
     265        attrCertList:   list of attribute certificates""" 
     266         
     267        try: 
     268            userCred = self.UserCredential.selectBy(userName=userName) 
     269             
     270        except Exception, e: 
     271            raise UserCredentialsError("Selecting credentials for %s: %s", 
     272                                       dn, str(e)) 
     273 
     274 
     275        nUserCred = userCred.count() 
     276        if nUserCred == 0: 
     277            raise UserCredentialsError("User % is not registered" % dn) 
     278         
     279        # Carry out check? - filter out certs in db where a new cert 
     280        # supercedes it - i.e. expires later and has the same roles 
     281        # assigned - May be too complicated to implement 
     282        #uniqAttrCertList = [attrCert for attrCert in attrCertList \ 
     283        #    if min([attrCert == cred.attrCert for cred in userCred])] 
     284         
     285                 
    171286        # Update database with new entries 
    172         for attrCert in uniqAttrCertList: 
    173             self.UserCredentials(userName=userName, attrCert=attrCert) 
    174  
    175  
     287        for attrCert in attrCertList: 
     288            self.UserCredentials(dn=dn, attrCert=attrCert) 
     289 
     290 
     291 
     292    #_________________________________________________________________________ 
    176293    # Database tables defined using SQLObject derived classes 
    177294    # Nb. These are class variables of the CredRepos class 
     
    183300        _connection = None 
    184301 
    185         # Table field names are expected to be in Camel-case - initial letters 
    186         # of words are capitalized and the rest of the word is in lower case. 
    187         # Field names MUST match those in the database. 
    188         _style = MixedCaseStyle() 
    189  
    190         userName = StringCol(length=30) 
    191         firstName = StringCol(length=30) 
    192         lastName = StringCol(length=30) 
     302        # Force table name 
     303        _table = "User" 
     304 
     305        userName = StringCol(dbName='userName', length=30) 
     306        dn = StringCol(dbName='dn', length=128) 
    193307 
    194308 
     
    200314        _connection = None 
    201315 
    202         # Table field names are expected to be in Camel-case - initial letters 
    203         # of words are capitalized and the rest of the word is in lower case. 
    204         # Field names MUST match those in the database. 
    205         _style = MixedCaseStyle() 
    206  
    207          
    208         # User name field binds with usrCredential table 
    209         userName = StringCol(length=30) 
     316        # Force table name 
     317        _table = "UserCredential" 
     318 
     319         
     320        # User name field binds with UserCredential table 
     321        dn = StringCol(dbName='dn', length=128) 
    210322 
    211323        # Store complete attribute certificate text 
    212         attrCert = StringCol() 
    213  
    214      
    215 def crtTbl(dbURI): 
    216  
    217     con = connectionForURI(dbURI) 
    218      
    219          
    220     pdb.set_trace() 
    221     Session.createTable() 
    222         
    223 if __name__ == '__main__': 
    224  
    225     if len(sys.argv) > 1: 
    226         crtTbl(sys.argv[1]) 
    227      
     324        attrCert = StringCol(dbName='attrCert') 
  • security/trunk/python/NDG/X509.py

    r414 r418  
    4646        self.__m2CryptoX509 = None 
    4747        self.__dn = None 
     48 
     49 
     50    def __str__(self): 
     51        """Override to display current certificate file setting.""" 
     52 
     53        if self.__filePath is None: 
     54            return '<X509 Cert>' 
     55        else: 
     56            return '<X509 Cert \'%s\'>' % self.__filePath 
     57 
     58 
     59    def __repr__(self): 
     60        """Override to display current certificate file setting.""" 
     61         
     62        return str(self) 
    4863         
    4964 
    5065    def read(self, filePath=None): 
    51  
     66        """Read a certificate from file""" 
     67         
    5268        # Check for optional input certificate file path 
    5369        if filePath is not None: 
     
    6177        try: 
    6278            self.__m2CryptoX509 = M2Crypto.X509.load_cert(self.__filePath) 
    63         except: 
    64             raise X509CertError(\ 
    65                 "Error loading certificate \"" + self.__filePath + "\"") 
     79        except Exception, e: 
     80            raise X509CertError("Error loading certificate \""%s"\": %s" % \ 
     81                                (self.__filePath, str(e))) 
    6682 
    6783        # Get distinguished name 
     
    7086        # Instiantiate X500 Distinguished name 
    7187        self.__dn = X500DN(m2CryptoX509Name=m2CryptoX509Name) 
    72              
    73  
    74         return self 
    75  
    76  
    77     def __str__(self): 
    78         """Override to display current certificate file setting.""" 
    79  
    80         if self.__filePath is None: 
    81             return '<X509 Cert>' 
    82         else: 
    83             return '<X509 Cert \'%s\'>' % self.__filePath 
    84  
    85  
    86     def __repr__(self): 
    87         """Override to display current certificate file setting.""" 
    88          
    89         return str(self) 
    90              
     88 
     89 
     90    def parse(self, certTxt): 
     91        """Read a certificate input as a string""" 
     92 
     93        try: 
     94            certBIO = M2Crypto.BIO.MemoryBuffer(certTxt) 
     95            self.__m2CryptoX509 = M2Crypto.X509.load_cert_bio(certBIO) 
     96             
     97        except Exception, e: 
     98            raise X509CertError("Error loading certificate: %s" % str(e)) 
     99         
    91100         
    92101    def string(self, filePath=None): 
Note: See TracChangeset for help on using the changeset viewer.