/** \details Test the RegisterNotification (0x29) operation This function: -# \param mt pointer on the top-level mapitest structure \return true on success, otherwise false */ _PUBLIC_ bool mapitest_oxcnotif_RegisterNotification(struct mapitest *mt) { enum MAPISTATUS retval; bool ret; mapi_object_t obj_store; mapi_object_t obj_folder; struct mapi_session *session; uint32_t tcon; /* Step 1. Logon */ mapi_object_init(&obj_store); retval = OpenMsgStore(mt->session, &obj_store); mapitest_print_retval(mt, "OpenMsgStore"); if (retval != MAPI_E_SUCCESS) { return false; } /* Step 2. Open Inbox folder */ mapi_object_init(&obj_folder); ret = mapitest_common_folder_open(mt, &obj_store, &obj_folder, olFolderInbox); if (!ret) { return ret; } /* Step 3. Register notification */ session = mapi_object_get_session(&obj_store); retval = RegisterNotification(session); mapitest_print_retval(mt, "RegisterNotification"); if ( retval != MAPI_E_SUCCESS) { return false; } /* Step 4. Subscribe for notifications */ retval = Subscribe(&obj_store, &tcon, fnevObjectCopied, true, cb, NULL); mapitest_print_retval(mt, "Subscribe"); if (retval != MAPI_E_SUCCESS) { return false; } /* Step 5. Unsubscribe for notifications */ retval = Unsubscribe(mt->session, tcon); mapitest_print_retval(mt, "Unsubscribe"); if (retval != MAPI_E_SUCCESS) { return false; } /* Step 6. Cleanup */ mapi_object_release(&obj_folder); mapi_object_release(&obj_store); return true; }
/** \details Test the SyncOpenAdvisor (0x83) and SetSyncNotificationGuid (0x88) operations This function: -# logs on -# creates a notification advisor -# sets a GUID on the advisor -# cleans up \param mt pointer on the top-level mapitest structure \return true on success, otherwise false */ _PUBLIC_ bool mapitest_oxcnotif_SyncOpenAdvisor(struct mapitest *mt) { enum MAPISTATUS retval; bool ret = true; mapi_object_t obj_store; mapi_object_t obj_notifier; mapi_object_init(&obj_store); mapi_object_init(&obj_notifier); /* Logon */ retval = OpenMsgStore(mt->session, &obj_store); mapitest_print_retval_clean(mt, "OpenMsgStore", retval); if (retval != MAPI_E_SUCCESS) { ret = false; goto cleanup; } /* Create advisor */ retval = SyncOpenAdvisor(&obj_store, &obj_notifier); mapitest_print_retval_clean(mt, "SyncOpenAdvisor", retval); if (retval != MAPI_E_SUCCESS) { ret = false; goto cleanup; } /* Set GUID */ retval = SetSyncNotificationGuid(&obj_notifier, GUID_random()); mapitest_print_retval_clean(mt, "SetSyncNotificationGuid", retval); if (retval != MAPI_E_SUCCESS) { ret = false; goto cleanup; } /* Cleanup */ cleanup: mapi_object_release(&obj_notifier); mapi_object_release(&obj_store); return ret; }
static uint32_t _module_fetchmail_run(TALLOC_CTX *mem_ctx, struct mapi_session *session) { enum MAPISTATUS retval; mapi_object_t obj_store; mapi_object_t obj_inbox; mapi_object_t obj_table; mapi_object_t obj_message; mapi_object_t obj_table_attach; mapi_object_t obj_attach; mapi_object_t obj_stream; uint64_t id_inbox = 0; struct SPropTagArray *SPropTagArray; struct SRowSet SRowSet; struct SRowSet SRowSet_attach; uint32_t i, j; uint32_t count; const uint8_t *has_attach; const uint32_t *attach_num; uint16_t read_size; unsigned char buf[MAX_READ_SIZE]; /* Log onto the store */ memset(&obj_store, 0, sizeof(mapi_object_t)); memset(&obj_inbox, 0, sizeof(mapi_object_t)); memset(&obj_table, 0, sizeof(mapi_object_t)); memset(&obj_message, 0, sizeof(mapi_object_t)); memset(&obj_table_attach, 0, sizeof(mapi_object_t)); memset(&obj_attach, 0, sizeof(mapi_object_t)); memset(&obj_stream, 0, sizeof(mapi_object_t)); mapi_object_init(&obj_store); retval = OpenMsgStore(session, &obj_store); if (retval) { mapi_errstr("OpenMsgStore", GetLastError()); return OCSIM_ERROR; } /* Open default receive folder (Inbox) */ retval = GetReceiveFolder(&obj_store, &id_inbox, NULL); if (retval) { mapi_errstr("GetReceiveFolder", GetLastError()); return OCSIM_ERROR; } retval = OpenFolder(&obj_store, id_inbox, &obj_inbox); if (retval) { mapi_errstr("OpenFolder", GetLastError()); return OCSIM_ERROR; } /* Open the contents table and customize the view */ mapi_object_init(&obj_table); retval = GetContentsTable(&obj_inbox, &obj_table, 0, &count); if (retval) { mapi_errstr("GetContentsTable", GetLastError()); return OCSIM_ERROR; } SPropTagArray = set_SPropTagArray(mem_ctx, 0x5, PR_FID, PR_MID, PR_INST_ID, PR_INSTANCE_NUM, PR_SUBJECT); retval = SetColumns(&obj_table, SPropTagArray); MAPIFreeBuffer(SPropTagArray); if (retval) { mapi_errstr("SetColumns", GetLastError()); return OCSIM_ERROR; } /* Retrieve the messages and attachments */ while ((retval = QueryRows(&obj_table, count, TBL_ADVANCE, &SRowSet)) != MAPI_E_NOT_FOUND && SRowSet.cRows) { count -= SRowSet.cRows; for (i = 0; i < SRowSet.cRows; i++) { mapi_object_init(&obj_message); retval = OpenMessage(&obj_store, SRowSet.aRow[i].lpProps[0].value.d, SRowSet.aRow[i].lpProps[0].value.d, &obj_message, 0); if (GetLastError() == MAPI_E_SUCCESS) { struct SPropValue *lpProps; struct SRow aRow; SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_HASATTACH); lpProps = talloc_zero(mem_ctx, struct SPropValue); retval = GetProps(&obj_message, 0, SPropTagArray, &lpProps, &count); MAPIFreeBuffer(SPropTagArray); if (retval) { mapi_errstr("GetProps", GetLastError()); return OCSIM_ERROR; } aRow.ulAdrEntryPad = 0; aRow.cValues = count; aRow.lpProps = lpProps; retval = fetchmail_get_contents(mem_ctx, &obj_message); has_attach = (const uint8_t *) get_SPropValue_SRow_data(&aRow, PR_HASATTACH); if (has_attach && *has_attach) { mapi_object_init(&obj_table_attach); retval = GetAttachmentTable(&obj_message, &obj_table_attach); if (retval == MAPI_E_SUCCESS) { SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_ATTACH_NUM); retval = SetColumns(&obj_table_attach, SPropTagArray); if (retval != MAPI_E_SUCCESS) return retval; MAPIFreeBuffer(SPropTagArray); retval = QueryRows(&obj_table_attach, 0xA, TBL_ADVANCE, &SRowSet_attach); if (retval != MAPI_E_SUCCESS) return retval; for (j = 0; j < SRowSet_attach.cRows; j++) { attach_num = (const uint32_t *) find_SPropValue_data(&(SRowSet_attach.aRow[j]), PR_ATTACH_NUM); mapi_object_init(&obj_attach); retval = OpenAttach(&obj_message, *attach_num, &obj_attach); if (retval == MAPI_E_SUCCESS) { struct SPropValue *lpProps2; uint32_t count2; SPropTagArray = set_SPropTagArray(mem_ctx, 0x3, PR_ATTACH_FILENAME, PR_ATTACH_LONG_FILENAME, PR_ATTACH_SIZE); lpProps2 = talloc_zero(mem_ctx, struct SPropValue); retval = GetProps(&obj_attach, 0, SPropTagArray, &lpProps2, &count2); MAPIFreeBuffer(SPropTagArray); if (retval != MAPI_E_SUCCESS) { MAPIFreeBuffer(lpProps2); return retval; } MAPIFreeBuffer(lpProps2); mapi_object_init(&obj_stream); retval = OpenStream(&obj_attach, PR_ATTACH_DATA_BIN, 0, &obj_stream); if (retval != MAPI_E_SUCCESS) return retval; read_size = 0; do { retval = ReadStream(&obj_stream, buf, MAX_READ_SIZE, &read_size); if (retval != MAPI_E_SUCCESS) break; } while (read_size); mapi_object_release(&obj_stream); mapi_object_release(&obj_attach); } } } } MAPIFreeBuffer(lpProps); } mapi_object_release(&obj_message); }
int main(int argc, char *argv[]) { enum MAPISTATUS retval; struct mapi_context *mapi_ctx; TALLOC_CTX *mem_ctx; struct mapi_session *session = NULL; mapi_object_t obj_store; mapi_object_t obj_folder; mapi_object_t obj_table; mapi_object_t obj_message; struct mapi_SPropValue_array props_all; struct SRowSet rowset; struct SPropTagArray *SPropTagArray; mapi_id_t id_inbox; mapi_id_t *fid, *mid; char *profname; char *profdb; uint32_t Numerator; uint32_t Denominator; uint32_t i; mem_ctx = talloc_named(NULL, 0, "fetchmail"); /* Initialize MAPI */ profdb = talloc_asprintf(mem_ctx, DEFAULT_PROFDB, getenv("HOME")); retval = MAPIInitialize(&mapi_ctx, profdb); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Find Default Profile */ retval = GetDefaultProfile(mapi_ctx, &profname); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Log on EMSMDB and NSPI */ retval = MapiLogonEx(mapi_ctx, &session, profname, NULL); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Open Message Store */ mapi_object_init(&obj_store); retval = OpenMsgStore(session, &obj_store); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Find Inbox default folder */ retval = GetDefaultFolder(&obj_store, &id_inbox, olFolderInbox); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Open Inbox folder */ mapi_object_init(&obj_folder); retval = OpenFolder(&obj_store, id_inbox, &obj_folder); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Retrieve Inbox content table */ mapi_object_init(&obj_table); retval = GetContentsTable(&obj_folder, &obj_table, 0x0, NULL); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Create the MAPI table view */ SPropTagArray = set_SPropTagArray(mem_ctx, 0x2, PR_FID, PR_MID); retval = SetColumns(&obj_table, SPropTagArray); MAPIFreeBuffer(SPropTagArray); MAPI_RETVAL_IF(retval, retval, mem_ctx); talloc_free(mem_ctx); /* Get current cursor position */ retval = QueryPosition(&obj_table, &Numerator, &Denominator); MAPI_RETVAL_IF(retval, retval, mem_ctx); /* Iterate through rows */ while ((retval = QueryRows(&obj_table, Denominator, TBL_ADVANCE, &rowset)) != -1 && rowset.cRows) { for (i = 0; i < rowset.cRows; i++) { fid = (mapi_id_t *)find_SPropValue_data(&(rowset.aRow[i]), PR_FID); mid = (mapi_id_t *)find_SPropValue_data(&(rowset.aRow[i]), PR_MID); mapi_object_init(&obj_message); retval = OpenMessage(&obj_store, *fid, *mid, &obj_message, 0x0); if (retval != MAPI_E_NOT_FOUND) { retval = GetPropsAll(&obj_message, MAPI_UNICODE, &props_all); mapidump_message(&props_all, NULL, &obj_message); mapi_object_release(&obj_message); } } } /* Release MAPI objects */ mapi_object_release(&obj_table); mapi_object_release(&obj_folder); Logoff(&obj_store); /* Uninitialize MAPI */ MAPIUninitialize(mapi_ctx); return (0); }
/** \details Test #1804 ModifyRecipients and try to build RecipientRow with multi-value properties (e.g. PidTagUserX509Certificate) \param mt pointer to the top level mapitest structure \return true on success, otherwise false */ _PUBLIC_ bool mapitest_zentyal_1804(struct mapitest *mt) { enum MAPISTATUS retval; mapi_object_t obj_store; mapi_object_t obj_folder; mapi_object_t obj_message; mapi_id_t id_folder; char **username = NULL; struct SPropTagArray *SPropTagArray = NULL; struct PropertyValue_r value; struct PropertyRowSet_r *RowSet = NULL; struct SRowSet *SRowSet = NULL; struct PropertyTagArray_r *flaglist = NULL; mapi_id_t id_msgs[1]; /* Step 1. Logon */ mapi_object_init(&obj_store); retval = OpenMsgStore(mt->session, &obj_store); mapitest_print_retval(mt, "OpenMsgStore"); if (GetLastError() != MAPI_E_SUCCESS) { return false; } /* Step 2. Open Outbox folder */ retval = GetDefaultFolder(&obj_store, &id_folder, olFolderOutbox); mapitest_print_retval(mt, "GetDefaultFolder"); if (GetLastError() != MAPI_E_SUCCESS) { return false; } mapi_object_init(&obj_folder); retval = OpenFolder(&obj_store, id_folder, &obj_folder); mapitest_print_retval(mt, "OpenFolder"); if (GetLastError() != MAPI_E_SUCCESS) { return false; } /* Step 3. Create the message */ mapi_object_init(&obj_message); retval = CreateMessage(&obj_folder, &obj_message); mapitest_print_retval(mt, "CreateMessage"); if (GetLastError() != MAPI_E_SUCCESS) { return false; } /* Step 4. Resolve the recipients and call ModifyRecipients */ SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0xA, PR_ENTRYID, PR_DISPLAY_NAME_UNICODE, PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_TRANSMITTABLE_DISPLAY_NAME_UNICODE, PR_EMAIL_ADDRESS_UNICODE, PR_ADDRTYPE_UNICODE, PR_SEND_RICH_INFO, PR_7BIT_DISPLAY_NAME_UNICODE, PR_SMTP_ADDRESS_UNICODE); username = talloc_array(mt->mem_ctx, char *, 2); username[0] = (char *)mt->profile->username; username[1] = NULL; retval = ResolveNames(mapi_object_get_session(&obj_message), (const char **)username, SPropTagArray, &RowSet, &flaglist, MAPI_UNICODE); mapitest_print_retval_clean(mt, "ResolveNames", retval); if (retval != MAPI_E_SUCCESS) { return false; } if (!RowSet) { mapitest_print(mt, "Null RowSet\n"); return false; } if (!RowSet->cRows) { mapitest_print(mt, "No values in RowSet\n"); MAPIFreeBuffer(RowSet); return false; } value.ulPropTag = PR_SEND_INTERNET_ENCODING; value.value.l = 0; PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value); /* Fake multi-value property on RecipientRow */ /* PT_MV_STRING8 */ value.ulPropTag = PR_EMS_AB_PROXY_ADDRESSES; value.value.MVszA.cValues = 2; value.value.MVszA.lppszA = talloc_array(mt->mem_ctx, const char *, value.value.MVszA.cValues); value.value.MVszA.lppszA[0] = "smtp:[email protected]"; value.value.MVszA.lppszA[1] = "X400:c=US;a= ;p=First Organizati;o=Exchange;s=test"; PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value); /* PT_MV_UNICODE - same layout as PT_MV_STRING8 */ value.ulPropTag = PR_EMS_AB_PROXY_ADDRESSES_UNICODE; PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value); /* PT_MV_BINARY */ value.ulPropTag = PidTagUserX509Certificate; value.value.MVbin.cValues = 2; value.value.MVbin.lpbin = talloc_array(mt->mem_ctx, struct Binary_r, value.value.MVbin.cValues); value.value.MVbin.lpbin[0].cb = 9; value.value.MVbin.lpbin[0].lpb = (uint8_t *)"string 1"; value.value.MVbin.lpbin[1].cb = 9; value.value.MVbin.lpbin[1].lpb = (uint8_t *)"string 2"; PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value); SRowSet = talloc_zero(RowSet, struct SRowSet); cast_PropertyRowSet_to_SRowSet(SRowSet, RowSet, SRowSet); SetRecipientType(&(SRowSet->aRow[0]), MAPI_TO); mapitest_print_retval(mt, "SetRecipientType"); retval = ModifyRecipients(&obj_message, SRowSet); mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_TO"); if (retval != MAPI_E_SUCCESS) { MAPIFreeBuffer(RowSet); MAPIFreeBuffer(flaglist); return false; } /* Step 5. Delete the message */ id_msgs[0] = mapi_object_get_id(&obj_message); retval = DeleteMessage(&obj_folder, id_msgs, 1); mapitest_print_retval(mt, "DeleteMessage"); if (retval != MAPI_E_SUCCESS) { MAPIFreeBuffer(RowSet); MAPIFreeBuffer(flaglist); return false; } /* Release */ MAPIFreeBuffer(RowSet); MAPIFreeBuffer(flaglist); mapi_object_release(&obj_message); mapi_object_release(&obj_folder); mapi_object_release(&obj_store); return true; }
bool MapiConnector2::login(QString profile) { if (!init()) { return false; } if (m_session) { // already logged in... return true; } if (profile.isEmpty()) { // use the default profile if none was specified by the caller profile = defaultGet(); if (profile.isEmpty()) { // there seams to be no default profile error() << "no default profile"; return false; } } // Log on if (MAPI_E_SUCCESS != MapiLogonEx(m_context, &m_session, profile.toUtf8(), NULL)) { error() << "cannot logon using profile" << profile << mapiError(); return false; } if (MAPI_E_SUCCESS != OpenMsgStore(m_session, m_store)) { error() << "cannot open message store" << mapiError(); return false; } #if (ENABLE_PUBLIC_FOLDERS) if (MAPI_E_SUCCESS != OpenPublicFolder(m_session, m_nspiStore)) { error() << "cannot open public folder" << mapiError(); return false; } #endif MapiDebug debug(this, (0 != ENABLE_MAPI_DEBUG)); // Get rid of any existing notifier and create a new one. // TODO Wait for a version of libmapi that has asingle parameter here. #if (ENABLE_NOTIFICATIONS) #if 0 if (MAPI_E_SUCCESS != RegisterNotification(m_session)) { #else if (MAPI_E_SUCCESS != RegisterNotification(m_session, 0)) { #endif error() << "cannot register for notifications" << mapiError(); return false; } delete m_notifier; m_notifier = new QSocketNotifier(m_session->notify_ctx->fd, QSocketNotifier::Read); if (!m_notifier) { error() << "cannot create notifier"; return false; } connect(m_notifier, SIGNAL(activated(int)), this, SLOT(notified(int))); #endif return true; } void MapiConnector2::notified(int fd) { QAbstractSocket socket(QAbstractSocket::UdpSocket, this); socket.setSocketDescriptor(fd); struct mapi_response *mapi_response; NTSTATUS status; QByteArray data; while (true) { data = socket.readAll(); error() << "read from socket" << data.size(); if (!data.size()) { break; } // Dummy transaction to keep the pipe up. status = emsmdb_transaction_null((struct emsmdb_context *)m_session->emsmdb->ctx, &mapi_response); if (!NT_STATUS_IS_OK(status)) { error() << "bad nt status" << status; break; } //retval = ProcessNotification(notify_ctx, mapi_response); } }