s3-rpc_server rename NTLMSSP functions to auth_generic..()
[mat/samba.git] / source3 / rpc_server / srv_pipe.c
index b4611de3acf0f75620ef5d17030f871f44a89d02..5b2c78ab145b5e6a4fc1ec4353c6290078836449 100644 (file)
@@ -43,6 +43,7 @@
 #include "ntdomain.h"
 #include "rpc_server/srv_pipe.h"
 #include "rpc_server/rpc_contexts.h"
+#include "lib/param/param.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
@@ -356,10 +357,10 @@ static bool check_bind_req(struct pipes_struct *p,
                return false;
        }
 
-       context_fns = SMB_MALLOC_P(struct pipe_rpc_fns);
+       context_fns = talloc(p, struct pipe_rpc_fns);
        if (context_fns == NULL) {
-               DEBUG(0,("check_bind_req: malloc() failed!\n"));
-               return False;
+               DEBUG(0,("check_bind_req: talloc() failed!\n"));
+               return false;
        }
 
        context_fns->next = context_fns->prev = NULL;
@@ -477,6 +478,7 @@ static bool pipe_schannel_auth_bind(struct pipes_struct *p,
        struct netlogon_creds_CredentialState *creds;
        enum ndr_err_code ndr_err;
        struct schannel_state *schannel_auth;
+       struct loadparm_context *lp_ctx;
 
        ndr_err = ndr_pull_struct_blob(
                        &auth_info->credentials, mem_ctx, &neg,
@@ -495,6 +497,12 @@ static bool pipe_schannel_auth_bind(struct pipes_struct *p,
                return false;
        }
 
+       lp_ctx = loadparm_init_s3(p, loadparm_s3_context());
+       if (!lp_ctx) {
+               DEBUG(0,("pipe_schannel_auth_bind: loadparm_init_s3() failed!\n"));
+               return false;
+       }
+
        /*
         * The neg.oem_netbios_computer.a key here must match the remote computer name
         * given in the DOM_CLNT_SRV.uni_comp_name used on all netlogon pipe
@@ -502,10 +510,11 @@ static bool pipe_schannel_auth_bind(struct pipes_struct *p,
         */
 
        become_root();
-       status = schannel_get_creds_state(p, lp_private_dir(),
+       status = schannel_get_creds_state(p, lp_ctx,
                                            neg.oem_netbios_computer.a, &creds);
        unbecome_root();
-
+       
+       talloc_unlink(p, lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("pipe_schannel_auth_bind: Attempt to bind using schannel without successful serverauth2\n"));
                return False;
@@ -580,7 +589,7 @@ static bool pipe_ntlmssp_auth_bind(struct pipes_struct *p,
                                   struct dcerpc_auth *auth_info,
                                   DATA_BLOB *response)
 {
-       struct auth_ntlmssp_state *ntlmssp_state = NULL;
+       struct gensec_security *gensec_security = NULL;
         NTSTATUS status;
 
        if (strncmp((char *)auth_info->credentials.data, "NTLMSSP", 7) != 0) {
@@ -589,7 +598,8 @@ static bool pipe_ntlmssp_auth_bind(struct pipes_struct *p,
         }
 
        /* We have an NTLMSSP blob. */
-       status = ntlmssp_server_auth_start(p,
+       status = auth_generic_server_start(p,
+                                          OID_NTLMSSP,
                                           (auth_info->auth_level ==
                                                DCERPC_AUTH_LEVEL_INTEGRITY),
                                           (auth_info->auth_level ==
@@ -598,7 +608,7 @@ static bool pipe_ntlmssp_auth_bind(struct pipes_struct *p,
                                           &auth_info->credentials,
                                           response,
                                           p->remote_address,
-                                          &ntlmssp_state);
+                                          &gensec_security);
        if (!NT_STATUS_EQUAL(status, NT_STATUS_OK)) {
                DEBUG(0, (__location__ ": auth_ntlmssp_start failed: %s\n",
                          nt_errstr(status)));
@@ -608,7 +618,7 @@ static bool pipe_ntlmssp_auth_bind(struct pipes_struct *p,
        /* Make sure data is bound to the memctx, to be freed the caller */
        talloc_steal(mem_ctx, response->data);
 
-       p->auth.auth_ctx = ntlmssp_state;
+       p->auth.auth_ctx = gensec_security;
        p->auth.auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
 
        DEBUG(10, (__location__ ": NTLMSSP auth started\n"));
@@ -624,9 +634,9 @@ static bool pipe_ntlmssp_auth_bind(struct pipes_struct *p,
 *******************************************************************/
 
 static bool pipe_ntlmssp_verify_final(TALLOC_CTX *mem_ctx,
-                               struct auth_ntlmssp_state *ntlmssp_ctx,
+                               struct gensec_security *gensec_security,
                                enum dcerpc_AuthLevel auth_level,
-                               struct auth_serversupplied_info **session_info)
+                               struct auth_session_info **session_info)
 {
        NTSTATUS status;
        bool ret;
@@ -637,7 +647,7 @@ static bool pipe_ntlmssp_verify_final(TALLOC_CTX *mem_ctx,
           ensure the underlying NTLMSSP flags are also set. If not we should
           refuse the bind. */
 
-       status = ntlmssp_server_check_flags(ntlmssp_ctx,
+       status = auth_generic_server_check_flags(gensec_security,
                                            (auth_level ==
                                                DCERPC_AUTH_LEVEL_INTEGRITY),
                                            (auth_level ==
@@ -650,7 +660,7 @@ static bool pipe_ntlmssp_verify_final(TALLOC_CTX *mem_ctx,
 
        TALLOC_FREE(*session_info);
 
-       status = ntlmssp_server_get_user_info(ntlmssp_ctx,
+       status = auth_generic_server_get_user_info(gensec_security,
                                                mem_ctx, session_info);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, (__location__ ": failed to obtain the server info "
@@ -722,8 +732,8 @@ err:
 
 static NTSTATUS pipe_gssapi_verify_final(TALLOC_CTX *mem_ctx,
                                         struct gse_context *gse_ctx,
-                                        struct client_address *client_id,
-                                        struct auth_serversupplied_info **session_info)
+                                        const struct tsocket_address *remote_address,
+                                        struct auth_session_info **session_info)
 {
        NTSTATUS status;
        bool bret;
@@ -739,7 +749,7 @@ static NTSTATUS pipe_gssapi_verify_final(TALLOC_CTX *mem_ctx,
        }
 
        status = gssapi_server_get_user_info(gse_ctx, mem_ctx,
-                                            client_id, session_info);
+                                            remote_address, session_info);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, (__location__ ": failed to obtain the server info "
                          "for authenticated user: %s\n", nt_errstr(status)));
@@ -763,7 +773,7 @@ static NTSTATUS pipe_gssapi_verify_final(TALLOC_CTX *mem_ctx,
 static NTSTATUS pipe_auth_verify_final(struct pipes_struct *p)
 {
        enum spnego_mech auth_type;
-       struct auth_ntlmssp_state *ntlmssp_ctx;
+       struct gensec_security *gensec_security;
        struct spnego_context *spnego_ctx;
        struct gse_context *gse_ctx;
        void *mech_ctx;
@@ -771,9 +781,9 @@ static NTSTATUS pipe_auth_verify_final(struct pipes_struct *p)
 
        switch (p->auth.auth_type) {
        case DCERPC_AUTH_TYPE_NTLMSSP:
-               ntlmssp_ctx = talloc_get_type_abort(p->auth.auth_ctx,
-                                                   struct auth_ntlmssp_state);
-               if (!pipe_ntlmssp_verify_final(p, ntlmssp_ctx,
+               gensec_security = talloc_get_type_abort(p->auth.auth_ctx,
+                                                       struct gensec_security);
+               if (!pipe_ntlmssp_verify_final(p, gensec_security,
                                                p->auth.auth_level,
                                                &p->session_info)) {
                        return NT_STATUS_ACCESS_DENIED;
@@ -783,7 +793,7 @@ static NTSTATUS pipe_auth_verify_final(struct pipes_struct *p)
                gse_ctx = talloc_get_type_abort(p->auth.auth_ctx,
                                                struct gse_context);
                status = pipe_gssapi_verify_final(p, gse_ctx,
-                                                 p->client_id,
+                                                 p->remote_address,
                                                  &p->session_info);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(1, ("gssapi bind failed with: %s",
@@ -806,7 +816,7 @@ static NTSTATUS pipe_auth_verify_final(struct pipes_struct *p)
                        gse_ctx = talloc_get_type_abort(mech_ctx,
                                                        struct gse_context);
                        status = pipe_gssapi_verify_final(p, gse_ctx,
-                                                         p->client_id,
+                                                         p->remote_address,
                                                          &p->session_info);
                        if (!NT_STATUS_IS_OK(status)) {
                                DEBUG(1, ("gssapi bind failed with: %s",
@@ -815,9 +825,9 @@ static NTSTATUS pipe_auth_verify_final(struct pipes_struct *p)
                        }
                        break;
                case SPNEGO_NTLMSSP:
-                       ntlmssp_ctx = talloc_get_type_abort(mech_ctx,
-                                               struct auth_ntlmssp_state);
-                       if (!pipe_ntlmssp_verify_final(p, ntlmssp_ctx,
+                       gensec_security = talloc_get_type_abort(mech_ctx,
+                                               struct gensec_security);
+                       if (!pipe_ntlmssp_verify_final(p, gensec_security,
                                                        p->auth.auth_level,
                                                        &p->session_info)) {
                                return NT_STATUS_ACCESS_DENIED;
@@ -1154,7 +1164,7 @@ bool api_pipe_bind_auth3(struct pipes_struct *p, struct ncacn_packet *pkt)
 {
        struct dcerpc_auth auth_info;
        DATA_BLOB response = data_blob_null;
-       struct auth_ntlmssp_state *ntlmssp_ctx;
+       struct gensec_security *gensec_security;
        struct spnego_context *spnego_ctx;
        struct gse_context *gse_ctx;
        NTSTATUS status;
@@ -1202,9 +1212,9 @@ bool api_pipe_bind_auth3(struct pipes_struct *p, struct ncacn_packet *pkt)
 
        switch (auth_info.auth_type) {
        case DCERPC_AUTH_TYPE_NTLMSSP:
-               ntlmssp_ctx = talloc_get_type_abort(p->auth.auth_ctx,
-                                                   struct auth_ntlmssp_state);
-               status = ntlmssp_server_step(ntlmssp_ctx,
+               gensec_security = talloc_get_type_abort(p->auth.auth_ctx,
+                                                   struct gensec_security);
+               status = auth_generic_server_step(gensec_security,
                                             pkt, &auth_info.credentials,
                                             &response);
                break;
@@ -1273,7 +1283,7 @@ static bool api_pipe_alter_context(struct pipes_struct *p,
        DATA_BLOB auth_resp = data_blob_null;
        DATA_BLOB auth_blob = data_blob_null;
        int pad_len = 0;
-       struct auth_ntlmssp_state *ntlmssp_ctx;
+       struct gensec_security *gensec_security;
        struct spnego_context *spnego_ctx;
        struct gse_context *gse_ctx;
 
@@ -1370,9 +1380,9 @@ static bool api_pipe_alter_context(struct pipes_struct *p,
                                                    &auth_resp);
                        break;
                case DCERPC_AUTH_TYPE_NTLMSSP:
-                       ntlmssp_ctx = talloc_get_type_abort(p->auth.auth_ctx,
-                                                   struct auth_ntlmssp_state);
-                       status = ntlmssp_server_step(ntlmssp_ctx,
+                       gensec_security = talloc_get_type_abort(p->auth.auth_ctx,
+                                                   struct gensec_security);
+                       status = auth_generic_server_step(gensec_security,
                                                     pkt,
                                                     &auth_info.credentials,
                                                     &auth_resp);
@@ -1521,18 +1531,18 @@ static bool api_pipe_request(struct pipes_struct *p,
                                struct ncacn_packet *pkt)
 {
        bool ret = False;
-       bool changed_user = False;
-       PIPE_RPC_FNS *pipe_fns;
-
-       if (p->pipe_bound &&
-           ((p->auth.auth_type == DCERPC_AUTH_TYPE_NTLMSSP) ||
-            (p->auth.auth_type == DCERPC_AUTH_TYPE_KRB5) ||
-            (p->auth.auth_type == DCERPC_AUTH_TYPE_SPNEGO))) {
-               if(!become_authenticated_pipe_user(p->session_info)) {
-                       data_blob_free(&p->out_data.rdata);
-                       return False;
-               }
-               changed_user = True;
+       struct pipe_rpc_fns *pipe_fns;
+
+       if (!p->pipe_bound) {
+               DEBUG(1, ("Pipe not bound!\n"));
+               data_blob_free(&p->out_data.rdata);
+               return false;
+       }
+
+       if (!become_authenticated_pipe_user(p->session_info)) {
+               DEBUG(1, ("Failed to become pipe user!\n"));
+               data_blob_free(&p->out_data.rdata);
+               return false;
        }
 
        /* get the set of RPC functions for this context */
@@ -1557,9 +1567,7 @@ static bool api_pipe_request(struct pipes_struct *p,
                          pkt->u.request.context_id));
        }
 
-       if (changed_user) {
-               unbecome_authenticated_pipe_user();
-       }
+       unbecome_authenticated_pipe_user();
 
        return ret;
 }