From: Matthias Dieter Wallnöfer Date: Sat, 15 Aug 2009 13:20:09 +0000 (+0200) Subject: s4: Major rework of the LDB/SAMDB/IDMAP python bindings X-Git-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=7a79d161838efcec27a159fc40481e7be419b778 s4: Major rework of the LDB/SAMDB/IDMAP python bindings - Centralise the lookups for the default domain (root) in the call "domain_dn" - Reduce the LDB connections attempts ("connect" calls) from three to one - tools should load faster - Make the LDB connection init more like the "ldb_wrap_connection" call - Load the right UTF8 casefolder which fixes up problems with special characters (discovered by me: e.g. small "Umlaute" (ä, ö, ü, ...) in the DN weren't upcased - so records "seemed" lost in TDB) --- diff --git a/source4/scripting/python/samba/__init__.py b/source4/scripting/python/samba/__init__.py index ad75f5f8f1fc..537953005407 100644 --- a/source4/scripting/python/samba/__init__.py +++ b/source4/scripting/python/samba/__init__.py @@ -52,21 +52,22 @@ class Ldb(ldb.Ldb): not necessarily the Sam database. For Sam-specific helper functions see samdb.py. """ - def __init__(self, url=None, session_info=None, credentials=None, - modules_dir=None, lp=None, options=None): - """Open a Samba Ldb file. + def __init__(self, url=None, lp=None, modules_dir=None, session_info=None, + credentials=None, flags=0, options=None): + """Opens a Samba Ldb file. :param url: Optional LDB URL to open + :param lp: Optional loadparm object + :param modules_dir: Optional modules directory :param session_info: Optional session information :param credentials: Optional credentials, defaults to anonymous. - :param modules_dir: Modules directory, if not the default. - :param lp: Loadparm object, optional. + :param flags: Optional LDB flags + :param options: Additional options (optional) This is different from a regular Ldb file in that the Samba-specific modules-dir is used by default and that credentials and session_info can be passed through (required by some modules). """ - super(Ldb, self).__init__(options=options) if modules_dir is not None: self.set_modules_dir(modules_dir) @@ -75,23 +76,33 @@ class Ldb(ldb.Ldb): elif lp is not None: self.set_modules_dir(os.path.join(lp.get("modules dir"), "ldb")) - if credentials is not None: - self.set_credentials(credentials) - if session_info is not None: self.set_session_info(session_info) - glue.ldb_register_samba_handlers(self) + if credentials is not None: + self.set_credentials(credentials) if lp is not None: self.set_loadparm(lp) + # This must be done before we load the schema, as these handlers for + # objectSid and objectGUID etc must take precedence over the 'binary + # attribute' declaration in the schema + glue.ldb_register_samba_handlers(self) + + # TODO set debug def msg(l,text): print text #self.set_debug(msg) - if url is not None: - self.connect(url, options=options) + glue.ldb_set_utf8_casefold(self) + + # Allow admins to force non-sync ldb for all databases + nosync_p = lp.get("nosync", "ldb") + if nosync_p is not None and nosync_p == true: + flags |= FLG_NOSYNC + + self.connect(url, flags, options) def set_credentials(self, credentials): glue.ldb_set_credentials(self, credentials) diff --git a/source4/scripting/python/samba/idmap.py b/source4/scripting/python/samba/idmap.py index ee79be1af9d2..acc98a56e88c 100644 --- a/source4/scripting/python/samba/idmap.py +++ b/source4/scripting/python/samba/idmap.py @@ -32,23 +32,23 @@ class IDmapDB(samba.Ldb): TYPE_GID = 2 TYPE_BOTH = 3 - def __init__(self, url=None, session_info=None, credentials=None, - modules_dir=None, lp=None): - """Open the IDmap Database. - - :param url: URL of the database. + def __init__(self, url=None, lp=None, modules_dir=None, session_info=None, + credentials=None, flags=0, options=None): + """Opens the IDmap Database. + For parameter meanings see the super class (samba.Ldb) """ + self.lp = lp + if url is None: + url = lp.get("idmap database") - super(IDmapDB, self).__init__(session_info=session_info, credentials=credentials, - modules_dir=modules_dir, lp=lp) - if url: - self.connect(url) - else: - self.connect(lp.get("idmap database")) + super(IDmapDB, self).__init__(url=url, lp=lp, modules_dir=modules_dir, + session_info=session_info, credentials=credentials, flags=flags, + options=options) - def connect(self, url): - super(IDmapDB, self).connect(self.lp.private_path(url)) + def connect(self, url=None, flags=0, options=None): + super(IDmapDB, self).connect(url=self.lp.private_path(url), flags=flags, + options=options) def setup_name_mapping(self, sid, type, unixid): """Setup a mapping between a sam name and a unix name. diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py index d9d12126cf87..a58d6c5b1247 100644 --- a/source4/scripting/python/samba/samdb.py +++ b/source4/scripting/python/samba/samdb.py @@ -35,23 +35,25 @@ __docformat__ = "restructuredText" class SamDB(samba.Ldb): """The SAM database.""" - def __init__(self, url=None, session_info=None, credentials=None, - modules_dir=None, lp=None, options=None): - """Open the Sam Database. - - :param url: URL of the database. + def __init__(self, url=None, lp=None, modules_dir=None, session_info=None, + credentials=None, flags=0, options=None): + """Opens the Sam Database. + For parameter meanings see the super class (samba.Ldb) """ + self.lp = lp - super(SamDB, self).__init__(session_info=session_info, credentials=credentials, - modules_dir=modules_dir, lp=lp, options=options) + if url is None: + url = lp.get("sam database") + + super(SamDB, self).__init__(url=url, lp=lp, modules_dir=modules_dir, + session_info=session_info, credentials=credentials, flags=flags, + options=options) + glue.dsdb_set_global_schema(self) - if url: - self.connect(url) - else: - self.connect(lp.get("sam database")) - def connect(self, url): - super(SamDB, self).connect(self.lp.private_path(url)) + def connect(self, url=None, flags=0, options=None): + super(SamDB, self).connect(url=self.lp.private_path(url), flags=flags, + options=options) def enable_account(self, user_dn): """Enable an account. @@ -73,7 +75,6 @@ replace: userAccountControl userAccountControl: %u """ % (user_dn, userAccountControl) self.modify_ldif(mod) - def force_password_change_at_next_login(self, user_dn): """Force a password change at next login @@ -89,8 +90,9 @@ pwdLastSet: 0 self.modify_ldif(mod) def domain_dn(self): - # find the DNs for the domain and the domain users group - res = self.search("", scope=ldb.SCOPE_BASE, + # find the DNs for the domain + res = self.search(base="", + scope=ldb.SCOPE_BASE, expression="(defaultNamingContext=*)", attrs=["defaultNamingContext"]) assert(len(res) == 1 and res[0]["defaultNamingContext"] is not None) @@ -106,9 +108,7 @@ pwdLastSet: 0 # connect to the sam self.transaction_start() try: - domain_dn = self.domain_dn() - assert(domain_dn is not None) - user_dn = "CN=%s,CN=Users,%s" % (username, domain_dn) + user_dn = "CN=%s,CN=Users,%s" % (username, self.domain_dn()) # # the new user record. note the reliance on the samdb module to @@ -156,17 +156,8 @@ pwdLastSet: 0 # connect to the sam self.transaction_start() try: - # find the DNs for the domain - res = self.search("", scope=ldb.SCOPE_BASE, - expression="(defaultNamingContext=*)", - attrs=["defaultNamingContext"]) - assert(len(res) == 1 and res[0]["defaultNamingContext"] is not None) - domain_dn = res[0]["defaultNamingContext"][0] - assert(domain_dn is not None) - - res = self.search(domain_dn, scope=ldb.SCOPE_SUBTREE, - expression=filter, - attrs=[]) + res = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE, + expression=filter, attrs=[]) assert(len(res) == 1) user_dn = res[0].dn diff --git a/source4/scripting/python/samba/tests/dcerpc/__init__.py b/source4/scripting/python/samba/tests/dcerpc/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000