Author: abartlet
Date: 2006-06-14 23:47:45 +0000 (Wed, 14 Jun 2006)
New Revision: 16236

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16236

Log:
Add a proper baseDN to a large number of queries.  Searching the NULL
baseDN won't work once the partitions module is loaded.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c
   branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c
   branches/SAMBA_4_0/source/rpc_server/samr/dcesrv_samr.c


Changeset:
Modified: branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c       2006-06-14 
23:46:27 UTC (rev 16235)
+++ branches/SAMBA_4_0/source/rpc_server/lsa/dcesrv_lsa.c       2006-06-14 
23:47:45 UTC (rev 16236)
@@ -221,6 +221,7 @@
                                     struct lsa_policy_state **_state)
 {
        struct lsa_policy_state *state;
+       const struct ldb_dn *partitions_basedn = ldb_dn_string_compose(mem_ctx, 
samdb_base_dn(mem_ctx), "CN=Partitions,CN=Configuration");
 
        state = talloc(mem_ctx, struct lsa_policy_state);
        if (!state) {
@@ -246,7 +247,7 @@
        }
 
        state->domain_name
-               = samdb_search_string(state->sam_ldb, state, NULL, 
"nETBIOSName", 
+               = samdb_search_string(state->sam_ldb, state, partitions_basedn, 
"nETBIOSName", 
                                      "(&(objectclass=crossRef)(ncName=%s))", 
ldb_dn_linearize(mem_ctx, state->domain_dn));
        
        if (!state->domain_name) {

Modified: branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c     
2006-06-14 23:46:27 UTC (rev 16235)
+++ branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c     
2006-06-14 23:47:45 UTC (rev 16236)
@@ -99,7 +99,7 @@
                return NT_STATUS_INVALID_SYSTEM_SERVICE;
        }
        /* pull the user attributes */
-       num_records = gendb_search(sam_ctx, mem_ctx, NULL, &msgs, attrs,
+       num_records = gendb_search(sam_ctx, mem_ctx, samdb_base_dn(mem_ctx), 
&msgs, attrs,
                                   "(&(sAMAccountName=%s)(objectclass=user))", 
                                   r->in.account_name);
 
@@ -901,6 +901,7 @@
        struct netr_DomainInfo1 *info1;
        int ret, ret1, ret2, i;
        NTSTATUS status;
+       const struct ldb_dn *partitions_basedn = ldb_dn_string_compose(mem_ctx, 
samdb_base_dn(mem_ctx), "CN=Partitions,CN=Configuration");
 
        const char *local_domain;
 
@@ -922,13 +923,13 @@
           primary domain is also a "trusted" domain, so we need to
           put the primary domain into the lists of returned trusts as
           well */
-       ret1 = gendb_search(sam_ctx, mem_ctx, NULL, &res1, attrs, 
"(objectClass=domainDNS)");
+       ret1 = gendb_search(sam_ctx, mem_ctx, samdb_base_dn(mem_ctx), &res1, 
attrs, "(objectClass=domainDNS)");
        if (ret1 != 1) {
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
 
        /* try and find the domain */
-       ret = gendb_search(sam_ctx, mem_ctx, NULL, 
+       ret = gendb_search(sam_ctx, mem_ctx, partitions_basedn, 
                           &ref_res, ref_attrs, 
                           "(&(objectClass=crossRef)(ncName=%s))", 
                           ldb_dn_linearize(mem_ctx, res1[0]->dn));
@@ -938,7 +939,7 @@
 
        local_domain = samdb_result_string(ref_res[0], "nETBIOSName", NULL);
 
-       ret2 = gendb_search(sam_ctx, mem_ctx, NULL, &res2, attrs, 
"(objectClass=trustedDomain)");
+       ret2 = gendb_search(sam_ctx, mem_ctx, samdb_base_dn(mem_ctx), &res2, 
attrs, "(objectClass=trustedDomain)");
        if (ret2 == -1) {
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
@@ -1164,6 +1165,7 @@
        struct ldb_message **dom_res, **ref_res;
        const char * const dom_attrs[] = { "dnsDomain", "objectSid", 
"objectGUID", NULL };
        const char * const ref_attrs[] = { "nETBIOSName", NULL };
+       const struct ldb_dn *partitions_basedn = ldb_dn_string_compose(mem_ctx, 
samdb_base_dn(mem_ctx), "CN=Partitions,CN=Configuration");
 
        ZERO_STRUCT(r->out);
 
@@ -1181,7 +1183,7 @@
                return WERR_GENERAL_FAILURE;
        }
 
-       ret = gendb_search(sam_ctx, mem_ctx, NULL, &ref_res, ref_attrs,
+       ret = gendb_search(sam_ctx, mem_ctx, partitions_basedn, &ref_res, 
ref_attrs,
                           "(&(objectClass=crossRef)(ncName=%s))",
                           ldb_dn_linearize(mem_ctx, dom_res[0]->dn));
        if (ret == -1) {

Modified: branches/SAMBA_4_0/source/rpc_server/samr/dcesrv_samr.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/samr/dcesrv_samr.c     2006-06-14 
23:46:27 UTC (rev 16235)
+++ branches/SAMBA_4_0/source/rpc_server/samr/dcesrv_samr.c     2006-06-14 
23:47:45 UTC (rev 16236)
@@ -29,6 +29,7 @@
 #include "rpc_server/samr/dcesrv_samr.h"
 #include "system/time.h"
 #include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
 #include "ads.h"
 #include "dsdb/samdb/samdb.h"
 #include "libcli/ldap/ldap.h"
@@ -163,6 +164,7 @@
        struct ldb_message **dom_msgs;
        struct ldb_message **ref_msgs;
        int ret;
+       const struct ldb_dn *partitions_basedn = ldb_dn_string_compose(mem_ctx, 
samdb_base_dn(mem_ctx), "CN=Partitions,CN=Configuration");
 
        r->out.sid = NULL;
 
@@ -176,11 +178,11 @@
 
        if (strcasecmp(r->in.domain_name->string, "BUILTIN") == 0) {
                ret = gendb_search(c_state->sam_ctx,
-                                  mem_ctx, NULL, &dom_msgs, dom_attrs,
+                                  mem_ctx, samdb_base_dn(mem_ctx), &dom_msgs, 
dom_attrs,
                                   "(objectClass=builtinDomain)");
        } else {
                ret = gendb_search(c_state->sam_ctx,
-                                  mem_ctx, NULL, &ref_msgs, ref_attrs,
+                                  mem_ctx, partitions_basedn, &ref_msgs, 
ref_attrs,
                                   
"(&(&(nETBIOSName=%s)(objectclass=crossRef))(ncName=*))", 
                                   ldb_binary_encode_string(mem_ctx, 
r->in.domain_name->string));
                if (ret != 1) {
@@ -226,6 +228,7 @@
        const char * const ref_attrs[] = { "nETBIOSName", NULL};
        struct ldb_message **dom_msgs;
        struct ldb_message **ref_msgs;
+       const struct ldb_dn *partitions_basedn = ldb_dn_string_compose(mem_ctx, 
samdb_base_dn(mem_ctx), "CN=Partitions,CN=Configuration");
 
        *r->out.resume_handle = 0;
        r->out.sam = NULL;
@@ -236,8 +239,8 @@
        c_state = h->data;
 
        count = gendb_search(c_state->sam_ctx,
-                          mem_ctx, NULL, &dom_msgs, dom_attrs,
-                          "(objectClass=domain)");
+                            mem_ctx, samdb_base_dn(mem_ctx), &dom_msgs, 
dom_attrs,
+                            "(objectClass=domain)");
        if (count == -1) {
                DEBUG(0,("samdb: no domains found in EnumDomains\n"));
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
@@ -269,7 +272,7 @@
                int ret;
                array->entries[i].idx = start_i + i;
                /* try and find the domain */
-               ret = gendb_search(c_state->sam_ctx, mem_ctx, NULL, 
+               ret = gendb_search(c_state->sam_ctx, mem_ctx, partitions_basedn,
                                   &ref_msgs, ref_attrs, 
                                   "(&(objectClass=crossRef)(ncName=%s))", 
                                   ldb_dn_linearize(mem_ctx, dom_msgs[i]->dn));
@@ -303,6 +306,7 @@
        struct ldb_message **dom_msgs;
        struct ldb_message **ref_msgs;
        int ret;
+       const struct ldb_dn *partitions_basedn = ldb_dn_string_compose(mem_ctx, 
samdb_base_dn(mem_ctx), "CN=Partitions,CN=Configuration");
 
        ZERO_STRUCTP(r->out.domain_handle);
 
@@ -315,14 +319,14 @@
        }
 
        ret = gendb_search(c_state->sam_ctx,
-                          mem_ctx, NULL, &dom_msgs, dom_attrs,
+                          mem_ctx, samdb_base_dn(mem_ctx), &dom_msgs, 
dom_attrs,
                           "(&(objectSid=%s)(&(objectclass=domain)))",
                           ldap_encode_ndr_dom_sid(mem_ctx, r->in.sid));
        if (ret != 1) {
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        } else {
                ret = gendb_search(c_state->sam_ctx,
-                                  mem_ctx, NULL, &ref_msgs, ref_attrs,
+                                  mem_ctx, partitions_basedn, &ref_msgs, 
ref_attrs,
                                   
"(&(&(nETBIOSName=*)(objectclass=crossRef))(ncName=%s))", 
                                   ldb_dn_linearize(mem_ctx, dom_msgs[0]->dn));
                if (ret == 0) {
@@ -431,11 +435,13 @@
        info->primary.string = lp_netbios_name();
        info->sequence_num = 0;
        info->role = ROLE_DOMAIN_PDC;
-       info->num_users = samdb_search_count(state->sam_ctx, mem_ctx, NULL, 
"(objectClass=user)");
-       info->num_groups = samdb_search_count(state->sam_ctx, mem_ctx, NULL,
+
+       /* TODO: Should these filter on SID, to avoid counting BUILTIN? */
+       info->num_users = samdb_search_count(state->sam_ctx, mem_ctx, 
state->domain_dn, "(objectClass=user)");
+       info->num_groups = samdb_search_count(state->sam_ctx, mem_ctx, 
state->domain_dn,
                                              
"(&(objectClass=group)(sAMAccountType=%u))",
                                              ATYPE_GLOBAL_GROUP);
-       info->num_aliases = samdb_search_count(state->sam_ctx, mem_ctx, NULL,
+       info->num_aliases = samdb_search_count(state->sam_ctx, mem_ctx, 
state->domain_dn,
                                               
"(&(objectClass=group)(sAMAccountType=%u))",
                                               ATYPE_LOCAL_GROUP);
 
@@ -764,7 +770,7 @@
        }
 
        /* check if the user already exists */
-       name = samdb_search_string(d_state->sam_ctx, mem_ctx, NULL, 
+       name = samdb_search_string(d_state->sam_ctx, mem_ctx, 
samdb_base_dn(mem_ctx), 
                                   "sAMAccountName", 
                                   "(&(sAMAccountName=%s)(objectclass=user))", 
                                   ldb_binary_encode_string(mem_ctx, 
account_name));
@@ -830,11 +836,20 @@
        
        /* create the user */
        ret = samdb_add(d_state->sam_ctx, mem_ctx, msg);
-       if (ret != 0) {
+       switch (ret) {
+       case  LDB_SUCCESS:
+               break;
+       case  LDB_ERR_ENTRY_ALREADY_EXISTS:
                ldb_transaction_cancel(d_state->sam_ctx);
                DEBUG(0,("Failed to create user record %s: %s\n",
                         ldb_dn_linearize(mem_ctx, msg->dn),
                         ldb_errstring(d_state->sam_ctx)));
+               return NT_STATUS_USER_EXISTS;
+       default:
+               ldb_transaction_cancel(d_state->sam_ctx);
+               DEBUG(0,("Failed to create user record %s: %s\n",
+                        ldb_dn_linearize(mem_ctx, msg->dn),
+                        ldb_errstring(d_state->sam_ctx)));
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
 
@@ -1256,7 +1271,7 @@
 
                        memberdn = 
                                samdb_search_string(d_state->sam_ctx,
-                                                   mem_ctx, NULL, 
"distinguishedName",
+                                                   mem_ctx, 
samdb_base_dn(mem_ctx), "distinguishedName",
                                                    "(objectSid=%s)",
                                                    
ldap_encode_ndr_dom_sid(mem_ctx, 
                                                                            
r->in.sids->sids[i].sid));
@@ -2164,7 +2179,7 @@
        a_state = h->data;
        d_state = a_state->domain_state;
 
-       ret = gendb_search(d_state->sam_ctx, mem_ctx, NULL,
+       ret = gendb_search(d_state->sam_ctx, mem_ctx, d_state->domain_dn,
                           &msgs, attrs, "(objectsid=%s)", 
                           ldap_encode_ndr_dom_sid(mem_ctx, r->in.sid));
 
@@ -2269,7 +2284,7 @@
        a_state = h->data;
        d_state = a_state->domain_state;
 
-       memberdn = samdb_search_string(d_state->sam_ctx, mem_ctx, NULL,
+       memberdn = samdb_search_string(d_state->sam_ctx, mem_ctx, 
d_state->domain_dn,
                                       "distinguishedName", "(objectSid=%s)", 
                                       ldap_encode_ndr_dom_sid(mem_ctx, 
r->in.sid));
 
@@ -2908,7 +2923,7 @@
        a_state = h->data;
        d_state = a_state->domain_state;
 
-       count = samdb_search_domain(a_state->sam_ctx, mem_ctx, NULL, &res,
+       count = samdb_search_domain(a_state->sam_ctx, mem_ctx, 
d_state->domain_dn, &res,
                                    attrs, d_state->domain_sid,
                                    
"(&(member=%s)(grouptype=%d)(objectclass=group))",
                                    ldb_dn_linearize(mem_ctx, 
a_state->account_dn),

Reply via email to