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;
