22
22
#include "libmapi/libmapi.h"
23
23
#include "libmapi/libmapi_private.h"
24
#include "libmapi/mapi_nameid.h"
24
25
#include "libocpf/ocpf.h"
25
#include <samba/popt.h>
28
29
#include "openchangeclient.h"
281
282
static char *build_uniqueID(TALLOC_CTX *mem_ctx, mapi_object_t *obj_folder,
282
283
mapi_object_t *obj_message)
284
enum MAPISTATUS retval;
286
286
struct SPropTagArray *SPropTagArray;
287
287
struct SPropValue *lpProps;
292
292
/* retrieve the folder ID */
293
293
SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_FID);
294
retval = GetProps(obj_folder, 0, SPropTagArray, &lpProps, &count);
294
GetProps(obj_folder, 0, SPropTagArray, &lpProps, &count);
295
295
MAPIFreeBuffer(SPropTagArray);
296
296
if (GetLastError() != MAPI_E_SUCCESS) return NULL;
297
297
fid = (const uint64_t *)get_SPropValue_data(lpProps);
299
299
/* retrieve the message ID */
300
300
SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_MID);
301
retval = GetProps(obj_message, 0, SPropTagArray, &lpProps, &count);
301
GetProps(obj_message, 0, SPropTagArray, &lpProps, &count);
302
302
MAPIFreeBuffer(SPropTagArray);
303
303
if (GetLastError() != MAPI_E_SUCCESS) return NULL;
304
304
mid = (const uint64_t *)get_SPropValue_data(lpProps);
331
330
if (!filename || !size) return false;
332
mapi_object_init(&obj_stream);
333
334
mem_ctx = talloc_named(NULL, 0, "store_attachment");
334
mapi_object_init(&obj_stream);
336
336
if (!(dir = opendir(oclient->store_folder))) {
337
337
if (mkdir(oclient->store_folder, 0700) == -1) return false;
353
353
retval = ReadStream(&obj_stream, buf, MAX_READ_SIZE, &read_size);
354
354
if (retval != MAPI_E_SUCCESS) goto error;
355
len = write(fd, buf, read_size);
355
write(fd, buf, read_size);
356
356
} while (read_size);
433
433
retval = SetColumns(&obj_table, SPropTagArray);
434
434
MAPIFreeBuffer(SPropTagArray);
435
435
MAPI_RETVAL_IF(retval, retval, mem_ctx);
450
450
struct SRow aRow;
452
452
SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PR_HASATTACH);
453
lpProps = talloc_zero(mem_ctx, struct SPropValue);
454
454
retval = GetProps(&obj_message, 0, SPropTagArray, &lpProps, &count);
455
455
MAPIFreeBuffer(SPropTagArray);
456
456
if (retval != MAPI_E_SUCCESS) return retval;
488
488
PR_ATTACH_LONG_FILENAME,
490
490
PR_ATTACH_CONTENT_ID);
491
lpProps2 = talloc_zero(mem_ctx, struct SPropValue);
492
492
retval = GetProps(&obj_attach, MAPI_UNICODE, SPropTagArray, &lpProps2, &count2);
493
493
MAPIFreeBuffer(SPropTagArray);
494
494
if (retval != MAPI_E_SUCCESS) return retval;
700
700
/* Open a stream on the parent for the given property */
701
701
retval = OpenStream(&obj_parent, mapitag, access_flags, &obj_stream);
702
fprintf (stderr, "openstream: retval = %s (0x%.8x)\n",
703
mapi_get_errstr (retval), retval);
702
705
if (retval != MAPI_E_SUCCESS) return false;
704
707
/* WriteStream operation */
763
771
if (retval != MAPI_E_SUCCESS) return retval;
765
773
/* Get Sent Items folder but should be using olFolderOutbox */
766
retval = GetDefaultFolder(obj_store, &id_outbox, olFolderSentMail);
774
retval = GetDefaultFolder(obj_store, &id_outbox, olFolderOutbox);
767
775
if (retval != MAPI_E_SUCCESS) return retval;
769
777
/* Open outbox folder */
849
857
bin.lpb = (uint8_t *)oclient->pr_html_inline;
850
858
bin.cb = strlen(oclient->pr_html_inline);
851
860
openchangeclient_stream(mem_ctx, obj_message, obj_stream, PR_HTML, 2, bin);
853
862
struct SBinary_short bin;
874
883
mapi_object_init(&obj_stream);
875
884
openchangeclient_stream(mem_ctx, obj_message, obj_stream, PR_HTML, 2, oclient->pr_html);
876
mapi_object_release(&obj_stream);
911
919
if (retval != MAPI_E_SUCCESS) return retval;
913
921
/* Stream operations */
922
mapi_object_init(&obj_stream);
914
923
openchangeclient_stream(mem_ctx, obj_attach, obj_stream, PR_ATTACH_DATA_BIN, 2, oclient->attach[i].bin);
916
925
/* Save changes on attachment */
1119
1128
if (!oclient->update) {
1120
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS, (const void *)"IPM.Appointment");
1129
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS_UNICODE, (const void *)"IPM.Appointment");
1123
1132
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_FLAGS, (const void *)&flag);
1252
1261
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PidLidEmail1EmailAddress, (const void *)oclient->email);
1254
1263
if (!oclient->update) {
1255
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS, (const void *)"IPM.Contact");
1264
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS_UNICODE, (const void *)"IPM.Contact");
1257
1266
retval = SetProps(obj_message, 0, lpProps, cValues);
1258
1267
MAPIFreeBuffer(SPropTagArray);
1362
1371
if (!oclient->update) {
1363
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS, (const void *)"IPM.Task");
1372
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS_UNICODE, (const void *)"IPM.Task");
1364
1373
oclient->importance = (oclient->importance == -1) ? 1 : oclient->importance;
1365
1374
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_IMPORTANCE, (const void *)&oclient->importance);
1366
1375
oclient->taskstatus = (oclient->taskstatus == -1) ? 0 : oclient->taskstatus;
1452
1461
if (!oclient->update) {
1453
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS, (const void *)"IPM.StickyNote");
1462
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_CLASS_UNICODE, (const void *)"IPM.StickyNote");
1456
1465
lpProps = add_SPropValue(mem_ctx, lpProps, &cValues, PR_MESSAGE_FLAGS, (const void *)&value);
2179
2187
DEBUG(0, ("[+] New mail Received\n"));
2180
2188
newmail = (struct NewMailNotification *) NotificationData;
2181
2189
mapidump_newmail(newmail, "\t");
2182
retval = openchangeclient_findmail((mapi_object_t *)private_data, newmail->MID);
2190
openchangeclient_findmail((mapi_object_t *)private_data, newmail->MID);
2183
2191
mapi_errstr("openchangeclient_findmail", GetLastError());
2185
2193
case fnevObjectCreated:
2311
2319
uint32_t ulConnection;
2312
2320
uint16_t ulEventMask;
2321
uint32_t notification = 0;
2313
2322
struct mapi_session *session;
2315
2324
/* Register notification */
2316
2325
session = mapi_object_get_session(obj_store);
2317
retval = RegisterNotification(session, 0);
2326
retval = RegisterNotification(session);
2318
2327
if (retval != MAPI_E_SUCCESS) return false;
2320
2329
if (oclient->pf == true) {
2342
2351
if (retval != MAPI_E_SUCCESS) return false;
2344
2353
/* wait for notifications: infinite loop */
2345
retval = MonitorNotification(mapi_object_get_session(obj_store), (void *)obj_store, NULL);
2354
retval = RegisterAsyncNotification(mapi_object_get_session(obj_store), ¬ification);
2355
if( retval == MAPI_E_NOT_INITIALIZED ) {
2356
retval = MonitorNotification(mapi_object_get_session(obj_store), (void *)obj_store, NULL);
2346
2358
if (retval != MAPI_E_SUCCESS) return false;
2348
2360
retval = Unsubscribe(mapi_object_get_session(obj_store), ulConnection);
2450
2462
struct SPropTagArray *SPropTagArray;
2451
2463
struct SRowSet *SRowSet;
2452
enum MAPISTATUS retval;
2454
2465
uint32_t count;
2455
2466
uint8_t ulFlags;
2456
2467
uint32_t rowsFetched = 0;
2457
2468
uint32_t totalRecs = 0;
2459
retval = GetGALTableCount(session, &totalRecs);
2470
GetGALTableCount(session, &totalRecs);
2460
2471
printf("Total Number of entries in GAL: %d\n", totalRecs);
2462
2473
SPropTagArray = set_SPropTagArray(mem_ctx, 0xc,
2477
2488
ulFlags = TABLE_START;
2480
retval = GetGALTable(session, SPropTagArray, &SRowSet, count, ulFlags);
2491
GetGALTable(session, SPropTagArray, &SRowSet, count, ulFlags);
2481
2492
if ((!SRowSet) || (!(SRowSet->aRow))) {
2717
2728
/* Step 2. Dump properties */
2718
2729
message_name = (const char *) find_SPropValue_data(&aRow, PR_NORMALIZED_SUBJECT);
2719
publish_start = (const uint32_t *) find_SPropValue_data(&aRow, PR_FREEBUSY_START_RANGE);
2720
publish_end = (const uint32_t *) find_SPropValue_data(&aRow, PR_FREEBUSY_END_RANGE);
2721
busy_months = (const struct LongArray_r *) find_SPropValue_data(&aRow, PR_FREEBUSY_BUSY_MONTHS);
2722
busy_events = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_FREEBUSY_BUSY_EVENTS);
2723
tentative_months = (const struct LongArray_r *) find_SPropValue_data(&aRow, PR_FREEBUSY_TENTATIVE_MONTHS);
2724
tentative_events = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_FREEBUSY_TENTATIVE_EVENTS);
2725
oof_months = (const struct LongArray_r *) find_SPropValue_data(&aRow, PR_FREEBUSY_OOF_MONTHS);
2726
oof_events = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_FREEBUSY_OOF_EVENTS);
2730
publish_start = (const uint32_t *) find_SPropValue_data(&aRow, PR_FREEBUSY_PUBLISH_START);
2731
publish_end = (const uint32_t *) find_SPropValue_data(&aRow, PR_FREEBUSY_PUBLISH_END);
2732
busy_months = (const struct LongArray_r *) find_SPropValue_data(&aRow, PR_SCHDINFO_MONTHS_BUSY);
2733
busy_events = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_SCHDINFO_FREEBUSY_BUSY);
2734
tentative_months = (const struct LongArray_r *) find_SPropValue_data(&aRow, PR_SCHDINFO_MONTHS_TENTATIVE);
2735
tentative_events = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_SCHDINFO_FREEBUSY_TENTATIVE);
2736
oof_months = (const struct LongArray_r *) find_SPropValue_data(&aRow, PR_SCHDINFO_MONTHS_OOF);
2737
oof_events = (const struct BinaryArray_r *) find_SPropValue_data(&aRow, PR_SCHDINFO_FREEBUSY_OOF);
2728
2739
year = GetFreeBusyYear(publish_start);