Beispiel #1
0
        /// <summary>
        /// Loads exchange appointment from exchange, filtered by related <paramref name="activityMetadata"/> to
        /// activity unique identifier.
        /// </summary>
        /// <param name="activityMetadata">Activity instance synchronization metadata.</param>
        /// <returns>If appointment with activity id found, returns <see cref="Exchange.Appointment"/> instance.
        /// Otherwise returns null.</returns>
        private Exchange.Appointment GetAppointmentByLocalIdProperty(SysSyncMetaData activityMetadata)
        {
            var localId             = activityMetadata.LocalId;
            var filters             = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And);
            var customPropSetFilter = new Exchange.SearchFilter.IsEqualTo(ExchangeUtilityImpl.LocalIdProperty, localId.ToString());

            filters.Add(customPropSetFilter);
            foreach (var noteFolder in Folders)
            {
                Exchange.PropertySet idOnlyPropertySet = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly);
                var itemView = new Exchange.ItemView(1)
                {
                    PropertySet = idOnlyPropertySet
                };
                IEnumerable <Exchange.Item> itemCollection = GetCalendarItemsByFilter(noteFolder, filters, itemView);
                if (itemCollection == null)
                {
                    continue;
                }
                foreach (Exchange.Item item in itemCollection)
                {
                    Exchange.Appointment appointment = SafeBindItem <Exchange.Appointment>(Service, item.Id);
                    if (appointment != null)
                    {
                        return(appointment);
                    }
                }
            }
            return(null);
        }
Beispiel #2
0
        /// <summary>
        /// Gets filters for Exchange data query.
        /// </summary>
        /// <returns>Filter instance.</returns>
        private Exchange.SearchFilter.SearchFilterCollection GetItemsSearchFilters()
        {
            var itemsFilter = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And)
            {
                new Exchange.SearchFilter.IsEqualTo(Exchange.ItemSchema.ItemClass, ExchangeConsts.TaskItemClassName)
            };
            DateTime lastSyncDateUtc          = TimeZoneInfo.ConvertTimeToUtc(UserSettings.LastSyncDate, TimeZone);
            DateTime importActivitiesFromDate = UserSettings.ImportActivitiesFrom;

            if (UserSettings.ImportActivitiesFrom != DateTime.MinValue)
            {
                itemsFilter.Add(new Exchange.SearchFilter.IsGreaterThanOrEqualTo(
                                    Exchange.TaskSchema.LastModifiedTime, importActivitiesFromDate));
            }
            if (UserSettings.LastSyncDate != DateTime.MinValue)
            {
                var lastSyncDateUtcFilter = new Exchange.SearchFilter.IsGreaterThan(
                    Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime());
                var filterCollection       = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or);
                var customPropSetFilter    = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty);
                var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter);
                filterCollection.AddRange(new List <Exchange.SearchFilter> {
                    lastSyncDateUtcFilter,
                    notCustomPropSetFilter
                });
                itemsFilter.Add(filterCollection);
            }
            return(itemsFilter);
        }
