Skip to content

Commit 64ee3ab

Browse files
authored
Merge pull request #175 from hoefling/pyxmlsec-error-callback
Work around xmlsec overwriting custom callback on init
2 parents cda5afc + 268c588 commit 64ee3ab

File tree

11 files changed

+43
-36
lines changed

11 files changed

+43
-36
lines changed

pyproject.toml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,7 @@ exclude = '''
1818
'''
1919

2020
[tool.isort]
21-
force_alphabetical_sort_within_sections = true
22-
recursive = true
23-
line_length = 130
24-
multi_line_output = 3
25-
include_trailing_comma = true
26-
force_grid_wrap = 0
27-
use_parentheses = true
28-
combine_as_imports = true
21+
profile = 'black'
2922
known_first_party = ['xmlsec']
3023
known_third_party = ['lxml', 'pytest', '_pytest', 'hypothesis']
3124

src/exception.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ void PyXmlSecEnableDebugTrace(int v) {
165165
PyXmlSec_PrintErrorMessage = v;
166166
}
167167

168+
void PyXmlSec_InstallErrorCallback() {
169+
if (PyXmlSec_LastErrorKey != 0) {
170+
xmlSecErrorsSetCallback(PyXmlSec_ErrorCallback);
171+
}
172+
}
173+
168174
// initializes errors module
169175
int PyXmlSec_ExceptionsModule_Init(PyObject* package) {
170176
PyXmlSec_Error = NULL;
@@ -185,9 +191,7 @@ int PyXmlSec_ExceptionsModule_Init(PyObject* package) {
185191
if (PyModule_AddObject(package, "VerificationError", PyXmlSec_VerificationError) < 0) goto ON_FAIL;
186192

187193
PyXmlSec_LastErrorKey = PyThread_create_key();
188-
if (PyXmlSec_LastErrorKey != 0) {
189-
xmlSecErrorsSetCallback(&PyXmlSec_ErrorCallback);
190-
}
194+
PyXmlSec_InstallErrorCallback();
191195

192196
return 0;
193197

src/exception.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@ void PyXmlSec_ClearError(void);
2424

2525
void PyXmlSecEnableDebugTrace(int);
2626

27+
void PyXmlSec_InstallErrorCallback();
28+
2729
#endif //__PYXMLSEC_EXCEPTIONS_H__

src/main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ PYENTRY_FUNC_NAME(void)
239239

240240
if (PyXmlSec_Init() < 0) goto ON_FAIL;
241241

242+
// xmlsec will install default callback in PyXmlSec_Init,
243+
// overwriting any custom callbacks.
244+
// We thus install our callback again now.
245+
PyXmlSec_InstallErrorCallback();
246+
242247
if (PyModule_AddStringConstant(module, "__version__", STRINGIFY(MODULE_VERSION)) < 0) goto ON_FAIL;
243248

244249
if (PyXmlSec_InitLxmlModule() < 0) goto ON_FAIL;

tests/base.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import gc
22
import os
33
import sys
4+
import unittest
45

56
from lxml import etree
6-
import xmlsec
77

8-
import unittest
8+
import xmlsec
99

10-
if sys.version_info < (3, ):
10+
if sys.version_info < (3,):
1111
unittest.TestCase.assertRaisesRegex = unittest.TestCase.assertRaisesRegexp
1212

1313

@@ -21,6 +21,8 @@
2121

2222
def get_memory_usage():
2323
return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
24+
25+
2426
except ImportError:
2527
resource = None
2628

@@ -112,9 +114,7 @@ def assertXmlEqual(self, first, second, msg=None):
112114
self.fail('Tags do not match: %s and %s. %s' % (first.tag, second.tag, msg))
113115
for name, value in first.attrib.items():
114116
if second.attrib.get(name) != value:
115-
self.fail(
116-
'Attributes do not match: %s=%r, %s=%r. %s' % (name, value, name, second.attrib.get(name), msg)
117-
)
117+
self.fail('Attributes do not match: %s=%r, %s=%r. %s' % (name, value, name, second.attrib.get(name), msg))
118118
for name in second.attrib.keys():
119119
if name not in first.attrib:
120120
self.fail('x2 has an attribute x1 is missing: %s. %s' % (name, msg))

tests/test_constants.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
"""Test constants from :mod:`xmlsec.constants` module."""
22

3-
import xmlsec
43
from hypothesis import given, strategies
54

5+
import xmlsec
6+
67

78
def _constants(typename):
89
return list(

tests/test_ds.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
23
import xmlsec
34
from tests import base
45

@@ -70,7 +71,7 @@ def test_sign_bad_args(self):
7071
def test_sign_fail(self):
7172
ctx = xmlsec.SignatureContext()
7273
ctx.key = xmlsec.Key.from_file(self.path("rsakey.pem"), format=consts.KeyDataFormatPem)
73-
with self.assertRaisesRegex(xmlsec.InternalError, 'failed to sign'):
74+
with self.assertRaisesRegex(xmlsec.Error, 'failed to sign'):
7475
ctx.sign(self.load_xml('sign1-in.xml'))
7576

7677
def test_sign_case1(self):
@@ -229,7 +230,7 @@ def test_verify_bad_args(self):
229230
def test_verify_fail(self):
230231
ctx = xmlsec.SignatureContext()
231232
ctx.key = xmlsec.Key.from_file(self.path("rsakey.pem"), format=consts.KeyDataFormatPem)
232-
with self.assertRaisesRegex(xmlsec.InternalError, 'failed to verify'):
233+
with self.assertRaisesRegex(xmlsec.Error, 'failed to verify'):
233234
ctx.verify(self.load_xml('sign1-in.xml'))
234235

235236
def test_verify_case_1(self):

tests/test_enc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def test_encrypt_uri_bad_args(self):
191191

192192
def test_encrypt_uri_fail(self):
193193
ctx = xmlsec.EncryptionContext()
194-
with self.assertRaisesRegex(xmlsec.InternalError, 'failed to encrypt URI'):
194+
with self.assertRaisesRegex(xmlsec.Error, 'failed to encrypt URI'):
195195
ctx.encrypt_uri(etree.Element('root'), '')
196196

197197
def test_decrypt1(self):

tests/test_keys.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def test_key_from_memory_with_bad_args(self):
1717
xmlsec.Key.from_memory(1, format="")
1818

1919
def test_key_from_memory_invalid_data(self):
20-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot load key.*'):
20+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot load key.*'):
2121
xmlsec.Key.from_memory(b'foo', format=consts.KeyDataFormatPem)
2222

2323
def test_key_from_file(self):
@@ -29,7 +29,7 @@ def test_key_from_file_with_bad_args(self):
2929
xmlsec.Key.from_file(1, format="")
3030

3131
def test_key_from_invalid_file(self):
32-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot read key.*'):
32+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot read key.*'):
3333
with tempfile.NamedTemporaryFile() as tmpfile:
3434
tmpfile.write(b'foo')
3535
xmlsec.Key.from_file(tmpfile.name, format=consts.KeyDataFormatPem)
@@ -42,7 +42,7 @@ def test_key_from_fileobj(self):
4242
def test_key_from_invalid_fileobj(self):
4343
with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
4444
tmpfile.write(b'foo')
45-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot read key.*'), open(tmpfile.name) as fp:
45+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot read key.*'), open(tmpfile.name) as fp:
4646
xmlsec.Key.from_file(fp, format=consts.KeyDataFormatPem)
4747

4848
def test_generate(self):
@@ -54,7 +54,7 @@ def test_generate_with_bad_args(self):
5454
xmlsec.Key.generate(klass="", size="", type="")
5555

5656
def test_generate_invalid_size(self):
57-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot generate key.*'):
57+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot generate key.*'):
5858
xmlsec.Key.generate(klass=consts.KeyDataAes, size=0, type=consts.KeyDataTypeSession)
5959

6060
def test_from_binary_file(self):
@@ -66,7 +66,7 @@ def test_from_binary_file_with_bad_args(self):
6666
xmlsec.Key.from_binary_file(klass="", filename=1)
6767

6868
def test_from_invalid_binary_file(self):
69-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot read key.*'):
69+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot read key.*'):
7070
with tempfile.NamedTemporaryFile() as tmpfile:
7171
tmpfile.write(b'foo')
7272
xmlsec.Key.from_binary_file(klass=consts.KeyDataDes, filename=tmpfile.name)
@@ -80,7 +80,7 @@ def test_from_binary_data_with_bad_args(self):
8080
xmlsec.Key.from_binary_data(klass="", data=1)
8181

8282
def test_from_invalid_binary_data(self):
83-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot read key.*'):
83+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot read key.*'):
8484
xmlsec.Key.from_binary_data(klass=consts.KeyDataDes, data=b'')
8585

8686
def test_load_cert_from_file(self):
@@ -97,7 +97,7 @@ def test_load_cert_from_file_with_bad_args(self):
9797
def test_load_cert_from_invalid_file(self):
9898
key = xmlsec.Key.from_file(self.path("rsakey.pem"), format=consts.KeyDataFormatPem)
9999
self.assertIsNotNone(key)
100-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot load cert.*'):
100+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot load cert.*'):
101101
with tempfile.NamedTemporaryFile() as tmpfile:
102102
tmpfile.write(b'foo')
103103
key.load_cert_from_file(tmpfile.name, format=consts.KeyDataFormatPem)
@@ -119,7 +119,7 @@ def test_load_cert_from_invalid_fileobj(self):
119119
self.assertIsNotNone(key)
120120
with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
121121
tmpfile.write(b'foo')
122-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot load cert.*'), open(tmpfile.name) as fp:
122+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot load cert.*'), open(tmpfile.name) as fp:
123123
key.load_cert_from_file(fp, format=consts.KeyDataFormatPem)
124124

125125
def test_load_cert_from_memory(self):
@@ -136,7 +136,7 @@ def test_load_cert_from_memory_with_bad_args(self):
136136
def test_load_cert_from_memory_invalid_data(self):
137137
key = xmlsec.Key.from_file(self.path("rsakey.pem"), format=consts.KeyDataFormatPem)
138138
self.assertIsNotNone(key)
139-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot load cert.*'):
139+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot load cert.*'):
140140
key.load_cert_from_memory(b'', format=consts.KeyDataFormatPem)
141141

142142
def test_get_name(self):
@@ -190,7 +190,7 @@ def test_load_cert(self):
190190
def test_load_cert_with_bad_args(self):
191191
mngr = xmlsec.KeysManager()
192192
mngr.add_key(xmlsec.Key.from_file(self.path("rsakey.pem"), format=consts.KeyDataFormatPem))
193-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot load cert.*'):
193+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot load cert.*'):
194194
with tempfile.NamedTemporaryFile() as tmpfile:
195195
tmpfile.write(b'foo')
196196
mngr.load_cert(tmpfile.name, format=consts.KeyDataFormatPem, type=consts.KeyDataTypeTrusted)
@@ -215,7 +215,7 @@ def test_load_cert_from_memory_with_bad_args(self):
215215
def test_load_cert_from_memory_invalid_data(self):
216216
mngr = xmlsec.KeysManager()
217217
mngr.add_key(xmlsec.Key.from_file(self.path("rsakey.pem"), format=consts.KeyDataFormatPem))
218-
with self.assertRaisesRegex(xmlsec.InternalError, '.*cannot load cert.*'):
218+
with self.assertRaisesRegex(xmlsec.Error, '.*cannot load cert.*'):
219219
mngr.load_cert_from_memory(b'', format=consts.KeyDataFormatPem, type=consts.KeyDataTypeTrusted)
220220

221221
def test_load_invalid_key(self):

tests/test_templates.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
23
from lxml import etree
34

45
import xmlsec
@@ -36,7 +37,7 @@ def test_ensure_key_info(self):
3637
self.assertEqual("Id", ki.get("Id"))
3738

3839
def test_ensure_key_info_fail(self):
39-
with self.assertRaisesRegex(xmlsec.InternalError, 'cannot ensure key info.'):
40+
with self.assertRaisesRegex(xmlsec.Error, 'cannot ensure key info.'):
4041
xmlsec.template.ensure_key_info(etree.fromstring(b'<Data/>'), id="Id")
4142

4243
def test_ensure_key_info_bad_args(self):
@@ -88,7 +89,7 @@ def test_add_reference_bad_args(self):
8889
xmlsec.template.add_reference(etree.Element('root'), '')
8990

9091
def test_add_reference_fail(self):
91-
with self.assertRaisesRegex(xmlsec.InternalError, 'cannot add reference.'):
92+
with self.assertRaisesRegex(xmlsec.Error, 'cannot add reference.'):
9293
xmlsec.template.add_reference(etree.Element('root'), consts.TransformSha1)
9394

9495
def test_add_transform_bad_args(self):

0 commit comments

Comments
 (0)