Changeset 525


Ignore:
Timestamp:
05/01/06 17:32:30 (14 years ago)
Author:
pjkersha
Message:

CertReq?.py: use write-olny attribute filePath instead of defunct
setFilePath method.

MyProxy?.py: use SimpleCA class call method to convert instance to a
dictionary.

Session.py: Session class modified addUser to allow for encrypted input.

SessionMgrIO.py: new AddUserReq? and AddUserResp? classes.

SimpleCA.py: added call method to convert instance to dictionary.

SimpleCAClient.py: added xmlSig* keys to validKeys - set which keywords
are allowed.

XMLSecDoc.py: corrected call to setCertFilePathList() ->
setCertFilePathList(). filePath and filePathList attributes need to be
sorted out. Ambiguous at the moment.

sessionMgr_services.py: Modified WSDL addUser interface to allow encryption
of input args.

Location:
security/trunk/python/NDG
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • security/trunk/python/NDG/CertReq.py

    r520 r525  
    5858                raise CertReqError("Input file path must be a valid string") 
    5959 
    60             self.setFilePath(filePath) 
     60            self.filePath = filePath 
    6161 
    6262        self.sCertReq = '' 
  • security/trunk/python/NDG/CredWallet.py

    r522 r525  
    527527            raise CredWalletError("No CA certificate has been set") 
    528528         
    529         attCert.setCertFilePathList(self.__caCertFilePath) 
     529        attCert.filePath = self.__caCertFilePath 
    530530 
    531531         
  • security/trunk/python/NDG/MyProxy.py

    r520 r525  
    254254                raise MyProxyError("Setting SimpleCA properties: %s" % e) 
    255255 
    256             prop['simpleCASrvProp'] = dict(simpleCA) 
     256            prop['simpleCASrvProp'] = simpleCA() 
    257257 
    258258        else: 
  • security/trunk/python/NDG/Session.py

    r522 r525  
    395395 
    396396    #_________________________________________________________________________ 
    397     def addUser(self, 
    398                 userName, 
    399                 userPassPhrase, 
     397    def addUser(self,  
    400398                caConfigFilePath=None, 
    401                 caPassPhrase=None): 
    402          
    403         """Register a new user with NDG" 
    404  
    405         userName:                       user name for new user 
    406          
    407         userPassPhrase:                 selected passphrase for new user 
     399                caPassPhrase=None, 
     400                encrAddUserReqTxt=None,  
     401                **addUserReqKeys):         
     402        """Register a new user with NDG data centre 
     403         
     404        addUser([caConfigFilePath, ]|[, caPassPhrase][, encrAddUserReqTxt] 
     405                |[, userName=u, pPhrase=p]) 
     406 
     407        returns XML formatted response message 
    408408         
    409409        caConfigFilePath|caPassPhrase:  pass phrase for SimpleCA's 
     
    416416                                        SimpleCA is instantiated on the local 
    417417                                        machine.  If SimpleCA WS is called no 
    418                                         passphrase is required.""" 
     418                                        passphrase is required. 
     419                                         
     420        encrAddUserReqTxt:              encrypted XML containing credentials  
     421                                        for new user: username, pass-phrase 
     422        addUserReqKeys:                 use as alternative to  
     423                                        encrAddUserReqTxt keyword - pass in  
     424                                        username and pass-phrase for new user  
     425                                        unencrypted as keywords username 
     426                                        and pPhrase respectively.""" 
     427         
     428 
     429        if encrAddUserReqTxt is not None: 
     430            if not isinstance(encrAddUserReqTxt, basestring): 
     431                raise SessionMgrError(\ 
     432                    "Encrypted new user credentials must be a string") 
     433                                        
     434            # Decrypt and parse 
     435            try: 
     436                # UserReq object returned behaves like a dictionary 
     437                addUserReqKeys = AddUserReq(encrXMLtxt=encrAddUserReqTxt, 
     438                                    encrPriKeyFilePath=self.__prop['keyFile'], 
     439                                    encrPriKeyPwd=self.__prop['keyPPhrase']) 
     440            except Exception, e: 
     441                raise SessionMgrError(\ 
     442                    "Error decrypting user credentials: %s" % e) 
    419443         
    420444        try: 
    421445            # Add new user certificate to MyProxy Repository 
    422             user = self.__myPx.addUser(userName, 
    423                                        userPassPhrase, 
     446            user = self.__myPx.addUser(addUserReqKeys['userName'], 
     447                                       addUserReqKeys['pPhrase'], 
    424448                                       caConfigFilePath=caConfigFilePath, 
    425449                                       caPassPhrase=caPassPhrase, 
     
    427451             
    428452            # Add to user database 
    429             self.__credRepos.addUser(userName, user['dn']) 
     453            self.__credRepos.addUser(addUserReqKeys['userName'], user['dn']) 
    430454             
    431455        except Exception, e: 
     
    433457 
    434458 
     459        return str(AddUserResp(errMsg='')) 
     460     
     461     
    435462    #_________________________________________________________________________         
    436     def connect(self, encrUserCredTxt=None, **connectReqKeys):         
     463    def connect(self, encrConnectReqTxt=None, **connectReqKeys):         
    437464        """Create and return a new user session or connect to an existing 
    438465        one: 
    439466 
    440         connect([webClnt=True/False][, encrUserCreds] 
    441                 [, userName=u, passPhrase=p]|[, proxyCert=px]|[, sessID=id]) 
     467        connect([webClnt=True/False][, encrConnectReqTxt] 
     468                |[, userName=u, pPhrase=p]|[, proxyCert=px]|[, sessID=id]) 
    442469 
    443470        webClnt:                If True, allocate a user session with a  
     
    447474                                certificate only.  The client is then  
    448475                                responsible for Credential Wallet management. 
    449         encrUserCred:           encrypted XML containing user credentials - 
     476        encrConnectReqTxt:      encrypted XML containing user credentials - 
    450477                                user name, pass-phrase or proxy cert etc 
    451         connectReqKeys:           username and pass-phrase or the proxy  
     478        connectReqKeys:         username and pass-phrase or the proxy  
    452479                                certificate or browser session ID  
    453480                                corresponding to an existing session""" 
    454481         
    455482 
    456         if encrUserCredTxt is not None: 
    457             if not isinstance(encrUserCredTxt, basestring): 
     483        if encrConnectReqTxt is not None: 
     484            if not isinstance(encrConnectReqTxt, basestring): 
    458485                raise SessionMgrError(\ 
    459486                    "Encrypted user credentials must be a string") 
     
    461488            # Decrypt and parse 
    462489            try: 
    463                 # UserCred object returned behaves like a dictionary 
    464                 connectReqKeys = ConnectReq(encrXMLtxt=encrUserCredTxt, 
     490                # Connect request object returned behaves like a dictionary 
     491                connectReqKeys = ConnectReq(encrXMLtxt=encrConnectReqTxt, 
    465492                                    encrPriKeyFilePath=self.__prop['keyFile'], 
    466493                                    encrPriKeyPwd=self.__prop['keyPPhrase']) 
     
    472499            if 'encrCert' in connectReqKeys: 
    473500                # ConnectResp class expects the public key to be in a file 
     501                # - Copy public key string content into a temporary file 
    474502                try: 
    475503                    fdPubKeyTmp = NamedTemporaryFile() 
     
    484512            else: 
    485513                clntPubKeyFilePath = None 
    486                                             
     514 
     515                                           
    487516        if 'sessID' in connectReqKeys or 'proxyCert' in connectReqKeys: 
    488517            # Connect to an existing session identified by a session ID or  
     
    503532                sessCookie = self.__createUserSession(proxyCert) 
    504533                try: 
     534                    # Encrypt response if a client public key is available 
    505535                    connectResp = ConnectResp(sessCookie=sessCookie, 
    506536                                      encrPubKeyFilePath=clntPubKeyFilePath, 
     
    525555             
    526556                 
    527  
    528  
    529  
    530  
     557    #_________________________________________________________________________         
    531558    def __delegateProxy(self, userName, passPhrase): 
    532559        """Delegate a proxy certificate ID from input user credentials""" 
     
    548575            raise SessionMgrError("Delegating from MyProxy: %s" % e) 
    549576         
    550  
    551  
    552          
     577        
     578    #_________________________________________________________________________         
    553579    def __createUserSession(self, proxyCert): 
    554580        """Create a new user session from input user credentials        
     
    599625 
    600626 
    601  
    602  
     627    #_________________________________________________________________________         
    603628    def __connect2UserSession(self, **idKeys): 
    604629        """Connect to an existing session by providing a valid session ID 
  • security/trunk/python/NDG/SessionMgrIO.py

    r522 r525  
    280280     
    281281 
    282  
    283282#_____________________________________________________________________________ 
    284283class ConnectReqError(EncrXMLError):     
     
    323322                        raise ConnectReqError(\ 
    324323                            "Credentials must be: \"userName\" and " + \ 
    325                             "\"pPhrase\"or \"proxyCert\" or \"sessID\"") 
     324                            "\"pPhrase\" or \"proxyCert\" or \"sessID\"") 
    326325                 
    327326        # Allow user credentials to be access like dictionary keys 
     
    363362         
    364363                                
    365         # Check for encrypted text or valid credentials 
    366         if 'proxyCert' not in encrXMLkeys and 'sessCookie' not in encrXMLkeys:             
     364        # Check for valid output credentials 
     365        if 'proxyCert' not in encrXMLkeys or 'sessCookie' not in encrXMLkeys:             
    367366 
    368367            # XML tags input as keywords expected - check minimum  
     
    370369            raise ConnectRespError(\ 
    371370                            "Connect response must contain: \"proxyCert\"" + \ 
    372                             "\"sessCookie\" keywords") 
     371                            "or \"sessCookie\" keywords") 
     372         
     373         
     374        # Allow user credentials to be access like dictionary keys 
     375        EncrXML.__init__(self, **encrXMLkeys) 
     376     
     377 
     378#_____________________________________________________________________________ 
     379class AddUserReqError(EncrXMLError):     
     380    """Exception handling for NDG SessionMgr WS connect request class.""" 
     381    pass 
     382 
     383 
     384#_____________________________________________________________________________ 
     385class AddUserReq(EncrXML): 
     386    """For client to Session Manager WS addUser(): formats inputs for request 
     387    into XML and encrypts. 
     388     
     389    For Session Manager enables decryption of result""" 
     390     
     391    # Override base class class variables 
     392    xmlTagTmpl = {  "userName":    "", 
     393                    "pPhrase":     "", 
     394                    "encrCert":    ""    } 
     395                         
     396 
     397    def __init__(self, **encrXMLkeys): 
     398        """XML for sending encrypted credentials to Session Manager connect 
     399         
     400        encrXMLkeys:    keywords for EncrXML super-class.  If XML tags are  
     401                        input as keywords then 'userName' and 'pPhrase'  
     402                        must be input as the bare minimum required for  
     403                        SessionMgr addUser request. 
     404        """ 
     405         
     406                                
     407        # Check for encrypted text or valid credentials 
     408        if 'encrXMLtxt' not in encrXMLkeys and 'xmlTxt' not in encrXMLkeys:             
     409 
     410            # XML tags input as keywords expected - check minimum  
     411            # required are present for SessionMgr connect request 
     412            if 'userName' not in encrXMLkeys and 'pPhrase' not in encrXMLkeys: 
     413                raise AddUserReqError(\ 
     414                    "Credentials must include \"userName\" and \"pPhrase\"") 
     415                 
     416        # Allow user credentials to be access like dictionary keys 
     417        EncrXML.__init__(self, **encrXMLkeys) 
     418      
     419 
     420 
     421 
     422#_____________________________________________________________________________ 
     423class AddUserRespError(EncrXMLError):     
     424    """Exception handling for NDG SessionMgr WS addUser response class.""" 
     425    pass 
     426 
     427 
     428#_____________________________________________________________________________ 
     429class AddUserResp(EncrXML): 
     430    """For client to Session Manager WS connect(): formats addUser response 
     431    from SessionMgr. 
     432     
     433    For client, enables decryption of response""" 
     434     
     435    # Override base class class variables 
     436    xmlTagTmpl = {"errMsg": ""} 
     437                         
     438 
     439    def __init__(self, **encrXMLkeys): 
     440        """XML for sending encrypted credentials to Session Manager addUser 
     441         
     442        encrXMLkeys:    keywords for EncrXML super-class.  If XML tags are  
     443                        input as keywords then 'proxyCert' or 'sessCookie'  
     444                        must be set. 
     445                         
     446                        Note: If no public key of the SessionMgr client is 
     447                        available, noEncrypt=True must be set otherwise an 
     448                        exception will be raised. 
     449        """ 
     450         
     451                                
     452        # Check valid output 
     453        if 'errMsg' not in encrXMLkeys:             
     454 
     455            # XML tags input as keywords expected - check minimum  
     456            # required are present for SessionMgr connect response 
     457            raise AddUserRespError(\ 
     458                "AddUser response must contain \"errMsg\" keyword") 
    373459         
    374460         
  • security/trunk/python/NDG/SimpleCA.py

    r518 r525  
    120120 
    121121 
     122    def __call__(self): 
     123        """Return file properties dictionary""" 
     124        return self.__prop 
     125 
     126 
    122127    #_________________________________________________________________________ 
    123128    # dict derived methods ... 
     
    126131    def __delitem__(self, key): 
    127132        "SimpleCA Properties keys cannot be removed"         
    128         raise SimpleCAError('Keys cannot be deleted from '+self.__class__.__name__) 
     133        raise SimpleCAError('Keys cannot be deleted from ' + \ 
     134                            self.__class__.__name__) 
    129135 
    130136 
    131137    def __getitem__(self, key): 
    132  
    133         self.__class__.__name__ + """ behaves as data dictionary of SimpleCA file 
    134         properties""" 
     138        self.__class__.__name__ + """ behaves as data dictionary of SimpleCA  
     139        file properties""" 
    135140         
    136141        # Check input key 
     
    142147         
    143148    def clear(self): 
    144         raise SimpleCAError("Data cannot be cleared from "+self.__class__.__name__) 
     149        raise SimpleCAError("Data cannot be cleared from " + \ 
     150                            self.__class__.__name__) 
    145151     
    146152    def keys(self): 
     
    158164    # 'in' operator 
    159165    def __contains__(self, key): 
    160         return key in self.__tags 
     166        return key in self.__prop 
    161167 
    162168    #_________________________________________________________________________ 
     
    275281                                        to a file containing the certificate 
    276282                                        request 
    277         configFilePath|caPassPhrase:    pass phrase for SimpleCA's certificate. 
     283        configFilePath|caPassPhrase:    pass phrase for SimpleCA's  
     284                                        certificate. 
    278285                                        Set via file or direct string input 
    279286                                        respectively.  Set here to override 
     
    338345                                               self.__prop['certTmpDir']) 
    339346 
    340         gridCaSignCmd = [self.__prop['signExe'], 
    341                          '-in',  certReqFilePath, 
    342                          '-out', certFile.name, 
    343                          '-enddate', self.__dtCertExpiry.strftime("%y%m%d%H%M%SZ"), 
    344                          '-passin', 'stdin', 
    345                          '-force'] 
     347        gridCaSignCmd = [ 
     348            self.__prop['signExe'], 
     349            '-in',  certReqFilePath, 
     350            '-out', certFile.name, 
     351            '-enddate', self.__dtCertExpiry.strftime("%y%m%d%H%M%SZ"), 
     352            '-passin', 'stdin', 
     353            '-force'] 
    346354 
    347355        errMsgTmpl = "Signing certificate request: %s" 
     
    388396 
    389397        except Exception, e: 
    390             raise SimpleCAError("Reading output certificate file \"%s\": %s" %\ 
    391                                 (certFile.name, e)) 
     398            raise SimpleCAError( 
     399            "Reading output certificate file \"%s\": %s" % (certFile.name, e)) 
  • security/trunk/python/NDG/SimpleCAClient.py

    r520 r525  
    3737 
    3838    # valid configuration property keywords 
    39     __validKeys = ['wsdl'] 
     39    __validKeys = ['wsdl', 
     40                   'xmlSigKeyFile', 
     41                   'xmlSigCertFile', 
     42                   'xmlSigCertPPhrase'] 
    4043     
    4144    def __init__(self, 
     
    180183 
    181184 
    182  
    183       
     185    #_________________________________________________________________________     
    184186    def initSrvPx(self): 
    185187        """Initialise service proxy""" 
     
    195197 
    196198 
    197  
    198  
     199    #_________________________________________________________________________ 
    199200    def reqCert(self, sCertReq=None, certReqFilePath=None, **prop):         
    200201        """Request certificate from SimpleCA WS""" 
  • security/trunk/python/NDG/XMLSecDoc.py

    r518 r525  
    9898        # document being checked 
    9999        if certFilePathList is not None: 
    100             self.setCertFilePathList(certFilePathList) 
     100            self.__setCertFilePathList(certFilePathList) 
    101101 
    102102 
     
    378378   
    379379    # Publish attribute as write only 
    380     filePath = property(fset=__setCertFilePathList, 
     380    filePathList = property(fset=__setCertFilePathList, 
    381381                        doc="File Path for XML document to apply security to") 
    382382 
     
    743743 
    744744        if certFilePathList is not None: 
    745             self.setCertFilePathList(certFilePathList) 
     745            self.__setCertFilePathList(certFilePathList) 
    746746 
    747747         
  • security/trunk/python/NDG/sessionMgr_services.py

    r522 r525  
    4242        """ 
    4343        @param: request to addUserRequest:: 
    44           _passPhrase: str 
    45           _userName: str 
     44          _addUserReq: str 
    4645 
    4746        @return: response from addUserResponse:: 
    48           _errMsg: str 
     47          _addUserResp: str 
    4948        """ 
    5049 
     
    114113class addUserRequest (ZSI.TCcompound.Struct):  
    115114    def __init__(self, name=None, ns=None): 
    116         self._userName = None 
    117         self._passPhrase = None 
    118  
    119         oname = None 
    120         if name: 
    121             oname = name 
    122             if ns: 
    123                 oname += ' xmlns="%s"' % ns 
    124             ZSI.TC.Struct.__init__(self, addUserRequest, [ZSI.TC.String(pname="userName",aname="_userName",optional=1),ZSI.TC.String(pname="passPhrase",aname="_passPhrase",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
     115        self._addUserReq = None 
     116 
     117        oname = None 
     118        if name: 
     119            oname = name 
     120            if ns: 
     121                oname += ' xmlns="%s"' % ns 
     122            ZSI.TC.Struct.__init__(self, addUserRequest, [ZSI.TC.String(pname="addUserReq",aname="_addUserReq",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
    125123 
    126124class addUserRequestWrapper(addUserRequest): 
     
    133131class addUserResponse (ZSI.TCcompound.Struct):  
    134132    def __init__(self, name=None, ns=None): 
    135         self._errMsg = None 
    136  
    137         oname = None 
    138         if name: 
    139             oname = name 
    140             if ns: 
    141                 oname += ' xmlns="%s"' % ns 
    142             ZSI.TC.Struct.__init__(self, addUserResponse, [ZSI.TC.String(pname="errMsg",aname="_errMsg",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
     133        self._addUserResp = None 
     134 
     135        oname = None 
     136        if name: 
     137            oname = name 
     138            if ns: 
     139                oname += ' xmlns="%s"' % ns 
     140            ZSI.TC.Struct.__init__(self, addUserResponse, [ZSI.TC.String(pname="addUserResp",aname="_addUserResp",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
    143141 
    144142class addUserResponseWrapper(addUserResponse): 
  • security/trunk/python/NDG/sessionMgr_services_server.py

    r523 r525  
    3636         
    3737         
     38    #_________________________________________________________________________ 
    3839    def soap_addUser(self, ps): 
     40        """SOAP interface to NDG Session Manager WS addUser.""" 
     41        
     42        if debug: 
     43            import pdb 
     44            pdb.set_trace() 
     45 
    3946        # input vals in request object 
    40         args = ps.Parse( addUserRequestWrapper() ) 
     47        reqArgs = ps.Parse(addUserRequestWrapper) 
     48        encrReqTxt = str(reqArgs._addUserReq) 
    4149 
    4250        # assign return values to response object 
    4351        response = addUserResponseWrapper() 
     52         
     53         
     54        # Request a connection from the Session Manager 
     55        try: 
     56            response._addUserResp = self.__sessionMgr.addUser(\ 
     57                                            encrAddUserReqTxt=encrReqTxt)    
     58        except Exception, e: 
     59            resp._addUserResp = str(addUserResp(errMsg=str(e))) 
    4460 
    4561        return response 
    4662 
    4763 
     64    #_________________________________________________________________________ 
    4865    def soap_connect(self, ps): 
    4966        """SOAP interface to NDG Session Manager WS connect.""" 
     
    5572        # input vals in request object 
    5673        reqArgs = ps.Parse(connectRequestWrapper) 
    57         encrUserCredTxt = str(reqArgs._connectReq) 
    58          
     74        encrReqTxt = str(reqArgs._connectReq) 
     75 
    5976        # assign return values to response object 
    6077        response = connectResponseWrapper() 
    61         response._errMsg = '' 
    6278         
    6379         
     
    6581        try: 
    6682            response._connectResp = self.__sessionMgr.connect(\ 
    67                                             encrUserCredTxt=encrUserCredTxt)    
     83                                            encrConnectReqTxt=encrReqTxt)    
    6884        except Exception, e: 
    6985            resp._connectResp = str(ConnectResp(errMsg=str(e))) 
     
    7288 
    7389 
     90    #_________________________________________________________________________ 
    7491    def soap_reqAuthorisation(self, ps): 
    7592        # input vals in request object 
Note: See TracChangeset for help on using the changeset viewer.