_PUBLIC_ NTSTATUS auth_check_password(struct auth_context *auth_ctx, TALLOC_CTX *mem_ctx, const struct auth_usersupplied_info *user_info, struct auth_user_info_dc **user_info_dc) { struct tevent_req *subreq; struct tevent_context *ev; bool ok; NTSTATUS status; /*TODO: create a new event context here! */ ev = auth_ctx->event_ctx; subreq = auth_check_password_send(mem_ctx, ev, auth_ctx, user_info); if (subreq == NULL) { return NT_STATUS_NO_MEMORY; } ok = tevent_req_poll(subreq, ev); if (!ok) { return NT_STATUS_INTERNAL_ERROR; } status = auth_check_password_recv(subreq, mem_ctx, user_info_dc); TALLOC_FREE(subreq); return status; }
static void sesssetup_nt1_send(struct tevent_req *subreq) { struct sesssetup_context *state = tevent_req_callback_data(subreq, struct sesssetup_context); struct smbsrv_request *req = state->req; union smb_sesssetup *sess = talloc_get_type(req->io_ptr, union smb_sesssetup); struct auth_user_info_dc *user_info_dc = NULL; struct auth_session_info *session_info; struct smbsrv_session *smb_sess; uint32_t flags; NTSTATUS status; status = auth_check_password_recv(subreq, req, &user_info_dc); TALLOC_FREE(subreq); if (!NT_STATUS_IS_OK(status)) goto failed; flags = AUTH_SESSION_INFO_DEFAULT_GROUPS; if (user_info_dc->info->authenticated) { flags |= AUTH_SESSION_INFO_AUTHENTICATED; } /* This references user_info_dc into session_info */ status = state->auth_context->generate_session_info(state->auth_context, req, user_info_dc, sess->nt1.in.user, flags, &session_info); if (!NT_STATUS_IS_OK(status)) goto failed; /* allocate a new session */ smb_sess = smbsrv_session_new(req->smb_conn, req, NULL); if (!smb_sess) { status = NT_STATUS_INSUFFICIENT_RESOURCES; goto failed; } /* Ensure this is marked as a 'real' vuid, not one * simply valid for the session setup leg */ status = smbsrv_session_sesssetup_finished(smb_sess, session_info); if (!NT_STATUS_IS_OK(status)) goto failed; /* To correctly process any AndX packet (like a tree connect) * we need to fill in the session on the request here */ req->session = smb_sess; sess->nt1.out.vuid = smb_sess->vuid; if (!smbsrv_setup_signing(req->smb_conn, &session_info->session_key, &sess->nt1.in.password2)) { /* Already signing, or disabled */ goto done; } done: status = NT_STATUS_OK; failed: status = nt_status_squash(status); smbsrv_sesssetup_backend_send(req, sess, status); }