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

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