[SCM] Samba Shared Repository - branch v3-5-test updated

Karolin Seeger kseeger at samba.org
Fri Dec 17 12:46:27 MST 2010


The branch, v3-5-test has been updated
       via  ab69b55 s3:ntlm_auth: support clients which offer a spnego mechs we don't support (bug #7855)
       via  e00cb88 s3:ntlm_auth: free session key, as we don't use it (at least for now)
       via  7c3bb9a s3:ntlm_auth: fix memory leak in the raw ntlmssp code path
       via  7cb3d84 s3: Correctly unwrap the krb ticket in gss-spnego (cherry picked from commit 547b268cfaa2e791bf92e8804bfa504c4e37050b)
       via  7652f2a s3: Fall back to raw NTLMSSP for the gss-spnego protocol
       via  8443abe s3: Split off output generation from manage_squid_ntlmssp_request (cherry picked from commit de2c143f4d540f695db5c7fe8685614c03977365)
       via  0d9b2e9 s3: Wrap the ntlm_auth loop with a talloc_stackframe (cherry picked from commit ae483bbe9af526623189cefe7735f3f2813da6d7)
       via  498f1c8 s3: Fix some debug msgs in ntlm_auth (cherry picked from commit 6400f3ee62108e3dd1e6c1013ccea9fb4b08d562)
       via  63fa349 ntlm_auth: Fix a valgrind error (cherry picked from commit 69db4b4ccf051b05517e6eb9039ab48f90608075)
      from  a966463 Fix bso#3185, return false when EOF is encountered in param name.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit ab69b55011eea73d7c8827fc339feb905474f201
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Dec 2 00:39:23 2010 +0100

    s3:ntlm_auth: support clients which offer a spnego mechs we don't support (bug #7855)
    
    Before we rejected the authentication if we don't support the
    first spnego mech the client offered.
    
    We now negotiate the first mech we support.
    
    This fix works arround problems, when a client
    sends the NEGOEX (1.3.6.1.4.1.311.2.2.30) oid,
    which we don't support.
    
    metze
    (cherry picked from commit f802075f08fe0d86f3d176f2302236aeb5834f3d)
    Modified to work in the v3-5-test branch, e.g. use ntlmssp_end()
    
    The last 9 patches address bug #7855 (ntlm_auth only handles the first spnego
    mech).

commit e00cb883107753380272e128955ae5ad3057fd40
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 1 05:59:16 2010 +0100

    s3:ntlm_auth: free session key, as we don't use it (at least for now)
    
    metze
    (cherry picked from commit ee4f5ac6182969bcab91955e6d6581e408d222f1)

commit 7c3bb9af54b40dbd24b781186607339c76a25a85
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 1 05:50:59 2010 +0100

    s3:ntlm_auth: fix memory leak in the raw ntlmssp code path
    
    metze
    (cherry picked from commit 9a56ade6b1d627126418c75de4602610b4482503)

commit 7cb3d84fc11490c97d7d84a3231e2d9f6b2d69fe
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Nov 30 10:52:52 2010 +0100

    s3: Correctly unwrap the krb ticket in gss-spnego (cherry picked from commit 547b268cfaa2e791bf92e8804bfa504c4e37050b)
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    renamed to _spnego_parse_krb5_wrap()
    
    metze

commit 7652f2a782559bb0346b0976929b5b5b5377dcbc
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Sep 16 10:22:00 2010 +0200

    s3: Fall back to raw NTLMSSP for the gss-spnego protocol
    
    This is to handle the mod_auth_ntlm_winbind protocol
    sending "Negotiate" to IE, which sends raw NTLMSSP
    instead of a SPNEGO wrapped NTLMSSP blob.
    (cherry picked from commit 70ab7eb5303a5ff058939541dd5bc1f81113a48e)
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 8443abede7c3f6deb7a7c584937d9e28eb9274da
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Nov 30 10:46:28 2010 +0100

    s3: Split off output generation from manage_squid_ntlmssp_request (cherry picked from commit de2c143f4d540f695db5c7fe8685614c03977365)
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 0d9b2e954d61c9f6211c867348a817e42bd4b12f
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Sep 16 10:36:21 2010 +0200

    s3: Wrap the ntlm_auth loop with a talloc_stackframe (cherry picked from commit ae483bbe9af526623189cefe7735f3f2813da6d7)
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 498f1c87e6c9bc136da696bae5e9a71df9b8233e
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Sep 15 10:29:44 2010 +0200

    s3: Fix some debug msgs in ntlm_auth (cherry picked from commit 6400f3ee62108e3dd1e6c1013ccea9fb4b08d562)
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 63fa349916d72c158b1fc4ab7a60b9a909a15131
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Sep 13 18:09:20 2010 +0200

    ntlm_auth: Fix a valgrind error (cherry picked from commit 69db4b4ccf051b05517e6eb9039ab48f90608075)
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in       |    2 +-
 source3/utils/ntlm_auth.c |  417 ++++++++++++++++++++++++++++++++-------------
 2 files changed, 296 insertions(+), 123 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 9e960c9..8cdecef 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -1315,7 +1315,7 @@ NTLM_AUTH_OBJ = ${NTLM_AUTH_OBJ1} $(LIBSAMBA_OBJ) $(POPT_LIB_OBJ) \
 		$(LIBADS_SERVER_OBJ) \
 		$(PASSDB_OBJ) $(LIBTSOCKET_OBJ) $(GROUPDB_OBJ) \
 		$(SMBLDAP_OBJ) $(LIBNMB_OBJ) \
