source: MILK/trunk/milk_server/milk_server/config/milkMiddleware.py @ 4992

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/MILK/trunk/milk_server/milk_server/config/milkMiddleware.py@4992
Revision 4992, 7.5 KB checked in by cbyrom, 11 years ago (diff)

Adjust code to fit with changes to ndgCommon codebase + tidy up
structure of ndgInterface to make easier to follow + add documentation
+ add universal debug mode + various other small code tidy ups.

Line 
1'''
2Class defining the config params for the milk server
3'''
4from paste.deploy import CONFIG
5from ndg.common.src.models.myconfig import myConfig
6from ndg.common.src.lib.atomvalidator import AtomValidator
7import milk_server.lib.helpers as h
8
9class NDGConfigError(Exception): 
10    '''Errors related to reading from ndg config file'''
11     
12class milkMiddleware:
13   
14    def __init__(self, app, g, app_conf):
15       
16        #this is the next application in the wsgi stack
17        self.app=app
18       
19        #set up the ndg configuration file
20        cf= CONFIG['app_conf']['configfile']
21        cf=myConfig(cf)
22     
23        self.globals=g
24        self.globals.htdocs=cf.get('DEFAULT','htdocs',None)
25        self.globals.localLink=cf.get('layout','localLink',None)
26        self.globals.localAlt=cf.get('layout','localAlt','Visit Local Site')
27        self.globals.ndgLink=cf.get('layout','ndgLink','http://ndg.nerc.ac.uk')
28        self.globals.ndgImage=cf.get('layout','ndgImage',None)
29        self.globals.ndgAlt=cf.get('layout','ndgAlt','Visit NDG')
30        self.globals.stfcLink=cf.get('layout','stfcLink')
31        self.globals.stfcImage=cf.get('layout','stfcImage')
32        self.globals.helpIcon=cf.get('layout','helpIcon')
33        self.globals.navPlus=cf.get('layout','navPlus')
34        self.globals.loadingIcon=cf.get('layout','loadingIcon')
35        self.globals.navMinus=cf.get('layout','navMinus')
36        self.globals.LeftAlt=cf.get('layout','HdrLeftAlt')
37        self.globals.LeftLogo=cf.get('layout','HdrLeftLogo')
38        self.globals.pageLogo="bodcHdr"
39        self.globals.icons_xml=cf.get('layout','Xicon')
40        self.globals.icons_plot=cf.get('layout','plot')
41        self.globals.icons_prn=cf.get('layout','printer')
42        self.globals.icons_A=cf.get('NDG_A_SERVICE','icon')
43        self.globals.icons_B=cf.get('NDG_B_SERVICE','icon')
44        self.globals.icons_D=cf.get('DISCOVERY','icon')
45        self.globals.icons_R=cf.get('RELATED','icon')
46        self.globals.icons_key=cf.get('layout','key')
47        self.globals.debugModeOn = cf.get('DEFAULT','debug') or False
48       
49        self.globals.atomEditorEnabled = cf.get('ATOM_EDITOR','enabled')
50
51        self.globals.wmcClientURL = cf.get('WMC_CLIENT','url')
52       
53        self.globals.disclaimer=cf.get('default','disclaimer')
54       
55        self.globals.discoveryURL=cf.get('SEARCH','discoveryURL')
56       
57        self.globals.server=cf.get('DEFAULT','server','')
58
59        # for standalone discovery
60        self.globals.standalone=cf.config.getboolean('DISCOVERY','standalone')
61
62        # NB, without this set, the default host on ndg.badc.rl.ac.uk will be
63        # used by discoveryServiceClient
64        if cf.config.has_option('DISCOVERY', 'discoveryServiceURL'):
65            self.globals.discoveryServiceURL = \
66                cf.config.get('DISCOVERY', 'discoveryServiceURL')
67               
68        self.globals.pwFile = cf.get('NDG_EXIST','passwordFile')
69        localDbHostName = cf.get('NDG_EXIST','local')
70        # set up the validator for atoms - to allow re-use across the app
71        self.globals.validator = AtomValidator(None, 
72                                               dbConfigFile = self.globals.pwFile, 
73                                               dbHostName = localDbHostName,
74                                               newLineChar="<br/>",
75                                               isDebug = self.globals.debugModeOn,
76                                               loadAllCollections = False)
77
78        # initialise collection to store re-usable connections to the eXist DB
79        self.globals.eXistDBCons = {}
80       
81        # Security Related
82
83        # Single Sign On settings - check for mode of operation:
84        # 1) act as a client to a separate Single Sign On Service
85        # or
86        # 2) Single Sign On service is integrated into THIS service
87        securityEnabled = not self.globals.standalone
88        isSSOClient = cf.config.has_section('NDG_SECURITY.ssoClient') and \
89            securityEnabled
90           
91        isSSOService = cf.config.has_section('NDG_SECURITY.ssoService') and \
92            securityEnabled
93           
94        if isSSOClient and isSSOService:
95            raise NDGConfigError(\
96                "NDG_SECURITY.ssoClient and NDG_SECURITY.ssoService " + \
97                "sections are present in the NDG Config file: " + \
98                "only one or the other may be set")
99 
100        if isSSOClient:
101            try:
102                from \
103            ndg.security.client.ssoclient.ssoclient.config.ssoClientMiddleware\
104                    import SSOMiddleware
105            except ImportError, e:
106                # If standalone flag is not present security must be enabled
107                raise NDGConfigError(\
108                    '%s: importing Single Sign On Client SSOMiddleware: %s' % \
109                        (__name__, e))
110                       
111               
112            self.app = SSOMiddleware(app, cf.config, g, app_conf,
113                                     defSection='NDG_SECURITY.ssoClient')
114           
115            self.globals.sslServer = g.ndg.security.common.sso.cfg.sslServer
116            self.globals.wayfuri=g.ndg.security.common.sso.cfg.wayfuri
117            self.globals.logout=g.ndg.security.common.sso.cfg.logoutURI
118           
119        elif isSSOService:
120            try:
121                from ndg.security.server.sso.sso.config.ssoServiceMiddleware \
122                    import SSOMiddleware
123            except ImportError, e:
124                # If standalone flag is not present security must be enabled
125                raise NDGConfigError(\
126                    '%s: importing Single Sign On Service SSOMiddleware: %s' %\
127                        (__name__, e))
128                       
129               
130            self.app = SSOMiddleware(app, g, app_conf,
131                                     defSection='NDG_SECURITY.ssoService',
132                                     wssSection='NDG_SECURITY.wssecurity')
133           
134            self.globals.sslServer=g.ndg.security.server.sso.cfg.sslServer
135            self.globals.wayfuri=g.ndg.security.server.sso.cfg.wayfuri
136            self.globals.logout=g.ndg.security.server.sso.cfg.logoutURI
137            self.globals.getCredentials=g.ndg.security.server.sso.cfg.getCredentials
138
139        # Policy Enforcement Point initialisation
140        if securityEnabled:
141            try:
142                from ndg.security.common.authz.pep import PEP
143            except ImportError, e:
144                # If standalone flag is not present security must be enabled
145                raise NDGConfigError('%s: expecting standalone config ' % \
146                        __name__ + 
147                        'flag set to False for Policy Enforcement Point ' + \
148                        'import: %s' % e)
149           
150            self.globals.pep = PEP(cfg=cf.config, 
151                                   cfgSection='NDG_SECURITY.gatekeeper')
152           
153        self.config=cf
154       
155        self.__setUpHelpText(g)
156
157
158    def __setUpHelpText(self, g):
159       
160        cf = CONFIG['app_conf']['helpConfigfile']
161        cf = myConfig(cf)
162        # NB, the cf.config class lowercases everything.
163        for (section, val) in cf.config.items('ATOM_EDITOR'):
164            setattr(g, section, val)
165           
166        # extend the granulite example link - to add a valid location
167        g.example_granulite = g.example_granulite.replace('HREF', \
168            h.url_for('example'))
169       
170       
171    def __call__(self,environ,start_response):
172       
173        environ['ndgConfig']=self.config
174        return self.app(environ,start_response)
175   
Note: See TracBrowser for help on using the repository browser.