diff options
-rw-r--r-- | python/samba/netcmd/common.py | 45 | ||||
-rw-r--r-- | python/samba/netcmd/user.py | 3 | ||||
-rw-r--r-- | selftest/knownfail.d/samba_tool.user_edit | 1 |
3 files changed, 46 insertions, 3 deletions
diff --git a/python/samba/netcmd/common.py b/python/samba/netcmd/common.py index 86f3e5161b1..f53ff4555a9 100644 --- a/python/samba/netcmd/common.py +++ b/python/samba/netcmd/common.py @@ -20,7 +20,7 @@ import re from samba.dcerpc import nbt from samba.net import Net - +import ldb def _get_user_realm_domain(user): r""" get the realm or the domain and the base user @@ -69,3 +69,46 @@ def netcmd_get_domain_infos_via_cldap(lp, creds, address=None): cldap_ret = net.finddc(address=address, flags=nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS) return cldap_ret + +def is_printable_attr_val(val): + import unicodedata + + # The value must be convertable to a string value. + try: + str_val = str(val) + except: + return False + + # Characters of the Unicode Character Category "C" ("Other") are + # supposed to be not printable. The category "C" includes control + # characters, format specifier and others. + for c in str_val: + if unicodedata.category(c)[0] == 'C': + return False + + return True + +def get_ldif_for_editor(samdb, msg): + + # Copy the given message, because we do not + # want to modify the original message. + m = ldb.Message() + m.dn = msg.dn + + for k in msg.keys(): + if k == "dn": + continue + vals = msg[k] + m[k] = vals + need_base64 = False + for v in vals: + if is_printable_attr_val(v): + continue + need_base64 = True + break + if not need_base64: + m[k].set_flags(ldb.FLAG_FORCE_NO_BASE64_LDIF) + + result_ldif = samdb.write_ldif(m, ldb.CHANGETYPE_NONE) + + return result_ldif diff --git a/python/samba/netcmd/user.py b/python/samba/netcmd/user.py index 112756ea4f5..121050a26e6 100644 --- a/python/samba/netcmd/user.py +++ b/python/samba/netcmd/user.py @@ -2428,6 +2428,7 @@ LDAP server using the 'nano' editor. def run(self, username, credopts=None, sambaopts=None, versionopts=None, H=None, editor=None): + from . import common lp = sambaopts.get_loadparm() creds = credopts.get_credentials(lp, fallback_machine=True) @@ -2448,7 +2449,7 @@ LDAP server using the 'nano' editor. raise CommandError('Unable to find user "%s"' % (username)) for msg in res: - result_ldif = samdb.write_ldif(msg, ldb.CHANGETYPE_NONE) + result_ldif = common.get_ldif_for_editor(samdb, msg) if editor is None: editor = os.environ.get('EDITOR') diff --git a/selftest/knownfail.d/samba_tool.user_edit b/selftest/knownfail.d/samba_tool.user_edit deleted file mode 100644 index 5c5c9a6d781..00000000000 --- a/selftest/knownfail.d/samba_tool.user_edit +++ /dev/null @@ -1 +0,0 @@ -samba.tests.samba_tool.user_edit.change_attribute_force_no_base64 |