Beispiel #3
0
        /// <summary>
        /// <see cref="ExchangeSyncProvider.FillItemsFilterCollection"/>
        /// </summary>
        protected override void FillItemsFilterCollection()
        {
            _itemsFilterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And);
            var draftFilter = new Exchange.SearchFilter.IsNotEqualTo(Exchange.ItemSchema.IsDraft, true);

            _itemsFilterCollection.Add(draftFilter);
            if (_userConnection.GetIsFeatureEnabled("SetEmailSynchronizedInExchange"))
            {
                var customPropSetFilter    = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty);
                var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter);
                _itemsFilterCollection.Add(notCustomPropSetFilter);
            }
            DateTime loadEmailsFromDate = LoadEmailsFromDate != DateTime.MinValue
                                ? LoadEmailsFromDate
                                : UserSettings.LastSyncDate;

            LogError($"LoadEmailsFromDate = '{LoadEmailsFromDate}', LastSyncDate = '{UserSettings.LastSyncDate}', result = '{loadEmailsFromDate}'");
            if (loadEmailsFromDate != DateTime.MinValue)
            {
                var localLastSyncDate = GetLastSyncDate(loadEmailsFromDate);
                var itemsFilter       = new Exchange.SearchFilter.IsGreaterThan(Exchange.ItemSchema.LastModifiedTime,
                                                                                localLastSyncDate);
                _itemsFilterCollection.Add(itemsFilter);
                LogError($"LoadEmailsFromDate filter adedd, filter date '{localLastSyncDate}'");
            }
        }
        /// <summary>
        /// For each specified sahred mailbox, if the user has access to the mailbox, 
        /// items matching the search term are sought-out. Each of the specified folders in the user's personal mailbox are also searched.
        /// </summary>
        /// <param name="credentials">The user credntials to impersonate in the mail system.</param>
        /// <param name="sharedMailBoxNames">The names of the shared mailboxes to search.</param>
        /// <param name="mailFolderNames">The names of the folders in the user's personal mail box to search.</param>
        /// <param name="searchTerm">The term that results must contain. This is case insensitive.</param>
        /// <returns>Mail items that match the search term or an empty result (i.e. never null).</returns>
        public IEnumerable<MailItem> FindItems(MailBoxCredentials credentials,
            MailSearchContainerNameList sharedMailBoxNames,
            MailSearchContainerNameList mailFolderNames,
            string searchTerm)
        {
            if (credentials == null
                || String.IsNullOrEmpty(credentials.UserName))
            {
                throw new UnauthorizedAccessException("No user to impersonate specified.");
            }

            var result = new List<MailItem>();
            if (String.IsNullOrEmpty(searchTerm)
                || ((sharedMailBoxNames == null
                     || sharedMailBoxNames.Count <= 0)
                    && (mailFolderNames == null
                     || mailFolderNames.Count <= 0)))
            {
                return result;
            }

            var ewsURL = configuration.EWSURL;
            var networkDomain = configuration.EWSNetworkDomain;
            var networkUserName = configuration.EWSNetworkUserName;
            var networkPassword = configuration.EWSNetworkPassword;
            var mailDomain = configuration.MailDomain;
            var searchFilters = new Microsoft.Exchange.WebServices.Data.SearchFilter.SearchFilterCollection (LogicalOperator.Or,
                    new SearchFilter[5]{new SearchFilter.ContainsSubstring(EmailMessageSchema.Body, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.Subject, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.Sender, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.ToRecipients, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.Attachments, searchTerm)
                                        });
            var service = ConfigureMSExchangeService(networkUserName,
                                                     networkPassword,
                                                     networkDomain,
                                                     ewsURL,
                                                     credentials);
            var iv = new ItemView(VIEW_SIZE);
            iv.PropertySet = new PropertySet(BasePropertySet.IdOnly,
                                            ItemSchema.Subject,
                                            ItemSchema.DateTimeReceived);

            var shareMailBoxMatches = SearchSharedMailBoxes(service,
                                                            iv,
                                                            searchFilters,
                                                            sharedMailBoxNames,
                                                            configuration.MailDomain,
                                                            searchTerm);
            if (sharedMailBoxNames != null) result.AddRange(shareMailBoxMatches);
            var mailFolderMatches = SearchMailFolders(service,
                                                     iv,
                                                     searchFilters,
                                                     mailFolderNames,
                                                     searchTerm);
            if (mailFolderMatches != null) result.AddRange(mailFolderMatches);

            return result;
        }
