Skip to content

Commit dee7490

Browse files
committed
added encryption support, refactor code, unify errors
2 parents c73298a + b1e2186 commit dee7490

20 files changed

Lines changed: 903 additions & 179 deletions

setup.cfg

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
[pytest]
2-
addopts = tests -s -rx
1+
[bdist_rpm]
2+
release = 1
3+
build-requires = pkgconfig xmlsec1-devel libxml2-devel xmlsec1-openssl-devel
4+
group = Development/Libraries
5+
requires = python3-lxml xmlsec1 xmlsec1-openssl

setup.py

Lines changed: 21 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,75 +12,45 @@ def lazy(function):
1212
@wraps(function)
1313
def wrapped(*args, **kwargs):
1414

15-
class LazyProxy(object):
15+
class LazyProxy(Extension):
16+
__arguments = dict()
1617

1718
def __init__(self, function, args, kwargs):
18-
self._function = function
19-
self._args = args
20-
self._kwargs = kwargs
21-
self._result = None
19+
self.__arguments["function"] = function
20+
self.__arguments["args"] = args
21+
self.__arguments["kwargs"] = kwargs
22+
self.__arguments["result"] = None
2223

23-
def __getattribute__(self, name):
24-
if name in ['_function', '_args', '_kwargs', '_result']:
25-
return super(LazyProxy, self).__getattribute__(name)
24+
def __getattr__(self, item):
25+
if self.__arguments["result"] is None:
26+
self.__arguments["result"] = self.__arguments["function"](*self.__arguments["args"],
27+
**self.__arguments["kwargs"])
2628

27-
if self._result is None:
28-
self._result = self._function(*self._args, **self._kwargs)
29-
30-
return object.__getattribute__(self._result, name)
29+
return getattr(self.__arguments["result"], item)
3130

3231
def __setattr__(self, name, value):
33-
if name in ['_function', '_args', '_kwargs', '_result']:
34-
super(LazyProxy, self).__setattr__(name, value)
35-
return
36-
37-
if self._result is None:
38-
self._result = self._function(*self._args, **self._kwargs)
32+
if self.__arguments["result"] is None:
33+
self.__arguments["result"] = self.__arguments["function"](*self.__arguments["args"],
34+
**self.__arguments["kwargs"])
3935

40-
setattr(self._result, name, value)
36+
setattr(self.__arguments["result"], name, value)
4137

4238
return LazyProxy(function, args, kwargs)
4339

4440
return wrapped
4541

4642

47-
class Extension(Extension, object):
48-
49-
lxml_extended = False
50-
51-
@property
52-
def include_dirs(self):
53-
dirs = self.__dict__['include_dirs']
54-
if self.lxml_extended:
55-
return dirs
56-
57-
# Resolve lxml include directories.
58-
import lxml
59-
lxml_base = path.dirname(lxml.__file__)
60-
lxml_include = path.join(lxml_base, 'includes')
61-
62-
dirs.insert(0, lxml_include)
63-
dirs.insert(0, lxml_base)
64-
65-
self.lxml_extended = True
66-
return dirs
67-
68-
@include_dirs.setter
69-
def include_dirs(self, dirs):
70-
self.__dict__['include_dirs'] = dirs
71-
72-
7343
@lazy
7444
def make_extension(name, cython=True):
7545
from pkgconfig import parse
7646

7747
# Declare the crypto implementation.
78-
XMLSEC_CRYPTO = 'openssl'
48+
xmlsec_crypto = 'openssl'
7949

8050
# Process the `pkg-config` utility and discover include and library
8151
# directories.
8252
config = {}
83-
for lib in ['libxml-2.0', 'xmlsec1-%s' % XMLSEC_CRYPTO]:
53+
for lib in ['libxml-2.0', 'xmlsec1-%s' % xmlsec_crypto]:
8454
config.update(parse(lib))
8555

8656
config['extra_compile_args'] = ['-DXMLSEC_CRYPTO_OPENSSL=1']
@@ -93,6 +63,9 @@ def make_extension(name, cython=True):
9363
config['include_dirs'] = []
9464

