From 987f51e81f357812fb64ae481c3acecb548e481c Mon Sep 17 00:00:00 2001 From: Noel Power Date: Fri, 2 Feb 2018 16:08:48 +0000 Subject: [PATCH 1/2] python3 port for dckeytab module Signed-off-by: Noel Power --- source4/libnet/py_net_dckeytab.c | 26 +++++++++++++++++++------- source4/libnet/wscript_build | 12 ++++++------ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/source4/libnet/py_net_dckeytab.c b/source4/libnet/py_net_dckeytab.c index efb92677055..cf43da71c60 100644 --- a/source4/libnet/py_net_dckeytab.c +++ b/source4/libnet/py_net_dckeytab.c @@ -22,6 +22,7 @@ #include #include "includes.h" +#include "python/py3compat.h" #include "py_net.h" #include "libnet_export_keytab.h" @@ -74,28 +75,37 @@ static PyMethodDef export_keytab_method_table[] = { * the global module table even if we don't really need that record. Thus, we initialize * dckeytab module but never use it. * */ -void initdckeytab(void) +void initdckeytab(void); +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + .m_name = "dckeytab", + .m_doc = "dckeytab", + .m_size = -1, + .m_methods = NULL +}; + +MODULE_INIT_FUNC(dckeytab) { - PyObject *m; + PyObject *m = NULL; PyObject *Net; PyObject *descr; int ret; - m = Py_InitModule3("dckeytab", NULL, NULL); + m = PyModule_Create(&moduledef); if (m == NULL) - return; + return m; m = PyImport_ImportModule("samba.net"); if (m == NULL) - return; + return m; Net = (PyObject *)PyObject_GetAttrString(m, "Net"); if (Net == NULL) - return; + return m; descr = PyDescr_NewMethod((PyTypeObject*)Net, &export_keytab_method_table[0]); if (descr == NULL) - return; + return m; ret = PyDict_SetItemString(((PyTypeObject*)Net)->tp_dict, export_keytab_method_table[0].ml_name, @@ -103,4 +113,6 @@ void initdckeytab(void) if (ret != -1) { Py_DECREF(descr); } + + return m; } diff --git a/source4/libnet/wscript_build b/source4/libnet/wscript_build index e192eb59404..df0a097e520 100644 --- a/source4/libnet/wscript_build +++ b/source4/libnet/wscript_build @@ -18,9 +18,9 @@ for env in bld.gen_python_environments(): realname='samba/net.so' ) -bld.SAMBA_PYTHON('python_dckeytab', - source='py_net_dckeytab.c libnet_export_keytab.c', - deps='pyrpc_util db-glue krb5 com_err', - realname='samba/dckeytab.so', - enabled=bld.CONFIG_SET('AD_DC_BUILD_IS_ENABLED') - ) + bld.SAMBA_PYTHON('python_dckeytab', + source='py_net_dckeytab.c libnet_export_keytab.c', + deps='pyrpc_util db-glue krb5 com_err', + realname='samba/dckeytab.so', + enabled=bld.CONFIG_SET('AD_DC_BUILD_IS_ENABLED') + ) From 18adbc13ca33859600fd1739d03af07843ac888b Mon Sep 17 00:00:00 2001 From: David Mulder Date: Fri, 16 Feb 2018 10:00:19 -0700 Subject: [PATCH 2/2] Add tests for dckeytab python module Signed-off-by: David Mulder --- python/samba/tests/dckeytab.py | 38 ++++++++++++++++++++++++++++++++++++++ source4/selftest/tests.py | 3 +++ 2 files changed, 41 insertions(+) create mode 100644 python/samba/tests/dckeytab.py diff --git a/python/samba/tests/dckeytab.py b/python/samba/tests/dckeytab.py new file mode 100644 index 00000000000..50dc305800b --- /dev/null +++ b/python/samba/tests/dckeytab.py @@ -0,0 +1,38 @@ +import os, sys, string +from samba.net import Net +import samba.dckeytab +from samba import tests +from samba.param import LoadParm + +def open_bytes(filename): + if sys.version_info[0] == 3: + return open(filename, errors='ignore') + else: + return open(filename, 'rb') + +class DCKeytabTests(tests.TestCase): + def setUp(self): + super(DCKeytabTests, self).setUp() + self.lp = LoadParm() + self.lp.load_default() + self.creds = self.insta_creds(template=self.get_credentials()) + self.ktfile = os.path.join(self.lp.get('private dir'), 'test.keytab') + self.principal = self.creds.get_principal() + + def tearDown(self): + super(DCKeytabTests, self).tearDown() + os.remove(self.ktfile) + + def test_export_keytab(self): + net = Net(None, self.lp) + net.export_keytab(keytab=self.ktfile, principal=self.principal) + assert os.path.exists(self.ktfile), 'keytab was not created' + with open_bytes(self.ktfile) as bytes_kt: + result = '' + for c in bytes_kt.read(): + if c in string.printable: + result += c + principal_parts = self.principal.split('@') + assert principal_parts[0] in result and \ + principal_parts[1] in result, \ + 'Principal not found in generated keytab' diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py index 4e397a8f134..65e0e2490e0 100755 --- a/source4/selftest/tests.py +++ b/source4/selftest/tests.py @@ -613,6 +613,9 @@ def planoldpythontestsuite(env, module, name=None, extra_path=[], environ={}, ex planpythontestsuite("ad_dc:local", "samba.tests.samba_tool.dnscmd") planpythontestsuite("ad_dc_ntvfs:local", "samba.tests.dcerpc.rpcecho") + +planoldpythontestsuite("ad_dc:local", "samba.tests.dckeytab", extra_args=['-U"$USERNAME%$PASSWORD"'], py3_compatible=True) + planoldpythontestsuite("ad_dc_ntvfs:local", "samba.tests.dcerpc.registry", extra_args=['-U"$USERNAME%$PASSWORD"']) planoldpythontestsuite("ad_dc_ntvfs", "samba.tests.dcerpc.dnsserver", extra_args=['-U"$USERNAME%$PASSWORD"']) planoldpythontestsuite("ad_dc", "samba.tests.dcerpc.dnsserver", extra_args=['-U"$USERNAME%$PASSWORD"'])