Beispiel #5
0
        public List <ExchangeMailFolder> GetMailboxFolders(string mailServerId, string mailboxName,
                                                           string mailboxPassword, string senderEmailAddress, string folderClassName)
        {
            if (string.IsNullOrEmpty(mailboxPassword))
            {
                mailboxPassword = GetExistingMailboxPassword(senderEmailAddress, UserConnection);
            }
            var credentials = new Mail.Credentials {
                UserName     = mailboxName,
                UserPassword = mailboxPassword,
                ServerId     = Guid.Parse(mailServerId),
                UseOAuth     = GetSettingsHasOauth(senderEmailAddress, UserConnection)
            };

            SetServerCertificateValidation();
            var exchangeUtility = new ExchangeUtilityImpl();

            Exchange.ExchangeService service = exchangeUtility.CreateExchangeService(UserConnection, credentials,
                                                                                     senderEmailAddress, true);
            var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or);
            var filter           = new Exchange.SearchFilter.IsEqualTo(Exchange.FolderSchema.FolderClass, folderClassName);
            var nullfilter       = new Exchange.SearchFilter.Exists(Exchange.FolderSchema.FolderClass);

            filterCollection.Add(filter);
            filterCollection.Add(new Exchange.SearchFilter.Not(nullfilter));
            string[] selectedFolders = null;
            var      idPropertySet   = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly);

            Exchange.Folder draftFolder = null;
            if (folderClassName == ExchangeConsts.NoteFolderClassName)
            {
                Exchange.Folder inboxFolder = Exchange.Folder.Bind(service, Exchange.WellKnownFolderName.Inbox,
                                                                   idPropertySet);
                if (inboxFolder != null)
                {
                    selectedFolders = new[] { inboxFolder.Id.UniqueId };
                }
                draftFolder = Exchange.Folder.Bind(service, Exchange.WellKnownFolderName.Drafts, idPropertySet);
            }
            List <ExchangeMailFolder> folders = exchangeUtility.GetHierarhicalFolderList(service,
                                                                                         Exchange.WellKnownFolderName.MsgFolderRoot, filterCollection, selectedFolders);

            if (folders != null && folders.Any())
            {
                folders[0] = new ExchangeMailFolder {
                    Id       = folders[0].Id,
                    Name     = mailboxName,
                    ParentId = string.Empty,
                    Path     = string.Empty,
                    Selected = false
                };
                if (draftFolder != null)
                {
                    folders.Remove(folders.FirstOrDefault(e => e.Path == draftFolder.Id.UniqueId));
                }
            }
            return(folders);
        }
        /// <summary>
        /// Get folder filters.
        /// </summary>
        /// <returns>Folder filters.</returns>
        private Exchange.SearchFilter getFolderFilters()
        {
            var filterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or);
            var filter           = new Exchange.SearchFilter.IsEqualTo(Exchange.FolderSchema.FolderClass, ExchangeConsts.NoteFolderClassName);
            var nullfilter       = new Exchange.SearchFilter.Exists(Exchange.FolderSchema.FolderClass);

            filterCollection.Add(filter);
            filterCollection.Add(new Exchange.SearchFilter.Not(nullfilter));
            return(filterCollection);
        }
Beispiel #7
0
        /// <summary>
        /// Gets filters for Exchange data query.
        /// </summary>
        /// <returns>Filter instance.</returns>
        private Exchange.SearchFilter GetItemsSearchFilters(SyncContext context = null)
        {
            Exchange.SearchFilter filter      = null;
            DateTime lastSyncDateUtc          = TimeZoneInfo.ConvertTimeToUtc(UserSettings.LastSyncDate, TimeZone);
            DateTime importActivitiesFromDate = UserSettings.ImportActivitiesFrom;

            context?.LogInfo(SyncAction.None, SyncDirection.Download, "lastSyncDateUtc = {0}, importActivitiesFromDate = {1}",
                             lastSyncDateUtc, importActivitiesFromDate);
            if (lastSyncDateUtc != DateTime.MinValue && UserSettings.ImportActivitiesFrom != DateTime.MinValue)
            {
                var lastSyncDateUtcFilter = new Exchange.SearchFilter.IsGreaterThan(
                    Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime());
                var filterCollection       = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or);
                var customPropSetFilter    = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty);
                var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter);
                filterCollection.AddRange(new List <Exchange.SearchFilter> {
                    lastSyncDateUtcFilter,
                    notCustomPropSetFilter
                });
                if (context != null && GetExchangeRecurringAppointmentsSupported(context.UserConnection))
                {
                    return(filterCollection);
                }
                var allFilterCollection            = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And);
                var importActivitiesFromDateFilter = new Exchange.SearchFilter.IsGreaterThanOrEqualTo(
                    Exchange.AppointmentSchema.Start, importActivitiesFromDate);
                allFilterCollection.AddRange(new List <Exchange.SearchFilter> {
                    importActivitiesFromDateFilter,
                    filterCollection
                });
                filter = allFilterCollection;
            }
            else if (lastSyncDateUtc != DateTime.MinValue && UserSettings.ImportActivitiesFrom == DateTime.MinValue)
            {
                filter = new Exchange.SearchFilter.IsGreaterThan(
                    Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime());
            }
            else if (lastSyncDateUtc == DateTime.MinValue && UserSettings.ImportActivitiesFrom != DateTime.MinValue)
            {
                filter = new Exchange.SearchFilter.IsGreaterThanOrEqualTo(
                    Exchange.AppointmentSchema.Start, importActivitiesFromDate);
            }
            return(filter);
        }
