Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <xmlsec/xmlsec.h>
#include <xmlsec/crypto.h>
#include <xmlsec/errors.h>
#include <xmlsec/base64.h>

#define _PYXMLSEC_FREE_NONE 0
#define _PYXMLSEC_FREE_XMLSEC 1
Expand Down Expand Up @@ -127,6 +128,34 @@ static PyObject* PyXmlSec_PyEnableDebugOutput(PyObject *self, PyObject* args, Py
Py_RETURN_NONE;
}

static char PyXmlSec_PyBase64DefaultLineSize__doc__[] = \
"base64_default_line_size(size = None)\n"
"Configures the default maximum columns size for base64 encoding.\n\n"
"If ``size`` is not given, this function returns the current default size, acting as a getter. "
"If ``size`` is given, a new value is applied and this function returns nothing, acting as a setter.\n"
":param size: new default size value (optional)\n"
":type size: :class:`int` or :data:`None`";
static PyObject* PyXmlSec_PyBase64DefaultLineSize(PyObject *self, PyObject *args, PyObject *kwargs) {
static char *kwlist[] = { "size", NULL };
PyObject *pySize = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:base64_default_line_size", kwlist, &pySize)) {
return NULL;
}
if (pySize == NULL) {
return PyLong_FromLong(xmlSecBase64GetDefaultLineSize());
}
int size = (int)PyLong_AsLong(pySize);
if (PyErr_Occurred()) {
return NULL;
}
if (size < 0) {
PyErr_SetString(PyExc_ValueError, "size must be positive");
return NULL;
}
xmlSecBase64SetDefaultLineSize(size);
Py_RETURN_NONE;
}

static PyMethodDef PyXmlSec_MainMethods[] = {
{
"init",
Expand All @@ -146,6 +175,12 @@ static PyMethodDef PyXmlSec_MainMethods[] = {
METH_VARARGS|METH_KEYWORDS,
PyXmlSec_PyEnableDebugOutput__doc__
},
{
"base64_default_line_size",
(PyCFunction)PyXmlSec_PyBase64DefaultLineSize,
METH_VARARGS|METH_KEYWORDS,
PyXmlSec_PyBase64DefaultLineSize__doc__
},
{NULL, NULL} /* sentinel */
};

Expand Down
6 changes: 5 additions & 1 deletion src/xmlsec/__init__.pyi
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import sys
from typing import AnyStr, IO, Iterable, Optional, Type, TypeVar, Union
from typing import AnyStr, IO, Iterable, Optional, Type, TypeVar, Union, overload

from lxml.etree import _Element

Expand All @@ -24,6 +24,10 @@ _K = TypeVar('_K', bound=Key)
def enable_debug_trace(enabled: bool = ...) -> None: ...
def init() -> None: ...
def shutdown() -> None: ...
@overload
def base64_default_line_size() -> int: ...
@overload
def base64_default_line_size(size: int) -> None: ...

class EncryptionContext:
key: Optional[Key]
Expand Down
32 changes: 32 additions & 0 deletions tests/test_main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import xmlsec
from tests import base


class TestBase64LineSize(base.TestMemoryLeaks):
def tearDown(self):
xmlsec.base64_default_line_size(64)
super(TestBase64LineSize, self).tearDown()

def test_get_base64_default_line_size(self):
self.assertEqual(xmlsec.base64_default_line_size(), 64)

def test_set_base64_default_line_size_positional_arg(self):
xmlsec.base64_default_line_size(0)
self.assertEqual(xmlsec.base64_default_line_size(), 0)

def test_set_base64_default_line_size_keyword_arg(self):
xmlsec.base64_default_line_size(size=0)
self.assertEqual(xmlsec.base64_default_line_size(), 0)

def test_set_base64_default_line_size_with_bad_args(self):
size = xmlsec.base64_default_line_size()
for bad_size in (None, '', object()):
with self.assertRaises(TypeError):
xmlsec.base64_default_line_size(bad_size)
self.assertEqual(xmlsec.base64_default_line_size(), size)

def test_set_base64_default_line_size_rejects_negative_values(self):
size = xmlsec.base64_default_line_size()
with self.assertRaises(ValueError):
xmlsec.base64_default_line_size(-1)
self.assertEqual(xmlsec.base64_default_line_size(), size)