Changeset 828 for TI07-MOLES/trunk


Ignore:
Timestamp:
25/04/06 14:53:11 (13 years ago)
Author:
lawrence
Message:

Browse History cookie works, more security scaffolding, new
response class handling interactions.

Location:
TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi
Files:
2 added
5 edited

Legend:

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

    r777 r828  
    11#!/usr/bin/env python 
    2 import cgitb;cgitb.enable() 
     2import cgitb; cgitb.enable() 
     3import sys 
    34from browseCGI import * 
     5 
    46molesPortal=CGIcontroller() 
    5 html=molesPortal.goforit() 
    6 print 'text/html' 
    7 print 
    8 print html 
     7response=molesPortal.goforit() 
     8response.write(sys.stdout) 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py

    r825 r828  
    66#import cgitb;ctitb.enable() 
    77import os 
     8import ConfigParser 
    89import ElementTree as ET 
    910from insecure import * 
     
    1314from renderEntity import renderEntity 
    1415from renderPage import renderPage 
     16from Response import * 
     17import Cookie 
     18 
     19 
     20class myConfig: 
     21        ''' Handle missing sections and variables in a config file a bit gracefully ''' 
     22        def __init__(self,configfile): 
     23                self.config=ConfigParser.ConfigParser() 
     24                if not os.path.exists(configfile): 
     25                        raise 'No config file' 
     26                self.config.read(configfile) 
     27                logfile=self.get('logging','debugLog',None) 
     28                self.logfile=None 
     29                if logfile is not None: 
     30                        self.logfile=open(logfile,'a') 
     31 
     32        def get(self,section,key,default=None): 
     33                try: 
     34                        return self.config.get(section,key) 
     35                except: 
     36                        return default 
     37         
     38        def log(self,string): 
     39                self.logfile.write(string+'\n') 
    1540 
    1641def EvaluateCredentials(ac,securityMetadata): 
     
    3358class BrowseSession: 
    3459        ''' Holds the browse history and contact details for the NDG session manager ''' 
    35         def __init__(self,cookie,url): 
     60        def __init__(self,cookie,url,config): 
    3661                '''Instantiate and get security environment''' 
    3762                # we should have two cookies, the NDG security cookie, and our browse history cookie! 
    38                 self.cookie=cookie 
     63                self.config=config 
     64                self.cookie=Cookie.SimpleCookie(cookie) 
    3965                self.history=RingBuffer(10) 
    40                 self.ndgGate=gateway2NDGsession(cookie,url) 
     66                self.ndgGate=gateway2NDGsession(cookie,url,config) 
    4167                self.__loadBrowseHistory() 
    42                 self.writeCookie() 
     68         
     69        def __toXML(self): 
     70                ''' Used to serialise the history into a cookie string ''' 
     71                xml='<BH>' 
     72                for uri,name in self.getHistory(): 
     73                        xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name) 
     74                xml+='</BH>' 
     75                return xml 
     76                                 
    4377        def __loadBrowseHistory(self): 
    4478                ''' get the string of URI values out of the cookie (if it's there)''' 
    45                 try: 
    46                         strHistory=self.cookie['BrowseHistory'].value 
    47                 except: 
    48                         strHistory='[]' 
    49                 #this will definitely break when we have a real cookie ...  
    50                 if strHistory !='[]': 
    51                         for uri,name in strHistory[1:-1].split(','): self.addToHistory(uri,name) 
     79                #try: 
     80                self.tree=ET.fromstring(self.cookie['BrowseHistory'].value) 
     81                for item in self.tree: 
     82                        self.addToHistory(item.find('u').text,item.find('n').text) 
     83                #except: 
     84                #       pass 
    5285        def addToHistory(self,uri,name): 
    5386                ''' Add a URI to the session history''' 
     
    5992                '''Obtain the attribute certificate from the wallet ''' 
    6093                return 'empty attribute certificate' 
    61         def writeCookie(self): 
    62                 ''' Write out the current cookie ''' 
    63                 pass 
     94        def makeCookie(self): 
     95                ''' Create a local cookie ''' 
     96                import md5,time,base64 
     97                # start by creating a unique session id 
     98                m=md5.new() 
     99                m.update('this is a seed string') 
     100                m.update(str(time.time())) 
     101                cookie=Cookie.SimpleCookie() 
     102                cookie['session']=base64.encodestring(m.digest())[:-3].replace("/", "$") 
     103                cookie['BrowseHistory']=self.__toXML() 
     104                return cookie 
    64105         
    65106class CGIcontroller: 
     
    71112                self.path=self.env.get('PATH_INFO','/') 
    72113                self.FieldStorage=cgi.FieldStorage() 
     114                self.config=myConfig('cgi/browse.config') 
     115                self.response=Response() 
    73116 
    74117        def goforit(self): 
     
    85128                else:  
    86129                        return self.error('No valid URI') 
    87                 self.session=BrowseSession(self.cookie,self.uri) 
     130                self.session=BrowseSession(self.cookie,self.uri,self.config) 
     131                if self.config.logfile is not None: self.config.log(self.cookie) 
    88132                 
    89133                #Handle authorisation 
     
    93137                if self.b.xml is not None: 
    94138                        self.session.addToHistory(self.b.Burl,self.b.name) 
     139                        self.response.cookie=self.session.makeCookie() 
    95140                        if EvaluateCredentials(self.ac,self.uri): 
    96141                                #we can show the user the page 
     
    106151                        historyHTML+='<a href="%s">%s</a><br/>'%item 
    107152                historyHTML+='</p>' 
    108                          
    109                 return renderPage(content,historyHTML,historyHTML,self.b.name) 
     153                self.response.content=renderPage( 
     154                        content,historyHTML,historyHTML,self.b.name,self.config) 
     155                return self.response 
    110156                 
    111157        def error(self,message): 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/renderPage.py

    r825 r828  
    1 def renderPage(contentHTML,historyHTML,selectHTML,name): 
     1def renderPage(contentHTML,historyHTML,selectHTML,name,config): 
    22         
    33        ''' Renders the content of a browse page, using information from the entity 
     
    77        #Note layout images and stylesheets should be in the layout directory ... 
    88        #following should come from a config file 
    9         localLink='http://www.badc.rl.ac.uk' 
    10         localImage='/layout/bodc_logo.gif' 
    11         localAlt='visit badc' 
    12         ndgLink='http://ndg.nerc.ac.uk/' 
    13         ndgImage="/layout/ndg_logo.gif" 
    14         ndgAlt='visit ndg' 
    15         PageLogo='/layout/browse_header4.gif' 
     9        localLink=config.get('layout','localLink',None) 
     10        localImage=config.get('layout','localImage',None) 
     11        localAlt=config.get('layout','localAlt','Visit Local Site') 
     12        ndgLink=config.get('layout','ndgLink','http://ndg.nerc.ac.uk') 
     13        ndgImage=config.get('layout','ndgImage',None) 
     14        ndgAlt=config.get('layout','ndgAlt','Visit NDG') 
     15        PageLogo=config.get('layout','pageLogo',None) 
    1616         
    1717        #set up html header 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/secure.py

    r822 r828  
     1 
     2 
     3class AttributeAuthorityClient: 
     4        ''' placeholder til Phil writes his''' 
     5        def __init__(self,x): 
     6                pass 
     7        def getTrustedHostInfo(self): 
     8                return ['http://badc.nerc.ac.uk/login'] 
     9         
     10def mapAA2loginHosts(x): 
     11        ''' It's not obvious that the list of trusted hosts (which are attribute authorities)  
     12        are the same as actual login hosts associated with those attribute authorities, 
     13        so for now we'll hardcode that mapping in this routine, but it ought to be a simple 
     14        (restful) web service (restful because it is public) ''' 
     15        return [x] 
     16         
    117class gateway2NDGsession: 
    218         
    319        ''' This class provides a gateway to the NDG session manager and methods upon it ''' 
    420 
    5         def __init__(self,cookie, url): 
     21        def __init__(self,cookie, url, config, desiredAA=None): 
    622                 
    723                ''' Establish gateway by either, 
    8                        a) using the NDG cookie to get to the session manager WSDL, or 
    9                        b) redirecting and receving back a url with the cookie information. 
     24                       a) using the NDG cookie and passing it to a local session manager instance 
     25                       to decode and use, or  
     26                       b) redirecting and receving back a url with the cookie information and then 
     27                       doing option a). 
    1028                In both cases, we can't assume that we can *Create* the cookie as there 
    1129                may be a pre-existing history component to the cookie. 
    1230                ''' 
    1331                 
    14  
     32                #First we have to see if the ndgsecurity info is in the cookie 
     33                self.cookie=cookie 
     34                self.url=url 
     35                if self.__notSecCookie(): 
     36                        self._Establish(desiredAA) 
     37                else: 
     38                        self._reEstablish() 
    1539                 
    16                 #First we have to see if the ndgsecurity info is in the cookie 
    17                 if self.__notSecCookie(cookie): 
    18                         self._Establish(url) 
    19                 else: 
    20                         self._reEstablish(cookie) 
    21                          
    22         def __notSecCookie(self,cookie): 
    23                 ''' parse the current cookie and check that it contains security information ''' 
     40                self.config=config 
     41         
     42        def __notSecCookie(self): 
     43                ''' Check the current cookie and see if it contains security information, but 
     44                we (the CGI) don't need to parse it ''' 
    2445                # note we don't use isinstance since it is considered harmful. 
    25                 if cookie is None: 
     46                if self.cookie is None: 
    2647                        return 1 
    2748                else: 
    2849                        try: 
    2950                                for i in ('NDG-ID1','NDG-ID2'):  
    30                                         if i not in cookie: return 1 
     51                                        if i not in self.cookie: return 1 
    3152                        except:  
    3253                                return 1 
    3354                return 0 
    3455                                                 
    35         def _Establish(self,url): 
     56        def _Establish(self,desiredAA): 
    3657                ''' Need to go off and do some prompting etc ''' 
    3758                # this should eventually be a redirect, after which we will 
    38                 # get a URI back with  
    39                 pass #should return the cookie 
     59                # get a URI back with the cookie posted as a (hidden) uri argument. 
     60                AA=AttributeAuthorityClient(desiredAA) 
     61                trustedHostList=AA.getTrustedHostInfo() 
     62                loginHostList=mapAA2loginHosts(trustedHostList)  
     63                pass 
    4064         
    4165        def _reEstablish(self,cookie): 
     
    4973                        # see __loadKeys for more details) 
    5074                        smClient = SessionClient( 
    51                             smWSDL=self.__smWSDL, 
    52                             smPubKeyFilePath=self.__remoteSessionManagerPublicKey, 
     75                            smWSDL=self.__localSessionManagerProxyWSDL, 
     76                            smPubKeyFilePath=self.__localSessionManagerPublicKey, 
    5377                                    clntPubKeyFilePath=self.__thisCGIpublicKey, 
    5478                                    clntPriKeyFilePath=self.__thisCGIprivateKey, 
    5579                            traceFile=traceFile) 
    5680 
    57                         #connect using cookie 
    58                         resp = smClient.reqAuthorisation(sessCookie=cookieObj, 
    59                                     aaWSDL=self.__aaWSDL, 
    60                                                     aaPubKey=self.__aaPubKey, 
    61                                     reqRole=reqRole, 
    62                                     rtnExtAttCertList=bRtnExtAttCertList, 
    63                                     clntPriKeyPwd=self.__clntPriKeyPwd) 
    6481                except Exception, e: 
    6582                        # Socket error returns tuple - reformat to just give msg 
     
    7087                ''' can the credentials in the wallet support access to the resource requiring  
    7188                the role at wsdlAA ''' 
    72                 pass 
     89                #connect using cookie 
     90 
     91                resp = smClient.reqAuthorisation(sessCookie=cookieObj, 
     92                                    aaWSDL=wsdlAA, 
     93                                    aaPubKey=None, # the session client can get that from the WSDL  
     94                                    reqRole=role, 
     95                                    rtnExtAttCertList=None, #auto select role map for now 
     96                                    clntPriKeyPwd=None # not using encrypted yet 
     97                                    ) 
     98                return 'AccessGranted' in resp 
     99                 
    73100         
    74101        def __loadKeys(self,smWSDL): 
     
    85112                self.__thisCGIpublicKey=None 
    86113                self.__thisCGIprivateKey=None 
    87                 self.__remoteSessionManagerPublicKey=None 
     114                 
     115                #these are the things I need to talk to my local session manager 
     116                self.__localSessionManagerPublicKey=None 
     117                self.__localSessionManagerProxyWSDL=self.config.get('Security','localSM',None) 
    88118                 
    89119                #we need to call out to smWSDL to get their public key as a first step? 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/stubB.py

    r825 r828  
    172172                        self.type='dgObservationStation' 
    173173                        self.others=('dgDataEntity','dataproductiontool','activity') 
    174                  
    175                 else: 
    176                         #handle other forms 
    177                         pass 
     174 
    178175                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText') 
    179176                service='cgi/browse.py' 
Note: See TracChangeset for help on using the changeset viewer.