Changeset 488


Ignore:
Timestamp:
28/09/05 17:26:07 (14 years ago)
Author:
pjkersha
Message:

Mods to connect interface - added input flags to specify connection to a
new session, and return session info as a cookie. New outputs include,
expiry date string for session and optional session cookie text.

Session.py: UserSession? class affected by the above - connect is changed
so that if an existing session exists for a given user then they connect
to this one rather than creating a fresh one.

Location:
security/trunk/python
Files:
5 edited

Legend:

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

    r485 r488  
    289289        behaviour""" 
    290290        if key == 'proxyCertTxt': 
    291             self.__proxyCertTxt = value 
     291            self.setProxyCert(value) 
    292292        else: 
    293293            raise CredWalletError('Key "%s" not recognised' % key) 
     
    299299        if key == 'proxyCertTxt': 
    300300            return self.__proxyCertTxt 
    301         elif key == 'credentials': 
     301         
     302        elif key == 'proxyCert': 
     303            return self.__proxyCert 
     304         
     305       elif key == 'credentials': 
    302306            return self.__credentials 
    303307        else: 
     
    317321     
    318322    def keys(self): 
    319         return ['proxyCertTxt'] 
     323        return ['proxyCertTxt', 'proxyCert', 'credentials'] 
    320324 
    321325 
     
    814818            if not self.__bMapFromTrustedHosts: 
    815819                raise CredWalletError("A list of trusted hosts has been " + \ 
    816                                       "but mapping from trusted hosts is " + \ 
    817                                       "set to disallowed") 
     820                                      "input but mapping from trusted " + \ 
     821                                      "hosts is set to disallowed") 
    818822             
    819823            if isinstance(extTrustedHostList, basestring): 
     
    12761280    """Session details - created when a user logs into NDG""" 
    12771281 
     1282    # Session ID 
    12781283    __sessIDlen = 128 
    12791284    __sessIDtagName = "Hash" 
     1285 
     1286    # Follow standard format for cookie expiry tag 
     1287    __sessCookieExpiryTagName = "expiry" 
     1288    __sessCookieExpiryFmt = "%a, %d-%b-%Y %H:%M:%S GMT" 
     1289 
    12801290 
    12811291    def __init__(self, *credWalletArgs, **credWalletKeys): 
     
    13531363        return self.__newSessID 
    13541364 
    1355      
    1356     def setSessionCookie(self, sessID): 
    1357         """Create cookie containing session ID""" 
    1358          
    1359         sessCookie = SimpleCookie() 
    1360         sessCookie[__sessIDtagName] = sessID 
    1361          
    1362         # Caller should set the cookie e.g. in a CGI script 
    1363         # print "Content-type: text/html" 
    1364         # print cookie.output() + os.linesep 
    1365         return sessCookie 
     1365 
     1366    def getExpiryStr(self): 
     1367        """Return session expiry date/time as would formatted for a cookie""" 
     1368 
     1369        try: 
     1370            # Proxy certificate's not after time determines the expiry 
     1371            dtNotAfter = self.credWallet['proxyCert'].getNotAfter() 
     1372 
     1373            return dtNotAfter.strftime(__sessCookieExpiryFmt) 
     1374        except Exception, e: 
     1375            UserSessionError("getExpiry: %s" % e) 
     1376             
     1377     
     1378    def createCookie(self, sessID=None, asString=True): 
     1379        """Create cookie containing session ID and expiry 
     1380 
     1381        sessID:     if no session ID is provided, return the latest one to 
     1382                    be allocated. 
     1383        asString:   Set to True to return the cookie as string text.  If 
     1384                    False, it is returned as a SimpleCookie type.""" 
     1385 
     1386        try: 
     1387            if sessID is None: 
     1388                sessID = self.__sessID[-1] 
     1389                 
     1390            sessCookie = SimpleCookie() 
     1391            sessCookie[__sessIDtagName] = sessID 
     1392 
     1393            # Use standard format for cookie expiry 
     1394            sessCookie[__sessCookieExpiryTagName] = self.getExpiryStr() 
     1395                                         
     1396             
     1397            # Caller should set the cookie e.g. in a CGI script 
     1398            # print "Content-type: text/html" 
     1399            # print cookie.output() + os.linesep 
     1400            if asString: 
     1401                return sessCookie.output() 
     1402            else: 
     1403                return sessCookie 
     1404             
     1405        except Exception, e: 
     1406            UserSessionError("createCookie: %s" % e) 
    13661407 
    13671408 
     
    15151556 
    15161557         
    1517     def connect(self, userName=None, passPhrase=None, sessID=None): 
     1558    def connect(self, 
     1559                userName=None, 
     1560                passPhrase=None, 
     1561                sessID=None, 
     1562                rtnAsCookie=False): 
    15181563         
    15191564        """Create and return a new user session or connect to an existing 
     
    15301575        if sessID is not None: 
    15311576            # Connect to session identified by session ID 
    1532             return self.__connect2UserSession(sessID=sessID) 
     1577            return self.__connect2UserSession(sessID) 
    15331578        else: 
    15341579            # Create a fresh session 
     
    15471592            raise SessionMgrError("Passphrase is null") 
    15481593 
     1594         
    15491595        try:             
    15501596            # Get a proxy certificate to represent users ID for the new 
     
    15561602 
    15571603        try:    
    1558             # Create a new user session using the new proxy certificate and 
    1559             # session ID 
    1560             userSess = UserSession(proxyCert, credRepos=self.__credRepos) 
    1561             newSessID = userSess.newSessID() 
    1562              
    1563             # Check for unique session ID 
    1564             for existingUserSess in self.__sessList: 
    1565                 if newSessID in existingUserSess['sessID']: 
    1566                     raise SessionMgrError(\ 
     1604            # Search for an existing session for the same user 
     1605            userSess = None 
     1606            for u in self.__sessList: 
     1607                if u.credWallet['proxyCert'].getDN()['CN'] == userName: 
     1608 
     1609                    # Existing session found 
     1610                    userSess = u 
     1611 
     1612                    # Replace it's Proxy Certificate with a more up to date 
     1613                    # one 
     1614                    userSess.setProxyCert(proxyCert) 
     1615                    break 
     1616                 
     1617 
     1618            if userSess is None: 
     1619                # Create a new user session using the new proxy certificate 
     1620                # and session ID 
     1621                userSess = UserSession(proxyCert, credRepos=self.__credRepos) 
     1622                 
     1623                newSessID = userSess.newSessID() 
     1624                 
     1625                # Check for unique session ID 
     1626                for existingUserSess in self.__sessList: 
     1627                    if newSessID in existingUserSess['sessID']: 
     1628                        raise SessionMgrError(\ 
    15671629                            "Session ID is not unique:\n\n %s" % newSessID) 
    15681630 
    1569             # Add new session to list                  
    1570             self.__sessList.append(userSess) 
     1631                # Add new session to list                  
     1632                self.__sessList.append(userSess) 
    15711633 
    15721634            return userSess 
     
    15781640 
    15791641 
    1580     def __connect2UserSession(self, sessID=None): 
     1642    def __connect2UserSession(self, sessID): 
    15811643        """Connect to an existing session by providing a valid session ID 
    15821644 
    1583         sessID: ID corresponding to session to connect to.  If none is set 
    1584                 the HTTP_COOKIE environment variable is checked for a 
    1585                 cookie containing an session ID""" 
    1586          
    1587         if sessID is None: 
    1588             # Check current environment for a cookie containing a session ID 
    1589             if not os.environ.has_key('HTTP_COOKIE'): 
    1590                 raise SessionMgrError("No session cookie has been set") 
    1591  
    1592             # Instantiate cookie object and get id 
    1593             cookie = SimpleCookie(os.environ['HTTP_COOKIE']) 
    1594             if not cookie.has_key(SessionMgr.__sessIDtagName): 
    1595                 raise SessionMgrError("No session ID found in cookie") 
    1596  
    1597             sessID = cookie[SessionMgr.__sessIDtagName].value 
    1598  
     1645        sessID: ID corresponding to session to connect to.""" 
     1646         
    15991647             
    16001648        # Look for a session corresponding to this ID 
    1601         for userSess in self.__sessList: 
    1602             if sessID in userSess['sessID']: 
    1603  
    1604                 # Check matched session has not expired 
    1605                 try: 
     1649        try: 
     1650            for userSess in self.__sessList: 
     1651                if sessID in userSess['sessID']: 
     1652 
     1653                    # Check matched session has not expired 
    16061654                    userSess.credWallet.isValid(raiseExcep=True) 
    16071655                    return userSess 
    16081656                     
    1609                 except Exception, e: 
    1610                     raise SessionMgrError("User Session: %s" % e) 
     1657        except Exception, e: 
     1658            raise SessionMgrError("User Session: %s" % e) 
    16111659                         
    16121660 
     
    16501698            # which could be used to re-try to get authorisation via a mapped 
    16511699            # certificate 
    1652             raise SessionMgrAuthorisationDenied(str(e),e['extAttCertList']) 
     1700            raise SessionMgrAuthorisationDenied(str(e), e['extAttCertList']) 
    16531701         
    16541702        except Exception, e: 
  • security/trunk/python/NDG.BAK/sessionMgr_services.py

    r485 r488  
    6464        """ 
    6565        @param: request to connectRequest:: 
     66          _connect2ExistingSess: boolean 
    6667          _passPhrase: str 
     68          _rtnAsCookie: boolean 
    6769          _userName: str 
    6870 
    6971        @return: response from connectResponse:: 
     72          _cookie: str 
    7073          _errMsg: str 
     74          _expiry: str 
    7175          _sessID: str 
    7276        """ 
     
    155159        self._userName = None 
    156160        self._passPhrase = None 
    157  
    158         oname = None 
    159         if name: 
    160             oname = name 
    161             if ns: 
    162                 oname += ' xmlns="%s"' % ns 
    163             ZSI.TC.Struct.__init__(self, connectRequest, [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 ) 
     161        self._connect2ExistingSess = None 
     162        self._rtnAsCookie = None 
     163 
     164        oname = None 
     165        if name: 
     166            oname = name 
     167            if ns: 
     168                oname += ' xmlns="%s"' % ns 
     169            ZSI.TC.Struct.__init__(self, connectRequest, [ZSI.TC.String(pname="userName",aname="_userName",optional=1),ZSI.TC.String(pname="passPhrase",aname="_passPhrase",optional=1),ZSI.TC.Boolean(pname="connect2ExistingSess",aname="_connect2ExistingSess",optional=1),ZSI.TC.Boolean(pname="rtnAsCookie",aname="_rtnAsCookie",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
    164170 
    165171class connectRequestWrapper(connectRequest): 
     
    173179    def __init__(self, name=None, ns=None): 
    174180        self._sessID = None 
     181        self._expiry = None 
     182        self._cookie = None 
    175183        self._errMsg = None 
    176184 
     
    180188            if ns: 
    181189                oname += ' xmlns="%s"' % ns 
    182             ZSI.TC.Struct.__init__(self, connectResponse, [ZSI.TC.String(pname="sessID",aname="_sessID",optional=1),ZSI.TC.String(pname="errMsg",aname="_errMsg",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
     190            ZSI.TC.Struct.__init__(self, connectResponse, [ZSI.TC.String(pname="sessID",aname="_sessID",optional=1),ZSI.TC.String(pname="expiry",aname="_expiry",optional=1),ZSI.TC.String(pname="cookie",aname="_cookie",optional=1),ZSI.TC.String(pname="errMsg",aname="_errMsg",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
    183191 
    184192class connectResponseWrapper(connectResponse): 
  • security/trunk/python/NDG/Session.py

    r485 r488  
    289289        behaviour""" 
    290290        if key == 'proxyCertTxt': 
    291             self.__proxyCertTxt = value 
     291            self.setProxyCert(value) 
    292292        else: 
    293293            raise CredWalletError('Key "%s" not recognised' % key) 
     
    299299        if key == 'proxyCertTxt': 
    300300            return self.__proxyCertTxt 
    301         elif key == 'credentials': 
     301         
     302        elif key == 'proxyCert': 
     303            return self.__proxyCert 
     304         
     305       elif key == 'credentials': 
    302306            return self.__credentials 
    303307        else: 
     
    317321     
    318322    def keys(self): 
    319         return ['proxyCertTxt'] 
     323        return ['proxyCertTxt', 'proxyCert', 'credentials'] 
    320324 
    321325 
     
    814818            if not self.__bMapFromTrustedHosts: 
    815819                raise CredWalletError("A list of trusted hosts has been " + \ 
    816                                       "but mapping from trusted hosts is " + \ 
    817                                       "set to disallowed") 
     820                                      "input but mapping from trusted " + \ 
     821                                      "hosts is set to disallowed") 
    818822             
    819823            if isinstance(extTrustedHostList, basestring): 
     
    12761280    """Session details - created when a user logs into NDG""" 
    12771281 
     1282    # Session ID 
    12781283    __sessIDlen = 128 
    12791284    __sessIDtagName = "Hash" 
     1285 
     1286    # Follow standard format for cookie expiry tag 
     1287    __sessCookieExpiryTagName = "expiry" 
     1288    __sessCookieExpiryFmt = "%a, %d-%b-%Y %H:%M:%S GMT" 
     1289 
    12801290 
    12811291    def __init__(self, *credWalletArgs, **credWalletKeys): 
     
    13531363        return self.__newSessID 
    13541364 
    1355      
    1356     def setSessionCookie(self, sessID): 
    1357         """Create cookie containing session ID""" 
    1358          
    1359         sessCookie = SimpleCookie() 
    1360         sessCookie[__sessIDtagName] = sessID 
    1361          
    1362         # Caller should set the cookie e.g. in a CGI script 
    1363         # print "Content-type: text/html" 
    1364         # print cookie.output() + os.linesep 
    1365         return sessCookie 
     1365 
     1366    def getExpiryStr(self): 
     1367        """Return session expiry date/time as would formatted for a cookie""" 
     1368 
     1369        try: 
     1370            # Proxy certificate's not after time determines the expiry 
     1371            dtNotAfter = self.credWallet['proxyCert'].getNotAfter() 
     1372 
     1373            return dtNotAfter.strftime(__sessCookieExpiryFmt) 
     1374        except Exception, e: 
     1375            UserSessionError("getExpiry: %s" % e) 
     1376             
     1377     
     1378    def createCookie(self, sessID=None, asString=True): 
     1379        """Create cookie containing session ID and expiry 
     1380 
     1381        sessID:     if no session ID is provided, return the latest one to 
     1382                    be allocated. 
     1383        asString:   Set to True to return the cookie as string text.  If 
     1384                    False, it is returned as a SimpleCookie type.""" 
     1385 
     1386        try: 
     1387            if sessID is None: 
     1388                sessID = self.__sessID[-1] 
     1389                 
     1390            sessCookie = SimpleCookie() 
     1391            sessCookie[__sessIDtagName] = sessID 
     1392 
     1393            # Use standard format for cookie expiry 
     1394            sessCookie[__sessCookieExpiryTagName] = self.getExpiryStr() 
     1395                                         
     1396             
     1397            # Caller should set the cookie e.g. in a CGI script 
     1398            # print "Content-type: text/html" 
     1399            # print cookie.output() + os.linesep 
     1400            if asString: 
     1401                return sessCookie.output() 
     1402            else: 
     1403                return sessCookie 
     1404             
     1405        except Exception, e: 
     1406            UserSessionError("createCookie: %s" % e) 
    13661407 
    13671408 
     
    15151556 
    15161557         
    1517     def connect(self, userName=None, passPhrase=None, sessID=None): 
     1558    def connect(self, 
     1559                userName=None, 
     1560                passPhrase=None, 
     1561                sessID=None, 
     1562                rtnAsCookie=False): 
    15181563         
    15191564        """Create and return a new user session or connect to an existing 
     
    15301575        if sessID is not None: 
    15311576            # Connect to session identified by session ID 
    1532             return self.__connect2UserSession(sessID=sessID) 
     1577            return self.__connect2UserSession(sessID) 
    15331578        else: 
    15341579            # Create a fresh session 
     
    15471592            raise SessionMgrError("Passphrase is null") 
    15481593 
     1594         
    15491595        try:             
    15501596            # Get a proxy certificate to represent users ID for the new 
     
    15561602 
    15571603        try:    
    1558             # Create a new user session using the new proxy certificate and 
    1559             # session ID 
    1560             userSess = UserSession(proxyCert, credRepos=self.__credRepos) 
    1561             newSessID = userSess.newSessID() 
    1562              
    1563             # Check for unique session ID 
    1564             for existingUserSess in self.__sessList: 
    1565                 if newSessID in existingUserSess['sessID']: 
    1566                     raise SessionMgrError(\ 
     1604            # Search for an existing session for the same user 
     1605            userSess = None 
     1606            for u in self.__sessList: 
     1607                if u.credWallet['proxyCert'].getDN()['CN'] == userName: 
     1608 
     1609                    # Existing session found 
     1610                    userSess = u 
     1611 
     1612                    # Replace it's Proxy Certificate with a more up to date 
     1613                    # one 
     1614                    userSess.setProxyCert(proxyCert) 
     1615                    break 
     1616                 
     1617 
     1618            if userSess is None: 
     1619                # Create a new user session using the new proxy certificate 
     1620                # and session ID 
     1621                userSess = UserSession(proxyCert, credRepos=self.__credRepos) 
     1622                 
     1623                newSessID = userSess.newSessID() 
     1624                 
     1625                # Check for unique session ID 
     1626                for existingUserSess in self.__sessList: 
     1627                    if newSessID in existingUserSess['sessID']: 
     1628                        raise SessionMgrError(\ 
    15671629                            "Session ID is not unique:\n\n %s" % newSessID) 
    15681630 
    1569             # Add new session to list                  
    1570             self.__sessList.append(userSess) 
     1631                # Add new session to list                  
     1632                self.__sessList.append(userSess) 
    15711633 
    15721634            return userSess 
     
    15781640 
    15791641 
    1580     def __connect2UserSession(self, sessID=None): 
     1642    def __connect2UserSession(self, sessID): 
    15811643        """Connect to an existing session by providing a valid session ID 
    15821644 
    1583         sessID: ID corresponding to session to connect to.  If none is set 
    1584                 the HTTP_COOKIE environment variable is checked for a 
    1585                 cookie containing an session ID""" 
    1586          
    1587         if sessID is None: 
    1588             # Check current environment for a cookie containing a session ID 
    1589             if not os.environ.has_key('HTTP_COOKIE'): 
    1590                 raise SessionMgrError("No session cookie has been set") 
    1591  
    1592             # Instantiate cookie object and get id 
    1593             cookie = SimpleCookie(os.environ['HTTP_COOKIE']) 
    1594             if not cookie.has_key(SessionMgr.__sessIDtagName): 
    1595                 raise SessionMgrError("No session ID found in cookie") 
    1596  
    1597             sessID = cookie[SessionMgr.__sessIDtagName].value 
    1598  
     1645        sessID: ID corresponding to session to connect to.""" 
     1646         
    15991647             
    16001648        # Look for a session corresponding to this ID 
    1601         for userSess in self.__sessList: 
    1602             if sessID in userSess['sessID']: 
    1603  
    1604                 # Check matched session has not expired 
    1605                 try: 
     1649        try: 
     1650            for userSess in self.__sessList: 
     1651                if sessID in userSess['sessID']: 
     1652 
     1653                    # Check matched session has not expired 
    16061654                    userSess.credWallet.isValid(raiseExcep=True) 
    16071655                    return userSess 
    16081656                     
    1609                 except Exception, e: 
    1610                     raise SessionMgrError("User Session: %s" % e) 
     1657        except Exception, e: 
     1658            raise SessionMgrError("User Session: %s" % e) 
    16111659                         
    16121660 
     
    16501698            # which could be used to re-try to get authorisation via a mapped 
    16511699            # certificate 
    1652             raise SessionMgrAuthorisationDenied(str(e),e['extAttCertList']) 
     1700            raise SessionMgrAuthorisationDenied(str(e), e['extAttCertList']) 
    16531701         
    16541702        except Exception, e: 
  • security/trunk/python/NDG/sessionMgr_services.py

    r485 r488  
    6464        """ 
    6565        @param: request to connectRequest:: 
     66          _connect2ExistingSess: boolean 
    6667          _passPhrase: str 
     68          _rtnAsCookie: boolean 
    6769          _userName: str 
    6870 
    6971        @return: response from connectResponse:: 
     72          _cookie: str 
    7073          _errMsg: str 
     74          _expiry: str 
    7175          _sessID: str 
    7276        """ 
     
    155159        self._userName = None 
    156160        self._passPhrase = None 
    157  
    158         oname = None 
    159         if name: 
    160             oname = name 
    161             if ns: 
    162                 oname += ' xmlns="%s"' % ns 
    163             ZSI.TC.Struct.__init__(self, connectRequest, [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 ) 
     161        self._connect2ExistingSess = None 
     162        self._rtnAsCookie = None 
     163 
     164        oname = None 
     165        if name: 
     166            oname = name 
     167            if ns: 
     168                oname += ' xmlns="%s"' % ns 
     169            ZSI.TC.Struct.__init__(self, connectRequest, [ZSI.TC.String(pname="userName",aname="_userName",optional=1),ZSI.TC.String(pname="passPhrase",aname="_passPhrase",optional=1),ZSI.TC.Boolean(pname="connect2ExistingSess",aname="_connect2ExistingSess",optional=1),ZSI.TC.Boolean(pname="rtnAsCookie",aname="_rtnAsCookie",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
    164170 
    165171class connectRequestWrapper(connectRequest): 
     
    173179    def __init__(self, name=None, ns=None): 
    174180        self._sessID = None 
     181        self._expiry = None 
     182        self._cookie = None 
    175183        self._errMsg = None 
    176184 
     
    180188            if ns: 
    181189                oname += ' xmlns="%s"' % ns 
    182             ZSI.TC.Struct.__init__(self, connectResponse, [ZSI.TC.String(pname="sessID",aname="_sessID",optional=1),ZSI.TC.String(pname="errMsg",aname="_errMsg",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
     190            ZSI.TC.Struct.__init__(self, connectResponse, [ZSI.TC.String(pname="sessID",aname="_sessID",optional=1),ZSI.TC.String(pname="expiry",aname="_expiry",optional=1),ZSI.TC.String(pname="cookie",aname="_cookie",optional=1),ZSI.TC.String(pname="errMsg",aname="_errMsg",optional=1),], pname=name, aname="_%s" % name, oname=oname ) 
    183191 
    184192class connectResponseWrapper(connectResponse): 
  • security/trunk/python/SessionMgrServer.py

    r485 r488  
    5656 
    5757 
    58 def connect(userName, passPhrase): 
     58def connect(userName, 
     59            passPhrase, 
     60            rtnAsCookie): 
    5961    """NDG Session Manager WS interface for connection to a user session.""" 
    6062     
     
    6567    resp = connectResponseWrapper() 
    6668    resp._sessID = '' 
     69    resp._expiry = '' 
     70    resp._cookie = '' 
    6771    resp._errMsg = '' 
    6872         
     
    7478        # Return the latest session ID to be allocated 
    7579        resp._sessID = userSess['sessID'][-1] 
    76  
     80        resp._expiry = userSess.getExpiryStr() 
     81         
     82        if bool(rtnAsCookie): 
     83            resp._cookie = userSess.createCookie() 
     84             
    7785    except Exception, e: 
    7886        resp._errMsg = str(e) 
Note: See TracChangeset for help on using the changeset viewer.