Exemplo n.º 1
0
_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;
}
Exemplo n.º 2
0
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);
}