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

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

wsSecurity.SignatureHandler? - extra options for passing config.

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 ZSI.wstools.Namespaces import OASIS
16from ConfigParser import SafeConfigParser
17from os.path import expandvars as exVar
18import copy
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    defParam = 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             refC14nKw={'unsuppressedPrefixes': []},
42             refC14nInclNS=[],
43             signedInfoC14nKw = {'unsuppressedPrefixes': []},
44             signedInfoC14nInclNS=[])
45   
46    def __init__(self, cfg=SafeConfigParser()):
47        dict.__init__(self)
48        self._cfg = cfg
49       
50        # Initialise parameters from ref in class var
51        self._param = WSSecurityConfig.defParam.copy()
52       
53
54    def read(self, *arg, **kw):
55        '''Read ConfigParser object but also set _param dict'''
56        self._cfg.read(*arg)
57       
58        # This enables WS-Security params to be set in a config file with
59        # other sections e.g. params could be under the section 'wssecurity'
60        if 'section' in kw:
61            section = kw['section']
62        else:
63            section = 'DEFAULT'
64             
65        for paramName in self._param:
66            # Options may be omitted and set later
67            if self._cfg.has_option(section, paramName):
68                # Switch based defParam type - TODO: refC14nKw and
69                # signedInfoC14nKw - maybe these should be removed as they're
70                # clumsy
71                if isinstance(WSSecurityConfig.defParam[paramName], list):
72                    try:
73                        self._param[paramName] = \
74                            exVar(self._cfg.get(section, paramName)).split()
75                    except AttributeError:
76                        raise SecurityConfigError('Setting "%s"' % paramName)
77                   
78                elif isinstance(WSSecurityConfig.defParam[paramName], bool):           
79                    self._param[paramName] = self._cfg.getboolean(section, 
80                                                                  paramName)
81                else:
82                    # Default to None if setting is an empty string.  Settings
83                    # of '' causes problems for M2Crypto parsing
84                    self._param[paramName] = \
85                        exVar(self._cfg.get(section, paramName)) or None
86
87    def __len__(self):
88        return len(self._param)
89   
90    def __iter__(self):
91        return self._param.__iter__()
92   
93    def __repr__(self):
94        """Return file properties dictionary as representation"""
95        return repr(self._param)
96
97    def __delitem__(self, key):
98        "Session Manager keys cannot be removed"       
99        raise KeyError('Keys cannot be deleted from ' + \
100                        WSSecurityConfig.__name__)
101
102    def __getitem__(self, key):
103        WSSecurityConfig.__name__ + \
104        """ behaves as data dictionary of WS-Security properties
105        """
106        if key not in self.defParam:
107            raise KeyError("Invalid key '%s'" % key)
108       
109        return self._param[key] 
110   
111    def __setitem__(self, key, item):
112        WSSecurityConfig.__name__ + \
113        """ behaves as data dictionary of WS-Security properties"""
114        if key not in WSSecurityConfig.defParam:
115            raise KeyError("Parameter key '%s' is not recognised" % key)
116       
117        self._param[key] = item
118
119    def copy(self):
120        wsSecurityConfig = WSSecurityConfig()
121        wsSecurityConfig._param = self._param.copy()
122        return wsSecurityConfig
123   
124    def get(self, key, *arg):
125        return self._param.get(key, *arg)
126
127    def clear(self):
128        raise WSSecurityConfigOpNotPermitted("Data cannot be cleared from "+\
129                                             WSSecurityConfig.__name__)
130   
131    def keys(self):
132        return self._param.keys()
133
134    def items(self):
135        return self._param.items()
136
137    def values(self):
138        return self._param.values()
139
140    def has_key(self, key):
141        return self._param.has_key(key)
142
143    # 'in' operator
144    def __contains__(self, key):
145        return key in self._param
146   
147    def update(self, seq, *arg):
148        badKeys = [i for i in seq if i not in WSSecurityConfig.defParam]
149        if badKeys:
150            raise KeyError("Parameter keys '%s' not recognised" % badKeys)
151        return self._param.update(seq, *arg)
152   
153    def fromkeys(self, seq):
154        badKeys = [i for i in seq if i not in WSSecurityConfig.defParam]
155        if badKeys:
156            raise KeyError("Parameter keys '%s' not recognised" % badKeys)
157        return self._param.fromkeys(*arg)
158   
159    def setdefault(self, key, *arg):
160        badKeys = [i for i in b if i not in WSSecurityConfig.defParam]
161        if badKeys:
162            raise KeyError("Parameter keys '%s' not recognised" % badKeys)
163        return self._param.setdefault(key, *arg)
164
165    def pop(self, key, *arg):
166        raise WSSecurityConfigOpNotPermitted("Params should not be deleted")
167   
168    def popitem(self):
169        raise WSSecurityConfigOpNotPermitted("Params should not be deleted")
170   
171    def iteritems(self):
172        return self._param.iteritems()
173   
174    def iterkeys(self):
175        return self._param.iterkeys()
176   
177    def itervalues(self):
178        return self._param.itervalues()
179
180# Temporary measure - until...
181# TODO: Move wsSecurity module into this package
182from ndg.security.common.wsSecurity import *
183   
Note: See TracBrowser for help on using the repository browser.