-		$(LDB_OBJ) $(WBCOMMON_OBJ) \
+		$(LDB_OBJ) $(WBCOMMON_OBJ) $(SLCACHE_OBJ) \
 		$(LIBNDR_GEN_OBJ0) $(LIBNDR_GEN_OBJ1) @BUILD_INIPARSER@
 
 
diff --git a/source3/utils/ntlm_auth.c b/source3/utils/ntlm_auth.c
index afd0b99..a85f123 100644
--- a/source3/utils/ntlm_auth.c
+++ b/source3/utils/ntlm_auth.c
@@ -76,6 +76,8 @@ struct ntlm_auth_state {
 	struct ntlmssp_state *ntlmssp_state;
 	uint32_t neg_flags;
 	char *want_feature_list;
+	char *spnego_mech;
+	char *spnego_mech_oid;
 	bool have_session_key;
 	DATA_BLOB session_key;
 	DATA_BLOB initial_message;
@@ -778,15 +780,17 @@ static NTSTATUS do_ccache_ntlm_auth(DATA_BLOB initial_msg, DATA_BLOB challenge_m
 	return NT_STATUS_MORE_PROCESSING_REQUIRED;
 }
 
-static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
-						char *buf, int length)
+static void manage_squid_ntlmssp_request_int(struct ntlm_auth_state *state,
+					     char *buf, int length,
+					     TALLOC_CTX *mem_ctx,
+					     char **response)
 {
 	DATA_BLOB request, reply;
 	NTSTATUS nt_status;
 
 	if (strlen(buf) < 2) {
-		DEBUG(1, ("NTLMSSP query [%s] invalid", buf));
-		x_fprintf(x_stdout, "BH NTLMSSP query invalid\n");
+		DEBUG(1, ("NTLMSSP query [%s] invalid\n", buf));
+		*response = talloc_strdup(mem_ctx, "BH NTLMSSP query invalid");
 		return;
 	}
 
@@ -796,7 +800,7 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 			TALLOC_FREE(state->want_feature_list);
 			state->want_feature_list = talloc_strdup(state->mem_ctx,
 					buf+3);
-			x_fprintf(x_stdout, "OK\n");
+			*response = talloc_strdup(mem_ctx, "OK");
 			return;
 		}
 		request = base64_decode_data_blob(buf + 3);
@@ -813,12 +817,12 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 
 		if (opt_password == NULL) {
 			DEBUG(1, ("Out of memory\n"));
-			x_fprintf(x_stdout, "BH Out of memory\n");
+			*response = talloc_strdup(mem_ctx, "BH Out of memory");
 			data_blob_free(&request);
 			return;
 		}
 
-		x_fprintf(x_stdout, "OK\n");
+		*response = talloc_strdup(mem_ctx, "OK");
 		data_blob_free(&request);
 		return;
 	}
@@ -833,10 +837,11 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 		DEBUG(10, ("Requested negotiated NTLMSSP flags\n"));
 
 		if (state->svr_state == SERVER_FINISHED) {
-			x_fprintf(x_stdout, "GF 0x%08x\n", state->neg_flags);
+			*response = talloc_asprintf(mem_ctx, "GF 0x%08x",
+						 state->neg_flags);
 		}
 		else {
-			x_fprintf(x_stdout, "BH\n");
+			*response = talloc_strdup(mem_ctx, "BH\n");
 		}
 		data_blob_free(&request);
 		return;
