Fix the wbinfo test on the LDAP backend.
[metze/samba/wip.git] / source / winbind / wb_init_domain.c
index 83769b1489a9ba7d3b7462e4bdbae08f06a4f3dd..c6dee825a904b481bdfede3025149234914c33fe 100644 (file)
@@ -38,6 +38,7 @@
 #include "libcli/ldap/ldap_client.h"
 
 #include "auth/credentials/credentials.h"
+#include "param/param.h"
 
 /*
  * Initialize a domain:
@@ -75,7 +76,6 @@ static void init_domain_recv_netlogonpipe(struct composite_context *ctx);
 static void init_domain_recv_lsa_pipe(struct composite_context *ctx);
 static void init_domain_recv_lsa_policy(struct rpc_request *req);
 static void init_domain_recv_queryinfo(struct rpc_request *req);
-static void init_domain_recv_ldapconn(struct composite_context *ctx);
 static void init_domain_recv_samr(struct composite_context *ctx);
 
 static struct dcerpc_binding *init_domain_binding(struct init_domain_state *state, 
@@ -100,7 +100,8 @@ static struct dcerpc_binding *init_domain_binding(struct init_domain_state *stat
        binding->host = state->domain->dc_address;
 
        /* This shouldn't make a network call, as the mappings for named pipes are well known */
-       status = dcerpc_epm_map_binding(binding, binding, table, state->service->task->event_ctx);
+       status = dcerpc_epm_map_binding(binding, binding, table, state->service->task->event_ctx,
+                                       state->service->task->lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
                return NULL;
        }
