samba-tool: use ldb.binary_encode() on search expression elements
authorAndrew Tridgell <tridge@samba.org>
Thu, 28 Jul 2011 07:14:28 +0000 (17:14 +1000)
committerAndrew Tridgell <tridge@samba.org>
Fri, 29 Jul 2011 08:17:44 +0000 (18:17 +1000)
this allows us to deal with search elements containing characters that
must be escaped in LDAP

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>
Pair-Programmed-With: Amitay Isaacs <amitay@gmail.com>

source4/scripting/python/samba/join.py
source4/scripting/python/samba/netcmd/delegation.py
source4/scripting/python/samba/netcmd/domain.py
source4/scripting/python/samba/netcmd/drs.py
source4/scripting/python/samba/netcmd/gpo.py
source4/scripting/python/samba/netcmd/rodc.py
source4/scripting/python/samba/netcmd/spn.py
source4/scripting/python/samba/netcmd/user.py
source4/scripting/python/samba/samdb.py

index b586e2cd5b04c0b4fbfcf41bb56cbc81f16fe9c1..4495b527b938dcaf604df170f31b446d8b49ff35 100644 (file)
@@ -147,7 +147,7 @@ class dc_join(object):
             # find the krbtgt link
             print("checking samaccountname")
             res = ctx.samdb.search(base=ctx.samdb.get_default_basedn(),
-                                   expression='samAccountName=%s' % ctx.samname,
+                                   expression='samAccountName=%s' % ldb.binary_encode(ctx.samname),
                                    attrs=["msDS-krbTgtLink"])
             if res:
                 ctx.del_noerror(res[0].dn, recursive=True)
@@ -408,7 +408,7 @@ class dc_join(object):
         ctx.samdb.modify(m)
 
         print "Setting account password for %s" % ctx.samname
