summaryrefslogtreecommitdiffstats
path: root/auth
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2014-04-23 18:59:52 +0200
committerStefan Metzmacher <metze@samba.org>2014-04-24 11:21:05 +0200
commitfc59cc31024598599a2f1c9d73b8fa43a408ced2 (patch)
tree9c7d0b192f1830ab00c1e722caac1ef62f0888ce /auth
parent169c6d409f9c1b50b25bc59bcf12515d9a286c56 (diff)
downloadsamba-fc59cc31024598599a2f1c9d73b8fa43a408ced2.tar.gz
samba-fc59cc31024598599a2f1c9d73b8fa43a408ced2.tar.xz
samba-fc59cc31024598599a2f1c9d73b8fa43a408ced2.zip
auth/gensec: use auth_ctx->generate_session_info() for schannel
This way we generate a correct session info for the s3 rpc_server, including a unix token. Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'auth')
-rw-r--r--auth/gensec/schannel.c49
1 files changed, 46 insertions, 3 deletions
diff --git a/auth/gensec/schannel.c b/auth/gensec/schannel.c
index 3d30e83b3a4..ee23e77ace4 100644
--- a/auth/gensec/schannel.c
+++ b/auth/gensec/schannel.c
@@ -38,6 +38,7 @@ struct schannel_state {
uint64_t seq_num;
bool initiator;
struct netlogon_creds_CredentialState *creds;
+ struct auth_user_info_dc *user_info_dc;
};
#define SETUP_SEQNUM(state, buf, initiator) do { \
@@ -58,14 +59,13 @@ static struct schannel_state *netsec_create_state(
{
struct schannel_state *state;
- state = talloc(gensec, struct schannel_state);
+ state = talloc_zero(gensec, struct schannel_state);
if (state == NULL) {
return NULL;
}
state->gensec = gensec;
state->initiator = initiator;
- state->seq_num = 0;
state->creds = netlogon_creds_copy(state, creds);
if (state->creds == NULL) {
talloc_free(state);
@@ -580,6 +580,13 @@ static NTSTATUS schannel_update(struct gensec_security *gensec_security, TALLOC_
return NT_STATUS_NO_MEMORY;
}
+ status = auth_anonymous_user_info_dc(state,
+ lpcfg_netbios_name(gensec_security->settings->lp_ctx),
+ &state->user_info_dc);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
bind_schannel_ack.MessageType = NL_NEGOTIATE_RESPONSE;
bind_schannel_ack.Flags = 0;
bind_schannel_ack.Buffer.dummy = 0x6c0000; /* actually I think
@@ -610,7 +617,43 @@ static NTSTATUS schannel_session_info(struct gensec_security *gensec_security,
TALLOC_CTX *mem_ctx,
struct auth_session_info **_session_info)
{
- return auth_anonymous_session_info(mem_ctx, gensec_security->settings->lp_ctx, _session_info);
+ struct schannel_state *state =
+ talloc_get_type(gensec_security->private_data,
+ struct schannel_state);
+ struct auth4_context *auth_ctx = gensec_security->auth_context;
+ struct auth_session_info *session_info = NULL;
+ uint32_t session_info_flags = 0;
+ NTSTATUS status;
+
+ if (auth_ctx == NULL) {
+ DEBUG(0, ("Cannot generate a session_info without the auth_context\n"));
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ if (auth_ctx->generate_session_info == NULL) {
+ DEBUG(0, ("Cannot generate a session_info without the generate_session_info hook\n"));
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ if (gensec_security->want_features & GENSEC_FEATURE_UNIX_TOKEN) {
+ session_info_flags |= AUTH_SESSION_INFO_UNIX_TOKEN;
+ }
+
+ session_info_flags |= AUTH_SESSION_INFO_SIMPLE_PRIVILEGES;
+
+ status = auth_ctx->generate_session_info(
+ auth_ctx,
+ mem_ctx,
+ state->user_info_dc,
+ state->user_info_dc->info->account_name,
+ session_info_flags,
+ &session_info);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ *_session_info = session_info;
+ return NT_STATUS_OK;
}
static NTSTATUS schannel_server_start(struct gensec_security *gensec_security)