Beispiel #8
0
 public Exchange.SearchFilter GetContactsFilters()
 {
     if (UserSettings.LastSyncDate != DateTime.MinValue)
     {
         DateTime lastSyncDateUtc =
             TimeZoneInfo.ConvertTimeToUtc(UserSettings.LastSyncDate, TimeZone);
         var lastSyncDateUtcFilter = new Exchange.SearchFilter.IsGreaterThan(
             Exchange.ItemSchema.LastModifiedTime, lastSyncDateUtc.ToLocalTime());
         var filterCollection       = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.Or);
         var customPropSetFilter    = new Exchange.SearchFilter.Exists(ExchangeUtilityImpl.LocalIdProperty);
         var notCustomPropSetFilter = new Exchange.SearchFilter.Not(customPropSetFilter);
         filterCollection.AddRange(new List <Exchange.SearchFilter> {
             lastSyncDateUtcFilter,
             notCustomPropSetFilter
         });
         return(filterCollection);
     }
     return(null);
 }
Beispiel #9
0
 /// <summary>
 /// Gets Items from <see cref="folder"/> by <see cref="filterCollection"/>
 /// </summary>
 /// <param name="folder">Exchange folder.</param>
 /// <param name="filterCollection">Filter collection.</param>
 /// <param name="itemView">Represents the view settings in a folder search operation.</param>
 /// <returns>Search result collection.</returns>
 public virtual IEnumerable <Exchange.Item> GetCalendarItemsByFilter(Exchange.Folder folder,
                                                                     Exchange.SearchFilter.SearchFilterCollection filterCollection, Exchange.ItemView itemView)
 {
     return(GetFolderItemsByFilter(folder, filterCollection, itemView));
 }
        private static webServiceData.Appointment searchAppointmentByFilter(SchedulingInfo schedulingInfo, webServiceData.ExchangeService service, string appointmentID)
        {
            RvLogger.DebugWrite("enter searchAppointmentByFilter==============");
            List<webServiceData.SearchFilter> searchORFilterCollection = new List<webServiceData.SearchFilter>();
            if (null != appointmentID)
                searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.Id, new webServiceData.ItemId(appointmentID)));
            else {
                searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.Subject, schedulingInfo.subject));
                searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.From, schedulingInfo.delegatorEmailAddr));
                searchORFilterCollection.Add(new webServiceData.SearchFilter.IsGreaterThan(webServiceData.EmailMessageSchema.LastModifiedTime, DateTime.UtcNow.AddHours(-25)));
                if (!string.IsNullOrEmpty(schedulingInfo.storeEntryId))
                    searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.StoreEntryId, schedulingInfo.storeEntryId));
                if (!string.IsNullOrEmpty(schedulingInfo.conversationKey))
                    searchORFilterCollection.Add(new webServiceData.SearchFilter.IsEqualTo(webServiceData.EmailMessageSchema.ConversationId, schedulingInfo.conversationKey));
            }
            RvLogger.DebugWrite("enter searchAppointmentByFilter==============1");
            webServiceData.SearchFilter searchFilter = new webServiceData.SearchFilter.SearchFilterCollection(webServiceData.LogicalOperator.And, searchORFilterCollection.ToArray());
            RvLogger.DebugWrite("enter searchAppointmentByFilter==============2 " + schedulingInfo.delegatorEmailAddr);
            webServiceData.Mailbox mailBox = new webServiceData.Mailbox(schedulingInfo.delegatorEmailAddr);
            RvLogger.DebugWrite("enter searchAppointmentByFilter==============3");
            webServiceData.FolderId folderID = new webServiceData.FolderId(webServiceData.WellKnownFolderName.Calendar, mailBox); //No need to set mail since the service already know it.
            //webServiceData.FolderId folderID = new webServiceData.FolderId(webServiceData.WellKnownFolderName.Calendar);
            RvLogger.DebugWrite("enter searchAppointmentByFilter==============4");
            webServiceData.FindItemsResults<webServiceData.Item> results = service.FindItems(
                                    folderID,
                                    searchFilter,
                                    new webServiceData.ItemView(100));
            RvLogger.DebugWrite("enter searchAppointmentByFilter==============5");
            RvLogger.DebugWrite("results searchAppointmentByFilter==============" + (null == results.Items ? "0" : "" + results.Items.Count));

            foreach (webServiceData.Item item in results) {
                try {
                    webServiceData.Appointment appointment = (webServiceData.Appointment)item;
                    if (string.IsNullOrEmpty(schedulingInfo.location)) schedulingInfo.location = "";
                    if (string.IsNullOrEmpty(appointment.Location)) appointment.Location = "";
                    if (schedulingInfo.location == appointment.Location
                        && schedulingInfo.startDate.ToUniversalTime().Equals(appointment.Start.ToUniversalTime())
                        && schedulingInfo.endDate.ToUniversalTime().Equals(appointment.End.ToUniversalTime()))
                    {
                        RvLogger.DebugWrite("lastModifiedTime1===================" + appointment.LastModifiedTime);
                        return appointment;
                    }
                }
                catch (ScopiaMeetingAddInException ex) {
                    throw ex;
                }
            }

            return null;
        }
