/** \details Check if the authenticated user belongs to the Exchange organization \param dce_call pointer to the session context \param emsabp_ctx pointer to the EMSABP context \return true on success, otherwise false */ _PUBLIC_ bool emsabp_verify_user(struct dcesrv_call_state *dce_call, struct emsabp_context *emsabp_ctx) { int ret; TALLOC_CTX *mem_ctx; const char *username = NULL; struct ldb_message *ldb_msg = NULL; username = dcesrv_call_account_name(dce_call); mem_ctx = talloc_named(emsabp_ctx->mem_ctx, 0, __FUNCTION__); ret = emsabp_get_account_info(mem_ctx, emsabp_ctx, username, &ldb_msg); /* cache account_name upon success */ if (MAPI_STATUS_IS_OK(ret)) { emsabp_ctx->account_name = talloc_strdup(emsabp_ctx->mem_ctx, username); } talloc_free(mem_ctx); return MAPI_STATUS_IS_OK(ret); }
/** \details Destroys the context handle \param nspi_ctx pointer to the NSPI connection context \return return 1 on success or 2 if the input context is NULL */ _PUBLIC_ enum MAPISTATUS nspi_unbind(struct nspi_context *nspi_ctx) { struct NspiUnbind r; NTSTATUS status; enum MAPISTATUS retval; /* Sanity checks */ OPENCHANGE_RETVAL_IF(!nspi_ctx, MAPI_E_NOT_INITIALIZED, NULL); r.in.handle = r.out.handle = &nspi_ctx->handle; r.in.Reserved = 0; status = dcerpc_NspiUnbind_r(nspi_ctx->rpc_connection->binding_handle, nspi_ctx->mem_ctx, &r); retval = r.out.result; OPENCHANGE_RETVAL_IF((retval != 1) && !MAPI_STATUS_IS_OK(NT_STATUS_V(status)), retval, NULL); return MAPI_E_SUCCESS; }
/** \details exchange_nsp NspiQueryRows (0x3) function \param dce_call pointer to the session context \param mem_ctx pointer to the memory context \param r pointer to the NspiQueryRows request data \return MAPI_E_SUCCESS on success */ static void dcesrv_NspiQueryRows(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct NspiQueryRows *r) { enum MAPISTATUS retval = MAPI_E_SUCCESS; struct emsabp_context *emsabp_ctx = NULL; struct SPropTagArray *pPropTags; struct PropertyRowSet_r *pRows; uint32_t i, j, count; DEBUG(3, ("exchange_nsp: NspiQueryRows (0x3)\n")); /* Step 0. Ensure incoming user is authenticated */ if (!dcesrv_call_authenticated(dce_call)) { DEBUG(1, ("No challenge requested by client, cannot authenticate\n")); DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL); } emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid); if (!emsabp_ctx) { DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL); } /* Step 1. Sanity Checks (MS-NSPI Server Processing Rules) */ if (r->in.pStat->ContainerID && r->in.lpETable == NULL && (emsabp_tdb_lookup_MId(emsabp_ctx->tdb_ctx, r->in.pStat->ContainerID) == false)) { retval = MAPI_E_INVALID_BOOKMARK; goto failure; } if (r->in.pPropTags == NULL) { pPropTags = set_SPropTagArray(mem_ctx, 0x7, PR_EMS_AB_CONTAINERID, PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_DISPLAY_NAME, PR_OFFICE_TELEPHONE_NUMBER, PR_COMPANY_NAME, PR_OFFICE_LOCATION); } else { pPropTags = r->in.pPropTags; } /* Allocate RowSet to be filled in */ pRows = talloc_zero(mem_ctx, struct PropertyRowSet_r); /* Step 2. Fill ppRows */ if (r->in.lpETable == NULL) { /* Step 2.1 Fill ppRows for supplied Container ID */ struct ldb_result *ldb_res; retval = emsabp_ab_container_enum(mem_ctx, emsabp_ctx, r->in.pStat->ContainerID, &ldb_res); if (!MAPI_STATUS_IS_OK(retval)) { goto failure; } count = ldb_res->count - r->in.pStat->NumPos; if (r->in.Count < count) { count = r->in.Count; } if (count) { pRows->cRows = count; pRows->aRow = talloc_array(mem_ctx, struct PropertyRow_r, count); } /* fetch required attributes for every entry found */ for (i = 0; i < count; i++) { retval = emsabp_fetch_attrs_from_msg(mem_ctx, emsabp_ctx, pRows->aRow + i, ldb_res->msgs[i+r->in.pStat->NumPos], 0, r->in.dwFlags, pPropTags); if (!MAPI_STATUS_IS_OK(retval)) { goto failure; } } r->in.pStat->NumPos = r->in.pStat->Delta + pRows->cRows; r->in.pStat->CurrentRec = MID_END_OF_TABLE; r->in.pStat->TotalRecs = pRows->cRows; r->in.pStat->Delta = 0; } else {