The branch, master has been updated via f8d9751 python/samba/netcmd: Fix wrong exception referenced in code via d96d85a python/samba/kcc: md5 needs to be passed bytes in py3 via 1a9786f python/samba/tests: various py3 porting for ord/chr via f59a20e s4/torure/drs/python: Fix incorrect use of unicode which doesn't exist in py3 via fee61c5 s4/torture/drs/python: xrange -> range for py2/py3 compat via 08c9ce4 s4/torture/drs/python: long is not used in py3 via 409ad5c s4/torture/drs/python: use cmp_fn for cmp (for py2/py3 compat) via 77ee94c s4/torture/drs/python: use cmp_fn and key=cmp_to_key_fn for py2/py3 via 0e930df python/samba: Add cmp_fn and cmp_to_key_fn functions for py2/py3 via 06d3eac s4/torture/drs/python: py2/py3 port map / ord usage via 343dc31 s4/torture/drs: ndr_upack needs bytes in py3 (samba4.drs.repl_move) via 2a2c221 s4/dsdb/tests/python: base64.b64encode returns bytes via 883c3d8 s4/librpc/ndr: allow GUID to accept unicode also via bbc5d31 python/samba/netcmd: Fix relative module import via c46fd16 python/samba/netcmd: Protect variable that can be None via 352eee5 python/samba/netcmd: fix py2/py3 bytes usage for replace via e915d18 s4/torture/drs/python: Py2/Py2 fix tab/space also incorrect unicode usage via 7b17020 lib/ldb: Implement a bytes derived object for attributes py2/py3 via 337ae8c python/samba/tests: remove Py2 specific imports. via 7d43571 python/samba/emulate: Fix some more missed exception tuple assignments via d5cd9af python/samba/tests: Py2/Py3 port for hexdump via 5b96e34 python/samba/tests: Py2/Py3 allow import of ndr_(un)pack to work via 9b16463 samdb: use int for get and set methods instead of digit str from f3358f0 gpo: Specify samba module when importing from gpclass
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit f8d9751344c75f1f343b857db82f689847628adc Author: Noel Power <noel.po...@suse.com> Date: Wed Jun 27 12:01:18 2018 +0100 python/samba/netcmd: Fix wrong exception referenced in code post commit: 52729d35495db638c84caa8cc6f5ffdf0b670353 wrong exception name was referenced. Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Fri Jul 13 04:01:59 CEST 2018 on sn-devel-144 commit d96d85a22be6da5b627ea6de212e99b8d08dca94 Author: Noel Power <noel.po...@suse.com> Date: Tue Jun 19 11:22:50 2018 +0100 python/samba/kcc: md5 needs to be passed bytes in py3 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 1a9786fe585d0354c20585768e8bd057a1473650 Author: Noel Power <noel.po...@suse.com> Date: Mon Jun 18 18:02:01 2018 +0100 python/samba/tests: various py3 porting for ord/chr various messages are lists of ints that need converting to str or bytes depending on py2/py3, others are str/bytes that need modification and are converted to lists or string char or ints for modificate (and then reconstructed as str/bytes again) Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit f59a20eb3b20b12fbf128b93c2a7a768be89e656 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 16:26:28 2018 +0100 s4/torure/drs/python: Fix incorrect use of unicode which doesn't exist in py3 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit fee61c57348d6964f61b27feef9d27b70889ed49 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 15:13:56 2018 +0100 s4/torture/drs/python: xrange -> range for py2/py3 compat Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 08c9ce41e91c5e68aa116e5b5b2bae97353f2fbc Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 14:29:42 2018 +0100 s4/torture/drs/python: long is not used in py3 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 409ad5c0f07445ea7d12466b56fbfbccfe71c2d1 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 13:06:13 2018 +0100 s4/torture/drs/python: use cmp_fn for cmp (for py2/py3 compat) Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 77ee94c3df1180da5cb6c7cc478bd814e1d02258 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 13:04:13 2018 +0100 s4/torture/drs/python: use cmp_fn and key=cmp_to_key_fn for py2/py3 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 0e930dfb477b121b69351cc9a011dfb71bcd10c0 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 13:00:15 2018 +0100 python/samba: Add cmp_fn and cmp_to_key_fn functions for py2/py3 the cmp function and the cmp paramater (e.g. to sort functions) no longer exist in python3. cmp_fn is provides the missing functionality of the py2 cmp builtin function. cmp_to_key_fn allows the key paramater (e.g. for sort) to use the old py2 cmp function for sorting. Note: the cmp_to_key is present in since 2.7 (hence the inclusion of the source code for this function pre that version) Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andreas Schneider <a...@samba.org> Signed-off-by: Joe Guo <j...@catalyst.net.nz> commit 06d3eac8a1f74b2954f6ca01a8ee3c33c23f1df5 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 10:58:13 2018 +0100 s4/torture/drs/python: py2/py3 port map / ord usage Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 343dc311486a07be0830e15311c548d1ab53b7cf Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 15 10:18:30 2018 +0100 s4/torture/drs: ndr_upack needs bytes in py3 (samba4.drs.repl_move) Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 2a2c22136ba63eb994faa6b2eeda342dd5491d49 Author: Noel Power <noel.po...@suse.com> Date: Thu May 31 16:13:28 2018 +0100 s4/dsdb/tests/python: base64.b64encode returns bytes adjust to unicode for py2/py3 compat needed as part of changes to ensure samba4.ldap.password_settings will work with PY3 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 883c3d8d646135c182db3c6f4085edb052929bcf Author: Noel Power <noel.po...@suse.com> Date: Fri May 18 17:15:44 2018 +0100 s4/librpc/ndr: allow GUID to accept unicode also This needed since _GUID_string method change (in source4/torture/drs/python/drs_base.py) which makes use use a unicode guid at times now Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit bbc5d3147064e211df0619689945ea32468f5460 Author: Noel Power <noel.po...@suse.com> Date: Fri May 18 12:12:44 2018 +0100 python/samba/netcmd: Fix relative module import Part of future changes needed to enable samba4.drs.replica_sync_rodc for PY3. Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit c46fd168fc1c0021e97f849088ac634c1b077f27 Author: Noel Power <noel.po...@suse.com> Date: Thu May 17 15:25:29 2018 +0100 python/samba/netcmd: Protect variable that can be None In py3 None variable cannot be compared with '>' '<' etc operators Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 352eee57ae0b3cd48ea8bab33d483812d57b8efd Author: Noel Power <noel.po...@suse.com> Date: Thu May 17 15:23:38 2018 +0100 python/samba/netcmd: fix py2/py3 bytes usage for replace base64.b64encode returns bytes in py3 make sure associated replace uses 'b' for strings passed to replace Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit e915d18e559370ee661d24d9682f0ba8e138ace8 Author: Noel Power <noel.po...@suse.com> Date: Tue May 15 15:32:35 2018 +0100 s4/torture/drs/python: Py2/Py2 fix tab/space also incorrect unicode usage Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 7b170206b45e2c10af1591f3a8d6565a1ae3853c Author: Noel Power <noel.po...@suse.com> Date: Fri May 11 13:48:29 2018 +0100 lib/ldb: Implement a bytes derived object for attributes py2/py3 ldb attributes are either bytes (py3) or str (py2) Some places in the code do str(res[0]['attribute'][0]) which results in 'result' (py2) b'result' (py3) or more commonly the attribute is used to construct a string e.g. "blah=" + res[0]['attribute'][0] + ",foo,bar=...." giving "blah=result,foo,bar=...." (py2) and very unhelpfully "blah=b'result',foo,bar=...." (py3) lots of code already constructs various strings for passing to other api using the above. To avoid many excessive res[0]['attribute'][0].decode('utf8') code like 'res[0]['attribute'][0]' will now return LdbBytes (a new object subclassing 'bytes') in py3 instead of bytes. This object has a custom '__str__' method which attempts to return a string decoded to uft8. In Py2 this will behave as it did previously (this is the safer option at the moment) Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 337ae8cd586aeb43721f79485f6a35a68b6060f2 Author: Noel Power <noel.po...@suse.com> Date: Thu May 10 13:14:22 2018 +0100 python/samba/tests: remove Py2 specific imports. Remove some python2 specific import, probably this was due to previous unavailability for some c-modules in python3 Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 7d435711692a7c6485bb13e626727400d01d21e3 Author: Noel Power <noel.po...@suse.com> Date: Wed May 9 20:17:30 2018 +0100 python/samba/emulate: Fix some more missed exception tuple assignments In python3 we need to change except LdbError as e: - (status, _) = e to except LdbError as e: + (status, _) = e.args Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit d5cd9af7b502f8cb3b0a6917bf5cc0a741bac454 Author: Noel Power <noel.po...@suse.com> Date: Tue May 1 19:58:36 2018 +0100 python/samba/tests: Py2/Py3 port for hexdump Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 5b96e349817eb28060b16095c907319c438cd670 Author: Noel Power <noel.po...@suse.com> Date: Mon Apr 30 18:43:54 2018 +0100 python/samba/tests: Py2/Py3 allow import of ndr_(un)pack to work Signed-off-by: Noel Power <noel.po...@suse.com> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> commit 9b164637f03b5d19054d286f883b9ce3bc30d76d Author: Joe Guo <j...@catalyst.net.nz> Date: Thu Jul 12 16:57:43 2018 +1200 samdb: use int for get and set methods instead of digit str This will make the API work in a nature way. Also, because of a defect in ldb API, code like `res[0]["maxPwdAge"][0]` will return bytes even in Python3, which will cause trouble. By casting the value to int, we avoid the str/bytes issue. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/ldb/pyldb.c | 45 +++++++++++++++++++++- python/samba/compat.py | 46 +++++++++++++++++++++++ python/samba/emulate/traffic.py | 14 +++---- python/samba/gp_sec_ext.py | 8 ++-- python/samba/kcc/__init__.py | 4 +- python/samba/netcmd/domain.py | 29 ++++++++------ python/samba/netcmd/drs.py | 2 +- python/samba/netcmd/user.py | 2 +- python/samba/samdb.py | 12 ++++-- python/samba/tests/__init__.py | 28 ++++++++------ python/samba/tests/dcerpc/raw_testcase.py | 18 ++++----- python/samba/tests/dns_base.py | 28 ++++++++------ python/samba/tests/net_join.py | 2 +- python/samba/tests/netlogonsvc.py | 2 +- python/samba/tests/ntlmdisabled.py | 4 +- python/samba/tests/samba_tool/passwordsettings.py | 2 +- source4/dsdb/tests/python/password_settings.py | 6 +-- source4/librpc/ndr/py_misc.c | 2 +- source4/torture/drs/python/drs_base.py | 24 ++++++------ source4/torture/drs/python/getnc_exop.py | 25 +++++++----- source4/torture/drs/python/repl_move.py | 2 +- source4/torture/drs/python/repl_schema.py | 2 +- 22 files changed, 212 insertions(+), 95 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/ldb/pyldb.c b/lib/ldb/pyldb.c index 110ec8e..66bc202 100644 --- a/lib/ldb/pyldb.c +++ b/lib/ldb/pyldb.c @@ -79,6 +79,7 @@ static struct ldb_message_element *PyObject_AsMessageElement( PyObject *set_obj, unsigned int flags, const char *attr_name); +static PyTypeObject PyLdbBytesType; #if PY_MAJOR_VERSION >= 3 #define PyStr_Check PyUnicode_Check @@ -89,6 +90,16 @@ static struct ldb_message_element *PyObject_AsMessageElement( #define PyStr_AsUTF8 PyUnicode_AsUTF8 #define PyStr_AsUTF8AndSize PyUnicode_AsUTF8AndSize #define PyInt_FromLong PyLong_FromLong + +static PyObject *PyLdbBytes_FromStringAndSize(const char *msg, int size) +{ + PyObject* result = NULL; + PyObject* args = NULL; + args = Py_BuildValue("(y#)", msg, size); + result = PyLdbBytesType.tp_new(&PyLdbBytesType, args, NULL); + Py_DECREF(args); + return result; +} #else #define PyStr_Check PyString_Check #define PyStr_FromString PyString_FromString @@ -96,6 +107,7 @@ static struct ldb_message_element *PyObject_AsMessageElement( #define PyStr_FromFormat PyString_FromFormat #define PyStr_FromFormatV PyString_FromFormatV #define PyStr_AsUTF8 PyString_AsString +#define PyLdbBytes_FromStringAndSize PyString_FromStringAndSize const char *PyStr_AsUTF8AndSize(PyObject *pystr, Py_ssize_t *sizeptr); const char * @@ -270,10 +282,34 @@ static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_ Py_BuildValue(discard_const_p(char, "(i,s)"), ret, ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx))); } +static PyObject *py_ldb_bytes_str(PyBytesObject *self) +{ + char *msg = NULL; + Py_ssize_t size; + int result = 0; + if (!PyBytes_Check(self)) { + PyErr_Format(PyExc_TypeError,"Unexpected type"); + return NULL; + } + result = PyBytes_AsStringAndSize((PyObject *)self, &msg, &size); + if (result != 0) { + PyErr_Format(PyExc_TypeError, "Failed to extract bytes"); + return NULL; + } + return PyUnicode_FromStringAndSize(msg, size); +} + +static PyTypeObject PyLdbBytesType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "ldb.bytes", + .tp_doc = "str/bytes (with custom str)", + .tp_str = (reprfunc)py_ldb_bytes_str, + .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, +}; static PyObject *PyObject_FromLdbValue(const struct ldb_val *val) { - return PyBytes_FromStringAndSize((const char *)val->data, val->length); + return PyLdbBytes_FromStringAndSize((const char *)val->data, val->length); } static PyObject *PyStr_FromLdbValue(const struct ldb_val *val) @@ -2990,7 +3026,7 @@ static PyObject *py_ldb_msg_element_find(PyLdbMessageElementObject *self, Py_ssi PyErr_SetString(PyExc_IndexError, "Out of range"); return NULL; } - return PyBytes_FromStringAndSize((char *)el->values[idx].data, el->values[idx].length); + return PyLdbBytes_FromStringAndSize((char *)el->values[idx].data, el->values[idx].length); } static PySequenceMethods py_ldb_msg_element_seq = { @@ -4123,6 +4159,11 @@ static PyObject* module_init(void) { PyObject *m; + PyLdbBytesType.tp_base = &PyBytes_Type; + if (PyType_Ready(&PyLdbBytesType) < 0) { + return NULL; + } + if (PyType_Ready(&PyLdbDn) < 0) return NULL; diff --git a/python/samba/compat.py b/python/samba/compat.py index 042fc86..3fdeec8 100644 --- a/python/samba/compat.py +++ b/python/samba/compat.py @@ -22,9 +22,20 @@ import sys PY3 = sys.version_info[0] == 3 if PY3: + def cmp_fn(x, y): + """ + Replacement for built-in function cmp that was removed in Python 3 + + Compare the two objects x and y and return an integer according to + the outcome. The return value is negative if x < y, zero if x == y + and strictly positive if x > y. + """ + + return (x > y) - (x < y) # compat functions from urllib.parse import quote as urllib_quote from urllib.request import urlopen as urllib_urlopen + from functools import cmp_to_key as cmp_to_key_fn # compat types integer_types = int, @@ -36,6 +47,40 @@ if PY3: import io StringIO = io.StringIO else: + + if sys.version_info < (2, 7): + def cmp_to_key_fn(mycmp): + + """Convert a cmp= function into a key= function""" + class K(object): + __slots__ = ['obj'] + + def __init__(self, obj, *args): + self.obj = obj + + def __lt__(self, other): + return mycmp(self.obj, other.obj) < 0 + + def __gt__(self, other): + return mycmp(self.obj, other.obj) > 0 + + def __eq__(self, other): + return mycmp(self.obj, other.obj) == 0 + + def __le__(self, other): + return mycmp(self.obj, other.obj) <= 0 + + def __ge__(self, other): + return mycmp(self.obj, other.obj) >= 0 + + def __ne__(self, other): + return mycmp(self.obj, other.obj) != 0 + + def __hash__(self): + raise TypeError('hash not implemented') + return K + else: + from functools import cmp_to_key as cmp_to_key_fn # compat functions from urllib import quote as urllib_quote from urllib import urlopen as urllib_urlopen @@ -49,3 +94,4 @@ else: # alias import StringIO StringIO = StringIO.StringIO + cmp_fn = cmp diff --git a/python/samba/emulate/traffic.py b/python/samba/emulate/traffic.py index dba2c3f..c96530b 100644 --- a/python/samba/emulate/traffic.py +++ b/python/samba/emulate/traffic.py @@ -1568,7 +1568,7 @@ def create_ou(ldb, instance_id): ldb.add({"dn": ou.split(',', 1)[1], "objectclass": "organizationalunit"}) except LdbError as e: - (status, _) = e + (status, _) = e.args # ignore already exists if status != 68: raise @@ -1576,7 +1576,7 @@ def create_ou(ldb, instance_id): ldb.add({"dn": ou, "objectclass": "organizationalunit"}) except LdbError as e: - (status, _) = e + (status, _) = e.args # ignore already exists if status != 68: raise @@ -1626,7 +1626,7 @@ def generate_traffic_accounts(ldb, instance_id, number, password): create_machine_account(ldb, instance_id, netbios_name, password) added += 1 except LdbError as e: - (status, _) = e + (status, _) = e.args if status == 68: break else: @@ -1642,7 +1642,7 @@ def generate_traffic_accounts(ldb, instance_id, number, password): create_user_account(ldb, instance_id, username, password) added += 1 except LdbError as e: - (status, _) = e + (status, _) = e.args if status == 68: break else: @@ -1728,7 +1728,7 @@ def generate_users(ldb, instance_id, number, password): create_user_account(ldb, instance_id, username, password) users += 1 except LdbError as e: - (status, _) = e + (status, _) = e.args # Stop if entry exists if status == 68: break @@ -1752,7 +1752,7 @@ def generate_groups(ldb, instance_id, number): create_group(ldb, instance_id, name) groups += 1 except LdbError as e: - (status, _) = e + (status, _) = e.args # Stop if entry exists if status == 68: break @@ -1767,7 +1767,7 @@ def clean_up_accounts(ldb, instance_id): try: ldb.delete(ou, ["tree_delete:1"]) except LdbError as e: - (status, _) = e + (status, _) = e.args # ignore does not exist if status != 32: raise diff --git a/python/samba/gp_sec_ext.py b/python/samba/gp_sec_ext.py index 11fd1f5..6d245c4 100644 --- a/python/samba/gp_sec_ext.py +++ b/python/samba/gp_sec_ext.py @@ -57,14 +57,14 @@ class inf_to_ldb(gp_ext_setter): old_val = self.ldb.get_minPwdAge() self.logger.info('KDC Minimum Password age was changed from %s to %s' \ % (old_val, val)) - self.gp_db.store(str(self), self.attribute, old_val) + self.gp_db.store(str(self), self.attribute, str(old_val)) self.ldb.set_minPwdAge(val) def ch_maxPwdAge(self, val): old_val = self.ldb.get_maxPwdAge() self.logger.info('KDC Maximum Password age was changed from %s to %s' \ % (old_val, val)) - self.gp_db.store(str(self), self.attribute, old_val) + self.gp_db.store(str(self), self.attribute, str(old_val)) self.ldb.set_maxPwdAge(val) def ch_minPwdLength(self, val): @@ -72,14 +72,14 @@ class inf_to_ldb(gp_ext_setter): self.logger.info( 'KDC Minimum Password length was changed from %s to %s' \ % (old_val, val)) - self.gp_db.store(str(self), self.attribute, old_val) + self.gp_db.store(str(self), self.attribute, str(old_val)) self.ldb.set_minPwdLength(val) def ch_pwdProperties(self, val): old_val = self.ldb.get_pwdProperties() self.logger.info('KDC Password Properties were changed from %s to %s' \ % (old_val, val)) - self.gp_db.store(str(self), self.attribute, old_val) + self.gp_db.store(str(self), self.attribute, str(old_val)) self.ldb.set_pwdProperties(val) def days2rel_nttime(self): diff --git a/python/samba/kcc/__init__.py b/python/samba/kcc/__init__.py index 1b22bf7..eace661 100644 --- a/python/samba/kcc/__init__.py +++ b/python/samba/kcc/__init__.py @@ -44,6 +44,7 @@ from samba.kcc.graph import Vertex from samba.kcc.debug import DEBUG, DEBUG_FN, logger from samba.kcc import debug +from samba.compat import text_type def sort_dsa_by_gc_and_guid(dsa1, dsa2): @@ -2586,7 +2587,8 @@ class KCC(object): dot_colours = [] for link in self.sitelink_table.values(): from hashlib import md5 - colour = '#' + md5(link.dnstr).hexdigest()[:6] + tmp_str = link.dnstr.encode('utf8') + colour = '#' + md5(tmp_str).hexdigest()[:6] for a, b in itertools.combinations(link.site_list, 2): dot_edges.append((a[1], b[1])) dot_colours.append(colour) diff --git a/python/samba/netcmd/domain.py b/python/samba/netcmd/domain.py index 8624907..555462c 100644 --- a/python/samba/netcmd/domain.py +++ b/python/samba/netcmd/domain.py @@ -821,7 +821,10 @@ class cmd_domain_demote(Command): controls=["search_options:1:2"]) if len(res) != 0: - raise CommandError("Current DC is still the owner of %d role(s), use the role command to transfer roles to another DC" % len(res)) + raise CommandError("Current DC is still the owner of %d role(s), " + "use the role command to transfer roles to " + "another DC" % + len(res)) self.errf.write("Using %s as partner server for the demotion\n" % server) @@ -1012,9 +1015,13 @@ class cmd_domain_demote(Command): remote_samdb.modify(msg) remote_samdb.rename(newdn, dc_dn) if werr == werror.WERR_DS_DRA_NO_REPLICA: - raise CommandError("The DC %s is not present on (already removed from) the remote server: " % server_dsa_dn, e) + raise CommandError("The DC %s is not present on (already " + "removed from) the remote server: %s" % + (server_dsa_dn, e3)) else: - raise CommandError("Error while sending a removeDsServer of %s: " % server_dsa_dn, e) + raise CommandError("Error while sending a removeDsServer " + "of %s: %s" % + (server_dsa_dn, e3)) remove_dc.remove_sysvol_references(remote_samdb, logger, dc_name) @@ -1524,7 +1531,7 @@ class cmd_domain_passwordsettings_set(Command): ldb.FLAG_MOD_REPLACE, "lockOutObservationWindow") msgs.append("Duration to reset account lockout after changed!") - if max_pwd_age > 0 and min_pwd_age >= max_pwd_age: + if max_pwd_age and max_pwd_age > 0 and min_pwd_age >= max_pwd_age: raise CommandError("Maximum password age (%d) must be greater than minimum password age (%d)!" % (max_pwd_age, min_pwd_age)) if len(m) == 0: @@ -1715,7 +1722,7 @@ class DomainTrustCommand(Command): if runtime is None: return False - err32 = self._uint32(runtime[0]) + err32 = self._uint32(runtime.args[0]) if err32 == val: return True @@ -1723,24 +1730,24 @@ class DomainTrustCommand(Command): class LocalRuntimeError(CommandError): def __init__(exception_self, self, runtime, message): - err32 = self._uint32(runtime[0]) - errstr = runtime[1] + err32 = self._uint32(runtime.args[0]) + errstr = runtime.args[1] msg = "LOCAL_DC[%s]: %s - ERROR(0x%08X) - %s" % ( self.local_server, message, err32, errstr) CommandError.__init__(exception_self, msg) class RemoteRuntimeError(CommandError): def __init__(exception_self, self, runtime, message): - err32 = self._uint32(runtime[0]) - errstr = runtime[1] + err32 = self._uint32(runtime.args[0]) + errstr = runtime.args[1] msg = "REMOTE_DC[%s]: %s - ERROR(0x%08X) - %s" % ( self.remote_server, message, err32, errstr) CommandError.__init__(exception_self, msg) class LocalLdbError(CommandError): def __init__(exception_self, self, ldb_error, message): - errval = ldb_error[0] - errstr = ldb_error[1] + errval = ldb_error.args[0] + errstr = ldb_error.args[1] msg = "LOCAL_DC[%s]: %s - ERROR(%d) - %s" % ( self.local_server, message, errval, errstr) CommandError.__init__(exception_self, msg) diff --git a/python/samba/netcmd/drs.py b/python/samba/netcmd/drs.py index b8793b7..6fb8c57 100644 --- a/python/samba/netcmd/drs.py +++ b/python/samba/netcmd/drs.py @@ -21,7 +21,7 @@ import samba.getopt as options import ldb import logging -import common +from . import common import json from samba.auth import system_session diff --git a/python/samba/netcmd/user.py b/python/samba/netcmd/user.py index f211b51..2131c68 100644 --- a/python/samba/netcmd/user.py +++ b/python/samba/netcmd/user.py @@ -119,7 +119,7 @@ def get_crypt_value(alg, utf8pw, rounds=0): # we can ignore the possible == at the end # of the base64 string # we just need to replace '+' by '.' - b64salt = base64.b64encode(salt)[0:16].replace('+', '.').decode('utf8') + b64salt = base64.b64encode(salt)[0:16].replace(b'+', b'.').decode('utf8') crypt_salt = "" if rounds != 0: crypt_salt = "$%s$rounds=%s$%s$" % (alg, rounds, b64salt) diff --git a/python/samba/samdb.py b/python/samba/samdb.py index 7184fcf..e0c29d8 100644 --- a/python/samba/samdb.py +++ b/python/samba/samdb.py @@ -917,6 +917,7 @@ schemaUpdateNow: 1 return dn def set_minPwdAge(self, value): + value = str(value).encode('utf8') m = ldb.Message() m.dn = ldb.Dn(self, self.domain_dn()) m["minPwdAge"] = ldb.MessageElement(value, ldb.FLAG_MOD_REPLACE, "minPwdAge") @@ -929,9 +930,10 @@ schemaUpdateNow: 1 elif not "minPwdAge" in res[0]: return None else: - return res[0]["minPwdAge"][0] + return int(res[0]["minPwdAge"][0]) def set_maxPwdAge(self, value): + value = str(value).encode('utf8') m = ldb.Message() m.dn = ldb.Dn(self, self.domain_dn()) m["maxPwdAge"] = ldb.MessageElement(value, ldb.FLAG_MOD_REPLACE, "maxPwdAge") @@ -945,11 +947,12 @@ schemaUpdateNow: 1 elif not "maxPwdAge" in res[0]: return None else: - return res[0]["maxPwdAge"][0] + return int(res[0]["maxPwdAge"][0]) def set_minPwdLength(self, value): + value = str(value).encode('utf8') m = ldb.Message() m.dn = ldb.Dn(self, self.domain_dn()) m["minPwdLength"] = ldb.MessageElement(value, ldb.FLAG_MOD_REPLACE, "minPwdLength") @@ -962,9 +965,10 @@ schemaUpdateNow: 1 elif not "minPwdLength" in res[0]: return None else: - return res[0]["minPwdLength"][0] + return int(res[0]["minPwdLength"][0]) def set_pwdProperties(self, value): + value = str(value).encode('utf8') m = ldb.Message() m.dn = ldb.Dn(self, self.domain_dn()) m["pwdProperties"] = ldb.MessageElement(value, ldb.FLAG_MOD_REPLACE, "pwdProperties") @@ -977,7 +981,7 @@ schemaUpdateNow: 1 elif not "pwdProperties" in res[0]: return None else: - return res[0]["pwdProperties"][0] + return int(res[0]["pwdProperties"][0]) def set_dsheuristics(self, dsheuristics): m = ldb.Message() diff --git a/python/samba/tests/__init__.py b/python/samba/tests/__init__.py index 7061f8b..1d50710 100644 --- a/python/samba/tests/__init__.py +++ b/python/samba/tests/__init__.py @@ -36,13 +36,12 @@ import re import samba.auth import samba.dcerpc.base from samba.compat import PY3, text_type +from samba.compat import string_types from random import randint -if not PY3: - # Py2 only - from samba.samdb import SamDB - import samba.ndr - import samba.dcerpc.dcerpc - import samba.dcerpc.epmapper +from samba.samdb import SamDB +import samba.ndr +import samba.dcerpc.dcerpc +import samba.dcerpc.epmapper try: from unittest import SkipTest @@ -50,7 +49,7 @@ except ImportError: class SkipTest(Exception): """Test skipped.""" -HEXDUMP_FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)]) +HEXDUMP_FILTER=bytearray([x if ((len(repr(chr(x)))==3) and (x < 127)) else ord('.') for x in range(256)]) class TestCase(unittest.TestCase): """A Samba test case.""" @@ -80,14 +79,21 @@ class TestCase(unittest.TestCase): def hexdump(self, src): N = 0 result = '' + is_string = isinstance(src, string_types) while src: ll = src[:8] lr = src[8:16] src = src[16:] - hl = ' '.join(["%02X" % ord(x) for x in ll]) -- Samba Shared Repository