The branch, master has been updated via 4f5c4df316d wscript_build: string concatenation efficiency cleanup via c9088c6aa84 pfm_verif: string concatenation efficiency cleanup via c7fa030aecd scripting: avoid inefficient string redefinition via 5ad629dcb95 wscript: avoid inefficient string concatenations via b3b6b700c47 s3/wscript: avoid inefficient string concatenations via 32d1c3f873f posixacl.py: avoid inefficient string concatenations via dd9e0f0ae1c auth_log_winbind.py: avoid inefficient string concatenations via cf51f73e02c schema.py: avoid inefficient string concatenations via d2d8ebcca1c user.py: avoid inefficient string concatenations via ce56d336f23 gpo.py: avoid inefficient string concatenations via 1825a7f4e2a kcc_utils.py: avoid inefficient string concatenations via 4c34a2d7256 traffic.py: avoid inefficient string concatenations from b8f4f141a2d ctdb-tests: Switch TEST_VAR_DIR to a local script variable
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 4f5c4df316dc029f7b5ed6e8e48636dc61ecfe22 Author: Björn Jacke <b...@sernet.de> Date: Fri Aug 23 02:19:20 2019 +0200 wscript_build: string concatenation efficiency cleanup Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Matthias Dieter Wallnöfer <m...@samba.org> Autobuild-User(master): Björn Jacke <bja...@samba.org> Autobuild-Date(master): Tue Sep 24 13:40:21 UTC 2019 on sn-devel-184 commit c9088c6aa847685613ec34d61b61e31fe0395035 Author: Björn Jacke <b...@sernet.de> Date: Fri Aug 23 02:21:17 2019 +0200 pfm_verif: string concatenation efficiency cleanup Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Matthias Dieter Wallnöfer <m...@samba.org> commit c7fa030aecd1de5ed32e2509ecd83828aa42c1a3 Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:10:19 2019 +0200 scripting: avoid inefficient string redefinition Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Matthias Dieter Wallnöfer <m...@samba.org> commit 5ad629dcb957e45637f3a71309fa51abd87b267d Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:09:19 2019 +0200 wscript: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Matthias Dieter Wallnöfer <m...@samba.org> commit b3b6b700c47ba771baf632b3a165106c21c9ae04 Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:08:18 2019 +0200 s3/wscript: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Matthias Dieter Wallnöfer <m...@samba.org> commit 32d1c3f873fc8bd89a7dc985cb8258e990dc12cd Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:07:48 2019 +0200 posixacl.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Matthias Dieter Wallnöfer <m...@samba.org> commit dd9e0f0ae1cca23920883a0e04fe5862663e400e Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:07:13 2019 +0200 auth_log_winbind.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit cf51f73e02cab85f508bcbef362ff75a7ae18d7f Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:06:19 2019 +0200 schema.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit d2d8ebcca1cc4539a7a6b48fa364e03adda1db6c Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:06:00 2019 +0200 user.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit ce56d336f234febfd4cb3da11dd584842c24ce1d Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:05:31 2019 +0200 gpo.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 1825a7f4e2a39d03f01da37b68ba4f65dbafd04a Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:05:10 2019 +0200 kcc_utils.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 4c34a2d72569f31d59b904c3ca1c140f6084b3dd Author: Björn Jacke <b...@sernet.de> Date: Sun Aug 25 23:04:25 2019 +0200 traffic.py: avoid inefficient string concatenations Signed-off-by: Bjoern Jacke <bja...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> ----------------------------------------------------------------------- Summary of changes: docs-xml/wscript_build | 20 ++- python/samba/emulate/traffic.py | 4 +- python/samba/kcc/kcc_utils.py | 195 +++++++++++++-------------- python/samba/netcmd/gpo.py | 9 +- python/samba/netcmd/user.py | 58 ++++---- python/samba/schema.py | 7 +- python/samba/tests/auth_log_winbind.py | 3 +- python/samba/tests/posixacl.py | 4 +- source3/wscript | 4 +- source4/scripting/bin/samba_upgradeprovision | 8 +- source4/scripting/devel/config_base | 9 +- source4/scripting/devel/pfm_verify.py | 4 +- wscript | 5 +- 13 files changed, 147 insertions(+), 183 deletions(-) Changeset truncated at 500 lines: diff --git a/docs-xml/wscript_build b/docs-xml/wscript_build index f207e51ff21..b85309d4ead 100644 --- a/docs-xml/wscript_build +++ b/docs-xml/wscript_build @@ -115,26 +115,22 @@ def smbdotconf_generate_parameter_list(task): articles = task.inputs entities = bld.pathconfig_entities() - t = "<!DOCTYPE section [\n" - - for entity in entities: - t += "%s\n" % entity # We need this if we build with Heimdal mit_kdc_path = '"/usr/sbin/krb5kdc"' - # The MIT krb5kdc path is set if we build with MIT Kerberos if bld.CONFIG_SET('MIT_KDC_PATH'): mit_kdc_path = bld.CONFIG_GET('MIT_KDC_PATH') - t += "<!ENTITY pathconfig.MITKDCPATH %s>\n" % mit_kdc_path - - t += "]>\n" - t += "<section>\n" - for article in articles: - t += article.read() + t = "<!DOCTYPE section [\n" +\ + "\n".join(entities) +\ + "\n" +\ + "<!ENTITY pathconfig.MITKDCPATH " + mit_kdc_path + ">\n" +\ + "]>\n" +\ + "<section>\n" +\ + "".join(art.read() for art in articles) +\ + "</section>\n" - t += "</section>\n" save_file(parameter_all, t , create_dir=True) return 0 diff --git a/python/samba/emulate/traffic.py b/python/samba/emulate/traffic.py index d0a2ffc8f2c..c428b4e369e 100644 --- a/python/samba/emulate/traffic.py +++ b/python/samba/emulate/traffic.py @@ -453,9 +453,7 @@ class ReplayContext(object): # lookup all the GPO DNs res = db.search(db.domain_dn(), scope=ldb.SCOPE_SUBTREE, attrs=['dn'], expression='(objectclass=groupPolicyContainer)') - gpos_by_dn = "" - for msg in res: - gpos_by_dn += "(distinguishedName={0})".format(msg['dn']) + gpos_by_dn = "".join("(distinguishedName={0})".format(msg['dn']) for msg in res) # a search for the 'gPCFileSysPath' attribute is probably a GPO search # (as per the MS-GPOL spec) which searches for GPOs by DN diff --git a/python/samba/kcc/kcc_utils.py b/python/samba/kcc/kcc_utils.py index 3e9a988b778..e0712e49c82 100644 --- a/python/samba/kcc/kcc_utils.py +++ b/python/samba/kcc/kcc_utils.py @@ -66,9 +66,9 @@ class NamingContext(object): def __str__(self): '''Debug dump string output of class''' - text = "%s:" % (self.__class__.__name__,) - text = text + "\n\tnc_dnstr=%s" % self.nc_dnstr - text = text + "\n\tnc_guid=%s" % str(self.nc_guid) + text = "%s:" % (self.__class__.__name__,) +\ + "\n\tnc_dnstr=%s" % self.nc_dnstr +\ + "\n\tnc_guid=%s" % str(self.nc_guid) if self.nc_sid is None: text = text + "\n\tnc_sid=<absent>" @@ -200,20 +200,16 @@ class NCReplica(NamingContext): def __str__(self): '''Debug dump string output of class''' - text = "%s:" % self.__class__.__name__ - text = text + "\n\tdsa_dnstr=%s" % self.rep_dsa_dnstr - text = text + "\n\tdsa_guid=%s" % self.rep_dsa_guid - text = text + "\n\tdefault=%s" % self.rep_default - text = text + "\n\tro=%s" % self.rep_ro - text = text + "\n\tpartial=%s" % self.rep_partial - text = text + "\n\tpresent=%s" % self.is_present() - text = text + "\n\tfsmo_role_owner=%s" % self.rep_fsmo_role_owner - - for rep in self.rep_repsFrom: - text = text + "\n%s" % rep - - for rep in self.rep_repsTo: - text = text + "\n%s" % rep + text = "%s:" % self.__class__.__name__ +\ + "\n\tdsa_dnstr=%s" % self.rep_dsa_dnstr +\ + "\n\tdsa_guid=%s" % self.rep_dsa_guid +\ + "\n\tdefault=%s" % self.rep_default +\ + "\n\tro=%s" % self.rep_ro +\ + "\n\tpartial=%s" % self.rep_partial +\ + "\n\tpresent=%s" % self.is_present() +\ + "\n\tfsmo_role_owner=%s" % self.rep_fsmo_role_owner +\ + "".join("\n%s" % rep for rep in self.rep_repsFrom) +\ + "".join("\n%s" % rep for rep in self.rep_repsTo) return "%s\n%s" % (NamingContext.__str__(self), text) @@ -589,16 +585,15 @@ class DirectoryServiceAgent(object): if self.dsa_ivid is not None: text = text + "\n\tdsa_ivid=%s" % str(self.dsa_ivid) - text = text + "\n\tro=%s" % self.is_ro() - text = text + "\n\tgc=%s" % self.is_gc() - text = text + "\n\tistg=%s" % self.is_istg() - - text = text + "\ncurrent_replica_table:" - text = text + "\n%s" % self.dumpstr_current_replica_table() - text = text + "\nneeded_replica_table:" - text = text + "\n%s" % self.dumpstr_needed_replica_table() - text = text + "\nconnect_table:" - text = text + "\n%s" % self.dumpstr_connect_table() + text += "\n\tro=%s" % self.is_ro() +\ + "\n\tgc=%s" % self.is_gc() +\ + "\n\tistg=%s" % self.is_istg() +\ + "\ncurrent_replica_table:" +\ + "\n%s" % self.dumpstr_current_replica_table() +\ + "\nneeded_replica_table:" +\ + "\n%s" % self.dumpstr_needed_replica_table() +\ + "\nconnect_table:" +\ + "\n%s" % self.dumpstr_connect_table() return text @@ -919,39 +914,38 @@ class NTDSConnection(object): def __str__(self): '''Debug dump string output of NTDSConnection object''' - text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) - text = text + "\n\tenabled=%s" % self.enabled - text = text + "\n\tto_be_added=%s" % self.to_be_added - text = text + "\n\tto_be_deleted=%s" % self.to_be_deleted - text = text + "\n\tto_be_modified=%s" % self.to_be_modified - text = text + "\n\toptions=0x%08X" % self.options - text = text + "\n\tsystem_flags=0x%08X" % self.system_flags - text = text + "\n\twhenCreated=%d" % self.whenCreated - text = text + "\n\ttransport_dn=%s" % self.transport_dnstr + text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) +\ + "\n\tenabled=%s" % self.enabled +\ + "\n\tto_be_added=%s" % self.to_be_added +\ + "\n\tto_be_deleted=%s" % self.to_be_deleted +\ + "\n\tto_be_modified=%s" % self.to_be_modified +\ + "\n\toptions=0x%08X" % self.options +\ + "\n\tsystem_flags=0x%08X" % self.system_flags +\ + "\n\twhenCreated=%d" % self.whenCreated +\ + "\n\ttransport_dn=%s" % self.transport_dnstr if self.guid is not None: - text = text + "\n\tguid=%s" % str(self.guid) + text += "\n\tguid=%s" % str(self.guid) if self.transport_guid is not None: - text = text + "\n\ttransport_guid=%s" % str(self.transport_guid) + text += "\n\ttransport_guid=%s" % str(self.transport_guid) text = text + "\n\tfrom_dn=%s" % self.from_dnstr if self.schedule is not None: - text += "\n\tschedule.size=%s" % self.schedule.size - text += "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth - text += ("\n\tschedule.numberOfSchedules=%s" % + text += "\n\tschedule.size=%s" % self.schedule.size +\ + "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth +\ + ("\n\tschedule.numberOfSchedules=%s" % self.schedule.numberOfSchedules) for i, header in enumerate(self.schedule.headerArray): text += ("\n\tschedule.headerArray[%d].type=%d" % - (i, header.type)) - text += ("\n\tschedule.headerArray[%d].offset=%d" % - (i, header.offset)) - text += "\n\tschedule.dataArray[%d].slots[ " % i - for slot in self.schedule.dataArray[i].slots: - text = text + "0x%X " % slot - text = text + "]" + (i, header.type)) +\ + ("\n\tschedule.headerArray[%d].offset=%d" % + (i, header.offset)) +\ + "\n\tschedule.dataArray[%d].slots[ " % i +\ + "".join("0x%X " % slot for slot in self.schedule.dataArray[i].slots) +\ + "]" return text @@ -1458,12 +1452,10 @@ class Partition(NamingContext): def __str__(self): '''Debug dump string output of class''' - text = "%s" % NamingContext.__str__(self) - text = text + "\n\tpartdn=%s" % self.partstr - for k in self.rw_location_list: - text = text + "\n\tmsDS-NC-Replica-Locations=%s" % k - for k in self.ro_location_list: - text = text + "\n\tmsDS-NC-RO-Replica-Locations=%s" % k + text = "%s" % NamingContext.__str__(self) +\ + "\n\tpartdn=%s" % self.partstr +\ + "".join("\n\tmsDS-NC-Replica-Locations=%s" % k for k in self.rw_location_list) +\ + "".join("\n\tmsDS-NC-RO-Replica-Locations=%s" % k for k in self.ro_location_list) return text @@ -1764,11 +1756,11 @@ class Site(object): def __str__(self): '''Debug dump string output of class''' - text = "%s:" % self.__class__.__name__ - text = text + "\n\tdn=%s" % self.site_dnstr - text = text + "\n\toptions=0x%X" % self.site_options - text = text + "\n\ttopo_generator=%s" % self.site_topo_generator - text = text + "\n\ttopo_failover=%d" % self.site_topo_failover + text = "%s:" % self.__class__.__name__ +\ + "\n\tdn=%s" % self.site_dnstr +\ + "\n\toptions=0x%X" % self.site_options +\ + "\n\ttopo_generator=%s" % self.site_topo_generator +\ + "\n\ttopo_failover=%d" % self.site_topo_failover for key, dsa in self.dsa_table.items(): text = text + "\n%s" % dsa return text @@ -1792,9 +1784,9 @@ class GraphNode(object): self.edge_from = [] def __str__(self): - text = "%s:" % self.__class__.__name__ - text = text + "\n\tdsa_dnstr=%s" % self.dsa_dnstr - text = text + "\n\tmax_edges=%d" % self.max_edges + text = "%s:" % self.__class__.__name__ +\ + "\n\tdsa_dnstr=%s" % self.dsa_dnstr +\ + "\n\tmax_edges=%d" % self.max_edges for i, edge in enumerate(self.edge_from): if isinstance(edge, str): @@ -1894,13 +1886,12 @@ class Transport(object): def __str__(self): '''Debug dump string output of Transport object''' - text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) - text = text + "\n\tguid=%s" % str(self.guid) - text = text + "\n\toptions=%d" % self.options - text = text + "\n\taddress_attr=%s" % self.address_attr - text = text + "\n\tname=%s" % self.name - for dnstr in self.bridgehead_list: - text = text + "\n\tbridgehead_list=%s" % dnstr + text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) +\ + "\n\tguid=%s" % str(self.guid) +\ + "\n\toptions=%d" % self.options +\ + "\n\taddress_attr=%s" % self.address_attr +\ + "\n\tname=%s" % self.name +\ + "".join("\n\tbridgehead_list=%s" % dnstr for dnstr in self.bridgehead_list) return text @@ -2006,25 +1997,24 @@ class RepsFromTo(object): def __str__(self): '''Debug dump string output of class''' - text = "%s:" % self.__class__.__name__ - text += "\n\tdnstr=%s" % self.nc_dnstr - text += "\n\tupdate_flags=0x%X" % self.update_flags - text += "\n\tversion=%d" % self.version - text += "\n\tsource_dsa_obj_guid=%s" % self.source_dsa_obj_guid - text += ("\n\tsource_dsa_invocation_id=%s" % - self.source_dsa_invocation_id) - text += "\n\ttransport_guid=%s" % self.transport_guid - text += "\n\treplica_flags=0x%X" % self.replica_flags - text += ("\n\tconsecutive_sync_failures=%d" % - self.consecutive_sync_failures) - text += "\n\tlast_success=%s" % self.last_success - text += "\n\tlast_attempt=%s" % self.last_attempt - text += "\n\tdns_name1=%s" % self.dns_name1 - text += "\n\tdns_name2=%s" % self.dns_name2 - text += "\n\tschedule[ " - for slot in self.schedule: - text += "0x%X " % slot - text += "]" + text = "%s:" % self.__class__.__name__ +\ + "\n\tdnstr=%s" % self.nc_dnstr +\ + "\n\tupdate_flags=0x%X" % self.update_flags +\ + "\n\tversion=%d" % self.version +\ + "\n\tsource_dsa_obj_guid=%s" % self.source_dsa_obj_guid +\ + ("\n\tsource_dsa_invocation_id=%s" % + self.source_dsa_invocation_id) +\ + "\n\ttransport_guid=%s" % self.transport_guid +\ + "\n\treplica_flags=0x%X" % self.replica_flags +\ + ("\n\tconsecutive_sync_failures=%d" % + self.consecutive_sync_failures) +\ + "\n\tlast_success=%s" % self.last_success +\ + "\n\tlast_attempt=%s" % self.last_attempt +\ + "\n\tdns_name1=%s" % self.dns_name1 +\ + "\n\tdns_name2=%s" % self.dns_name2 +\ + "\n\tschedule[ " +\ + "".join("0x%X " % slot for slot in self.schedule) +\ + "]" return text @@ -2138,27 +2128,26 @@ class SiteLink(object): def __str__(self): '''Debug dump string output of Transport object''' - text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) - text = text + "\n\toptions=%d" % self.options - text = text + "\n\tsystem_flags=%d" % self.system_flags - text = text + "\n\tcost=%d" % self.cost - text = text + "\n\tinterval=%s" % self.interval + text = "%s:\n\tdn=%s" % (self.__class__.__name__, self.dnstr) +\ + "\n\toptions=%d" % self.options +\ + "\n\tsystem_flags=%d" % self.system_flags +\ + "\n\tcost=%d" % self.cost +\ + "\n\tinterval=%s" % self.interval if self.schedule is not None: - text += "\n\tschedule.size=%s" % self.schedule.size - text += "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth - text += ("\n\tschedule.numberOfSchedules=%s" % + text += "\n\tschedule.size=%s" % self.schedule.size +\ + "\n\tschedule.bandwidth=%s" % self.schedule.bandwidth +\ + ("\n\tschedule.numberOfSchedules=%s" % self.schedule.numberOfSchedules) for i, header in enumerate(self.schedule.headerArray): text += ("\n\tschedule.headerArray[%d].type=%d" % - (i, header.type)) - text += ("\n\tschedule.headerArray[%d].offset=%d" % - (i, header.offset)) - text = text + "\n\tschedule.dataArray[%d].slots[ " % i - for slot in self.schedule.dataArray[i].slots: - text = text + "0x%X " % slot - text = text + "]" + (i, header.type)) +\ + ("\n\tschedule.headerArray[%d].offset=%d" % + (i, header.offset)) +\ + "\n\tschedule.dataArray[%d].slots[ " % i +\ + "".join("0x%X " % slot for slot in self.schedule.dataArray[i].slots) +\ + "]" for guid, dn in self.site_list: text = text + "\n\tsite_list=%s (%s)" % (guid, dn) diff --git a/python/samba/netcmd/gpo.py b/python/samba/netcmd/gpo.py index 5a0258196c3..047f91951e8 100644 --- a/python/samba/netcmd/gpo.py +++ b/python/samba/netcmd/gpo.py @@ -110,9 +110,7 @@ def parse_gplink(gplink): def encode_gplink(gplist): '''Encode an array of dn and options into gPLink string''' - ret = '' - for g in gplist: - ret += "[LDAP://%s;%d]" % (g['dn'], g['options']) + ret = "".join("[LDAP://%s;%d]" % (g['dn'], g['options']) for g in gplist) return ret @@ -1079,9 +1077,8 @@ class cmd_backup(GPOCommand): entities = cmd_backup.generalize_xml_entities(self.outf, gpodir, gpodir) import operator - ents = '' - for ent in sorted(entities.items(), key=operator.itemgetter(1)): - ents += '<!ENTITY {} "{}">\n'.format(ent[1].strip('&;'), ent[0]) + ents = "".join('<!ENTITY {} "{}\n">'.format(ent[1].strip('&;'), ent[0]) \ + for ent in sorted(entities.items(), key=operator.itemgetter(1))) if ent_file: with open(ent_file, 'w') as f: diff --git a/python/samba/netcmd/user.py b/python/samba/netcmd/user.py index e59222f7727..6730ab718de 100644 --- a/python/samba/netcmd/user.py +++ b/python/samba/netcmd/user.py @@ -1899,15 +1899,13 @@ samba-tool user syncpasswords --terminate \\ self.password_attrs = password_attrs self.decrypt_samba_gpg = decrypt_samba_gpg self.sync_command = sync_command - add_ldif = "dn: %s\n" % self.cache_dn - add_ldif += "objectClass: userSyncPasswords\n" - add_ldif += "samdbUrl:: %s\n" % base64.b64encode(get_bytes(self.samdb_url)).decode('utf8') - add_ldif += "dirsyncFilter:: %s\n" % base64.b64encode(get_bytes(self.dirsync_filter)).decode('utf8') - for a in self.dirsync_attrs: - add_ldif += "dirsyncAttribute:: %s\n" % base64.b64encode(get_bytes(a)).decode('utf8') - add_ldif += "dirsyncControl: %s\n" % self.dirsync_controls[0] - for a in self.password_attrs: - add_ldif += "passwordAttribute:: %s\n" % base64.b64encode(get_bytes(a)).decode('utf8') + add_ldif = "dn: %s\n" % self.cache_dn +\ + "objectClass: userSyncPasswords\n" +\ + "samdbUrl:: %s\n" % base64.b64encode(get_bytes(self.samdb_url)).decode('utf8') +\ + "dirsyncFilter:: %s\n" % base64.b64encode(get_bytes(self.dirsync_filter)).decode('utf8') +\ + "".join("dirsyncAttribute:: %s\n" % base64.b64encode(get_bytes(a)).decode('utf8') for a in self.dirsync_attrs) +\ + "dirsyncControl: %s\n" % self.dirsync_controls[0] +\ + "".join("passwordAttribute:: %s\n" % base64.b64encode(get_bytes(a)).decode('utf8') for a in self.password_attrs) if self.decrypt_samba_gpg: add_ldif += "decryptSambaGPG: TRUE\n" else: @@ -2104,13 +2102,13 @@ samba-tool user syncpasswords --terminate \\ if self.current_pid is not None: log_msg("currentPid: %d\n" % self.current_pid) - modify_ldif = "dn: %s\n" % (self.cache_dn) - modify_ldif += "changetype: modify\n" - modify_ldif += "replace: currentPid\n" + modify_ldif = "dn: %s\n" % (self.cache_dn) +\ + "changetype: modify\n" +\ + "replace: currentPid\n" if self.current_pid is not None: modify_ldif += "currentPid: %d\n" % (self.current_pid) - modify_ldif += "replace: currentTime\n" - modify_ldif += "currentTime: %s\n" % ldb.timestring(int(time.time())) + modify_ldif += "replace: currentTime\n" +\ + "currentTime: %s\n" % ldb.timestring(int(time.time())) self.cache.modify_ldif(modify_ldif) return @@ -2122,12 +2120,12 @@ samba-tool user syncpasswords --terminate \\ # This cookie can be extremely long # log_msg("dirsyncControls: %r\n" % self.dirsync_controls) - modify_ldif = "dn: %s\n" % (self.cache_dn) - modify_ldif += "changetype: modify\n" - modify_ldif += "replace: dirsyncControl\n" - modify_ldif += "dirsyncControl: %s\n" % (self.dirsync_controls[0]) - modify_ldif += "replace: currentTime\n" - modify_ldif += "currentTime: %s\n" % ldb.timestring(int(time.time())) + modify_ldif = "dn: %s\n" % (self.cache_dn) +\ + "changetype: modify\n" +\ + "replace: dirsyncControl\n" +\ + "dirsyncControl: %s\n" % (self.dirsync_controls[0]) +\ + "replace: currentTime\n" +\ + "currentTime: %s\n" % ldb.timestring(int(time.time())) self.cache.modify_ldif(modify_ldif) return @@ -2163,18 +2161,18 @@ samba-tool user syncpasswords --terminate \\ expression="(objectClass=*)", attrs=["lastCookie"]) if len(res) == 0: - add_ldif = "dn: %s\n" % (dn) - add_ldif += "objectClass: userCookie\n" - add_ldif += "lastCookie: %s\n" % (lastCookie) - add_ldif += "currentTime: %s\n" % ldb.timestring(int(time.time())) + add_ldif = "dn: %s\n" % (dn) +\ + "objectClass: userCookie\n" +\ + "lastCookie: %s\n" % (lastCookie) +\ + "currentTime: %s\n" % ldb.timestring(int(time.time())) self.cache.add_ldif(add_ldif) else: - modify_ldif = "dn: %s\n" % (dn) - modify_ldif += "changetype: modify\n" - modify_ldif += "replace: lastCookie\n" - modify_ldif += "lastCookie: %s\n" % (lastCookie) - modify_ldif += "replace: currentTime\n" - modify_ldif += "currentTime: %s\n" % ldb.timestring(int(time.time())) + modify_ldif = "dn: %s\n" % (dn) +\ + "changetype: modify\n" +\ + "replace: lastCookie\n" +\ + "lastCookie: %s\n" % (lastCookie) +\ + "replace: currentTime\n" +\ + "currentTime: %s\n" % ldb.timestring(int(time.time())) self.cache.modify_ldif(modify_ldif) self.cache.transaction_commit() except Exception as e: diff --git a/python/samba/schema.py b/python/samba/schema.py index aedee82bb8f..caea7e358ae 100644 --- a/python/samba/schema.py +++ b/python/samba/schema.py @@ -111,9 +111,7 @@ class Schema(object): setup_path('ad-schema/%s' % Schema.base_schemas[base_schema][1])) if files is not None: - for file in files: - data = get_string(open(file, 'rb').read()) - self.schema_data += data + self.schema_data = "".join(get_string(open(file, 'rb').read()) for file in files) self.schema_data = substitute_var(self.schema_data, {"SCHEMADN": schemadn}) @@ -135,8 +133,7 @@ class Schema(object): self.prefixmap_data = open(setup_path("prefixMap.txt"), 'rb').read() if additional_prefixmap is not None: - for map in additional_prefixmap: - self.prefixmap_data += "%s\n" % map + self.prefixmap_data += "".join("%s\n" % map for map in additional_prefixmap) self.prefixmap_data = b64encode(self.prefixmap_data).decode('utf8') diff --git a/python/samba/tests/auth_log_winbind.py b/python/samba/tests/auth_log_winbind.py index a390197fe7f..4f4beff1e32 100644 --- a/python/samba/tests/auth_log_winbind.py +++ b/python/samba/tests/auth_log_winbind.py @@ -94,8 +94,7 @@ class AuthLogTestsWinbind(AuthLogTestBase, BlackboxTestCase): msgs = list(filter(is_sam_logon, self.dc_msgs)) if msgs: for m in msgs: - m += "\n" - os.write(w1, get_bytes(m)) + os.write(w1, get_bytes(m+"\n")) else: os.write(w1, get_bytes("None\n")) -- Samba Shared Repository