summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorSamuel Cabrero <scabrero@suse.de>2019-01-24 20:34:03 +0100
committerAndreas Schneider <asn@cryptomilk.org>2019-10-18 16:07:36 +0000
commit6fe23fa071d2dc6e348b175b514c99a6ce82b6f4 (patch)
treeb121a24763a407da9a65b1c4e765922da5503c5a /source4
parentbf097719534be55abaab931ca03b8be23ef1fe0a (diff)
downloadsamba-6fe23fa071d2dc6e348b175b514c99a6ce82b6f4.tar.gz
s4:rpc_server: Hide gensec prepare behind function pointer
This function will be different for s3 and s4 Signed-off-by: Samuel Cabrero <scabrero@suse.de> Reviewed-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'source4')
-rw-r--r--source4/rpc_server/dcerpc_server.c36
-rw-r--r--source4/rpc_server/dcerpc_server.h6
-rw-r--r--source4/rpc_server/dcesrv_auth.c28
-rw-r--r--source4/rpc_server/service_rpc.c1
-rw-r--r--source4/torture/rpc/spoolss_notify.c1
5 files changed, 47 insertions, 25 deletions
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index 3b432f7484c..fc8979deaa4 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -23,6 +23,7 @@
#include "includes.h"
#include "auth/auth.h"
#include "auth/gensec/gensec.h"
+#include "auth/credentials/credentials.h"
#include "lib/util/dlinklist.h"
#include "rpc_server/dcerpc_server.h"
#include "rpc_server/dcerpc_server_proto.h"
@@ -3436,3 +3437,38 @@ void log_successful_dcesrv_authz_event(struct dcesrv_call_state *call)
auth->auth_audited = true;
}
+
+NTSTATUS dcesrv_gensec_prepare(TALLOC_CTX *mem_ctx,
+ struct dcesrv_call_state *call,
+ struct gensec_security **out)
+{
+ struct cli_credentials *server_creds = NULL;
+ struct imessaging_context *imsg_ctx =
+ dcesrv_imessaging_context(call->conn);
+ NTSTATUS status;
+
+ server_creds = cli_credentials_init(call->auth_state);
+ if (!server_creds) {
+ DEBUG(1, ("Failed to init server credentials\n"));
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ cli_credentials_set_conf(server_creds, call->conn->dce_ctx->lp_ctx);
+
+ status = cli_credentials_set_machine_account(server_creds,
+ call->conn->dce_ctx->lp_ctx);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(1, ("Failed to obtain server credentials: %s\n",
+ nt_errstr(status)));
+ talloc_free(server_creds);
+ return status;
+ }
+
+ return samba_server_gensec_start(mem_ctx,
+ call->event_ctx,
+ imsg_ctx,
+ call->conn->dce_ctx->lp_ctx,
+ server_creds,
+ NULL,
+ out);
+}
diff --git a/source4/rpc_server/dcerpc_server.h b/source4/rpc_server/dcerpc_server.h
index 614c93bf50e..18956524f6f 100644
--- a/source4/rpc_server/dcerpc_server.h
+++ b/source4/rpc_server/dcerpc_server.h
@@ -38,6 +38,7 @@ struct dcesrv_call_state;
struct dcesrv_auth;
struct dcesrv_connection_context;
struct dcesrv_iface_state;
+struct cli_credentials;
struct dcesrv_interface {
const char *name;
@@ -367,6 +368,11 @@ struct dcesrv_context_callbacks {
struct {
void (*successful_authz)(struct dcesrv_call_state *);
} log;
+ struct {
+ NTSTATUS (*gensec_prepare)(TALLOC_CTX *mem_ctx,
+ struct dcesrv_call_state *call,
+ struct gensec_security **out);
+ } auth;
};
/* server-wide context information for the dcerpc server */
diff --git a/source4/rpc_server/dcesrv_auth.c b/source4/rpc_server/dcesrv_auth.c
index 73576dc45d0..87bc76d2780 100644
--- a/source4/rpc_server/dcesrv_auth.c
+++ b/source4/rpc_server/dcesrv_auth.c
@@ -78,11 +78,8 @@ static NTSTATUS dcesrv_auth_negotiate_hdr_signing(struct dcesrv_call_state *call
static bool dcesrv_auth_prepare_gensec(struct dcesrv_call_state *call)
{
- struct cli_credentials *server_credentials = NULL;
struct dcesrv_connection *dce_conn = call->conn;
struct dcesrv_auth *auth = call->auth_state;
- struct imessaging_context *imsg_ctx =
- dcesrv_imessaging_context(call->conn);
NTSTATUS status;
if (auth->auth_started) {
@@ -131,28 +128,9 @@ static bool dcesrv_auth_prepare_gensec(struct dcesrv_call_state *call)
auth->auth_level = call->in_auth_info.auth_level;
auth->auth_context_id = call->in_auth_info.auth_context_id;
- server_credentials
- = cli_credentials_init(auth);
- if (!server_credentials) {
- DEBUG(1, ("Failed to init server credentials\n"));
- return false;
- }
-
- cli_credentials_set_conf(server_credentials, call->conn->dce_ctx->lp_ctx);
- status = cli_credentials_set_machine_account(server_credentials, call->conn->dce_ctx->lp_ctx);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(1, ("Failed to obtain server credentials: %s\n",
- nt_errstr(status)));
- return false;
- }
-
- status = samba_server_gensec_start(auth,
- call->event_ctx,
- imsg_ctx,
- call->conn->dce_ctx->lp_ctx,
- server_credentials,
- NULL,
- &auth->gensec_security);
+ status = call->conn->dce_ctx->callbacks.auth.gensec_prepare(auth,
+ call,
+ &auth->gensec_security);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("Failed to call samba_server_gensec_start %s\n",
nt_errstr(status)));
diff --git a/source4/rpc_server/service_rpc.c b/source4/rpc_server/service_rpc.c
index efb3feabcdd..778d7b964a9 100644
--- a/source4/rpc_server/service_rpc.c
+++ b/source4/rpc_server/service_rpc.c
@@ -42,6 +42,7 @@
struct dcesrv_context_callbacks srv_callbacks = {
.log.successful_authz = log_successful_dcesrv_authz_event,
+ .auth.gensec_prepare = dcesrv_gensec_prepare,
};
/*
diff --git a/source4/torture/rpc/spoolss_notify.c b/source4/torture/rpc/spoolss_notify.c
index bed049bca86..91f9f92b7d8 100644
--- a/source4/torture/rpc/spoolss_notify.c
+++ b/source4/torture/rpc/spoolss_notify.c
@@ -36,6 +36,7 @@
struct dcesrv_context_callbacks srv_cb = {
.log.successful_authz = log_successful_dcesrv_authz_event,
+ .auth.gensec_prepare = dcesrv_gensec_prepare,
};
static NTSTATUS spoolss__op_bind(struct dcesrv_connection_context *context,