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

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

Better error handling, better xhtml compliance

  • 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()
7import os
8import ElementTree as ET
9from insecure import *
10from collections import deque # python 2.4
11from secure import *
12from stubB import *
13from renderEntity import renderEntity
14from renderPage import renderPage
15
16def EvaluateCredentials(ac,securityMetadata):
17        ''' Take Moles security metadata and compare with attribute certificate '''
18        return 1
19
20class RingBuffer(deque):
21    #deque is a python 2.4 class!
22    #credit http://www.onlamp.com/pub/a/python/excerpt/pythonckbk_chap1/index1.html
23    def __init__(self, size_max):
24        deque.__init__(self)
25        self.size_max = size_max
26    def append(self, datum):
27        deque.append(self, datum)
28        if len(self) > self.size_max:
29            self.popleft( )
30    def tolist(self):
31        return list(self)
32
33class BrowseSession:
34        ''' Holds the browse history and contact details for the NDG session manager '''
35        def __init__(self,cookie,url):
36                '''Instantiate and get security environment'''
37                # we should have two cookies, the NDG security cookie, and our browse history cookie!
38                self.cookie=cookie
39                self.history=RingBuffer(10)
40                self.ndgGate=gateway2NDGsession(cookie,url)
41                self.__loadBrowseHistory()
42                self.writeCookie()
43        def __loadBrowseHistory(self):
44                ''' 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)
52        def addToHistory(self,uri,name):
53                ''' Add a URI to the session history'''
54                self.history.append((uri,name))
55        def getHistory(self):
56                ''' Return a list of the items in the history '''
57                return self.history.tolist()
58        def getCredentials(self):
59                '''Obtain the attribute certificate from the wallet '''
60                return 'empty attribute certificate'
61        def writeCookie(self):
62                ''' Write out the current cookie '''
63                pass
64       
65class CGIcontroller:
66        ''' Currently holds the cgi environment and controls '''
67       
68        def __init__(self):
69                ''' Instantiate the CGI environment'''
70                self.env=os.environ
71                self.path=self.env.get('PATH_INFO','/')
72                self.FieldStorage=cgi.FieldStorage()
73
74        def goforit(self):
75                ''' This method actually responds to the user'''
76               
77                #Instantiate the Session Environment
78                self.cookie=self.env.get('HTTP_COOKIE',None)
79
80                #this will do for the moment, although I'd rather the whole
81                #URI was self consistent ...
82               
83                if self.FieldStorage.has_key('uri'):
84                        self.uri=self.FieldStorage['uri'].value
85                else: 
86                        return self.error('No valid URI')
87                self.session=BrowseSession(self.cookie,self.uri)
88               
89                #Handle authorisation
90                self.ac=self.session.getCredentials()
91       
92                self.b=stubB(self.uri)
93                if self.b.xml is not None:
94                        self.session.addToHistory(self.b.Burl,self.b.name)
95                        if EvaluateCredentials(self.ac,self.uri):
96                                #we can show the user the page
97                                #parsedHTML=self.b.toHTML()
98                                #bodge in the history list
99                                content=renderEntity(self.b)
100                        else:
101                                content=self.error('Not Allowed')
102                else:
103                        content=self.error('URI not available in database')
104                historyHTML='<p>'
105                for item in self.session.getHistory():
106                        historyHTML+='<a href="%s">%s</a><br/>'%item
107                historyHTML+='</p>'
108                       
109                return renderPage(content,historyHTML,historyHTML,self.b.name)
110               
111        def error(self,message):
112                ''' Construct a nice formal response, but don't throw a 404 ... '''
113                return '<p>Error: %s</p>'%message
114               
Note: See TracBrowser for help on using the repository browser.