bool MapiConnector2::defaultFolder(MapiDefaultFolder folderType, MapiId *id) { // In case we fail... id->m_provider = MapiId::INVALID; #if (!ENABLE_PUBLIC_FOLDERS) error() << "public folders disabled"; return false; #endif // NSPI-based assets. if ((PublicRoot <= folderType) && (folderType <= PublicNNTPArticle)) { if (MAPI_E_SUCCESS != GetDefaultPublicFolder(m_nspiStore, &id->second, folderType)) { error() << "cannot get default public folder: %1" << folderType << mapiError(); return false; } id->first = 0; id->m_provider = MapiId::NSPI; return true; } // EMSDB-based assets. if (MAPI_E_SUCCESS != GetDefaultFolder(m_store, &id->second, folderType)) { error() << "cannot get default folder: %1" << folderType << mapiError(); return false; } id->first = 0; id->m_provider = MapiId::EMSDB; return true; }
bool AccountFolderManager::IsDefaultFolder(const bbpim::CalendarFolder& folder, bool fresh) { bbpim::CalendarFolder defaultFolder = GetDefaultFolder(fresh); return (folder.accountId() == defaultFolder.accountId() && folder.id() == defaultFolder.id()); }
static enum MAPISTATUS import_directory(TALLOC_CTX *mem_ctx, const struct mbox_data *mdata, mapi_object_t *obj_store, mapi_object_t *obj_parent, const char *base_path) { enum MAPISTATUS retval; DIR *dirp; struct dirent *direntp; mapi_object_t obj_folder; mapi_object_t obj_inbox; mapi_object_t obj_child; mapi_id_t id_folder; char *folder_id; char *olFolderSrc; struct SPropTagArray *SPropTagArray; struct SPropValue *lpProps; uint32_t cValues = 0; struct SRow aRow; DEBUG(5,("[*] Importing directory %s\n", base_path)); /* Open the filesystem folder */ dirp = opendir(base_path); if (!dirp) { DEBUG(0, ("[!] Error opening directory %s: %s (%d)\n", base_path, strerror(errno), errno)); return MAPI_E_NOT_FOUND; // TODO map to proper code } mapi_object_init(&obj_folder); mapi_object_init(&obj_child); mapi_object_init(&obj_inbox); /* I want to get the folder ID from the remote Exchange server and check in the systemfolder database if it matches with something. we can get the remote folder ID from the directory name */ folder_id = import_get_folder_id(base_path); if (!folder_id) { DEBUG(0, ("[!] Error getting folder ID from directory name\n")); return MAPI_E_NOT_FOUND; // TODO map to proper code } if (!obj_parent) { DEBUG(5, ("parent is null\n")); retval = GetDefaultFolder(obj_store, &id_folder, olFolderInbox); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] GetDefaultFolder: %s\n", mapi_get_errstr(GetLastError()))); return retval; } DEBUG(4, ("[*] Opening folder %u\n", olFolderInbox)); retval = OpenFolder(obj_store, id_folder, &obj_inbox); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] OpenFolder: %s\n", mapi_get_errstr(GetLastError()))); return retval; } obj_parent = &obj_inbox; } /* XXX Begin of hack */ #if 0 olFolderSrc = import_is_system_folder(mdata, folder_id); if (!olFolderSrc) { DEBUG(5, ("[*] Not system folder, skip\n")); talloc_free(olFolderSrc); return MAPI_E_SUCCESS; } uint32_t olFolder = atoi(olFolderSrc); talloc_free(olFolderSrc); retval = MAPI_E_SUCCESS; if (olFolder == olFolderContacts) { retval = GetDefaultFolder(obj_store, &id_folder, olFolderContacts); } else if (olFolder == olFolderCalendar) { retval = GetDefaultFolder(obj_store, &id_folder, olFolderCalendar); } else if (olFolder == olFolderTopInformationStore) { retval = GetDefaultFolder(obj_store, &id_folder, olFolderInbox); } if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] GetDefaultFolder: %s\n", mapi_get_errstr(GetLastError()))); return retval; } DEBUG(4, ("Opening folder %u\n", olFolder)); retval = OpenFolder(obj_store, id_folder, &obj_folder); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] OpenFolder: %s\n", mapi_get_errstr(GetLastError()))); return retval; } #endif /* XXX end of hack */ #if 1 olFolderSrc = import_is_system_folder(mdata, folder_id); if (olFolderSrc) { char *folder_name = import_get_folder_name(mdata, folder_id); if (folder_name) { DEBUG(5, ("[*] Origin Folder '%s' mapped to name '%s'\n", folder_id, folder_name)); talloc_free(folder_name); folder_name = NULL; } /* This is a system folder, then I am calling GetDefaultFolder to retrieve the id then I open the folder */ uint32_t olFolder = atoi(olFolderSrc); talloc_free(olFolderSrc); retval = GetDefaultFolder(obj_store, &id_folder, olFolder); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] GetDefaultFolder: %s\n", mapi_get_errstr(GetLastError()))); return retval; } DEBUG(4, ("[*] Opening folder %u\n", olFolder)); retval = OpenFolder(obj_store, id_folder, &obj_folder); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] OpenFolder: %s\n", mapi_get_errstr(GetLastError()))); return retval; } SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PidTagDisplayName); retval = GetProps(&obj_folder, MAPI_UNICODE, SPropTagArray, &lpProps, &cValues); MAPIFreeBuffer(SPropTagArray); if (retval == MAPI_E_SUCCESS) { aRow.cValues = cValues; aRow.lpProps = lpProps; folder_name = (char *) find_SPropValue_data(&aRow, PidTagDisplayName); if (folder_name) { DEBUG(5, ("[*] Destination Folder: '%s'\n", folder_name)); } } } else { /* this is not a system folder, I know what is the root base where need to create it i and open it */ char *folder_name = import_get_folder_name(mdata, folder_id); if (!folder_name) { DEBUG(0, ("[!] Invalid Folder Name\n")); return MAPI_E_INVALID_PARAMETER; } DEBUG(4, ("[*] Creating folder %s\n", folder_name)); retval = CreateFolder(obj_parent, FOLDER_GENERIC, folder_name, NULL, OPEN_IF_EXISTS|MAPI_UNICODE, &obj_folder); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("[!] CreateFolder: %s\n", mapi_get_errstr(GetLastError()))); talloc_free(folder_name); return retval; } talloc_free(folder_name); return MAPI_E_SUCCESS; } #endif /* Import the files and clildren folders */ while ((direntp = readdir(dirp)) != NULL) { if (strcmp(direntp->d_name, ".") == 0) { continue; } if (strcmp(direntp->d_name, "..") == 0) { continue; } char *ext = strrchr(direntp->d_name, '.'); if (!ext) { if (strncasecmp(direntp->d_name, "0x", 2) == 0) { char *child_path = talloc_asprintf(mem_ctx, "%s/%s", base_path, direntp->d_name); retval = import_directory(mem_ctx, mdata, obj_store, &obj_folder, child_path); if (retval != MAPI_E_SUCCESS) { DEBUG(0, ("import_directory failed with %s\n", mapi_get_errstr(GetLastError()))); talloc_free(child_path); return retval; } talloc_free(child_path); } continue; } if (strncasecmp(ext, ".ocpf", 5) == 0) { char *child_path = talloc_asprintf(mem_ctx, "%s/%s", base_path, direntp->d_name); import_ocpf_file(mem_ctx, mdata, obj_store, &obj_folder, child_path); talloc_free(child_path); } } mapi_object_release(&obj_folder); mapi_object_release(&obj_inbox); /* Close directory */ closedir(dirp); return retval; }
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; }