Fix a warning about a shadowed variable by renaming the shadowing var
[obnox/samba/samba-obnox.git] / source4 / libnet / libnet_samsync_ldb.c
index 8ec058d845ee4e876d0a1e8e57d10b50ffa2e930..10e5a34da462591816decb0066678542173a8218 100644 (file)
 
 #include "includes.h"
 #include "libnet/libnet.h"
-#include "libcli/ldap/ldap.h"
+#include "libcli/ldap/ldap_ndr.h"
 #include "dsdb/samdb/samdb.h"
 #include "auth/auth.h"
-#include "util/util_ldb.h"
+#include "../lib/util/util_ldb.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "ldb_wrap.h"
 #include "libcli/security/security.h"
-#include "librpc/rpc/dcerpc.h"
 #include "param/param.h"
 
 struct samsync_ldb_secret {
@@ -52,12 +51,20 @@ struct samsync_ldb_state {
        const struct libnet_SamSync_state *samsync_state;
 
        struct dom_sid *dom_sid[3];
-       struct ldb_context *sam_ldb, *remote_ldb;
+       struct ldb_context *sam_ldb, *remote_ldb, *pdb;
        struct ldb_dn *base_dn[3];
        struct samsync_ldb_secret *secrets;
        struct samsync_ldb_trusted_domain *trusted_domains;
 };
 
+/* This wrapper is needed for the "ADD_OR_DEL" macros */
+static int samdb_msg_add_string(struct ldb_context *sam_ldb,
+                               TALLOC_CTX *mem_ctx, struct ldb_message *msg,
+                               const char *attr_name, const char *str)
+{
+       return ldb_msg_add_string(msg, attr_name, str);
+}
+
 static NTSTATUS samsync_ldb_add_foreignSecurityPrincipal(TALLOC_CTX *mem_ctx,
                                                         struct samsync_ldb_state *state,
                                                         struct dom_sid *sid,
@@ -94,15 +101,13 @@ static NTSTATUS samsync_ldb_add_foreignSecurityPrincipal(TALLOC_CTX *mem_ctx,
        if ( ! ldb_dn_add_child_fmt(msg->dn, "CN=%s", sidstr))
                return NT_STATUS_UNSUCCESSFUL;
        
-       samdb_msg_add_string(state->sam_ldb, mem_ctx, msg,
-                            "objectClass",
-                            "foreignSecurityPrincipal");
+       ldb_msg_add_string(msg, "objectClass", "foreignSecurityPrincipal");
 
        *fsp_dn = msg->dn;
 
        /* create the alias */
        ret = ldb_add(state->sam_ldb, msg);
-       if (ret != 0) {
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to create foreignSecurityPrincipal "
                                                "record %s: %s",
                                                ldb_dn_get_linearized(msg->dn),
@@ -156,26 +161,37 @@ static NTSTATUS samsync_ldb_handle_domain(TALLOC_CTX *mem_ctx,
                        /* Update the domain sid with the incoming
                         * domain (found on LSA pipe, database sid may
                         * be random) */
-                       samdb_msg_add_dom_sid(state->sam_ldb, mem_ctx, 
-                                             msg, "objectSid", state->dom_sid[database]);
+                       ret = samdb_msg_add_dom_sid(state->sam_ldb,
+                                                   mem_ctx,
+                                                   msg,
+                                                   "objectSid",
+                                                   state->dom_sid[database]);
+                       if (ret != LDB_SUCCESS) {
+                               return NT_STATUS_INTERNAL_ERROR;
+                       }
                } else {
                        /* Well, we will have to use the one from the database */
                        state->dom_sid[database] = samdb_search_dom_sid(state->sam_ldb, state,
                                                                        state->base_dn[database], 
                                                                        "objectSid", NULL);
+                       if (state->dom_sid[database] == NULL) {
+                               return NT_STATUS_INTERNAL_ERROR;
+                       }
                }
 
                if (state->samsync_state->domain_guid) {
-                       enum ndr_err_code ndr_err;
                        struct ldb_val v;
-                       ndr_err = ndr_push_struct_blob(&v, msg, state->samsync_state->domain_guid,
-                                                        (ndr_push_flags_fn_t)ndr_push_GUID);
-                       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status;
+                       status = GUID_to_ndr_blob(state->samsync_state->domain_guid, msg, &v);
+                       if (!NT_STATUS_IS_OK(status)) {
                                *error_string = talloc_asprintf(mem_ctx, "ndr_push of domain GUID failed!");
-                               return ndr_map_error2ntstatus(ndr_err);
+                               return status;
                        }
                        
-                       ldb_msg_add_value(msg, "objectGUID", &v, NULL);
+                       ret = ldb_msg_add_value(msg, "objectGUID", &v, NULL);
+                       if (ret != LDB_SUCCESS) {
+                               return NT_STATUS_INTERNAL_ERROR;
+                       }
                }
        } else if (database == SAM_DATABASE_BUILTIN) {
                /* work out the builtin_dn - useful for so many calls its worth
@@ -196,8 +212,8 @@ static NTSTATUS samsync_ldb_handle_domain(TALLOC_CTX *mem_ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
-       samdb_msg_add_string(state->sam_ldb, mem_ctx, 
-                            msg, "oEMInformation", domain->comment.string);
+       ldb_msg_add_string(msg, "oEMInformation",
+                          domain->oem_information.string);
 
        samdb_msg_add_int64(state->sam_ldb, mem_ctx, 
                            msg, "forceLogoff", domain->force_logoff_time);
@@ -223,10 +239,13 @@ static NTSTATUS samsync_ldb_handle_domain(TALLOC_CTX *mem_ctx,
 
        /* TODO: Account lockout, password properties */
        
-       ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-
-       if (ret) {
-               return NT_STATUS_INTERNAL_ERROR;
+       ret = dsdb_replace(state->sam_ldb, msg, 0);
+       if (ret != LDB_SUCCESS) {
+               *error_string = talloc_asprintf(mem_ctx,
+                                               "Failed to modify domain record %s: %s",
+                                               ldb_dn_get_linearized(msg->dn),
+                                               ldb_errstring(state->sam_ldb));
+               return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
        return NT_STATUS_OK;
 }
@@ -246,7 +265,8 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
        struct ldb_message *msg;
        struct ldb_message **msgs;
        struct ldb_message **remote_msgs = NULL;
-       int ret, i;
+       unsigned int i;
+       int ret;
        uint32_t acb;
        bool add = false;
        const char *attrs[] = { NULL };
@@ -309,8 +329,7 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
                        
                        /* Try to put things in the same location as the remote server */
                } else if (add) {
-                       msg->dn = remote_msgs[0]->dn;
-                       talloc_steal(msg, remote_msgs[0]->dn);
+                       msg->dn = talloc_steal(msg, remote_msgs[0]->dn);
                }
        }
 
@@ -361,12 +380,6 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
                return NT_STATUS_NO_MEMORY; 
        } 
        
-       if (!add) {
-               /* Passwords.  Ensure there is no plaintext stored against
-                * this entry, as we only have hashes */
-               samdb_msg_add_delete(state->sam_ldb, mem_ctx, msg,  
-                                    "sambaPassword"); 
-       }
        if (user->lm_password_present) {
                samdb_msg_add_hash(state->sam_ldb, mem_ctx, msg,  
                                   "dBCSPwd", &user->lmpassword);
@@ -383,7 +396,11 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
        }
            
        ADD_OR_DEL(string, "comment", comment.string);
-       ADD_OR_DEL(string, "userParameters", parameters.string);
+
+       if (samdb_msg_add_parameters(state->sam_ldb, mem_ctx, msg, "userParameters", &user->parameters) != 0) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
        ADD_OR_DEL(uint, "countryCode", country_code);
        ADD_OR_DEL(uint, "codePage", code_page);
 
@@ -419,8 +436,7 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
                obj_class = "user";
        }
        if (add) {
-               samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 
-                                    "objectClass", obj_class);
+               ldb_msg_add_string(msg, "objectClass", obj_class);
                if (!msg->dn) {
                        msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);
                        ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);