@@ -845,17 +850,18 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 		if(state->have_session_key) {
 			char *key64 = base64_encode_data_blob(state->mem_ctx,
 					state->session_key);
-			x_fprintf(x_stdout, "GK %s\n", key64?key64:"<NULL>");
+			*response = talloc_asprintf(mem_ctx, "GK %s",
+						 key64 ? key64 : "<NULL>");
 			TALLOC_FREE(key64);
 		} else {
-			x_fprintf(x_stdout, "BH\n");
+			*response = talloc_strdup(mem_ctx, "BH");
 		}
 
 		data_blob_free(&request);
 		return;
 	} else {
-		DEBUG(1, ("NTLMSSP query [%s] invalid", buf));
-		x_fprintf(x_stdout, "BH NTLMSSP query invalid\n");
+		DEBUG(1, ("NTLMSSP query [%s] invalid\n", buf));
+		*response = talloc_strdup(mem_ctx, "BH NTLMSSP query invalid");
 		return;
 	}
 
@@ -863,7 +869,8 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 		nt_status = ntlm_auth_start_ntlmssp_server(
 				&state->ntlmssp_state);
 		if (!NT_STATUS_IS_OK(nt_status)) {
-			x_fprintf(x_stdout, "BH %s\n", nt_errstr(nt_status));
+			*response = talloc_asprintf(
+				mem_ctx, "BH %s", nt_errstr(nt_status));
 			return;
 		}
 		ntlmssp_want_feature_list(state->ntlmssp_state,
@@ -878,22 +885,25 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 	if (NT_STATUS_EQUAL(nt_status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
 		char *reply_base64 = base64_encode_data_blob(state->mem_ctx,
 				reply);
-		x_fprintf(x_stdout, "TT %s\n", reply_base64);
+		*response = talloc_asprintf(mem_ctx, "TT %s", reply_base64);
 		TALLOC_FREE(reply_base64);
 		data_blob_free(&reply);
 		state->svr_state = SERVER_CHALLENGE;
 		DEBUG(10, ("NTLMSSP challenge\n"));
 	} else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_ACCESS_DENIED)) {
-		x_fprintf(x_stdout, "BH %s\n", nt_errstr(nt_status));
+		*response = talloc_asprintf(mem_ctx, "BH %s",
+					 nt_errstr(nt_status));
 		DEBUG(0, ("NTLMSSP BH: %s\n", nt_errstr(nt_status)));
 
 		ntlmssp_end(&state->ntlmssp_state);
 	} else if (!NT_STATUS_IS_OK(nt_status)) {
-		x_fprintf(x_stdout, "NA %s\n", nt_errstr(nt_status));
+		*response = talloc_asprintf(mem_ctx, "NA %s",
+					 nt_errstr(nt_status));
 		DEBUG(10, ("NTLMSSP %s\n", nt_errstr(nt_status)));
 	} else {
-		x_fprintf(x_stdout, "AF %s\n",
-				(char *)state->ntlmssp_state->auth_context);
+		*response = talloc_asprintf(
+			mem_ctx, "AF %s",
+			(char *)state->ntlmssp_state->auth_context);
 		DEBUG(10, ("NTLMSSP OK!\n"));
 
 		if(state->have_session_key)
@@ -909,6 +919,22 @@ static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
 	data_blob_free(&request);
 }
 