-        ctx.samdb.setpassword("(&(objectClass=user)(sAMAccountName=%s))" % ctx.samname,
+        ctx.samdb.setpassword("(&(objectClass=user)(sAMAccountName=%s))" % ldb.binary_encode(ctx.samname),
                               ctx.acct_pass,
                               force_change_at_next_login=False,
                               username=ctx.samname)
index 1980203f9d8200645bc72383def7a4171a1ec624..9aa8287785cec789b8d8ea101e2910f6cc6ec646 100644 (file)
@@ -72,7 +72,7 @@ class cmd_delegation_show(Command):
         # to the correct domain
         (cleanedaccount, realm, domain) = _get_user_realm_domain(accountname)
         print "Searching for: %s" % (cleanedaccount)
-        res = sam.search(expression="sAMAccountName=%s" % cleanedaccount,
+        res = sam.search(expression="sAMAccountName=%s" % ldb.binary_encode(cleanedaccount),
                             scope=ldb.SCOPE_SUBTREE,
                             attrs=["userAccountControl", "msDS-AllowedToDelegateTo"])
         if len(res) != 1:
@@ -122,7 +122,7 @@ class cmd_delegation_for_any_service(Command):
         # to the correct domain
         (cleanedaccount, realm, domain) = _get_user_realm_domain(accountname)
 
-       search_filter = "sAMAccountName=%s" % cleanedaccount
+       search_filter = "sAMAccountName=%s" % ldb.binary_encode(cleanedaccount)
         flag = dsdb.UF_TRUSTED_FOR_DELEGATION
         try:
             sam.toggle_userAccountFlags(search_filter, flag, on=on, strict=True)
@@ -154,7 +154,7 @@ class cmd_delegation_for_any_protocol(Command):
         # to the correct domain
         (cleanedaccount, realm, domain) = _get_user_realm_domain(accountname)
 
-       search_filter = "sAMAccountName=%s" % cleanedaccount
+       search_filter = "sAMAccountName=%s" % ldb.binary_encode(cleanedaccount)
         flag = dsdb.UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
         try:
             sam.toggle_userAccountFlags(search_filter, flag, on=on, strict=True)
@@ -178,7 +178,7 @@ class cmd_delegation_add_service(Command):
         # to the correct domain
         (cleanedaccount, realm, domain) = _get_user_realm_domain(accountname)
 
-        res = sam.search(expression="sAMAccountName=%s" % cleanedaccount,
+        res = sam.search(expression="sAMAccountName=%s" % ldb.binary_encode(cleanedaccount),
                             scope=ldb.SCOPE_SUBTREE,
                             attrs=["msDS-AllowedToDelegateTo"])
         if len(res) != 1:
@@ -211,7 +211,7 @@ class cmd_delegation_del_service(Command):
         # to the correct domain
         (cleanedaccount, realm, domain) = _get_user_realm_domain(accountname)
 
-        res = sam.search(expression="sAMAccountName=%s" % cleanedaccount,
+        res = sam.search(expression="sAMAccountName=%s" % ldb.binary_encode(cleanedaccount),
                             scope=ldb.SCOPE_SUBTREE,
                             attrs=["msDS-AllowedToDelegateTo"])
         if len(res) != 1:
index 8dffbd2b566ea42127654c8c9d95f2b40511cc65..50b5d80395213aa830b8212f95cec9e6065e5a55 100644 (file)
@@ -317,7 +317,7 @@ class cmd_domain_machinepassword(Command):
         secretsdb = Ldb(url=url, session_info=system_session(),
             credentials=creds, lp=lp)
         result = secretsdb.search(attrs=["secret"],
-            expression="(&(objectclass=primaryDomain)(samaccountname=%s))" % secret)
+            expression="(&(objectclass=primaryDomain)(samaccountname=%s))" % ldb.binary_encode(secret))
 
         if len(result) != 1:
             raise CommandError("search returned %d records, expected 1" % len(result))
index f9b55f47b5674736f773dad5862da7c10ce8ebb7..e9cd5406037d602b430ae37947ef4f40b662af5c 100644 (file)
@@ -287,8 +287,9 @@ class cmd_drs_replicate(Command):
 
         # we need to find the NTDS GUID of the source DC
         msg = self.samdb.search(base=self.samdb.get_config_basedn(),
-                                expression="(&(objectCategory=server)(|(name=%s)(dNSHostName=%s)))" % (SOURCE_DC,
-                                                                                                       SOURCE_DC),
+                                expression="(&(objectCategory=server)(|(name=%s)(dNSHostName=%s)))" % (
+            ldb.binary_encode(SOURCE_DC),
+            ldb.binary_encode(SOURCE_DC)),
                                 attrs=[])
         if len(msg) == 0:
             raise CommandError("Failed to find source DC %s" % SOURCE_DC)
index 72c157d00a082b86a86ca253d10a9455919b2b96..e59b79dbc0ca5ad5f999b48784ee57a9858a1c5f 100644 (file)
@@ -131,10 +131,10 @@ def get_gpo_info(samdb, gpo=None, displayname=None, dn=None):
     search_scope = ldb.SCOPE_ONELEVEL
 
     if gpo is not None:
-        search_expr = "(&(objectClass=groupPolicyContainer)(name=%s))" % gpo
+        search_expr = "(&(objectClass=groupPolicyContainer)(name=%s))" % ldb.binary_encode(gpo)
 
     if displayname is not None:
-        search_expr = "(&(objectClass=groupPolicyContainer)(displayname=%s))" % displayname
+        search_expr = "(&(objectClass=groupPolicyContainer)(displayname=%s))" % ldb.binary_encode(displayname)
 
     if dn is not None:
         base_dn = dn
@@ -253,7 +253,7 @@ class cmd_list(Command):
 
         try:
             msg = self.samdb.search(expression='(&(|(samAccountName=%s)(samAccountName=%s$))(objectClass=User))' %
-                                                (username,username))
+                                                (ldb.binary_encode(username),ldb.binary_encode(username)))
             user_dn = msg[0].dn
         except Exception, e:
             raise CommandError("Failed to find account %s" % username, e)
index 411221e24f7cb7f471c66f446ab220665353f63a..75c326f950d8d5b28f9271b6d7a6590b5831a058 100644 (file)
@@ -52,7 +52,7 @@ class cmd_rodc_preload(Command):
                                expression="objectclass=user",
                                scope=ldb.SCOPE_BASE, attrs=[])
         else:
-            res = samdb.search(expression="(&(samAccountName=%s)(objectclass=user))" % account,
+            res = samdb.search(expression="(&(samAccountName=%s)(objectclass=user))" % ldb.binary_encode(account),
                                scope=ldb.SCOPE_SUBTREE, attrs=[])
         if len(res) != 1:
             raise Exception("Failed to find account '%s'" % account)
index e81cdce4f309019024e4808d247d12521054af81..672f1401e9bfbeaa703ff7ab52205749dbaafc1d 100644 (file)
@@ -69,7 +69,7 @@ class cmd_spn_list(Command):
         # to the correct domain
         (cleaneduser, realm, domain) = _get_user_realm_domain(user)
         print cleaneduser
-        res = sam.search(expression="samaccountname=%s" % cleaneduser,
+        res = sam.search(expression="samaccountname=%s" % ldb.binary_encode(cleaneduser),
                             scope=ldb.SCOPE_SUBTREE,
                             attrs=["servicePrincipalName"])
         if len(res) >0:
@@ -102,7 +102,7 @@ class cmd_spn_add(Command):
         paths = provision.provision_paths_from_lp(lp, lp.get("realm"))
         sam = SamDB(paths.samdb, session_info=system_session(),
                     credentials=creds, lp=lp)
-        res = sam.search(expression="servicePrincipalName=%s" % name,
+        res = sam.search(expression="servicePrincipalName=%s" % ldb.binary_encode(name),
                             scope=ldb.SCOPE_SUBTREE,
                             )
         if len(res) != 0  and not force:
@@ -110,7 +110,7 @@ class cmd_spn_add(Command):
                                    " affected to another user" % name)
 
         (cleaneduser, realm, domain) = _get_user_realm_domain(user)
-        res = sam.search(expression="samaccountname=%s" % cleaneduser,
+        res = sam.search(expression="samaccountname=%s" % ldb.binary_encode(cleaneduser),
                             scope=ldb.SCOPE_SUBTREE,
                             attrs=["servicePrincipalName"])
         if len(res) >0:
@@ -151,7 +151,7 @@ class cmd_spn_delete(Command):
         paths = provision.provision_paths_from_lp(lp, lp.get("realm"))
         sam = SamDB(paths.samdb, session_info=system_session(),
                     credentials=creds, lp=lp)
-        res = sam.search(expression="servicePrincipalName=%s" % name,
+        res = sam.search(expression="servicePrincipalName=%s" % ldb.binary_encode(name),
                             scope=ldb.SCOPE_SUBTREE,
                             attrs=["servicePrincipalName", "samAccountName"])
         if len(res) >0:
index e92276b093b30f79c0311c2cca52e8c035f8bce1..88d93e3bea1ae218b21a53b14fdf3fbfc193e962 100644 (file)
@@ -142,7 +142,7 @@ class cmd_user_enable(Command):
             raise CommandError("Either the username or '--filter' must be specified!")
 
         if filter is None:
-            filter = "(&(objectClass=user)(sAMAccountName=%s))" % (username)
+            filter = "(&(objectClass=user)(sAMAccountName=%s))" % (ldb.binary_encode(username))
 
         lp = sambaopts.get_loadparm()
         creds = credopts.get_credentials(lp, fallback_machine=True)
@@ -178,7 +178,7 @@ class cmd_user_setexpiry(Command):
             raise CommandError("Either the username or '--filter' must be specified!")
 
         if filter is None:
-            filter = "(&(objectClass=user)(sAMAccountName=%s))" % (username)
+            filter = "(&(objectClass=user)(sAMAccountName=%s))" % (ldb.binary_encode(username))
 
         lp = sambaopts.get_loadparm()
         creds = credopts.get_credentials(lp)
index a7ed1d2c39e96b3d7c016cb795a0ea540b022941..6f3953540a2784a13028bb857dec0ab39db2f888 100644 (file)
@@ -189,7 +189,7 @@ pwdLastSet: 0
         :param groupname: Name of the target group
         """
 
-        groupfilter = "(&(sAMAccountName=%s)(objectCategory=%s,%s))" % (groupname, "CN=Group,CN=Schema,CN=Configuration", self.domain_dn())
+        groupfilter = "(&(sAMAccountName=%s)(objectCategory=%s,%s))" % (ldb.binary_encode(groupname), "CN=Group,CN=Schema,CN=Configuration", self.domain_dn())
         self.transaction_start()
         try:
             targetgroup = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE,
@@ -214,7 +214,8 @@ pwdLastSet: 0
             operation
         """
 
-        groupfilter = "(&(sAMAccountName=%s)(objectCategory=%s,%s))" % (groupname, "CN=Group,CN=Schema,CN=Configuration", self.domain_dn())
+        groupfilter = "(&(sAMAccountName=%s)(objectCategory=%s,%s))" % (
+            ldb.binary_encode(groupname), "CN=Group,CN=Schema,CN=Configuration", self.domain_dn())
         groupmembers = listofmembers.split(',')
 
         self.transaction_start()
@@ -234,7 +235,8 @@ changetype: modify
 
             for member in groupmembers:
                 targetmember = self.search(base=self.domain_dn(), scope=ldb.SCOPE_SUBTREE,
-                                    expression="(|(sAMAccountName=%s)(CN=%s))" % (member, member), attrs=[])
+                                    expression="(|(sAMAccountName=%s)(CN=%s))" % (
+                    ldb.binary_encode(member), ldb.binary_encode(member)), attrs=[])
 
                 if len(targetmember) != 1:
                     continue
@@ -378,7 +380,7 @@ member: %s
 
             # Sets the password for it
             if setpassword:
-                self.setpassword("(samAccountName=%s)" % username, password,
+                self.setpassword("(samAccountName=%s)" % ldb.binary_encode(username), password,
                                  force_password_change_at_next_login_req)
         except Exception:
             self.transaction_cancel()