#include "mapiproxy/dcesrv_mapiproxy.h"
#include "dcesrv_exchange_nsp.h"
-struct exchange_nsp_session *nsp_session = NULL;
-TDB_CONTEXT *emsabp_tdb_ctx = NULL;
+static struct exchange_nsp_session *nsp_session = NULL;
+static TDB_CONTEXT *emsabp_tdb_ctx = NULL;
+
+static bool dcesrv_uuid_matches(const struct GUID *uuid1, const struct GUID *uuid2)
+{
+ bool rc;
+ void *mem_ctx;
+
+ rc = (uuid1 == uuid2
+ || ((uuid1 != NULL) && (uuid2 != NULL)
+ && (uuid1->time_low == uuid2->time_low)
+ && (uuid1->time_mid == uuid2->time_mid)
+ && (uuid1->time_hi_and_version == uuid2->time_hi_and_version)
+ && (strncmp((const char *) uuid1->clock_seq, (const char *) uuid2->clock_seq, 2) == 0)
+ && (strncmp((const char *) uuid1->node, (const char *) uuid2->node, 6) == 0)));
+
+ /* mem_ctx = talloc_zero_size(NULL, 0); */
+ /* DEBUG(5, ("dcesrv_uuid_matches: uuids %s and %s %s\n", */
+ /* GUID_string(mem_ctx, uuid1), GUID_string(mem_ctx, uuid2), */
+ /* rc ? "match" : "do not match")); */
+ /* talloc_free(mem_ctx); */
+
+ return rc;
+}
+
+static struct exchange_nsp_session *dcesrv_find_nsp_session(struct GUID *uuid)
+{
+ struct exchange_nsp_session *session, *found_session = NULL;
+
+ for (session = nsp_session; !found_session && session; session = session->next) {
+ if (dcesrv_uuid_matches(uuid, &session->uuid)) {
+ found_session = session;
+ }
+ }
+
+ return found_session;
+}
+
+static struct emsabp_context *dcesrv_find_emsabp_context(struct GUID *uuid)
+{
+ struct exchange_nsp_session *session;
+ struct emsabp_context *emsabp_ctx = NULL;
+
+ session = dcesrv_find_nsp_session(uuid);
+ if (session) {
+ emsabp_ctx = (struct emsabp_context *)session->session->private_data;;
+ }
+
+ return emsabp_ctx;
+}
/**
\details exchange_nsp NspiBind (0x0) function, Initiates a NSPI
\return MAPI_E_SUCCESS on success, otherwise a MAPI error
*/
-static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiBind *r)
{
struct dcesrv_handle *handle;
struct policy_handle wire_handle;
struct exchange_nsp_session *session;
- bool found = false;
DEBUG(5, ("exchange_nsp: NspiBind (0x0)\n"));
*r->out.handle = wire_handle;
r->out.mapiuid = r->in.mapiuid;
- r->out.result = MAPI_E_LOGON_FAILED;
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_FAILONEPROVIDER, NULL);
}
/* Step 1. Initialize the emsabp context */
emsabp_ctx = emsabp_init(dce_call->conn->dce_ctx->lp_ctx, emsabp_tdb_ctx);
if (!emsabp_ctx) {
smb_panic("unable to initialize emsabp context");
- OPENCHANGE_RETVAL_IF(!emsabp_ctx, MAPI_E_FAILONEPROVIDER, NULL);
+ DCESRV_NSP_RETURN(r, MAPI_E_FAILONEPROVIDER, NULL);
}
/* Step 2. Check if incoming user belongs to the Exchange organization */
*r->out.handle = wire_handle;
r->out.mapiuid = r->in.mapiuid;
- r->out.result = MAPI_E_LOGON_FAILED;
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, emsabp_tdb_ctx);
}
/* Step 3. Check if valid cpID has been supplied */
*r->out.handle = wire_handle;
r->out.mapiuid = r->in.mapiuid;
- r->out.result = MAPI_E_UNKNOWN_CPID;
- return MAPI_E_UNKNOWN_CPID;
+ DCESRV_NSP_RETURN(r, MAPI_E_UNKNOWN_CPID, emsabp_tdb_ctx);
}
/* Step 4. Retrieve OpenChange server GUID */
guid = (struct GUID *) samdb_ntds_objectGUID(emsabp_ctx->samdb_ctx);
- OPENCHANGE_RETVAL_IF(!guid, MAPI_E_FAILONEPROVIDER, emsabp_ctx);
+ if (!guid) {
+ DCESRV_NSP_RETURN(r, MAPI_E_FAILONEPROVIDER, emsabp_ctx);
+ }
/* Step 5. Fill NspiBind reply */
handle = dcesrv_handle_new(dce_call->context, EXCHANGE_HANDLE_NSP);
- OPENCHANGE_RETVAL_IF(!handle, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+ if (!handle) {
+ DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+ }
handle->data = (void *) emsabp_ctx;
*r->out.handle = handle->wire_handle;
r->out.mapiuid = guid;
- r->out.result = MAPI_E_SUCCESS;
/* Search for an existing session and increment ref_count, otherwise create it */
- for (session = nsp_session; !found && session; session = session->next) {
- if ((mpm_session_cmp(session->session, dce_call) == true)) {
- mpm_session_increment_ref_count(session->session);
- found = true;
- break;
- }
+ session = dcesrv_find_nsp_session(&handle->wire_handle.uuid);
+ if (session) {
+ mpm_session_increment_ref_count(session->session);
+ DEBUG(5, (" [unexpected]: existing nsp_session: %p; session: %p (ref++)\n", session, session->session));
}
+ else {
+ DEBUG(0, ("Creating new session\n"));
- if (found == false) {
/* Step 6. Associate this emsabp context to the session */
session = talloc((TALLOC_CTX *)nsp_session, struct exchange_nsp_session);
- OPENCHANGE_RETVAL_IF(!session, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+ if (!session) {
+ DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+ }
- DEBUG(0, ("Creating new session\n"));
session->session = mpm_session_init((TALLOC_CTX *)nsp_session, dce_call);
- OPENCHANGE_RETVAL_IF(!session->session, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+ if (!session->session) {
+ DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+ }
- DEBUG(0, (" session is %p\n", session->session));
+ session->uuid = handle->wire_handle.uuid;
mpm_session_set_private_data(session->session, (void *) emsabp_ctx);
mpm_session_set_destructor(session->session, emsabp_destructor);
DLIST_ADD_END(nsp_session, session, struct exchange_nsp_session *);
}
- return MAPI_E_SUCCESS;
+ DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
}
\param mem_ctx pointer to the memory context
\param r pointer to the NspiUnbind call structure
*/
-static enum MAPISTATUS dcesrv_NspiUnbind(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiUnbind(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiUnbind *r)
{
struct dcesrv_handle *h;
struct exchange_nsp_session *session;
- bool ret, found;
+ bool ret;
DEBUG(5, ("exchange_nsp: NspiUnbind (0x1)\n"));
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
/* Step 1. Retrieve handle and free if emsabp context and session are available */
h = dcesrv_handle_fetch(dce_call->context, r->in.handle, DCESRV_HANDLE_ANY);
if (h) {
- found = false;
- for (session = nsp_session; !found && session; session = session->next) {
- found = mpm_session_cmp(session->session, dce_call);
- if (found) {
- ret = mpm_session_release(session->session);
- if (ret == true) {
- DLIST_REMOVE(nsp_session, session);
- DEBUG(0, ("[%s:%d]: Session found and released\n",
- __FUNCTION__, __LINE__));
- } else {
- DEBUG(0, ("[%s:%d]: Session found and ref_count decreased\n",
- __FUNCTION__, __LINE__));
- }
- break;
+ session = dcesrv_find_nsp_session(&r->in.handle->uuid);
+ if (session) {
+ ret = mpm_session_release(session->session);
+ if (ret == true) {
+ DLIST_REMOVE(nsp_session, session);
+ DEBUG(0, ("[%s:%d]: Session found and released\n",
+ __FUNCTION__, __LINE__));
+ } else {
+ DEBUG(0, ("[%s:%d]: Session found and ref_count decreased\n",
+ __FUNCTION__, __LINE__));
}
}
+ else {
+ DEBUG(5, (" nsp_session NOT found\n"));
+ }
}
r->out.result = 1;
- return MAPI_E_SUCCESS;
+ DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiUpdateStat(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiUpdateStat(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiUpdateStat *r)
{
DEBUG(3, ("exchange_nsp: NspiUpdateStat (0x2) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
-
/**
\details exchange_nsp NspiQueryRows (0x3) function
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiQueryRows(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiQueryRows *r)
+static void dcesrv_NspiQueryRows(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiQueryRows *r)
{
enum MAPISTATUS retval = MAPI_E_SUCCESS;
- struct exchange_nsp_session *session;
struct emsabp_context *emsabp_ctx = NULL;
struct SPropTagArray *pPropTags;
struct SRowSet *pRows;
uint32_t i;
- bool found = false;
DEBUG(3, ("exchange_nsp: NspiQueryRows (0x3)\n"));
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
- for (session = nsp_session; !found && session; session = session->next) {
- if ((mpm_session_cmp(session->session, dce_call)) == true) {
- emsabp_ctx = (struct emsabp_context *)session->session->private_data;
- found = true;
- }
+ emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+ if (!emsabp_ctx) {
+ DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
}
- OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
/* Step 1. Sanity Checks (MS-NSPI Server Processing Rules) */
if (r->in.pStat->ContainerID && (emsabp_tdb_lookup_MId(emsabp_ctx->tdb_ctx, r->in.pStat->ContainerID) == false)) {
retval = MAPI_E_INVALID_BOOKMARK;
r->out.pStat->NumPos = r->out.pStat->Delta + pRows->cRows;
r->out.pStat->CurrentRec = MID_END_OF_TABLE;
- return MAPI_E_SUCCESS;
-
+ DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
failure:
r->out.pStat = r->in.pStat;
*r->out.ppRows = NULL;
- r->out.result = retval;
-
- return retval;
+ DCESRV_NSP_RETURN(r, retval, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiSeekEntries(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiSeekEntries(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiSeekEntries *r)
{
DEBUG(3, ("exchange_nsp: NspiSeekEntries (0x4) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiGetMatches *r)
{
enum MAPISTATUS retval;
- struct exchange_nsp_session *session;
struct emsabp_context *emsabp_ctx = NULL;
struct SPropTagArray *ppOutMIds = NULL;
uint32_t i;
- bool found = false;
DEBUG(3, ("exchange_nsp: NspiGetMatches (0x5)\n"));
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
- for (session = nsp_session; !found && session; session = session->next) {
- found = mpm_session_cmp(session->session, dce_call);
- if (found == true) {
- emsabp_ctx = (struct emsabp_context *)session->session->private_data;
- }
+ emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+ if (!emsabp_ctx) {
+ DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
}
- OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
/* Step 1. Retrieve MIds array given search criterias */
ppOutMIds = talloc_zero(mem_ctx, struct SPropTagArray);
ppOutMIds->cValues = 0;
*r->out.ppOutMIds = ppOutMIds;
r->out.ppRows = talloc(mem_ctx, struct SRowSet *);
r->out.ppRows[0] = NULL;
- r->out.result = retval;
-
- return retval;
+ DCESRV_NSP_RETURN(r, retval, NULL);
}
*r->out.ppOutMIds = ppOutMIds;
for (i = 0; i < ppOutMIds->cValues; i++) {
retval = emsabp_fetch_attrs(mem_ctx, emsabp_ctx, &(r->out.ppRows[0]->aRow[i]),
ppOutMIds->aulPropTag[i], fEphID, r->in.pPropTags);
- if (retval) goto failure;
+ if (retval) {
+ DEBUG(5, ("failure looking up value %d\n", i));
+ goto failure;
+ }
}
- r->out.result = MAPI_E_SUCCESS;
-
- return MAPI_E_SUCCESS;
+ DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiResortRestriction(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiResortRestriction(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiResortRestriction *r)
{
DEBUG(3, ("exchange_nsp: NspiResortRestriction (0x6) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiDNToMId(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiDNToMId(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiDNToMId *r)
{
enum MAPISTATUS retval;
- struct exchange_nsp_session *session;
struct emsabp_context *emsabp_ctx = NULL;
struct ldb_message *msg;
uint32_t i;
uint32_t MId;
const char *dn;
bool pbUseConfPartition;
- bool found = false;
DEBUG(3, ("exchange_nsp: NspiDNToMId (0x7)\n"));
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
- for (session = nsp_session; !found && session; session = session->next) {
- DEBUG(0, (" comparing session %p with dce_call %p\n",
- session->session, dce_call));
- if ((mpm_session_cmp(session->session, dce_call)) == true) {
- emsabp_ctx = (struct emsabp_context *)session->session->private_data;
- found = true;
- }
+ emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+ if (!emsabp_ctx) {
+ DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
}
-
- OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
r->out.ppMIds = talloc_array(mem_ctx, struct SPropTagArray *, 2);
r->out.ppMIds[0] = talloc_zero(mem_ctx, struct SPropTagArray);
}
}
- r->out.result = MAPI_E_SUCCESS;
-
- return MAPI_E_SUCCESS;
+ DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetPropList(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiGetPropList(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiGetPropList *r)
{
DEBUG(3, ("exchange_nsp: NspiGetPropList (0x8) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiGetProps *r)
{
enum MAPISTATUS retval;
- struct exchange_nsp_session *session;
struct emsabp_context *emsabp_ctx = NULL;
uint32_t MId;
int i;
- bool found = false;
DEBUG(3, ("exchange_nsp: NspiGetProps (0x9)\n"));
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
- for (session = nsp_session; !found && session; session = session->next) {
- found = mpm_session_cmp(session->session, dce_call);
- if (found) {
- emsabp_ctx = (struct emsabp_context *)session->session->private_data;
- }
+ emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+ if (!emsabp_ctx) {
+ DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
}
- OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
MId = r->in.pStat->CurrentRec;
/* Step 1. Sanity Checks (MS-NSPI Server Processing Rules) */
if (r->in.pStat->ContainerID && (emsabp_tdb_lookup_MId(emsabp_ctx->tdb_ctx, r->in.pStat->ContainerID) == false)) {
- retval = MAPI_E_INVALID_BOOKMARK;
- r->out.result = retval;
- return retval;
+ DCESRV_NSP_RETURN(r, MAPI_E_INVALID_BOOKMARK, NULL);
}
/* Step 2. Fetch properties */
talloc_free(r->out.ppRows);
r->out.ppRows = NULL;
}
- r->out.result = retval;
- return r->out.result;
+ DCESRV_NSP_RETURN(r, retval, NULL);
}
/* Step 3. Properties are fetched. Provide proper return
}
}
- r->out.result = retval;
- return retval;
+ DCESRV_NSP_RETURN(r, retval, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiCompareMIds(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiCompareMIds(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiCompareMIds *r)
{
DEBUG(3, ("exchange_nsp: NspiCompareMIds (0xA) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiModProps(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiModProps(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct NspiModProps *r)
{
DEBUG(3, ("exchange_nsp: NspiModProps (0xB) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetSpecialTable(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiGetSpecialTable *r)
+static void dcesrv_NspiGetSpecialTable(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiGetSpecialTable *r)
{
- struct exchange_nsp_session *session;
struct emsabp_context *emsabp_ctx = NULL;
- bool found = false;
DEBUG(3, ("exchange_nsp: NspiGetSpecialTable (0xC)\n"));
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
- for (session = nsp_session; !found && session; session = session->next) {
- found = mpm_session_cmp(session->session, dce_call);
- if (found == true) {
- emsabp_ctx = (struct emsabp_context *)session->session->private_data;
- found = true;
- }
+ emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+ if (!emsabp_ctx) {
+ DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
}
- OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
/* Step 1. (FIXME) We arbitrary set lpVersion to 0x1 */
r->out.lpVersion = talloc_zero(mem_ctx, uint32_t);
*r->out.lpVersion = 0x1;
/* Step 2. Allocate output SRowSet and call associated emsabp function */
r->out.ppRows = talloc_zero(mem_ctx, struct SRowSet *);
- OPENCHANGE_RETVAL_IF(!r->out.ppRows, MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+ if (!r->out.ppRows) {
+ DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+ }
r->out.ppRows[0] = talloc_zero(mem_ctx, struct SRowSet);
- OPENCHANGE_RETVAL_IF(!r->out.ppRows[0], MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+ if (!r->out.ppRows[0]) {
+ DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+ }
switch (r->in.dwFlags) {
case NspiAddressCreationTemplates:
default:
talloc_free(r->out.ppRows);
talloc_free(r->out.ppRows[0]);
- return MAPI_E_NO_SUPPORT;
+ DCESRV_NSP_RETURN(r, MAPI_E_NO_SUPPORT, NULL);
}
-
- return r->out.result;
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetTemplateInfo(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiGetTemplateInfo *r)
+static void dcesrv_NspiGetTemplateInfo(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiGetTemplateInfo *r)
{
DEBUG(3, ("exchange_nsp: NspiGetTemplateInfo (0xD) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiModLinkAtt(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiModLinkAtt *r)
+static void dcesrv_NspiModLinkAtt(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiModLinkAtt *r)
{
DEBUG(3, ("exchange_nsp: NspiModLinkAtt (0xE) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiDeleteEntries(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiDeleteEntries *r)
+static void dcesrv_NspiDeleteEntries(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiDeleteEntries *r)
{
DEBUG(3, ("exchange_nsp: NspiDeleteEntries (0xF) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiQueryColumns(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiQueryColumns *r)
+static void dcesrv_NspiQueryColumns(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiQueryColumns *r)
{
DEBUG(3, ("exchange_nsp: NspiQueryColumns (0x10) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetNamesFromIDs(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiGetNamesFromIDs *r)
+static void dcesrv_NspiGetNamesFromIDs(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiGetNamesFromIDs *r)
{
DEBUG(3, ("exchange_nsp: NspiGetNamesFromIDs (0x11) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiGetIDsFromNames(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiGetIDsFromNames *r)
+static void dcesrv_NspiGetIDsFromNames(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiGetIDsFromNames *r)
{
DEBUG(3, ("exchange_nsp: NspiGetIDsFromNames (0x12) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiResolveNames(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiResolveNames *r)
+static void dcesrv_NspiResolveNames(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiResolveNames *r)
{
DEBUG(3, ("exchange_nsp: NspiResolveNames (0x13) not implemented\n"));
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ if (!NTLM_AUTH_IS_OK(dce_call)) {
+ DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
+ }
+ DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
}
\return MAPI_E_SUCCESS on success
*/
-static enum MAPISTATUS dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_call,
- TALLOC_CTX *mem_ctx,
- struct NspiResolveNamesW *r)
+static void dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_call,
+ TALLOC_CTX *mem_ctx,
+ struct NspiResolveNamesW *r)
{
enum MAPISTATUS retval = MAPI_E_SUCCESS;
- struct exchange_nsp_session *session;
struct emsabp_context *emsabp_ctx = NULL;
struct ldb_message *ldb_msg_ab;
struct SPropTagArray *pPropTags;
struct WStringsArray_r *paWStr;
uint32_t i;
int ret;
- bool found = false;
const char * const recipient_attrs[] = { "*", NULL };
const char * const search_attr[] = { "mailNickName", "mail", "name",
"displayName", "givenName", "sAMAccountName" };
/* Step 0. Ensure incoming user is authenticated */
if (!NTLM_AUTH_IS_OK(dce_call)) {
DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
- return MAPI_E_LOGON_FAILED;
+ DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
}
- for (session = nsp_session; !found && session; session = session->next) {
- found = mpm_session_cmp(session->session, dce_call);
- if (found == true) {
- emsabp_ctx = (struct emsabp_context *)session->session->private_data;
- found = true;
- }
+ emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+ if (!emsabp_ctx) {
+ DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
}
- OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
/* Step 1. Prepare in/out data */
retval = emsabp_ab_container_by_id(mem_ctx, emsabp_ctx, r->in.pStat->ContainerID, &ldb_msg_ab);
- OPENCHANGE_RETVAL_IF(!MAPI_STATUS_IS_OK(retval), MAPI_E_INVALID_BOOKMARK, NULL);
+ if (!MAPI_STATUS_IS_OK(retval)) {
+ DCESRV_NSP_RETURN(r, MAPI_E_INVALID_BOOKMARK, NULL);
+ }
purportedSearch = ldb_msg_find_attr_as_string(ldb_msg_ab, "purportedSearch", NULL);
- OPENCHANGE_RETVAL_IF(!purportedSearch, MAPI_E_INVALID_BOOKMARK, NULL);
+ if (!purportedSearch) {
+ DCESRV_NSP_RETURN(r, MAPI_E_INVALID_BOOKMARK, NULL);
+ }
/* Set default list of property tags if none were provided in input */
if (!r->in.pPropTags) {
*r->out.ppRows = pRows;
}
- r->out.result = retval;
- return retval;
+ DCESRV_NSP_RETURN(r, retval, NULL);
}
TALLOC_CTX *mem_ctx,
void *r, struct mapiproxy *mapiproxy)
{
- enum MAPISTATUS retval;
const struct ndr_interface_table *table;
uint16_t opnum;
switch (opnum) {
case NDR_NSPIBIND:
- retval = dcesrv_NspiBind(dce_call, mem_ctx, (struct NspiBind *)r);
+ dcesrv_NspiBind(dce_call, mem_ctx, (struct NspiBind *)r);
break;
case NDR_NSPIUNBIND:
- retval = dcesrv_NspiUnbind(dce_call, mem_ctx, (struct NspiUnbind *)r);
+ dcesrv_NspiUnbind(dce_call, mem_ctx, (struct NspiUnbind *)r);
break;
case NDR_NSPIUPDATESTAT:
- retval = dcesrv_NspiUpdateStat(dce_call, mem_ctx, (struct NspiUpdateStat *)r);
+ dcesrv_NspiUpdateStat(dce_call, mem_ctx, (struct NspiUpdateStat *)r);
break;
case NDR_NSPIQUERYROWS:
- retval = dcesrv_NspiQueryRows(dce_call, mem_ctx, (struct NspiQueryRows *)r);
+ dcesrv_NspiQueryRows(dce_call, mem_ctx, (struct NspiQueryRows *)r);
break;
case NDR_NSPISEEKENTRIES:
- retval = dcesrv_NspiSeekEntries(dce_call, mem_ctx, (struct NspiSeekEntries *)r);
+ dcesrv_NspiSeekEntries(dce_call, mem_ctx, (struct NspiSeekEntries *)r);
break;
case NDR_NSPIGETMATCHES:
- retval = dcesrv_NspiGetMatches(dce_call, mem_ctx, (struct NspiGetMatches *)r);
+ dcesrv_NspiGetMatches(dce_call, mem_ctx, (struct NspiGetMatches *)r);
break;
case NDR_NSPIRESORTRESTRICTION:
- retval = dcesrv_NspiResortRestriction(dce_call, mem_ctx, (struct NspiResortRestriction *)r);
+ dcesrv_NspiResortRestriction(dce_call, mem_ctx, (struct NspiResortRestriction *)r);
break;
case NDR_NSPIDNTOMID:
- retval = dcesrv_NspiDNToMId(dce_call, mem_ctx, (struct NspiDNToMId *)r);
+ dcesrv_NspiDNToMId(dce_call, mem_ctx, (struct NspiDNToMId *)r);
break;
case NDR_NSPIGETPROPLIST:
- retval = dcesrv_NspiGetPropList(dce_call, mem_ctx, (struct NspiGetPropList *)r);
+ dcesrv_NspiGetPropList(dce_call, mem_ctx, (struct NspiGetPropList *)r);
break;
case NDR_NSPIGETPROPS:
- retval = dcesrv_NspiGetProps(dce_call, mem_ctx, (struct NspiGetProps *)r);
+ dcesrv_NspiGetProps(dce_call, mem_ctx, (struct NspiGetProps *)r);
break;
case NDR_NSPICOMPAREMIDS:
- retval = dcesrv_NspiCompareMIds(dce_call, mem_ctx, (struct NspiCompareMIds *)r);
+ dcesrv_NspiCompareMIds(dce_call, mem_ctx, (struct NspiCompareMIds *)r);
break;
case NDR_NSPIMODPROPS:
- retval = dcesrv_NspiModProps(dce_call, mem_ctx, (struct NspiModProps *)r);
+ dcesrv_NspiModProps(dce_call, mem_ctx, (struct NspiModProps *)r);
break;
case NDR_NSPIGETSPECIALTABLE:
- retval = dcesrv_NspiGetSpecialTable(dce_call, mem_ctx, (struct NspiGetSpecialTable *)r);
+ dcesrv_NspiGetSpecialTable(dce_call, mem_ctx, (struct NspiGetSpecialTable *)r);
break;
case NDR_NSPIGETTEMPLATEINFO:
- retval = dcesrv_NspiGetTemplateInfo(dce_call, mem_ctx, (struct NspiGetTemplateInfo *)r);
+ dcesrv_NspiGetTemplateInfo(dce_call, mem_ctx, (struct NspiGetTemplateInfo *)r);
break;
case NDR_NSPIMODLINKATT:
- retval = dcesrv_NspiModLinkAtt(dce_call, mem_ctx, (struct NspiModLinkAtt *)r);
+ dcesrv_NspiModLinkAtt(dce_call, mem_ctx, (struct NspiModLinkAtt *)r);
break;
case NDR_NSPIDELETEENTRIES:
- retval = dcesrv_NspiDeleteEntries(dce_call, mem_ctx, (struct NspiDeleteEntries *)r);
+ dcesrv_NspiDeleteEntries(dce_call, mem_ctx, (struct NspiDeleteEntries *)r);
break;
case NDR_NSPIQUERYCOLUMNS:
- retval = dcesrv_NspiQueryColumns(dce_call, mem_ctx, (struct NspiQueryColumns *)r);
+ dcesrv_NspiQueryColumns(dce_call, mem_ctx, (struct NspiQueryColumns *)r);
break;
case NDR_NSPIGETNAMESFROMIDS:
- retval = dcesrv_NspiGetNamesFromIDs(dce_call, mem_ctx, (struct NspiGetNamesFromIDs *)r);
+ dcesrv_NspiGetNamesFromIDs(dce_call, mem_ctx, (struct NspiGetNamesFromIDs *)r);
break;
case NDR_NSPIGETIDSFROMNAMES:
- retval = dcesrv_NspiGetIDsFromNames(dce_call, mem_ctx, (struct NspiGetIDsFromNames *)r);
+ dcesrv_NspiGetIDsFromNames(dce_call, mem_ctx, (struct NspiGetIDsFromNames *)r);
break;
case NDR_NSPIRESOLVENAMES:
- retval = dcesrv_NspiResolveNames(dce_call, mem_ctx, (struct NspiResolveNames *)r);
+ dcesrv_NspiResolveNames(dce_call, mem_ctx, (struct NspiResolveNames *)r);
break;
case NDR_NSPIRESOLVENAMESW:
- retval = dcesrv_NspiResolveNamesW(dce_call, mem_ctx, (struct NspiResolveNamesW *)r);
+ dcesrv_NspiResolveNamesW(dce_call, mem_ctx, (struct NspiResolveNamesW *)r);
break;
}
bool found = false;
DEBUG (0, ("dcesrv_exchange_nsp_unbind\n"));
-
- for (session = nsp_session; !found && session; session = session->next) {
- found = mpm_session_cmp_sub(session->session, server_id, context_id);
- if (found == true) {
- mpm_session_release(session->session);
- DLIST_REMOVE(nsp_session, session);
- DEBUG(6, ("[%s:%d]: Session found and released\n", __FUNCTION__, __LINE__));
- return NT_STATUS_OK;
- }
- }
-
- return NT_STATUS_OK;
}