9565
# Add the source directories for inclusion.
66+
import lxml
67+
config['include_dirs'].insert(0, path.dirname(lxml.__file__))
68+
config['include_dirs'].insert(0, path.join(path.dirname(lxml.__file__), 'includes'))
9669
config['include_dirs'].insert(0, 'src')
9770

9871
# Resolve extension location from name.
@@ -133,9 +106,6 @@ def make_extension(name, cython=True):
133106
install_requires=[
134107
'lxml >= 3.0',
135108
],
136-
extras_require={
137-
'test': ['pytest']
138-
},
139109
package_dir={'xmlsec': 'src/xmlsec'},
140110
packages=['xmlsec'],
141111
ext_modules=[
@@ -144,6 +114,7 @@ def make_extension(name, cython=True):
144114
make_extension('xmlsec.tree'),
145115
make_extension('xmlsec.key'),
146116
make_extension('xmlsec.ds'),
117+
make_extension('xmlsec.enc'),
147118
make_extension('xmlsec.template'),
148119
]
149120
)

src/xmlsec/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from .utils import *
77
from .key import *
88
from .ds import *
9+
from .enc import *
10+
from .error import *
911
from . import tree, template
1012

1113

src/xmlsec/constants.pxd

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,28 @@ cdef extern from "xmlsec.h": # xmlsec/strings.h
2424
const_xmlChar* xmlSecNodeObject
2525
const_xmlChar* xmlSecNodeManifest
2626
const_xmlChar* xmlSecNodeSignatureProperties
27+
const_xmlChar* xmlSecNodeEncryptedData
28+
const_xmlChar* xmlSecNodeEncryptedKey
29+
30+
# encryption types
31+
const_xmlChar* xmlSecTypeEncContent
32+
const_xmlChar* xmlSecTypeEncElement
33+
34+
ctypedef unsigned int xmlSecTransformUsage
35+
cdef enum:
36+
xmlSecTransformUsageUnknown=0x0000
37+
xmlSecTransformUsageDSigTransform=0x0001
38+
xmlSecTransformUsageC14NMethod=0x0002
39+
xmlSecTransformUsageDigestMethod=0x0004
40+
xmlSecTransformUsageSignatureMethod=0x0008
41+
xmlSecTransformUsageEncryptionMethod=0x0010
42+
xmlSecTransformUsageAny=0xFFFF
2743

2844
# Transform ids
2945
cdef struct _xmlSecTransformKlass:
3046
const_xmlChar* name
3147
const_xmlChar* href
48+
xmlSecTransformUsage usage
3249

3350
ctypedef _xmlSecTransformKlass *xmlSecTransformId
3451

src/xmlsec/constants.pyx

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import, unicode_literals, division
33

4-
from xmlsec.constants cimport *
5-
from xmlsec.utils cimport *
4+
from .constants cimport *
5+
from .utils cimport *
66

77
__all__ = [
88
'Namespace',
99
'Node',
10-
'Transform'
10+
'Transform',
11+
'EncryptionType'
1112
]
1213

1314

@@ -24,6 +25,11 @@ class Namespace:
2425
SOAP12 = _u(xmlSecSoap12Ns)
2526

2627

28+
class EncryptionType:
29+
CONTENT = _u(xmlSecTypeEncContent)
30+
ELEMENT = _u(xmlSecTypeEncElement)
31+
32+
2733
class Node:
2834
"""Digital signature nodes."""
2935
SIGNATURE = _u(xmlSecNodeSignature)
@@ -36,6 +42,22 @@ class Node:
3642
OBJECT = _u(xmlSecNodeObject)
3743
MANIFEST = _u(xmlSecNodeManifest)
3844
SIGNATURE_PROPERTIES = _u(xmlSecNodeSignatureProperties)
45+
ENCRYPTED_DATA = _u(xmlSecNodeEncryptedData)
46+
ENCRYPTED_KEY = _u(xmlSecNodeEncryptedKey)
47+
48+
49+
cdef class _Transform:
50+
property name:
51+
def __get__(self):
52+
return _u(self.target.name)
53+
54+
property href:
55+
def __get__(self):
56+
return _u(self.target.href)
57+
58+
property usage:
59+
def __get__(self):
60+
return self.target.usage
3961

4062

4163
cdef _Transform _mkti(xmlSecTransformId target):

0 commit comments

Comments
 (0)