source: TI12-security/trunk/python/ndg.security.common/ndg/security/common/wssecurity/__init__.py @ 4331

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.common/ndg/security/common/wssecurity/__init__.py@4331
Revision 4331, 7.6 KB checked in by pjkersha, 11 years ago (diff)

Remove sessionCookie from init.py

Line 
1"""NDG Security wssecurity package - contains signature handler and config
2
3NERC Data Grid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "01/04/08"
7__copyright__ = "(C) 2008 STFC & NERC"
8__contact__ = "P.J.Kershaw@rl.ac.uk"
9__license__ = \
10"""This software may be distributed under the terms of the Q Public
11License, version 1.0 or later."""
12__contact__ = "P.J.Kershaw@rl.ac.uk"
13__revision__ = "$Id$"
14
15from ConfigParser import SafeConfigParser
16from os.path import expandvars as exVar
17import copy
18from ZSI.wstools.Namespaces import OASIS
19
20class WSSecurityConfigOpNotPermitted(Exception):
21    "Raise for dict methods not allowed in WSSecurityConfig"
22   
23class WSSecurityConfig(dict):
24    """Parser for WS-Security configuration.  Extends dict to enable
25    convenient interface for access to params.
26    """
27    propertyDefaults = dict(
28             reqBinSecTokValType=OASIS.X509TOKEN.X509,
29             verifyingCert=None,
30             verifyingCertFilePath=None,
31             signingCert=None,
32             signingCertFilePath=None, 
33             signingCertChain=[],
34             signingPriKey=None,
35             signingPriKeyFilePath=None, 
36             signingPriKeyPwd=None,
37             caCertDirPath=None,
38             caCertFilePathList=[],
39             addTimestamp=True,
40             applySignatureConfirmation=False,
41             refC14nInclNS=[],
42             signedInfoC14nInclNS=[])
43   
44    def __init__(self, cfg=SafeConfigParser()):
45        '''Initialise settings from an existing config file object or the
46        given path to config file
47       
48        @type cfg: SafeConfigParser or string
49        @param cfg: config object instance or file path to config file to be
50        parsed'''
51       
52        dict.__init__(self)
53       
54        # Initialise parameters from ref in class var
55        self._param = WSSecurityConfig.propertyDefaults.copy()
56       
57        if isinstance(cfg, basestring):
58            # Assume file path to be read
59            self.read(cfg)
60        else:
61            # Assume existing config type object
62            self._cfg = cfg
63       
64
65    def read(self, *filePathList):
66        '''Read ConfigParser object
67       
68        @type filePathList: tuple/list
69        @param filePathList: list of files to read config from'''
70        self._cfg = SafeConfigParser()
71       
72        # Expand environment variables in file list
73        filePathList = exVar(':'.join(filePathList)).split(':')
74        readFilePaths = self._cfg.read(filePathList)
75       
76        # Check files were read in OK
77        missingFilePaths = [file for file in filePathList \
78                            if file not in readFilePaths]
79        if len(missingFilePaths) > 0:
80            raise IOError('Missing config file(s): "%s"' % \
81                          '", "'.join(missingFilePaths))
82
83    def parse(self, **kw):
84        '''Extract items from config file and place in dict
85        @type **kw: dict
86        @param **kw: this enables WS-Security params to be set in a config file
87        with other sections e.g. params could be under the section 'wssecurity'
88        '''
89        section = kw.pop('section', 'DEFAULT')
90       
91        # Prefix for option names - optNames = name as they appear in the
92        # config file, self._param are the names used in the code.
93        prefix = kw.pop('prefix', None)
94        if prefix is not None:
95            optNames = ["%s.%s" % (prefix, optName) for optName in optNames] 
96        else:
97            optNames = self._param
98           
99        for optName, paramName in zip(optNames, self._param):
100           
101            # Parameters may be omitted and set later
102            if self._cfg.has_option(section, optName):
103                if isinstance(WSSecurityConfig.propertyDefaults[paramName], 
104                              list):
105                    try:
106                        self._param[paramName] = \
107                            exVar(self._cfg.get(section, optName)).split()
108                    except AttributeError:
109                        raise SecurityConfigError('Setting "%s"' % paramName)
110                   
111                elif isinstance(WSSecurityConfig.propertyDefaults[paramName], 
112                                bool):           
113                    self._param[paramName] = self._cfg.getboolean(section, 
114                                                                  optName)
115                else:
116                    # Default to None if setting is an empty string.  Settings
117                    # of '' causes problems for M2Crypto parsing
118                    self._param[paramName] = \
119                        exVar(self._cfg.get(section, optName)) or None
120
121    def __len__(self):
122        return len(self._param)
123   
124    def __iter__(self):
125        return self._param.__iter__()
126   
127    def __repr__(self):
128        """Return file properties dictionary as representation"""
129        return repr(self._param)
130
131    def __delitem__(self, key):
132        "Session Manager keys cannot be removed"       
133        raise KeyError('Keys cannot be deleted from ' + \
134                        WSSecurityConfig.__name__)
135
136    def __getitem__(self, key):
137        WSSecurityConfig.__name__ + \
138        """ behaves as data dictionary of WS-Security properties
139        """
140        if key not in WSSecurityConfig.propertyDefaults:
141            raise KeyError("Invalid key '%s'" % key)
142       
143        return self._param[key] 
144   
145    def __setitem__(self, key, item):
146        WSSecurityConfig.__name__ + \
147        """ behaves as data dictionary of WS-Security properties"""
148        if key not in WSSecurityConfig.propertyDefaults:
149            raise KeyError("Parameter key '%s' is not recognised" % key)
150       
151        self._param[key] = item
152
153    def copy(self):
154        wsSecurityConfig = WSSecurityConfig()
155        wsSecurityConfig._param = self._param.copy()
156        return wsSecurityConfig
157   
158    def get(self, key, *arg):
159        return self._param.get(key, *arg)
160
161    def clear(self):
162        raise WSSecurityConfigOpNotPermitted("Data cannot be cleared from "+\
163                                             WSSecurityConfig.__name__)
164   
165    def keys(self):
166        return self._param.keys()
167
168    def items(self):
169        return self._param.items()
170
171    def values(self):
172        return self._param.values()
173
174    def has_key(self, key):
175        return self._param.has_key(key)
176
177    # 'in' operator
178    def __contains__(self, key):
179        return key in self._param
180   
181    def update(self, seq, *arg):
182        badKeys=[i for i in seq if i not in WSSecurityConfig.propertyDefaults]
183        if badKeys:
184            raise KeyError("Parameter key(s) %s not recognised" % \
185                           ','.join(badKeys))
186        return self._param.update(seq, *arg)
187   
188    def fromkeys(self, seq):
189        badKeys=[i for i in seq if i not in WSSecurityConfig.propertyDefaults]
190        if badKeys:
191            raise KeyError("Parameter key(s) %s not recognised" % \
192                           ','.join(badKeys))
193        return self._param.fromkeys(*arg)
194   
195    def setdefault(self, key, *arg):
196        badKeys = [i for i in b if i not in WSSecurityConfig.propertyDefaults]
197        if badKeys:
198            raise KeyError("Parameter keys '%s' not recognised" % badKeys)
199        return self._param.setdefault(key, *arg)
200
201    def pop(self, key, *arg):
202        raise WSSecurityConfigOpNotPermitted("Params should not be deleted")
203   
204    def popitem(self):
205        raise WSSecurityConfigOpNotPermitted("Params should not be deleted")
206   
207    def iteritems(self):
208        return self._param.iteritems()
209   
210    def iterkeys(self):
211        return self._param.iterkeys()
212   
213    def itervalues(self):
214        return self._param.itervalues()
215   
Note: See TracBrowser for help on using the repository browser.