Beispiel #11
0
        public IEnumerable <IRemoteItem> EnumerateChangesOld(SyncContext context)
        {
            base.EnumerateChanges(context);
            var result  = new List <IRemoteItem>();
            var folders = new List <Exchange.Folder>();

            if (UserSettings.LoadAll)
            {
                Exchange.Folder rootFolder = Exchange.Folder.Bind(Service, Exchange.WellKnownFolderName.MsgFolderRoot);
                var             filter     = new Exchange.SearchFilter.IsEqualTo(
                    Exchange.FolderSchema.FolderClass, ExchangeConsts.NoteFolderClassName);
                folders.GetAllFoldersByFilter(rootFolder, filter);
            }
            else
            {
                folders = SafeBindFolders(Service, UserSettings.RemoteFolderUIds.Keys, context);
            }
            var itemsFilterCollection = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And);
            var draftFilter           = new Exchange.SearchFilter.IsNotEqualTo(Exchange.ItemSchema.IsDraft, true);

            itemsFilterCollection.Add(draftFilter);
            DateTime loadEmailsFromDate = LoadEmailsFromDate != DateTime.MinValue
                                ? LoadEmailsFromDate
                                : UserSettings.LastSyncDate;

            if (loadEmailsFromDate != DateTime.MinValue)
            {
                var localLastSyncDate = GetLastSyncDate(loadEmailsFromDate);
                var itemsFilter       = new Exchange.SearchFilter.IsGreaterThan(Exchange.ItemSchema.LastModifiedTime,
                                                                                localLastSyncDate);
                _itemsFilterCollection.Add(itemsFilter);
            }
            FilterDeprecatedFolders(ref folders);
            foreach (var noteFolder in folders)
            {
                var activityFolderIds = new List <Guid>();
                if (UserSettings.RootFolderId != Guid.Empty)
                {
                    activityFolderIds.Add(UserSettings.RootFolderId);
                }
                var folderId = GetFolderId(noteFolder);
                if (UserSettings.RemoteFolderUIds.ContainsKey(folderId))
                {
                    activityFolderIds.Add(UserSettings.RemoteFolderUIds[folderId]);
                }
                Exchange.PropertySet idOnlyPropertySet = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly);
                var itemView = new Exchange.ItemView(PageItemCount)
                {
                    PropertySet = idOnlyPropertySet
                };
                Exchange.FindItemsResults <Exchange.Item> itemCollection;
                do
                {
                    itemCollection = GetFolderItemsByFilter(noteFolder, itemsFilterCollection, itemView);
                    if (itemCollection == null)
                    {
                        break;
                    }
                    result.AddRange(GetEmailsFromCollection(itemCollection, activityFolderIds));
                } while (itemCollection.MoreAvailable);
            }
            return(result);
        }
 /// <summary>
 /// Gets Items from <see cref="folder"/> by <see cref="filterCollection"/>
 /// </summary>
 /// <param name="folder">Exchange folder.</param>
 /// <param name="filterCollection">Filter collection.</param>
 /// <param name="itemView">Represents the view settings in a folder search operation.</param>
 /// <returns></returns>
 public virtual Exchange.FindItemsResults <Exchange.Item> GetFolderItemsByFilter(Exchange.Folder folder,
                                                                                 Exchange.SearchFilter.SearchFilterCollection filterCollection, Exchange.ItemView itemView)
 {
     return(folder.ReadItems(filterCollection, itemView));
 }