svn commit: samba r15415 - in branches/SAMBA_4_0/source: auth/credentials libcli/smb_composite

abartlet at samba.org abartlet at samba.org
Wed May 3 14:54:57 GMT 2006


Author: abartlet
Date: 2006-05-03 14:54:57 +0000 (Wed, 03 May 2006)
New Revision: 15415

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15415

Log:
Use Jelmer's new credentials 'wrong password' code to give the user 3
attempts for the password, when talking to a remote CIFS server.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/auth/credentials/credentials.c
   branches/SAMBA_4_0/source/libcli/smb_composite/sesssetup.c


Changeset:
Modified: branches/SAMBA_4_0/source/auth/credentials/credentials.c
===================================================================
--- branches/SAMBA_4_0/source/auth/credentials/credentials.c	2006-05-03 14:15:31 UTC (rev 15414)
+++ branches/SAMBA_4_0/source/auth/credentials/credentials.c	2006-05-03 14:54:57 UTC (rev 15415)
@@ -58,6 +58,8 @@
 
 	cred->bind_dn = NULL;
 
+	cred->tries = 3;
+
 	cli_credentials_set_kerberos_state(cred, CRED_AUTO_USE_KERBEROS);
 
 	return cred;
@@ -233,7 +235,7 @@
 
 	if (cred->password_obtained == CRED_CALLBACK) {
 		cred->password = cred->password_cb(cred);
-		cred->password_obtained = CRED_SPECIFIED;
+		cred->password_obtained = CRED_CALLBACK_RESULT;
 	}
 
 	return cred->password;

Modified: branches/SAMBA_4_0/source/libcli/smb_composite/sesssetup.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/smb_composite/sesssetup.c	2006-05-03 14:15:31 UTC (rev 15414)
+++ branches/SAMBA_4_0/source/libcli/smb_composite/sesssetup.c	2006-05-03 14:54:57 UTC (rev 15415)
@@ -36,6 +36,18 @@
 	struct smbcli_request *req;
 };
 
+static NTSTATUS session_setup_old(struct composite_context *c,
+				  struct smbcli_session *session, 
+				  struct smb_composite_sesssetup *io,
+				  struct smbcli_request **req); 
+static NTSTATUS session_setup_nt1(struct composite_context *c,
+				  struct smbcli_session *session, 
+				  struct smb_composite_sesssetup *io,
+				  struct smbcli_request **req); 
+static NTSTATUS session_setup_spnego(struct composite_context *c,
+				     struct smbcli_session *session, 
+				     struct smb_composite_sesssetup *io,
+				     struct smbcli_request **req);
 
 /*
   store the user session key for a transport
@@ -58,21 +70,60 @@
 	struct smbcli_session *session = req->session;
 	DATA_BLOB session_key = data_blob(NULL, 0);
 	DATA_BLOB null_data_blob = data_blob(NULL, 0);
-	NTSTATUS session_key_err;
+	NTSTATUS session_key_err, nt_status;
 
 	c->status = smb_raw_sesssetup_recv(req, state, &state->setup);
 
 	switch (state->setup.old.level) {
 	case RAW_SESSSETUP_OLD:
 		state->io->out.vuid = state->setup.old.out.vuid;
+		if (NT_STATUS_EQUAL(c->status, NT_STATUS_LOGON_FAILURE)) {
+			if (cli_credentials_wrong_password(state->io->in.credentials)) {
+				nt_status = session_setup_old(c, session, 
+							      state->io, 
+							      &state->req);
+				if (NT_STATUS_IS_OK(nt_status)) {
+					c->status = nt_status;
+					state->req->async.fn = request_handler;
+					state->req->async.private = c;
+					return;
+				}
+			}
+		}
 		break;
 
 	case RAW_SESSSETUP_NT1:
 		state->io->out.vuid = state->setup.nt1.out.vuid;
+		if (NT_STATUS_EQUAL(c->status, NT_STATUS_LOGON_FAILURE)) {
+			if (cli_credentials_wrong_password(state->io->in.credentials)) {
+				nt_status = session_setup_nt1(c, session, 
+							      state->io, 
+							      &state->req);
+				if (NT_STATUS_IS_OK(nt_status)) {
+					c->status = nt_status;
+					state->req->async.fn = request_handler;
+					state->req->async.private = c;
+					return;
+				}
+			}
+		}
 		break;
 
 	case RAW_SESSSETUP_SPNEGO:
 		session->vuid = state->io->out.vuid = state->setup.spnego.out.vuid;
+		if (NT_STATUS_EQUAL(c->status, NT_STATUS_LOGON_FAILURE)) {
+			if (cli_credentials_wrong_password(state->io->in.credentials)) {
+				nt_status = session_setup_spnego(c, session, 
+								      state->io, 
+								      &state->req);
+				if (NT_STATUS_IS_OK(nt_status)) {
+					c->status = nt_status;
+					state->req->async.fn = request_handler;
+					state->req->async.private = c;
+					return;
+				}
+			}
+		}
 		if (!NT_STATUS_EQUAL(c->status, NT_STATUS_MORE_PROCESSING_REQUIRED) && 
 		    !NT_STATUS_IS_OK(c->status)) {
 			break;



More information about the samba-cvs mailing list