Changeset 668


Ignore:
Timestamp:
09/03/06 11:25:26 (14 years ago)
Author:
pjkersha
Message:

ndgSessionClient.py: added option for authorisation requests and also the ability to
combine --connect and --req-autho calls.

sessionMgrProperties.xml: new property cookieDomain enables a specific domain to be set for
session cookie.

Session.py: changes to implement the above - UserSession? has a cookieDomain attribute and
cookieDomain property.

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

Legend:

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

    r667 r668  
    7575    __sessIDlen = 128 
    7676 
    77     __cookieTagNames = ("NDG-ID1", "NDG-ID2") 
     77    __cookieTags = ("NDG-ID1", "NDG-ID2") 
    7878 
    7979    # Follow standard format for cookie path and expiry attributes 
    80     __cookiePathTagName = "path" 
     80    __cookiePathTag = "path" 
    8181    __cookiePath = "/" 
    82     __cookieDomainTagName = 'domain' 
    83     __cookieExpiryTagName = "expires" 
     82    __cookieDomainTag = 'domain' 
     83    __cookieExpiryTag = "expires" 
    8484         
    8585    __sessCookieExpiryFmt = "%a, %d-%b-%Y %H:%M:%S GMT" 
     
    8888    def __init__(self, *credWalletArgs, **credWalletKeys): 
    8989        """Initialise UserSession with args and keywords to CredWallet""" 
     90         
     91        # Domain for cookie used by createCookie method - if not set, default 
     92        # is web server domain name 
     93        self.__cookieDomain = None 
     94                 
    9095         
    9196        # Each User Session has one or more browser sessions associated with 
     
    96101 
    97102                
    98     def __repr__(self): 
    99         "Represent User Session"         
    100         return "<UserSession instance>" 
     103#    def __repr__(self): 
     104#        "Represent User Session"         
     105#        return "<UserSession instance>" 
     106 
     107    def __setCookieDomain(self, cookieDomain): 
     108        """Set domain for cookie - set to None to assume domain of web server 
     109        """ 
     110 
     111        if not isinstance(cookieDomain, basestring) and \ 
     112           cookieDomain is not None: 
     113            raise UserSessionError(\ 
     114                "Expecting string or None type for \"cookieDomain\"") 
     115                         
     116        self.__cookieDomain = cookieDomain 
     117 
     118    cookieDomain = property(fset=__setCookieDomain, 
     119                            doc="Set cookie domain") 
    101120 
    102121 
     
    155174             
    156175     
    157     def createCookie(self, encrSessMgrWSDLuri, sessID=None, asString=True): 
     176    def createCookie(self,  
     177                     encrSessMgrWSDLuri,  
     178                     sessID=None, 
     179                     cookieDomain=None, 
     180                     asString=True): 
    158181        """Create cookies for session ID Session Manager WSDL address 
    159182 
     
    162185        sessID:                if no session ID is provided, use the latest  
    163186                               one to be allocated. 
     187        cookieDomain:          domain set for cookie, if non set, web server 
     188                               domain name is used 
    164189        asString:              Set to True to return the cookie as string  
    165190                               text.  If False, it is returned as a  
     
    191216                pass    
    192217 
    193             
     218 
     219        # Nb. Implicit call to __setCookieDomain method 
     220        if cookieDomain: 
     221            self.cookieDomain = cookieDomain 
     222 
     223           
    194224        try: 
    195225            if sessID is None: 
     
    209239             
    210240            tagValues = (sessID, encrSessMgrWSDLuri) 
     241            expiryStr = self.__getExpiryStr() 
    211242             
    212243            i=0 
    213             for tagName in self.__cookieTagNames: 
    214      
    215                 sessCookie[tagName] = tagValues[i] 
     244            for tag in self.__cookieTags: 
     245     
     246                sessCookie[tag] = tagValues[i] 
    216247                i += 1 
    217248                 
    218249                # Use standard format for cookie path and expiry 
    219                 sessCookie[tagName][self.__cookiePathTagName] = \ 
    220                                                         self.__cookiePath 
    221                  
    222                 sessCookie[tagName][self.__cookieExpiryTagName]=\ 
    223                                                         self.__getExpiryStr() 
     250                sessCookie[tag][self.__cookiePathTag] = self.__cookiePath                 
     251                sessCookie[tag][self.__cookieExpiryTag]= expiryStr 
    224252                                             
    225253                # Make cookie as generic as possible for domains - Nb. '.uk' 
    226254                # alone won't work 
    227                 sessCookie[tagName][self.__cookieDomainTagName] = '.rl.ac.uk'#'glue.badc.rl.ac.uk' 
     255                if self.__cookieDomain: 
     256                    sessCookie[tag][self.__cookieDomainTag] = \ 
     257                                                        self.__cookieDomain 
    228258             
    229259             
     
    237267             
    238268        except Exception, e: 
    239             UserSessionError("Creating Cookie: %s" % e) 
     269            UserSessionError("Creating Session Cookie: %s" % e) 
    240270 
    241271 
     
    261291                       'keyPPhrase',  
    262292                       'sessMgrWSDLkey',  
    263                        'sessMgrWSDLuri',  
     293                       'sessMgrWSDLuri', 
     294                       'cookieDomain',  
    264295                       'myProxyProp',  
    265296                       'credReposProp'] 
     
    352383                    elem.text = os.path.expandvars(elem.text) 
    353384                     
    354                 self.__prop[elem.tag] = elem.text                 
     385                self.__prop[elem.tag] = elem.text 
     386                 
     387                # Strip white space but not in the case of pass-phrase field 
     388                # as pass-phrase might contain leading or trailing white space 
     389                if elem.tag != 'keyPPhrase': 
     390                    self.__prop[elem.tag].strip() 
    355391            else: 
    356392                raise SessionMgrError(\ 
     
    559595                 
    560596                # Web browser client - Return session cookie 
     597                userSess.cookieDomain = self.__prop['cookieDomain'] 
    561598                sessCookie = userSess.createCookie(self.encrSessMgrWSDLuri) 
    562599                 
  • TI12-security/trunk/python/ndgSessionClient.py

    r667 r668  
    2828     
    2929    fp.write(\ 
    30         "usage: %s [--add-user|--connect|--req-autho][<args...>]%s" % \ 
    31         (progName, os.linesep)) 
     30    """usage: %s [--add-user|--connect|--req-autho]|[--connect --req-autho] 
     31        [<args...>]%s""" % (progName, os.linesep)) 
    3232         
    3333    fp.write("""     
     
    4040    add a new user:  
    4141         
    42     %s --add-user -u <username> -p <pass-phrase> -s <Session Manager WSDL URI> 
     42    %s --add-user -u <username> [-p] -s <Session Manager WSDL URI> 
    4343 
    4444-c | --connect 
    4545    login in to a Session Manager 
    4646     
    47     %s --connect -u <username> -p <pass-phrase> -s <Session Manager WSDL URI> 
     47    %s --connect -u <username> [-p] -s <Session Manager WSDL URI> 
    4848     
    4949-r | --req-autho 
     
    5151    Authority on behalf of a user:  
    5252     
    53     %s --req-autho -i <User's Session ID>  -s <Session Manager WSDL URI>  
    54     -a <Attribute Authority WSDL URI> 
     53    %s --req-autho -i <User's Session ID> -s <Session Manager WSDL URI>  
     54    -a <Attribute Authority WSDL URI> [-m -q <role name> -l -f <file path> 
     55    -t <file path>] 
    5556   
    5657Generic options: 
     
    6869    username for --connect call 
    6970 
    70 -p <pass-phrase>| --pass-phrase=<pass-phrase> 
    71     user's pass-phrase for --connect call.  If this flag is omitted,  
    72     pass-phrase is taken from tty. 
     71-p | --pass-phrase-from-stdin 
     72    Take user's pass-phrase from stdin.  If this flag is omitted, pass-phrase  
     73    is prompted for. 
    7374 
    7475Options specific to --req-autho: 
     
    103104    Authority.   If set, a list of candidate Attribute Certificates from 
    104105    trusted import hosts will be returned.  Any one of these could be 
    105     re-input in a subsequent with the --ext-att-cert-list-file option in order to 
    106     get a mapped Attribute Certificate 
     106    re-input in a subsequent with the --ext-att-cert-list-file option in order 
     107    to get a mapped Attribute Certificate 
    107108     
    108109-f <file path> | --ext-att-cert-list-file=<file path> 
     
    132133                         "att-authority-wsdl-uri=", 
    133134                         "username=", 
    134                          "pass-phrase=", 
     135                         "pass-phrase-from-stdin", 
    135136                         "session-id=", 
    136137                         "encr-sess-mgr-wsdl-uri", 
     
    141142                         "ext-att-cert-list-file=", 
    142143                         "ext-trusted-host-file="] 
    143         optShortNames = "hncrs:a:u:p:i:e:dmq:l:f:t:" 
     144        optShortNames = "hncrs:a:u:pi:e:dmq:lf:t:" 
    144145        opts, args = getopt.getopt(sys.argv[1:], optShortNames, optLongNames) 
    145146 
     
    154155    extTrustedHostList = None 
    155156    extAttCertList = None 
     157    passPhrase = None 
    156158     
    157159    for opt, arg in opts: 
     
    178180            args['username'] = arg 
    179181 
    180         elif opt in ("-p", "--pass-phrase"): 
    181             args['pass-phrase'] = arg 
     182        elif opt in ("-p", "--pass-phrase-from-stdin"): 
     183            args['pass-phrase-from-stdin'] = True 
    182184 
    183185        elif opt in ("-i", "--session-id"): 
     
    197199         
    198200        elif opt in ("-l", "--rtn-ext-att-cert-list"): 
    199             args['rtn-ext-att-cert-list'] = arg 
     201            args['rtn-ext-att-cert-list'] = True 
    200202             
    201203        elif opt in ("-f", "--ext-att-cert-list-file"): 
    202204            args['ext-att-cert-list-file'] = arg 
    203205             
    204             sAttCertList = \ 
    205             re.sub("\s*<\?xml.*\?>\s*", "", open("attCertList.xml").read()) 
    206              
    207             extAttCertList = ['<attributeCertificate>' + ac for ac in \ 
    208                            sAttCertList.split('<attributeCertificate>')[1:] 
     206            try: 
     207                # Open and read file removing any <?xml ... ?> headers 
     208                fpExtAttCertList = open(args['ext-att-cert-list-file']) 
     209                sAttCertList = \ 
     210                     re.sub("\s*<\?xml.*\?>\s*", "", fpExtAttCertList.read()) 
     211                 
     212                # Convert into a list 
     213                extAttCertList = ['<attributeCertificate>' + ac for ac in \ 
     214                            sAttCertList.split('<attributeCertificate>')[1:]] 
     215            except Exception, e: 
     216                sys.stderr.write(\ 
     217                    "Error parsing file \%s\" for option \"%s\": %s" % \ 
     218                    (arg, opt, str(e))) 
    209219             
    210220        elif opt in ("-t", "ext-trusted-host-file"): 
     
    224234 
    225235 
    226     # For connect/addUser if pass-phrase wasn't set prompt for it 
    227     if not args['pass-phrase'] and args['add-user'] or args['connect']: 
    228         import getpass 
    229         try: 
    230             args['pass-phrase'] = getpass.getpass(\ 
    231                                 prompt="pass-phrase: ") 
    232         except KeyboardInterrupt: 
    233             sys.exit(1) 
     236    # For connect/addUser a pass-phrase is needed 
     237    if args['add-user'] or args['connect']: 
     238         
     239        if args['pass-phrase-from-stdin']: 
     240            # Read from standard input 
     241            passPhrase = sys.stdin.read().strip() 
     242             
     243        else: 
     244            # Obtain from prompt 
     245            import getpass 
     246            try: 
     247                passPhrase = getpass.getpass(prompt="pass-phrase: ")                 
     248            except KeyboardInterrupt: 
     249                sys.exit(1) 
    234250 
    235251 
     
    244260    try: 
    245261        if args['add-user']: 
    246             sessClnt.addUser(userName=args['username'],  
    247                              pPhrase=args['pass-phrase']) 
     262            sessClnt.addUser(userName=args['username'], pPhrase=passPhrase) 
     263            sys.exit(0) 
    248264                             
    249         elif args['connect']: 
     265        if args['connect']: 
    250266            sSessCookie = sessClnt.connect(userName=args['username'],  
    251                                            pPhrase=args['pass-phrase'])             
    252             print sSessCookie                                        
    253      
    254         elif args['req-autho']: 
    255             authResp = sessClnt.reqAuthorisation( 
    256                             sessID=args['session-id'],  
    257                             encrSessMgrWSDLuri=args['encr-sess-mgr-wsdl-uri'], 
    258                             aaWSDL=args['att-authority-wsdl-uri']) 
     267                                           pPhrase=passPhrase)             
     268            print sSessCookie 
     269            # Don't exit here - req-autho may have been set too 
     270     
     271        if args['req-autho']: 
     272            if args['connect']: 
     273                # Connect was set also - parse cookie in order to session ID 
     274                # and WSDL address 
     275                from Cookie import SimpleCookie 
     276                sessCookie = SimpleCookie(sSessCookie) 
     277                 
     278                args['session-id'] = sessCookie['NDG-ID1'].value 
     279                args['encr-sess-mgr-wsdl-uri'] = sessCookie['NDG-ID2'].value 
     280                 
     281            authResp = sessClnt.reqAuthorisation(\ 
     282                        sessID=args['session-id'],  
     283                        encrSessMgrWSDLuri=args['encr-sess-mgr-wsdl-uri'], 
     284                        aaWSDL=args['att-authority-wsdl-uri'], 
     285                        mapFromTrustedHosts=args['map-from-trusted-hosts'], 
     286                        reqRole=args['req-role'], 
     287                        rtnExtAttCertList=args['rtn-ext-att-cert-list'], 
     288                        extAttCertList=extAttCertList, 
     289                        extTrustedHostList=extTrustedHostList) 
    259290            print authResp 
    260291        else:    
     
    263294            usage(fp=sys.stderr) 
    264295            sys.exit(1) 
     296             
    265297    except Exception, e: 
    266298        sys.stderr.write(str(e) + os.linesep) 
  • TI12-security/trunk/python/sessionMgrProperties.xml

    r638 r668  
    77    <sessMgrWSDLkey></sessMgrWSDLkey> 
    88    <sessMgrWSDLuri></sessMgrWSDLuri> 
     9    <cookieDomain></cookieDomain> 
    910    <myProxyProp> 
    1011        <myProxyServer></myProxyServer> 
Note: See TracChangeset for help on using the changeset viewer.