@@ -430,7 +446,7 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
                }
 
                ret = ldb_add(state->sam_ldb, msg);
-               if (ret != 0) {
+               if (ret != LDB_SUCCESS) {
                        struct ldb_dn *first_try_dn = msg->dn;
                        /* Try again with the default DN */
                        if (!remote_msgs) {
@@ -441,7 +457,7 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
                        } else {
                                msg->dn = talloc_steal(msg, remote_msgs[0]->dn);
                                ret = ldb_add(state->sam_ldb, msg);
-                               if (ret != 0) {
+                               if (ret != LDB_SUCCESS) {
                                        *error_string = talloc_asprintf(mem_ctx, "Failed to create user record.  Tried both %s and %s: %s",
                                                                        ldb_dn_get_linearized(first_try_dn),
                                                                        ldb_dn_get_linearized(msg->dn),
@@ -451,8 +467,8 @@ static NTSTATUS samsync_ldb_handle_user(TALLOC_CTX *mem_ctx,
                        }
                }
        } else {
-               ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-               if (ret != 0) {
+               ret = dsdb_replace(state->sam_ldb, msg, 0);
+               if (ret != LDB_SUCCESS) {
                        *error_string = talloc_asprintf(mem_ctx, "Failed to modify user record %s: %s",
                                                        ldb_dn_get_linearized(msg->dn),
                                                        ldb_errstring(state->sam_ldb));
@@ -494,7 +510,7 @@ static NTSTATUS samsync_ldb_delete_user(TALLOC_CTX *mem_ctx,
        }
 
        ret = ldb_delete(state->sam_ldb, msgs[0]->dn);
-       if (ret != 0) {
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to delete user record %s: %s",
                                                ldb_dn_get_linearized(msgs[0]->dn),
                                                ldb_errstring(state->sam_ldb));
@@ -574,8 +590,7 @@ static NTSTATUS samsync_ldb_handle_group(TALLOC_CTX *mem_ctx,
        obj_class = "group";
 
        if (add) {
-               samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 
-                                    "objectClass", obj_class);
+               ldb_msg_add_string(msg, "objectClass", obj_class);
                msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);
                ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);
                if (!msg->dn) {
@@ -583,15 +598,15 @@ static NTSTATUS samsync_ldb_handle_group(TALLOC_CTX *mem_ctx,
                }
 
                ret = ldb_add(state->sam_ldb, msg);
-               if (ret != 0) {
+               if (ret != LDB_SUCCESS) {
                        *error_string = talloc_asprintf(mem_ctx, "Failed to create group record %s: %s",
                                                        ldb_dn_get_linearized(msg->dn),
                                                        ldb_errstring(state->sam_ldb));
                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
                }
        } else {
-               ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-               if (ret != 0) {
+               ret = dsdb_replace(state->sam_ldb, msg, 0);
+               if (ret != LDB_SUCCESS) {
                        *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",
                                                        ldb_dn_get_linearized(msg->dn),
                                                        ldb_errstring(state->sam_ldb));
@@ -633,7 +648,7 @@ static NTSTATUS samsync_ldb_delete_group(TALLOC_CTX *mem_ctx,
        }
        
        ret = ldb_delete(state->sam_ldb, msgs[0]->dn);
-       if (ret != 0) {
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to delete group record %s: %s",
                                                ldb_dn_get_linearized(msgs[0]->dn),
                                                ldb_errstring(state->sam_ldb));
@@ -650,12 +665,13 @@ static NTSTATUS samsync_ldb_handle_group_member(TALLOC_CTX *mem_ctx,
                                                char **error_string) 
 {
        uint32_t rid = delta->delta_id_union.rid;
-       struct netr_DELTA_GROUP_MEMBER *group_member = delta->delta_union.group_member;
+       struct netr_DELTA_GROUP_MEMBER *delta_group_member = delta->delta_union.group_member;
        struct ldb_message *msg;
        struct ldb_message **msgs;
        int ret;
        const char *attrs[] = { NULL };
-       int i;
+       const char *str_dn;
+       uint32_t i;
 
        msg = ldb_msg_new(mem_ctx);
        if (msg == NULL) {
@@ -685,11 +701,11 @@ static NTSTATUS samsync_ldb_handle_group_member(TALLOC_CTX *mem_ctx,
        
        talloc_free(msgs);
 
-       for (i=0; i<group_member->num_rids; i++) {
+       for (i=0; i<delta_group_member->num_rids; i++) {
                /* search for the group, by rid */
                ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[database], &msgs, attrs,
                                   "(&(objectClass=user)(objectSid=%s))", 
-                                  ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], group_member->rids[i]))); 
+                                  ldap_encode_ndr_dom_sid(mem_ctx, dom_sid_add_rid(mem_ctx, state->dom_sid[database], delta_group_member->rids[i])));
                
                if (ret == -1) {
                        *error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));
@@ -699,14 +715,17 @@ static NTSTATUS samsync_ldb_handle_group_member(TALLOC_CTX *mem_ctx,
                } else if (ret > 1) {
                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
                } else {
-                       samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "member", ldb_dn_alloc_linearized(mem_ctx, msgs[0]->dn));
+                       str_dn = ldb_dn_alloc_linearized(msg, msgs[0]->dn);
+                       NT_STATUS_HAVE_NO_MEMORY(str_dn);
+                       ret = ldb_msg_add_string(msg, "member", str_dn);
+                       if (ret != LDB_SUCCESS) return NT_STATUS_NO_MEMORY;
                }
                
                talloc_free(msgs);
        }
        
-       ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-       if (ret != 0) {
+       ret = dsdb_replace(state->sam_ldb, msg, 0);
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",
                                                ldb_dn_get_linearized(msg->dn),
                                                ldb_errstring(state->sam_ldb));
@@ -788,8 +807,7 @@ static NTSTATUS samsync_ldb_handle_alias(TALLOC_CTX *mem_ctx,
        obj_class = "group";
 
        if (add) {
-               samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, 
-                                    "objectClass", obj_class);
+               ldb_msg_add_string(msg, "objectClass", obj_class);
                msg->dn = ldb_dn_copy(mem_ctx, state->base_dn[database]);
                ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=%s", cn_name, container);
                if (!msg->dn) {
@@ -797,15 +815,15 @@ static NTSTATUS samsync_ldb_handle_alias(TALLOC_CTX *mem_ctx,
                }
 
                ret = ldb_add(state->sam_ldb, msg);
-               if (ret != 0) {
+               if (ret != LDB_SUCCESS) {
                        *error_string = talloc_asprintf(mem_ctx, "Failed to create alias record %s: %s",
                                                        ldb_dn_get_linearized(msg->dn),
                                                        ldb_errstring(state->sam_ldb));
                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
                }
        } else {
-               ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-               if (ret != 0) {
+               ret = dsdb_replace(state->sam_ldb, msg, 0);
+               if (ret != LDB_SUCCESS) {
                        *error_string = talloc_asprintf(mem_ctx, "Failed to modify alias record %s: %s",
                                                        ldb_dn_get_linearized(msg->dn),
                                                        ldb_errstring(state->sam_ldb));
@@ -842,7 +860,7 @@ static NTSTATUS samsync_ldb_delete_alias(TALLOC_CTX *mem_ctx,
        }
 
        ret = ldb_delete(state->sam_ldb, msgs[0]->dn);
-       if (ret != 0) {
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to delete alias record %s: %s",
                                                ldb_dn_get_linearized(msgs[0]->dn),
                                                ldb_errstring(state->sam_ldb));
@@ -864,7 +882,7 @@ static NTSTATUS samsync_ldb_handle_alias_member(TALLOC_CTX *mem_ctx,
        struct ldb_message **msgs;
        int ret;
        const char *attrs[] = { NULL };
-       int i;
+       uint32_t i;
 
        msg = ldb_msg_new(mem_ctx);
        if (msg == NULL) {
@@ -896,6 +914,7 @@ static NTSTATUS samsync_ldb_handle_alias_member(TALLOC_CTX *mem_ctx,
 
        for (i=0; i<alias_member->sids.num_sids; i++) {
                struct ldb_dn *alias_member_dn;
+               const char *str_dn;
                /* search for members, in the top basedn (normal users are builtin aliases) */
                ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[SAM_DATABASE_DOMAIN], &msgs, attrs,
                                   "(objectSid=%s)", 
@@ -918,13 +937,16 @@ static NTSTATUS samsync_ldb_handle_alias_member(TALLOC_CTX *mem_ctx,
                } else {
                        alias_member_dn = msgs[0]->dn;
                }
-               samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "member", ldb_dn_alloc_linearized(mem_ctx, alias_member_dn));
+               str_dn = ldb_dn_alloc_linearized(msg, alias_member_dn);
+               NT_STATUS_HAVE_NO_MEMORY(str_dn);
+               ret = ldb_msg_add_string(msg, "member", str_dn);
+               if (ret != LDB_SUCCESS) return NT_STATUS_NO_MEMORY;
        
                talloc_free(msgs);
        }
 
-       ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-       if (ret != 0) {
+       ret = dsdb_replace(state->sam_ldb, msg, 0);
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to modify group record %s: %s",
                                                ldb_dn_get_linearized(msg->dn),
                                                ldb_errstring(state->sam_ldb));
@@ -944,51 +966,39 @@ static NTSTATUS samsync_ldb_handle_account(TALLOC_CTX *mem_ctx,
        struct netr_DELTA_ACCOUNT *account = delta->delta_union.account;
 
        struct ldb_message *msg;
-       struct ldb_message **msgs;
-       struct ldb_dn *privilege_dn;
        int ret;
-       const char *attrs[] = { NULL };
-       int i;
+       uint32_t i;
+       char *dnstr, *sidstr;
 
        msg = ldb_msg_new(mem_ctx);
        if (msg == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
 
-       /* search for the account, by sid, in the top basedn */
-       ret = gendb_search(state->sam_ldb, mem_ctx, state->base_dn[SAM_DATABASE_DOMAIN], &msgs, attrs,
-                          "(objectSid=%s)", ldap_encode_ndr_dom_sid(mem_ctx, sid)); 
+       sidstr = dom_sid_string(msg, sid);
+       NT_STATUS_HAVE_NO_MEMORY_AND_FREE(sidstr, msg);
 
-       if (ret == -1) {
-               *error_string = talloc_asprintf(mem_ctx, "gendb_search failed: %s", ldb_errstring(state->sam_ldb));
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
-       } else if (ret == 0) {
-               NTSTATUS nt_status;
-               nt_status = samsync_ldb_add_foreignSecurityPrincipal(mem_ctx, state,
-                                                                    sid,
-                                                                    &privilege_dn,
-                                                                    error_string);
-               privilege_dn = talloc_steal(msg, privilege_dn);
-               if (!NT_STATUS_IS_OK(nt_status)) {
-                       return nt_status;
-               }
-       } else if (ret > 1) {
-               *error_string = talloc_asprintf(mem_ctx, "More than one account with SID: %s", 
-                                               dom_sid_string(mem_ctx, sid));
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
-       } else {
-               privilege_dn = talloc_steal(msg, msgs[0]->dn);
-       }
+       dnstr = talloc_asprintf(msg, "sid=%s", sidstr);
+       NT_STATUS_HAVE_NO_MEMORY_AND_FREE(dnstr, msg);
 
-       msg->dn = privilege_dn;
+       msg->dn = ldb_dn_new(msg, state->pdb, dnstr);
+       NT_STATUS_HAVE_NO_MEMORY_AND_FREE(msg->dn, msg);
 
        for (i=0; i< account->privilege_entries; i++) {
-               samdb_msg_add_string(state->sam_ldb, mem_ctx, msg, "privilege",
-                                    account->privilege_name[i].string);
+               ldb_msg_add_string(msg, "privilege", account->privilege_name[i].string);
        }
 
-       ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-       if (ret != 0) {
+       ret = dsdb_replace(state->pdb, msg, 0);
+       if (ret == LDB_ERR_NO_SUCH_OBJECT) {
+               if (samdb_msg_add_dom_sid(state->pdb, msg, msg, "objectSid", sid) != LDB_SUCCESS) {
+                       talloc_free(msg);
+                       return NT_STATUS_NO_MEMORY;
+               }
+               ldb_msg_add_string(msg, "comment", "added via samsync");
+               ret = ldb_add(state->pdb, msg);         
+       }
+
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to modify privilege record %s",
                                                ldb_dn_get_linearized(msg->dn));
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
@@ -1034,10 +1044,10 @@ static NTSTATUS samsync_ldb_delete_account(TALLOC_CTX *mem_ctx,
        }
 
        samdb_msg_add_delete(state->sam_ldb, mem_ctx, msg,  
-                            "privilage"); 
+                            "privilege");
 
-       ret = samdb_replace(state->sam_ldb, mem_ctx, msg);
-       if (ret != 0) {
+       ret = dsdb_replace(state->sam_ldb, msg, 0);
+       if (ret != LDB_SUCCESS) {
                *error_string = talloc_asprintf(mem_ctx, "Failed to modify privilege record %s",
                                                ldb_dn_get_linearized(msg->dn));
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
@@ -1047,13 +1057,13 @@ static NTSTATUS samsync_ldb_delete_account(TALLOC_CTX *mem_ctx,
 }
 
 static NTSTATUS libnet_samsync_ldb_fn(TALLOC_CTX *mem_ctx,             
-                                     void *private,                    
+                                     void *private_data,
                                      enum netr_SamDatabaseID database,
                                      struct netr_DELTA_ENUM *delta,
                                      char **error_string)
 {
        NTSTATUS nt_status = NT_STATUS_OK;
-       struct samsync_ldb_state *state = talloc_get_type(private, struct samsync_ldb_state);
+       struct samsync_ldb_state *state = talloc_get_type(private_data, struct samsync_ldb_state);
 
        *error_string = NULL;
        switch (delta->delta_type) {
@@ -1167,11 +1177,11 @@ static NTSTATUS libnet_samsync_ldb_fn(TALLOC_CTX *mem_ctx,
 }
 
 static NTSTATUS libnet_samsync_ldb_init(TALLOC_CTX *mem_ctx,           
-                                       void *private,
+                                       void *private_data,
                                        struct libnet_SamSync_state *samsync_state,
                                        char **error_string)
 {
-       struct samsync_ldb_state *state = talloc_get_type(private, struct samsync_ldb_state);
+       struct samsync_ldb_state *state = talloc_get_type(private_data, struct samsync_ldb_state);
        const char *server = dcerpc_server_name(samsync_state->netlogon_pipe);
        char *ldap_url;
 
@@ -1193,10 +1203,11 @@ static NTSTATUS libnet_samsync_ldb_init(TALLOC_CTX *mem_ctx,
                ldap_url = talloc_asprintf(state, "ldap://%s", server);
                
                state->remote_ldb = ldb_wrap_connect(mem_ctx, 
-                                                    global_loadparm, 
+                                                    NULL,
+                                                    state->samsync_state->machine_net_ctx->lp_ctx,
                                                     ldap_url, 
                                                     NULL, state->samsync_state->machine_net_ctx->cred,
-                                                    0, NULL);
+                                                    0);
                if (!state->remote_ldb) {
                        *error_string = talloc_asprintf(mem_ctx, "Failed to connect to remote LDAP server at %s (used to extract additional data in SamSync replication)", ldap_url);
                        return NT_STATUS_NO_LOGON_SERVERS;
@@ -1220,15 +1231,23 @@ NTSTATUS libnet_samsync_ldb(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, str
        state->secrets         = NULL;
        state->trusted_domains = NULL;
 
-       state->sam_ldb         = ldb_wrap_connect(mem_ctx, 
-                                                 global_loadparm, 
-                                                 lp_sam_url(global_loadparm), 
-                                                 r->in.session_info,
-                                                 ctx->cred, 0, NULL);
+       state->sam_ldb         = samdb_connect(mem_ctx, 
+                                              ctx->event_ctx,
+                                              ctx->lp_ctx,
+                                              r->in.session_info,
+                                                  0);
+       if (!state->sam_ldb) {
+               return NT_STATUS_INTERNAL_DB_ERROR;
+       }
+
+       state->pdb             = privilege_connect(mem_ctx, 
+                                                  ctx->lp_ctx);
+       if (!state->pdb) {
+               return NT_STATUS_INTERNAL_DB_ERROR;
+       }
 
        r2.out.error_string    = NULL;
        r2.in.binding_string   = r->in.binding_string;
-       r2.in.rid_crypt        = true;
        r2.in.init_fn          = libnet_samsync_ldb_init;
        r2.in.delta_fn         = libnet_samsync_ldb_fn;
        r2.in.fn_ctx           = state;