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

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

Improve MILK configuration file, to simplify switching on/off the
browse/discovery/editor modes + improve look and feel - according
to mode of operation (inc. add new logos) + remove some obsolete
functionality + hide functions not relevant to the selected mode of
operation.

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 = \
48            self.__getTrueFalseValue(cf.get('DEFAULT','debug')) 
49       
50        self.globals.atomEditorEnabled = \
51            self.__getTrueFalseValue(cf.get('MILK_SERVER','editorOn')) 
52
53        self.globals.browseEnabled = \
54            self.__getTrueFalseValue(cf.get('MILK_SERVER','browseOn')) 
55
56        self.globals.discoveryEnabled = \
57            self.__getTrueFalseValue(cf.get('MILK_SERVER','discoveryOn')) 
58
59        self.globals.wmcClientURL = cf.get('WMC_CLIENT','url')
60       
61        self.globals.disclaimer=cf.get('default','disclaimer')
62       
63        self.globals.discoveryURL=cf.get('SEARCH','discoveryURL')
64       
65        self.globals.server=cf.get('DEFAULT','server','')
66
67        self.globals.proxyServer = cf.get('DEFAULT','proxyServer')
68               
69        # for standalone discovery
70        self.globals.standalone=cf.config.getboolean('DISCOVERY','standalone')
71
72        # NB, without this set, the default host on ndg.badc.rl.ac.uk will be
73        # used by discoveryServiceClient
74        if cf.config.has_option('DISCOVERY', 'discoveryServiceURL'):
75            self.globals.discoveryServiceURL = \
76                cf.config.get('DISCOVERY', 'discoveryServiceURL')
77               
78        self.globals.pwFile = cf.get('NDG_EXIST','passwordFile')
79        localDbHostName = cf.get('NDG_EXIST','local')
80        # set up the validator for atoms - to allow re-use across the app
81        self.globals.validator = AtomValidator(None, 
82                                               dbConfigFile = self.globals.pwFile, 
83                                               dbHostName = localDbHostName,
84                                               newLineChar="<br/>",
85                                               isDebug = self.globals.debugModeOn,
86                                               loadAllCollections = False)
87
88        # initialise collection to store re-usable connections to the eXist DB
89        self.globals.eXistDBCons = {}
90       
91        # Security Related
92
93        # Single Sign On settings - check for mode of operation:
94        # 1) act as a client to a separate Single Sign On Service
95        # or
96        # 2) Single Sign On service is integrated into THIS service
97        securityEnabled = not self.globals.standalone
98        isSSOClient = cf.config.has_section('NDG_SECURITY.ssoClient') and \
99            securityEnabled
100           
101        isSSOService = cf.config.has_section('NDG_SECURITY.ssoService') and \
102            securityEnabled
103           
104        if isSSOClient and isSSOService:
105            raise NDGConfigError(\
106                "NDG_SECURITY.ssoClient and NDG_SECURITY.ssoService " + \
107                "sections are present in the NDG Config file: " + \
108                "only one or the other may be set")
109 
110        if isSSOClient:
111            try:
112                from \
113            ndg.security.client.ssoclient.ssoclient.config.ssoClientMiddleware\
114                    import SSOMiddleware
115            except ImportError, e:
116                # If standalone flag is not present security must be enabled
117                raise NDGConfigError(\
118                    '%s: importing Single Sign On Client SSOMiddleware: %s' % \
119                        (__name__, e))
120                       
121               
122            self.app = SSOMiddleware(app, cf.config, g, app_conf,
123                                     defSection='NDG_SECURITY.ssoClient')
124           
125            self.globals.sslServer = g.ndg.security.common.sso.cfg.sslServer
126            self.globals.wayfuri=g.ndg.security.common.sso.cfg.wayfuri
127            self.globals.logout=g.ndg.security.common.sso.cfg.logoutURI
128           
129        elif isSSOService:
130            try:
131                from ndg.security.server.sso.sso.config.ssoServiceMiddleware \
132                    import SSOMiddleware
133            except ImportError, e:
134                # If standalone flag is not present security must be enabled
135                raise NDGConfigError(\
136                    '%s: importing Single Sign On Service SSOMiddleware: %s' %\
137                        (__name__, e))
138                       
139               
140            self.app = SSOMiddleware(app, g, app_conf,
141                                     defSection='NDG_SECURITY.ssoService',
142                                     wssSection='NDG_SECURITY.wssecurity')
143           
144            self.globals.sslServer=g.ndg.security.server.sso.cfg.sslServer
145            self.globals.wayfuri=g.ndg.security.server.sso.cfg.wayfuri
146            self.globals.logout=g.ndg.security.server.sso.cfg.logoutURI
147            self.globals.getCredentials=g.ndg.security.server.sso.cfg.getCredentials
148
149        # Policy Enforcement Point initialisation
150        if securityEnabled:
151            try:
152                from ndg.security.common.authz.pep import PEP
153            except ImportError, e:
154                # If standalone flag is not present security must be enabled
155                raise NDGConfigError('%s: expecting standalone config ' % \
156                        __name__ + 
157                        'flag set to False for Policy Enforcement Point ' + \
158                        'import: %s' % e)
159           
160            self.globals.pep = PEP(cfg=cf.config, 
161                                   cfgSection='NDG_SECURITY.gatekeeper')
162           
163        self.config=cf
164       
165        self.__setUpHelpText(g)
166
167    def __getTrueFalseValue(self, val):
168        '''
169        Check for config values that could be true/false in a consistent manner
170        @param val: value read from config object
171        @return True, if val is some form of 'true'
172        '''
173        if val and val.lower() == 'true':
174            return True
175        return False
176
177    def __setUpHelpText(self, g):
178       
179        cf = CONFIG['app_conf']['helpConfigfile']
180        cf = myConfig(cf)
181        # NB, the cf.config class lowercases everything.
182        for (section, val) in cf.config.items('ATOM_EDITOR'):
183            setattr(g, section, val)
184           
185        # extend the granulite example link - to add a valid location
186        g.example_granulite = g.example_granulite.replace('HREF', \
187            h.url_for('example'))
188       
189       
190    def __call__(self,environ,start_response):
191       
192        environ['ndgConfig']=self.config
193        return self.app(environ,start_response)
194   
Note: See TracBrowser for help on using the repository browser.