source: TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py @ 991

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py@991
Revision 991, 5.6 KB checked in by lawrence, 13 years ago (diff)

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

  • Property svn:executable set to *
Line 
1#!/usr/bin/env python
2# CGI Script to support prototype NDG MOLES_Portal (Browse) functionality
3# Bryan Lawrence, April, 2006
4
5import cgi
6#import cgitb;ctitb.enable()
7
8import os
9import ElementTree as ET
10
11from insecure import *
12from secure import *
13from stubB import *
14
15from renderEntity import renderEntity
16from renderPage import renderPage
17from Utilities import *
18from ETxmlView import *
19
20import Cookie
21
22class BrowseSession:
23       
24        ''' Holds the browse history and contact details for the NDG session manager, designed
25        to work with the discovery portal as well '''
26       
27        def __init__(self,cookie,url,config):
28               
29                '''Instantiate with an unsecured browse session (security only
30                required if a secure resource is the target) '''
31                self.config=config
32                self.rawCookie=cookie
33                self.cookie=Cookie.SimpleCookie(cookie)
34                self.history=RingBuffer(10)
35                self.__loadBrowseHistory()
36                self.url=url
37       
38        def __toXML(self):
39                ''' Used to serialise the history into a cookie string '''
40                xml='<BH>'
41                for uri,name in self.getHistory():
42                        xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name)
43                xml+='</BH>'
44                return xml
45                               
46        def __loadBrowseHistory(self):
47                ''' get the string of URI values out of the cookie (if it's there)'''
48                try:
49                        self.tree=ET.fromstring(self.cookie['BrowseHistory'].value)
50                        for item in self.tree:
51                                self.addToHistory(item.find('u').text,item.find('n').text,ignore=True)
52                except:
53                        pass
54        def addToHistory(self,uri,name,ignore=False):
55                ''' Add a URI to the session history'''
56                if not ignore:
57                        current=self.getHistory()
58                        if (uri,name) not in current:
59                                self.history.append((uri,name))
60                else:
61                        self.history.append((uri,name))
62        def getHistory(self):
63                ''' Return a list of the items in the history '''
64                return self.history.tolist()
65        def makeCookie(self,ndgSec=None):
66                ''' Create a local cookie '''
67                import md5,time,base64
68                # start by creating a unique session id
69                m=md5.new()
70                m.update('this is a seed string')
71                m.update(str(time.time()))
72                cookie=Cookie.SimpleCookie()
73                cookie['session']=base64.encodestring(m.digest())[:-3].replace("/", "$")
74                cookie['BrowseHistory']=self.__toXML()
75                return cookie
76       
77class CGIcontroller:
78        ''' Currently holds the cgi environment and controls '''
79       
80        def __init__(self,config):
81                ''' Instantiate the CGI environment'''
82                self.env=os.environ
83                self.path=self.env.get('PATH_INFO','/')
84                self.FieldStorage=cgi.FieldStorage()
85                self.config=config
86                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)
94
95        def goforit(self):
96                ''' This method actually responds to the user'''
97               
98                #Instantiate the Session Environment
99                self.cookie=self.env.get('HTTP_COOKIE',None)
100
101                #this will do for the moment, although I'd rather the whole
102                #URI was self consistent ...
103               
104                if self.FieldStorage.has_key('uri'):
105                        self.uri=self.FieldStorage['uri'].value
106                else: 
107                        self.response.content=self.error('No valid URI')
108                        return self.response
109               
110                self.ViewTextOnly,self.ViewXML=0,0
111                if self.FieldStorage.has_key('text'):
112                    self.ViewTextOnly=1
113                elif self.FieldStorage.has_key('xml'):
114                    self.ViewXML=1
115               
116                if self.FieldStorage.has_key('ndgSec'):
117                    pass
118                   
119                self.session=BrowseSession(self.cookie,self.uri,self.config)
120               
121                if self.config.logfile is not None: self.config.log(self.cookie)
122               
123                #this is where we invoke NDG security setup
124                self.makeGateway()
125               
126                #get the xml document
127                db=self.config.get('db','exist',None)
128                xml=insecureGetDoc(self.uri,db)
129               
130                #create stub-b instance
131                self.b=stubB(xml,makeHTML=renderEntity)
132               
133                if self.b.xml is None:
134                    content=self.error('Unable to obtain stub-B from database')
135                else:
136                    self.session.addToHistory(self.b.Burl,self.b.abbreviation)
137                    self.response.cookie=self.session.makeCookie()
138                    if  self.b.constraints.exist:
139                        # we need to evaluate them
140                        result=self.ndgGate.check(self.b.constraints.SimpleCondition)
141                        if result=='AccessGranted': 
142                            access=1
143                        else:
144                            access=0
145                    else:
146                        access=1
147                    if access:
148                        if self.ViewTextOnly:
149                            self.response.contentType='text/plain'
150                            content=et2text(self.b.tree)
151                        elif self.ViewXML==1:
152                            content=et2html(self.b.tree)
153                        else:
154                            content=self.b.toHTML()
155                    else:
156                        content=result
157               
158                if not self.ViewTextOnly:
159                    historyHTML='<p>'
160                    for item in self.session.getHistory():
161                        historyHTML+='<a href="%s">%s</a><br/>'%item
162                    historyHTML+='</p>'
163                    self.response.content=renderPage(
164                        content,historyHTML,historyHTML,self.b.name,self.config)
165                else:
166                    self.response.content=content
167               
168                return self.response
169               
170        def error(self,message):
171                ''' Construct a nice formal response, but don't throw a 404 ... '''
172                return '<p>Error: %s</p>'%message
173               
Note: See TracBrowser for help on using the repository browser.