Changeset 991 for TI07-MOLES/trunk


Ignore:
Timestamp:
23/05/06 19:26:11 (13 years ago)
Author:
lawrence
Message:

Browse now goes through to prompting the user for
a login host (from a made up list)

Location:
TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py

    r980 r991  
    3636                self.url=url  
    3737         
    38         def makeGateway(self): 
    39                 ''' Make connection to NDG security ''' 
    40                 aa=self.config.get('security','localAA',None) 
    41                 self.ndgGate=gateway2NDGsession(self.rawCookie,self.url,aa) 
    42          
    4338        def __toXML(self): 
    4439                ''' Used to serialise the history into a cookie string ''' 
     
    6863                ''' Return a list of the items in the history ''' 
    6964                return self.history.tolist() 
    70         def getCredentials(self): 
    71                 '''Obtain the attribute certificate from the wallet ''' 
    72                 return 'empty attribute certificate' 
    73         def makeCookie(self): 
     65        def makeCookie(self,ndgSec=None): 
    7466                ''' Create a local cookie ''' 
    7567                import md5,time,base64 
     
    9385                self.config=config 
    9486                self.response=Response() 
     87                self.requestURL=self.env.get('SCRIPT_NAME')+'?'+self.env.get('QUERY_STRING') 
     88                 
     89        
     90        def makeGateway(self,cookie=None,cmdLine=None): 
     91                ''' Make connection to NDG security ''' 
     92                aa=self.config.get('security','localAA',None) 
     93                self.ndgGate=gateway2NDGsession(self.requestURL,aa,cookie=cookie,cmdLine=cmdLine) 
    9594 
    9695        def goforit(self): 
     
    114113                elif self.FieldStorage.has_key('xml'): 
    115114                    self.ViewXML=1 
    116  
    117115                 
     116                if self.FieldStorage.has_key('ndgSec'): 
     117                    pass 
     118                     
    118119                self.session=BrowseSession(self.cookie,self.uri,self.config) 
    119120                 
     
    121122                 
    122123                #this is where we invoke NDG security setup 
    123                 self.session.makeGateway() 
     124                self.makeGateway() 
    124125                 
    125126                #get the xml document 
     
    134135                else: 
    135136                    self.session.addToHistory(self.b.Burl,self.b.abbreviation) 
    136                     self.response.cookie=self.session.makeCookie() 
    137                     if  self.b.constraints.exist: 
     137                    self.response.cookie=self.session.makeCookie() 
     138                    if  self.b.constraints.exist: 
    138139                        # we need to evaluate them 
    139                         access=self.session.ndgGate.check(self.b.constraints.SimpleCondition) 
     140                        result=self.ndgGate.check(self.b.constraints.SimpleCondition) 
     141                        if result=='AccessGranted':  
     142                            access=1 
     143                        else: 
     144                            access=0 
    140145                    else: 
    141146                        access=1 
     
    149154                            content=self.b.toHTML() 
    150155                    else: 
    151                         content=self.error('No access to Secure Metadata') 
     156                        content=result 
    152157                 
    153158                if not self.ViewTextOnly: 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/env.py

    r764 r991  
    22print "text/html" 
    33print "<p>hello</p>" 
     4 
     5import os 
     6env=os.environ 
     7print env 
     8for i in env.keys(): 
     9    print '<p>#%s:%s#</p>'%i,env[i] 
     10 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/secure.py

    r980 r991  
    11from Utilities import wrapGetText 
    22from NDG.SecurityClient import * 
     3 
    34 
    45class AccessControl: 
     
    2223                        self.status=0 
    2324                        self.exist=1 
    24          
    25          
    26 class AttributeAuthorityClient: 
    27         ''' placeholder til Phil writes his''' 
    28         def __init__(self,x): 
    29                 pass 
    30         def getTrustedHostInfo(self): 
    31                 return ['http://badc.nerc.ac.uk/login'] 
    32          
    33 def mapAA2loginHosts(x): 
    34         ''' It's not obvious that the list of trusted hosts (which are attribute authorities)  
    35         are the same as actual login hosts associated with those attribute authorities, 
    36         so for now we'll hardcode that mapping in this routine, but it ought to be a simple 
    37         (restful) web service (restful because it is public) ''' 
    38         return x 
    39          
     25                 
    4026class gateway2NDGsession: 
    4127         
    4228        ''' This class provides a gateway to the NDG session manager and methods upon it ''' 
    4329 
    44         def __init__(self,cookie, url, config, desiredAA=None): 
     30        def __init__(self,url,config,desiredAA=None,cookie=None,cmdLine=None): 
    4531                 
    4632                ''' The use case is that we attempt to establish a gateway to an  
     
    5036                set of hosts. 
    5137                 
    52                 If an NDG cookie exists, we use it by reEstablishing to the existing session. 
     38                If an NDG cookie exists, or we have it on the commandline, we use it 
     39                by reEstablishing to the existing session. 
    5340                ''' 
    5441                 
    55                 #First we have to see if the ndgsecurity info is in the cookie 
    56                 self.cookie=cookie 
     42                #First we have to see if the ndgsecurity info is in the cooki 
    5743                self.url=url 
    5844                self.connected=0 
    5945                self.config=config 
    60                 if self.__SecCookie(): self._reEstablish(cookie) 
     46                if cookie is not None: 
     47                    if self.__SecCookie():  
     48                        self.__reEstablish(cookie=cookie) 
     49                        return 
     50                if cmdLine is not None: 
     51                    self.__reEstablish(cmdLine=cmdLine) 
    6152                 
    62         def __SecCookie(self): 
     53                 
     54        def check(self, parsedSimpleCondition): 
     55                ''' can the credentials in the wallet support access to the resource requiring  
     56                the role at wsdlAA - parsedSimpleCondition is a tuple - (role, wsdlAA) ''' 
     57                #connect using cookie 
     58 
     59                #first make sure we've got real conditions, if not, deny ... 
     60                if parsedSimpleCondition is None: return 0 
     61 
     62                #if not connected, get connected 
     63                if not self.connected: return self.__Establish(parsedSimpleCondition) 
     64 
     65                resp = self.smClient.reqAuthorisation(sessCookie=cookieObj, 
     66                                    aaWSDL=wsdlAA, 
     67                                    aaPubKey=None, # the session client can get that from the WSDL  
     68                                    reqRole=role, 
     69                                    rtnExtAttCertList=None, #auto select role map for now 
     70                                    clntPriKeyPwd=None # not using encrypted yet 
     71                                    ) 
     72                return 'AccessGranted' 
     73                 
     74        def __SecCookie(self): 
    6375                ''' Check the current cookie and see if it contains security information, but 
    64                 we (the CGI) don't need to parse it ''' 
    65                 # note we don't use isinstance since it is considered harmful. 
     76                we (the CGI) don't need to parse it - that's done in the NDG session client''' 
    6677                if self.cookie is None: 
    6778                    return 0 
     
    7384                        return 0 
    7485                return 1 
     86                         
     87        def __map2loginHosts(self,trustedHostList): 
     88            ''' Map from a list of attribute authority wsdl (which is what you get from 
     89            the attempt to obtain access) to a list of session manager wsdl addresses 
     90            and short names '''  
     91            # requires a new method on the AA wsdl ... 
     92            # what would happen if one of these requests timed out? How would we time it out? 
     93            result=[] 
     94            #following line for testing only - forces login at BADC 
     95            result.append(('BADC','http://glue.badc.rl.ac.uk/sessionMgr.wsdl')) 
     96            return result 
     97            for role,host in trustedHostList: 
     98                AA=AttAuthorityClient(aaWSDL=host) 
     99                loginName,loginURL=AA.getLoginHost() 
     100                result.append((loginName,loginURL)) 
     101            return result 
    75102                                                 
    76103        def __Establish(self,parsedSimpleCondition): 
     
    83110                AA=AttAuthorityClient(aaWSDL=parsedSimpleCondition[1]) 
    84111                trustedHostList=AA.getTrustedHostInfo(role=parsedSimpleCondition[0]) 
    85                 loginHostList=mapAA2loginHosts(trustedHostList)  
    86                 print trustedHostList,1/0 
    87                 #PHIL AT THIS POINT WE NEED TO CALL YOUR LOGIN CODE WHICH OUGHT 
    88                 #TO PROMPT THE USER FOR ONE OF THESE HOSTS ... 
    89          
    90         def _reEstablish(self,cookie): 
     112                loginHostList=self.__map2loginHosts(trustedHostList)     
     113                return self.__showSiteList(loginHostList) 
     114                 
     115        def __reEstablish(self,cookie=None,cmdLine=None): 
    91116                ''' bind to the existing WSDL ''' 
    92117                 
    93                 self.__loadKeys(smWSDL) 
     118                if cmdLine is not None: 
     119                    sessID,encrSessMgrWDLURI=urldecode(cmdLine) 
     120                 
     121                self.__loadKeys() 
    94122                try: 
    95123                        #set up session client  
     
    97125                        # see __loadKeys for more details) 
    98126                        self.smClient = SessionClient( 
    99                             smWSDL=self.__localSessionManagerProxyWSDL, 
    100                             smPubKeyFilePath=self.__localSessionManagerPublicKey, 
     127                                    sessCookie=cookie, 
     128                                    encrSessMgrWSDLuri=WSDLuri, 
     129                                    sessID=sessID, 
     130                                    smPubKeyFilePath=self.__localSessionManagerPublicKey, 
    101131                                    clntPubKeyFilePath=self.__thisCGIpublicKey, 
    102132                                    clntPriKeyFilePath=self.__thisCGIprivateKey, 
     
    108138                        pass # for now we don't have the libraries or code attached 
    109139 
    110         def check(self, parsedSimpleCondition): 
    111                 ''' can the credentials in the wallet support access to the resource requiring  
    112                 the role at wsdlAA - parsedSimpleCondition is a tuple - (role, wsdlAA) ''' 
    113                 #connect using cookie 
    114  
    115                 #first make sure we've got real conditions, if not, deny ... 
    116                 if parsedSimpleCondition is None: return 0 
    117  
    118                 #if not connected, get connected 
    119                 self.__Establish(parsedSimpleCondition) 
    120  
    121                 resp = self.smClient.reqAuthorisation(sessCookie=cookieObj, 
    122                                     aaWSDL=wsdlAA, 
    123                                     aaPubKey=None, # the session client can get that from the WSDL  
    124                                     reqRole=role, 
    125                                     rtnExtAttCertList=None, #auto select role map for now 
    126                                     clntPriKeyPwd=None # not using encrypted yet 
    127                                     ) 
    128                 return 'AccessGranted' in resp #a simple boolean 
    129                  
    130140         
    131         def __loadKeys(self,smWSDL): 
     141         
     142        def __loadKeys(self): 
    132143                ''' Load security keys ''' 
    133144                 
     
    156167                with it ''' 
    157168                return None 
    158          
     169         
     170        def __showSiteList(self,loginList,heading=''): 
     171            '''Show the user a list of trusted hosts, and redirect to one of them ''' 
     172            html='''<p> Access to resource [<b>%s</b>] requires credentials from one of 
     173                the following sites, please login ...' 
     174                    <hr> 
     175                    <form action="./xNDGtransfer.py" method="POST"> 
     176                    <table bgcolor=#ADD8E6 cellspacing=0 border=0 cellpadding=5> 
     177                    <tbody><tr> 
     178                    <td><select name="requestURI"> 
     179                    <option value="">Select your home site...'''%self.url 
     180            for i,j in loginList: 
     181                html+='<option value="%s">%s'%(j,i) 
     182            html+='''</select></td> 
     183                    <td align="right"><input type=submit value="Login"></td> 
     184                    </tr></tbody> 
     185                    </table> 
     186                    <input type="hidden" name="returnURL" value="%s">  
     187                    </form> 
     188                    </body> 
     189                    </html>'''%self.url 
     190            return html 
     191 
     192     
     193     
Note: See TracChangeset for help on using the changeset viewer.