+static void manage_squid_ntlmssp_request(struct ntlm_auth_state *state,
+					 char *buf, int length)
+{
+	char *response;
+
+	manage_squid_ntlmssp_request_int(state, buf, length,
+					 talloc_tos(), &response);
+
+	if (response == NULL) {
+		x_fprintf(x_stdout, "BH Out of memory\n");
+		return;
+	}
+	x_fprintf(x_stdout, "%s\n", response);
+	TALLOC_FREE(response);
+}
+
 static void manage_client_ntlmssp_request(struct ntlm_auth_state *state,
 					 	char *buf, int length)
 {
@@ -921,7 +947,7 @@ static void manage_client_ntlmssp_request(struct ntlm_auth_state *state,
 	}
 
 	if (strlen(buf) < 2) {
-		DEBUG(1, ("NTLMSSP query [%s] invalid", buf));
+		DEBUG(1, ("NTLMSSP query [%s] invalid\n", buf));
 		x_fprintf(x_stdout, "BH NTLMSSP query invalid\n");
 		return;
 	}
@@ -1013,7 +1039,7 @@ static void manage_client_ntlmssp_request(struct ntlm_auth_state *state,
 		data_blob_free(&request);
 		return;
 	} else {
-		DEBUG(1, ("NTLMSSP query [%s] invalid", buf));
+		DEBUG(1, ("NTLMSSP query [%s] invalid\n", buf));
 		x_fprintf(x_stdout, "BH NTLMSSP query invalid\n");
 		return;
 	}
@@ -1137,11 +1163,12 @@ static void offer_gss_spnego_mechs(void) {
 
 	/* Server negTokenInit (mech offerings) */
 	spnego.type = SPNEGO_NEG_TOKEN_INIT;
-	spnego.negTokenInit.mechTypes = talloc_array(ctx, const char *, 2);
+	spnego.negTokenInit.mechTypes = talloc_array(ctx, const char *, 4);
 #ifdef HAVE_KRB5
 	spnego.negTokenInit.mechTypes[0] = talloc_strdup(ctx, OID_KERBEROS5_OLD);
-	spnego.negTokenInit.mechTypes[1] = talloc_strdup(ctx, OID_NTLMSSP);
-	spnego.negTokenInit.mechTypes[2] = NULL;
+	spnego.negTokenInit.mechTypes[1] = talloc_strdup(ctx, OID_KERBEROS5);
+	spnego.negTokenInit.mechTypes[2] = talloc_strdup(ctx, OID_NTLMSSP);
+	spnego.negTokenInit.mechTypes[3] = NULL;
 #else
 	spnego.negTokenInit.mechTypes[0] = talloc_strdup(ctx, OID_NTLMSSP);
 	spnego.negTokenInit.mechTypes[1] = NULL;
@@ -1169,12 +1196,52 @@ static void offer_gss_spnego_mechs(void) {
 	return;
 }
 
+static bool _spnego_parse_krb5_wrap(TALLOC_CTX *ctx, DATA_BLOB blob, DATA_BLOB *ticket, uint8 tok_id[2])
+{
+	bool ret;
+	ASN1_DATA *data;
+	int data_remaining;
+
+	data = asn1_init(talloc_tos());
+	if (data == NULL) {
+		return false;
+	}
+
+	asn1_load(data, blob);
+	asn1_start_tag(data, ASN1_APPLICATION(0));
+	asn1_check_OID(data, OID_KERBEROS5);
+
+	data_remaining = asn1_tag_remaining(data);
+
+	if (data_remaining < 3) {
+		data->has_error = True;
+	} else {
+		asn1_read(data, tok_id, 2);
+		data_remaining -= 2;
+		*ticket = data_blob_talloc(ctx, NULL, data_remaining);
+		asn1_read(data, ticket->data, ticket->length);
+	}
+
+	asn1_end_tag(data);
+
+	ret = !data->has_error;
+
+	if (data->has_error) {
+		data_blob_free(ticket);
+	}
+
+	asn1_free(data);
+
+	return ret;
+}
+
 static void manage_gss_spnego_request(struct ntlm_auth_state *state,
 					char *buf, int length)
 {
-	static NTLMSSP_STATE *ntlmssp_state = NULL;
 	struct spnego_data request, response;
 	DATA_BLOB token;
+	DATA_BLOB raw_in_token = data_blob_null;
+	DATA_BLOB raw_out_token = data_blob_null;
 	NTSTATUS status;
 	ssize_t len;
 	TALLOC_CTX *ctx = talloc_tos();
@@ -1185,20 +1252,23 @@ static void manage_gss_spnego_request(struct ntlm_auth_state *state,
 	const char *reply_code;
 	char       *reply_base64;
 	char *reply_argument = NULL;
+	char *supportedMech = NULL;
 
 	if (strlen(buf) < 2) {
-		DEBUG(1, ("SPENGO query [%s] invalid", buf));
+		DEBUG(1, ("SPENGO query [%s] invalid\n", buf));
 		x_fprintf(x_stdout, "BH SPENGO query invalid\n");
 		return;
 	}
 
 	if (strncmp(buf, "YR", 2) == 0) {
-		if (ntlmssp_state)
-			ntlmssp_end(&ntlmssp_state);
+		if (state->ntlmssp_state)
+			ntlmssp_end(&state->ntlmssp_state);
+		TALLOC_FREE(state->spnego_mech);
+		TALLOC_FREE(state->spnego_mech_oid);
 	} else if (strncmp(buf, "KK", 2) == 0) {
 		;
 	} else {
-		DEBUG(1, ("SPENGO query [%s] invalid", buf));
+		DEBUG(1, ("SPENGO query [%s] invalid\n", buf));
 		x_fprintf(x_stdout, "BH SPENGO query invalid\n");
 		return;
 	}
@@ -1221,166 +1291,269 @@ static void manage_gss_spnego_request(struct ntlm_auth_state *state,
 	}
 
 	token = base64_decode_data_blob(buf + 3);
+
+	if ((token.length >= 7)
+	    && (strncmp((char *)token.data, "NTLMSSP", 7) == 0)) {
+		char *reply;
+
+		data_blob_free(&token);
+
+		DEBUG(10, ("Could not parse GSS-SPNEGO, trying raw "
+			   "ntlmssp\n"));
+
+		manage_squid_ntlmssp_request_int(state, buf, length,
+						 talloc_tos(), &reply);
+		if (reply == NULL) {
+			x_fprintf(x_stdout, "BH Out of memory\n");
+			return;
+		}
+
+		if (strncmp(reply, "AF ", 3) == 0) {
+			x_fprintf(x_stdout, "AF * %s\n", reply+3);
+		} else {
+			x_fprintf(x_stdout, "%s *\n", reply);
+		}
+
+		TALLOC_FREE(reply);
+		return;
+	}
+
+	ZERO_STRUCT(request);
 	len = spnego_read_data(ctx, token, &request);
 	data_blob_free(&token);
 
 	if (len == -1) {
-		DEBUG(1, ("GSS-SPNEGO query [%s] invalid", buf));
+		DEBUG(1, ("GSS-SPNEGO query [%s] invalid\n", buf));
 		x_fprintf(x_stdout, "BH GSS-SPNEGO query invalid\n");
 		return;
 	}
 
 	if (request.type == SPNEGO_NEG_TOKEN_INIT) {
+#ifdef HAVE_KRB5
+		int krb5_idx = -1;
+#endif
+		int ntlm_idx = -1;
+		int used_idx = -1;
+		int i;
+
+		if (state->spnego_mech) {
+			DEBUG(1, ("Client restarted SPNEGO with NegTokenInit "
+				  "while mech[%s] was already negotiated\n",
+				  state->spnego_mech));
+			x_fprintf(x_stdout, "BH Client send NegTokenInit twice\n");
+			return;
+		}
 
 		/* Second request from Client. This is where the
 		   client offers its mechanism to use. */
 
 		if ( (request.negTokenInit.mechTypes == NULL) ||
 		     (request.negTokenInit.mechTypes[0] == NULL) ) {
-			DEBUG(1, ("Client did not offer any mechanism"));
+			DEBUG(1, ("Client did not offer any mechanism\n"));
 			x_fprintf(x_stdout, "BH Client did not offer any "
 					    "mechanism\n");
 			return;
 		}
 
 		status = NT_STATUS_UNSUCCESSFUL;
-		if (strcmp(request.negTokenInit.mechTypes[0], OID_NTLMSSP) == 0) {
+		for (i = 0; request.negTokenInit.mechTypes[i] != NULL; i++) {
+			DEBUG(10,("got mech[%d][%s]\n",
+				i, request.negTokenInit.mechTypes[i]));
+#ifdef HAVE_KRB5
+			if (strcmp(request.negTokenInit.mechTypes[i], OID_KERBEROS5_OLD) == 0) {
+				krb5_idx = i;
+				break;
+			}
+			if (strcmp(request.negTokenInit.mechTypes[i], OID_KERBEROS5) == 0) {
+				krb5_idx = i;
+				break;
+			}
+#endif
+			if (strcmp(request.negTokenInit.mechTypes[i], OID_NTLMSSP) == 0) {
+				ntlm_idx = i;
+				break;
+			}
+		}
 
-			if ( request.negTokenInit.mechToken.data == NULL ) {
-				DEBUG(1, ("Client did not provide NTLMSSP data\n"));
-				x_fprintf(x_stdout, "BH Client did not provide "
-						    "NTLMSSP data\n");
+		used_idx = ntlm_idx;
+#ifdef HAVE_KRB5
+		if (krb5_idx != -1) {
+			ntlm_idx = -1;
+			used_idx = krb5_idx;
+		}
+#endif
+		if (ntlm_idx > -1) {
+			state->spnego_mech = talloc_strdup(state, "ntlmssp");
+			if (state->spnego_mech == NULL) {
+				x_fprintf(x_stdout, "BH Out of memory\n");
 				return;
 			}
 
-			if ( ntlmssp_state != NULL ) {
+			if (state->ntlmssp_state) {
 				DEBUG(1, ("Client wants a new NTLMSSP challenge, but "
 					  "already got one\n"));
 				x_fprintf(x_stdout, "BH Client wants a new "
 						    "NTLMSSP challenge, but "
 						    "already got one\n");
-				ntlmssp_end(&ntlmssp_state);
+				ntlmssp_end(&state->ntlmssp_state);
 				return;
 			}
 
-			if (!NT_STATUS_IS_OK(status = ntlm_auth_start_ntlmssp_server(&ntlmssp_state))) {
+			status = ntlm_auth_start_ntlmssp_server(&state->ntlmssp_state);
+			if (!NT_STATUS_IS_OK(status)) {
 				x_fprintf(x_stdout, "BH %s\n", nt_errstr(status));
 				return;
 			}
-
-			DEBUG(10, ("got NTLMSSP packet:\n"));
-			dump_data(10, request.negTokenInit.mechToken.data,
-				  request.negTokenInit.mechToken.length);
-
-			response.type = SPNEGO_NEG_TOKEN_TARG;
-			response.negTokenTarg.supportedMech = talloc_strdup(ctx, OID_NTLMSSP);
-			response.negTokenTarg.mechListMIC = data_blob_talloc(ctx, NULL, 0);
-
-			status = ntlmssp_update(ntlmssp_state,
-						       request.negTokenInit.mechToken,
-						       &response.negTokenTarg.responseToken);
 		}
 
 #ifdef HAVE_KRB5
-		if (strcmp(request.negTokenInit.mechTypes[0], OID_KERBEROS5_OLD) == 0) {
-
-			TALLOC_CTX *mem_ctx = talloc_init("manage_gss_spnego_request");
-			char *principal;
-			DATA_BLOB ap_rep;
-			DATA_BLOB session_key;
-			struct PAC_DATA *pac_data = NULL;
-
-			if ( request.negTokenInit.mechToken.data == NULL ) {
-				DEBUG(1, ("Client did not provide Kerberos data\n"));
-				x_fprintf(x_stdout, "BH Client did not provide "
-						    "Kerberos data\n");
+		if (krb5_idx > -1) {
+			state->spnego_mech = talloc_strdup(state, "krb5");
+			if (state->spnego_mech == NULL) {
+				x_fprintf(x_stdout, "BH Out of memory\n");
 				return;
 			}
-
-			response.type = SPNEGO_NEG_TOKEN_TARG;
-			response.negTokenTarg.supportedMech = talloc_strdup(ctx, OID_KERBEROS5_OLD);
-			response.negTokenTarg.mechListMIC = data_blob_talloc(ctx, NULL, 0);
-			response.negTokenTarg.responseToken = data_blob_talloc(ctx, NULL, 0);
-
-			status = ads_verify_ticket(mem_ctx, lp_realm(), 0,
-						   &request.negTokenInit.mechToken,
-						   &principal, &pac_data, &ap_rep,
-						   &session_key, True);
-
-			/* Now in "principal" we have the name we are
-                           authenticated as. */
-
-			if (NT_STATUS_IS_OK(status)) {
-
-				domain = strchr_m(principal, '@');
-
-				if (domain == NULL) {
-					DEBUG(1, ("Did not get a valid principal "
-						  "from ads_verify_ticket\n"));
-					x_fprintf(x_stdout, "BH Did not get a "
-						  "valid principal from "
-						  "ads_verify_ticket\n");
-					return;
-				}
-
-				*domain++ = '\0';
-				domain = SMB_STRDUP(domain);
-				user = SMB_STRDUP(principal);
-
-				data_blob_free(&ap_rep);
-			}
-
-			TALLOC_FREE(mem_ctx);
 		}
 #endif
+		if (used_idx > -1) {
+			state->spnego_mech_oid = talloc_strdup(state,
+				request.negTokenInit.mechTypes[used_idx]);
+			if (state->spnego_mech_oid == NULL) {
+				x_fprintf(x_stdout, "BH Out of memory\n");
+				return;
+			}
+			supportedMech = talloc_strdup(ctx, state->spnego_mech_oid);
+			if (supportedMech == NULL) {
+				x_fprintf(x_stdout, "BH Out of memory\n");
+				return;
+			}
 
+			status = NT_STATUS_MORE_PROCESSING_REQUIRED;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list