@@ -142,34 +143,33 @@ struct composite_context *wb_init_domain_send(TALLOC_CTX *mem_ctx,
        state->domain->dc_name = dom_info->dcs[0].name;
        state->domain->dc_address = dom_info->dcs[0].address;
 
-       state->domain->libnet_ctx = libnet_context_init(service->task->event_ctx);
+       state->domain->libnet_ctx = libnet_context_init(service->task->event_ctx, 
+                                                       service->task->lp_ctx);
 
        /* Create a credentials structure */
        state->domain->libnet_ctx->cred = cli_credentials_init(state->domain);
        if (state->domain->libnet_ctx->cred == NULL) goto failed;
 
-       cli_credentials_set_event_context(state->domain->libnet_ctx->cred, service->task->event_ctx);
-
-       cli_credentials_set_conf(state->domain->libnet_ctx->cred);
+       cli_credentials_set_conf(state->domain->libnet_ctx->cred, service->task->lp_ctx);
 
        /* Connect the machine account to the credentials */
        state->ctx->status =
-               cli_credentials_set_machine_account(state->domain->libnet_ctx->cred);
+               cli_credentials_set_machine_account(state->domain->libnet_ctx->cred, state->domain->libnet_ctx->lp_ctx);
        if (!NT_STATUS_IS_OK(state->ctx->status)) goto failed;
 
-       state->domain->netlogon_binding = init_domain_binding(state, &dcerpc_table_netlogon);
+       state->domain->netlogon_binding = init_domain_binding(state, &ndr_table_netlogon);
 
        state->domain->netlogon_pipe = NULL;
 
        if ((!cli_credentials_is_anonymous(state->domain->libnet_ctx->cred)) &&
-           ((lp_server_role() == ROLE_DOMAIN_MEMBER) ||
-            (lp_server_role() == ROLE_DOMAIN_CONTROLLER)) &&
+           ((lp_server_role(service->task->lp_ctx) == ROLE_DOMAIN_MEMBER) ||
+            (lp_server_role(service->task->lp_ctx) == ROLE_DOMAIN_CONTROLLER)) &&
            (dom_sid_equal(state->domain->info->sid,
                           state->service->primary_sid))) {
                state->domain->netlogon_binding->flags |= DCERPC_SCHANNEL;
 
                /* For debugging, it can be a real pain if all the traffic is encrypted */
-               if (lp_winbind_sealed_pipes()) {
+               if (lp_winbind_sealed_pipes(service->task->lp_ctx)) {
                        state->domain->netlogon_binding->flags |= (DCERPC_SIGN | DCERPC_SEAL );
                } else {
                        state->domain->netlogon_binding->flags |= (DCERPC_SIGN);
@@ -179,9 +179,10 @@ struct composite_context *wb_init_domain_send(TALLOC_CTX *mem_ctx,
        /* No encryption on anonymous pipes */
 
        ctx = dcerpc_pipe_connect_b_send(state, state->domain->netlogon_binding, 
-                                        &dcerpc_table_netlogon,
+                                        &ndr_table_netlogon,
                                         state->domain->libnet_ctx->cred,
-                                        service->task->event_ctx);
+                                        service->task->event_ctx,
+                                        service->task->lp_ctx);
        
        if (composite_nomem(ctx, state->ctx)) {
                goto failed;
@@ -207,15 +208,14 @@ static void init_domain_recv_netlogonpipe(struct composite_context *ctx)
                                                   &state->domain->netlogon_pipe);
        
        if (!composite_is_ok(state->ctx)) {
-               talloc_free(state->domain->netlogon_binding);
                return;
        }
        talloc_steal(state->domain->netlogon_pipe, state->domain->netlogon_binding);
 
-       state->domain->lsa_binding = init_domain_binding(state, &dcerpc_table_lsarpc);
+       state->domain->lsa_binding = init_domain_binding(state, &ndr_table_lsarpc);
 
        /* For debugging, it can be a real pain if all the traffic is encrypted */
-       if (lp_winbind_sealed_pipes()) {
+       if (lp_winbind_sealed_pipes(state->service->task->lp_ctx)) {
                state->domain->lsa_binding->flags |= (DCERPC_SIGN | DCERPC_SEAL );
        } else {
                state->domain->lsa_binding->flags |= (DCERPC_SIGN);
@@ -227,8 +227,9 @@ static void init_domain_recv_netlogonpipe(struct composite_context *ctx)
           secured with SPNEGO or NTLMSSP */
        ctx = dcerpc_secondary_auth_connection_send(state->domain->netlogon_pipe,
                                                    state->domain->lsa_binding,
-                                                   &dcerpc_table_lsarpc,
-                                                   state->domain->libnet_ctx->cred
+                                                   &ndr_table_lsarpc,
+                                                   state->domain->libnet_ctx->cred,
+                                                   state->domain->libnet_ctx->lp_ctx
                );
        composite_continue(state->ctx, ctx, init_domain_recv_lsa_pipe, state);
 }
@@ -254,7 +255,8 @@ static bool retry_with_schannel(struct init_domain_state *state,
                ctx = dcerpc_secondary_auth_connection_send(state->domain->netlogon_pipe,
                                                            binding,
                                                            table, 
-                                                           state->domain->libnet_ctx->cred);
+                                                           state->domain->libnet_ctx->cred,
+                                                           state->domain->libnet_ctx->lp_ctx);
                composite_continue(state->ctx, ctx, continuation, state);               
                return true;
        } else {
@@ -275,7 +277,7 @@ static void init_domain_recv_lsa_pipe(struct composite_context *ctx)
                                                                   &state->domain->libnet_ctx->lsa.pipe);
        if (NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_LOGON_FAILURE)) {
                if (retry_with_schannel(state, state->domain->lsa_binding, 
-                                       &dcerpc_table_lsarpc,
+                                       &ndr_table_lsarpc,
                                        init_domain_recv_lsa_pipe)) {
                        return;
                }
@@ -315,7 +317,7 @@ static void init_domain_recv_lsa_policy(struct rpc_request *req)
        if ((!NT_STATUS_IS_OK(state->ctx->status)
              || !NT_STATUS_IS_OK(state->lsa_openpolicy.out.result))) {
                if (retry_with_schannel(state, state->domain->lsa_binding, 
-                                       &dcerpc_table_lsarpc,
+                                       &ndr_table_lsarpc,
                                        init_domain_recv_lsa_pipe)) {
                        return;
                }
@@ -365,7 +367,7 @@ static void init_domain_recv_queryinfo(struct rpc_request *req)
                return;
        }
 
-       state->domain->samr_binding = init_domain_binding(state, &dcerpc_table_samr);
+       state->domain->samr_binding = init_domain_binding(state, &ndr_table_samr);
 
        /* We want to use the same flags as the LSA pipe did (so, if
         * it needed schannel, then we need that here too) */
@@ -398,36 +400,6 @@ static void init_domain_recv_samr(struct composite_context *ctx)
        state->domain->libnet_ctx->samr.name = state->domain->info->name;
        state->domain->libnet_ctx->samr.sid = state->domain->info->sid;
 
-       state->domain->ldap_conn =
-               ldap4_new_connection(state->domain, state->ctx->event_ctx);
-       composite_nomem(state->domain->ldap_conn, state->ctx);
-
-       ldap_url = talloc_asprintf(state, "ldap://%s/",
-                                  state->domain->dc_address);
-       composite_nomem(ldap_url, state->ctx);
-
-       ctx = ldap_connect_send(state->domain->ldap_conn, ldap_url);
-       composite_continue(state->ctx, ctx, init_domain_recv_ldapconn, state);
-}
-
-static void init_domain_recv_ldapconn(struct composite_context *ctx)
-{
-       struct init_domain_state *state =
-               talloc_get_type(ctx->async.private_data,
-                               struct init_domain_state);
-
-       state->ctx->status = ldap_connect_recv(ctx);
-       if (NT_STATUS_IS_OK(state->ctx->status)) {
-               state->domain->ldap_conn->host =
-                       talloc_strdup(state->domain->ldap_conn,
-                                     state->domain->dc_name);
-               state->ctx->status =
-                       ldap_bind_sasl(state->domain->ldap_conn,
-                                      state->domain->libnet_ctx->cred);
-               DEBUG(0, ("ldap_bind returned %s\n",
-                         nt_errstr(state->ctx->status)));
-       }
-
        composite_done(state->ctx);
 }