private bool MatchesFilter(RequestIndexEntryQueryFilter requestIndexEntryQueryFilter)
        {
            if (requestIndexEntryQueryFilter == null)
            {
                return(true);
            }
            if (requestIndexEntryQueryFilter.RequestType != base.Type)
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.RequestGuid != Guid.Empty && requestIndexEntryQueryFilter.RequestGuid != base.RequestGuid)
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.SourceMailbox != null && requestIndexEntryQueryFilter.SourceMailbox.ObjectGuid != ((base.SourceUserId == null) ? Guid.Empty : base.SourceUserId.ObjectGuid))
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.TargetMailbox != null && requestIndexEntryQueryFilter.TargetMailbox.ObjectGuid != ((base.TargetUserId == null) ? Guid.Empty : base.TargetUserId.ObjectGuid))
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.SourceDatabase != null && requestIndexEntryQueryFilter.SourceDatabase.ObjectGuid != ((base.SourceMDB == null) ? Guid.Empty : base.SourceMDB.ObjectGuid))
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.TargetDatabase != null && requestIndexEntryQueryFilter.TargetDatabase.ObjectGuid != ((base.TargetMDB == null) ? Guid.Empty : base.TargetMDB.ObjectGuid))
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.Status != RequestStatus.None && requestIndexEntryQueryFilter.Status != base.Status)
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.Flags != RequestFlags.None && (requestIndexEntryQueryFilter.Flags & base.Flags) != requestIndexEntryQueryFilter.Flags)
            {
                return(false);
            }
            if (requestIndexEntryQueryFilter.NotFlags != RequestFlags.None && (~requestIndexEntryQueryFilter.NotFlags & base.Flags) != base.Flags)
            {
                return(false);
            }
            if (!string.IsNullOrEmpty(requestIndexEntryQueryFilter.BatchName) && requestIndexEntryQueryFilter.BatchName.Equals(base.BatchName, StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }
            string text = requestIndexEntryQueryFilter.WildcardedNameSearch ? Wildcard.ConvertToRegexPattern(requestIndexEntryQueryFilter.RequestName) : requestIndexEntryQueryFilter.RequestName;

            return(string.IsNullOrEmpty(text) || !(requestIndexEntryQueryFilter.WildcardedNameSearch ? (!Regex.IsMatch(base.Name, text, RegexOptions.IgnoreCase)) : (!base.Name.Equals(text, StringComparison.OrdinalIgnoreCase))));
        }
        private static Type ValidateQueryFilter <T>(QueryFilter filter) where T : IConfigurable
        {
            RequestIndexEntryQueryFilter requestIndexEntryQueryFilter = filter as RequestIndexEntryQueryFilter;

            if (filter != null && requestIndexEntryQueryFilter == null)
            {
                throw new ArgumentException("This provider only supports RequestIndexEntryQueryFilters", "filter");
            }
            Type result = typeof(T);

            if (requestIndexEntryQueryFilter != null)
            {
                result = requestIndexEntryQueryFilter.IndexId.RequestIndexEntryType;
            }
            return(result);
        }
Пример #3
0
        public override IEnumerable <MRSRequestMailboxEntry> FindPaged(RequestIndexEntryProvider requestIndexEntryProvider, QueryFilter filter, ObjectId rootId, bool deepSearch, SortBy sortBy, int pageSize)
        {
            RequestIndexEntryQueryFilter requestIndexEntryQueryFilter = filter as RequestIndexEntryQueryFilter;
            ADUser aduser = requestIndexEntryProvider.ReadADUser(requestIndexEntryQueryFilter.MailboxId, Guid.Empty);

            if (aduser == null)
            {
                return(null);
            }
            List <MRSRequestMailboxEntry> list = new List <MRSRequestMailboxEntry>(MailboxRequestIndexEntryHandler.GetRequestIndexEntries(aduser, requestIndexEntryQueryFilter));

            foreach (MRSRequestMailboxEntry mrsrequestMailboxEntry in list)
            {
                mrsrequestMailboxEntry.RequestIndexId = new RequestIndexId(requestIndexEntryQueryFilter.MailboxId);
                mrsrequestMailboxEntry.OrganizationId = aduser.OrganizationId;
            }
            return(list);
        }
Пример #4
0
        internal IEnumerable <T> InternalGetObjects <T>(ObjectId rootId, IConfigDataProvider session, OptionalIdentityData optionalData, out LocalizedString?notFoundReason) where T : IConfigurable, new()
        {
            if (session == null)
            {
                throw new ArgumentNullException("session");
            }
            RequestIndexEntryProvider requestIndexEntryProvider = session as RequestIndexEntryProvider;

            if (requestIndexEntryProvider == null)
            {
                throw new ArgumentException(MrsStrings.MustProvideValidSessionForFindingRequests);
            }
            if (this.requestGuid != Guid.Empty && this.indexToUse != null)
            {
                List <T> list = new List <T>(1);
                RequestIndexEntryObjectId identity = new RequestIndexEntryObjectId(this.requestGuid, this.RequestType, this.OrganizationId, this.indexToUse, null);
                T t = (T)((object)requestIndexEntryProvider.Read <T>(identity));
                if (t != null)
                {
                    list.Add(t);
                    notFoundReason = null;
                }
                else
                {
                    notFoundReason = new LocalizedString?(MrsStrings.NoSuchRequestInSpecifiedIndex);
                }
                return(list);
            }
            if (string.IsNullOrEmpty(this.requestName) || this.indexToUse == null)
            {
                notFoundReason = new LocalizedString?(MrsStrings.NotEnoughInformationSupplied);
                return(new List <T>(0));
            }
            if (this.mailboxId != null)
            {
                QueryFilter filter = new RequestIndexEntryQueryFilter(this.requestName, this.mailboxId, this.RequestType, this.indexToUse, true);
                notFoundReason = new LocalizedString?(MrsStrings.NoSuchRequestInSpecifiedIndex);
                return(requestIndexEntryProvider.FindPaged <T>(filter, rootId, true, null, 2));
            }
            QueryFilter filter2 = new RequestIndexEntryQueryFilter(this.requestName, null, this.RequestType, this.indexToUse, false);

            notFoundReason = new LocalizedString?(MrsStrings.NoSuchRequestInSpecifiedIndex);
            return(requestIndexEntryProvider.FindPaged <T>(filter2, rootId, true, null, 2));
        }
Пример #5
0
        private static QueryFilter ConvertFilter(QueryFilter filter)
        {
            QueryFilter result = null;

            if (filter != null)
            {
                List <QueryFilter> list = new List <QueryFilter>();
                if (!(filter is RequestIndexEntryQueryFilter))
                {
                    throw new ArgumentException("This provider only supports RequestIndexEntryQueryFilters", "filter");
                }
                RequestIndexEntryQueryFilter requestIndexEntryQueryFilter = (RequestIndexEntryQueryFilter)filter;
                if (requestIndexEntryQueryFilter.IndexId.Location != RequestIndexLocation.AD)
                {
                    throw new ArgumentException("ADHandler only supports objects in the location \"AD\".");
                }
                if (requestIndexEntryQueryFilter.RequestGuid != Guid.Empty)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveRequestGuid, requestIndexEntryQueryFilter.RequestGuid));
                }
                if (requestIndexEntryQueryFilter.RequestQueueId != null)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveStorageMDB, requestIndexEntryQueryFilter.RequestQueueId));
                }
                if (requestIndexEntryQueryFilter.RequestType != MRSRequestType.Move)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MRSRequestType, requestIndexEntryQueryFilter.RequestType));
                }
                if (requestIndexEntryQueryFilter.RequestName != null)
                {
                    if (requestIndexEntryQueryFilter.RequestName.Equals(string.Empty))
                    {
                        list.Add(new NotFilter(new ExistsFilter(MRSRequestSchema.DisplayName)));
                    }
                    else if (requestIndexEntryQueryFilter.WildcardedNameSearch)
                    {
                        list.Add(new TextFilter(MRSRequestSchema.DisplayName, requestIndexEntryQueryFilter.RequestName, MatchOptions.WildcardString, MatchFlags.IgnoreCase));
                    }
                    else
                    {
                        list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.DisplayName, requestIndexEntryQueryFilter.RequestName));
                    }
                }
                if (requestIndexEntryQueryFilter.MailboxId != null)
                {
                    if (requestIndexEntryQueryFilter.LooseMailboxSearch)
                    {
                        list.Add(QueryFilter.OrTogether(new QueryFilter[]
                        {
                            new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveSourceUser, requestIndexEntryQueryFilter.MailboxId),
                            new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveTargetUser, requestIndexEntryQueryFilter.MailboxId)
                        }));
                    }
                    else
                    {
                        list.Add(QueryFilter.OrTogether(new QueryFilter[]
                        {
                            QueryFilter.AndTogether(new QueryFilter[]
                            {
                                new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveSourceUser, requestIndexEntryQueryFilter.MailboxId),
                                new BitMaskAndFilter(MRSRequestSchema.MailboxMoveFlags, 4UL)
                            }),
                            QueryFilter.AndTogether(new QueryFilter[]
                            {
                                new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveTargetUser, requestIndexEntryQueryFilter.MailboxId),
                                new BitMaskAndFilter(MRSRequestSchema.MailboxMoveFlags, 8UL)
                            })
                        }));
                    }
                }
                if (requestIndexEntryQueryFilter.DBId != null)
                {
                    if (requestIndexEntryQueryFilter.LooseMailboxSearch)
                    {
                        list.Add(QueryFilter.OrTogether(new QueryFilter[]
                        {
                            new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveSourceMDB, requestIndexEntryQueryFilter.DBId),
                            new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveTargetMDB, requestIndexEntryQueryFilter.DBId)
                        }));
                    }
                    else
                    {
                        list.Add(QueryFilter.OrTogether(new QueryFilter[]
                        {
                            QueryFilter.AndTogether(new QueryFilter[]
                            {
                                new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveSourceMDB, requestIndexEntryQueryFilter.DBId),
                                new BitMaskAndFilter(MRSRequestSchema.MailboxMoveFlags, 4UL)
                            }),
                            QueryFilter.AndTogether(new QueryFilter[]
                            {
                                new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveTargetMDB, requestIndexEntryQueryFilter.DBId),
                                new BitMaskAndFilter(MRSRequestSchema.MailboxMoveFlags, 8UL)
                            })
                        }));
                    }
                }
                if (requestIndexEntryQueryFilter.BatchName != null)
                {
                    if (requestIndexEntryQueryFilter.BatchName.Equals(string.Empty))
                    {
                        list.Add(new NotFilter(new ExistsFilter(MRSRequestSchema.MailboxMoveBatchName)));
                    }
                    else
                    {
                        list.Add(new TextFilter(MRSRequestSchema.MailboxMoveBatchName, requestIndexEntryQueryFilter.BatchName, MatchOptions.WildcardString, MatchFlags.IgnoreCase));
                    }
                }
                if (requestIndexEntryQueryFilter.SourceMailbox != null)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveSourceUser, requestIndexEntryQueryFilter.SourceMailbox));
                }
                if (requestIndexEntryQueryFilter.TargetMailbox != null)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveTargetUser, requestIndexEntryQueryFilter.TargetMailbox));
                }
                if (requestIndexEntryQueryFilter.SourceDatabase != null)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveSourceMDB, requestIndexEntryQueryFilter.SourceDatabase));
                }
                if (requestIndexEntryQueryFilter.TargetDatabase != null)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveTargetMDB, requestIndexEntryQueryFilter.TargetDatabase));
                }
                if (requestIndexEntryQueryFilter.Status != RequestStatus.None)
                {
                    list.Add(new ComparisonFilter(ComparisonOperator.Equal, MRSRequestSchema.MailboxMoveStatus, requestIndexEntryQueryFilter.Status));
                }
                if (requestIndexEntryQueryFilter.Flags != RequestFlags.None)
                {
                    list.Add(new BitMaskAndFilter(MRSRequestSchema.MailboxMoveFlags, (ulong)((long)requestIndexEntryQueryFilter.Flags)));
                }
                if (requestIndexEntryQueryFilter.NotFlags != RequestFlags.None)
                {
                    list.Add(new NotFilter(new BitMaskAndFilter(MRSRequestSchema.MailboxMoveFlags, (ulong)((long)requestIndexEntryQueryFilter.NotFlags))));
                }
                if (list.Count > 1)
                {
                    result = QueryFilter.AndTogether(list.ToArray());
                }
                else if (list.Count == 1)
                {
                    result = list[0];
                }
            }
            return(result);
        }
        public static ICollection <MRSRequestMailboxEntry> Read(MailboxSession mailboxSession, RequestIndexEntryQueryFilter requestIndexEntryQueryFilter = null)
        {
            List <MRSRequestMailboxEntry>   list       = new List <MRSRequestMailboxEntry>();
            ICollection <UserConfiguration> collection = mailboxSession.UserConfigurationManager.FindMailboxConfigurations("MRSRequest", UserConfigurationSearchFlags.Prefix);

            try
            {
                foreach (UserConfiguration userConfiguration in collection)
                {
                    MRSRequestMailboxEntry mrsrequestMailboxEntry = new MRSRequestMailboxEntry(userConfiguration);
                    if (mrsrequestMailboxEntry.MatchesFilter(requestIndexEntryQueryFilter))
                    {
                        list.Add(mrsrequestMailboxEntry);
                    }
                }
            }
            finally
            {
                foreach (UserConfiguration userConfiguration2 in collection)
                {
                    userConfiguration2.Dispose();
                }
            }
            return(list);
        }
Пример #7
0
        private static IEnumerable <MRSRequestMailboxEntry> GetRequestIndexEntries(ADUser user, RequestIndexEntryQueryFilter requestIndexEntryQueryFilter)
        {
            ExchangePrincipal mailboxOwner = ExchangePrincipal.FromADUser(user, RemotingOptions.AllowCrossSite);
            IEnumerable <MRSRequestMailboxEntry> result;

            using (MailboxSession mailboxSession = MailboxSession.OpenAsAdmin(mailboxOwner, CultureInfo.InvariantCulture, "Client=MSExchangeMigration"))
            {
                result = MRSRequestMailboxEntry.Read(mailboxSession, requestIndexEntryQueryFilter);
            }
            return(result);
        }
        private static void CleanADOrphanAndInconsistencyForNonMoves(IConfigurationSession configSession, MRSRequestType requestType, RequestJobProvider rjProvider, Guid dbGuid)
        {
            ADObjectId requestQueueId = new ADObjectId(dbGuid);
            RequestIndexEntryQueryFilter requestIndexEntryQueryFilter = new RequestIndexEntryQueryFilter();

            requestIndexEntryQueryFilter.IndexId        = new RequestIndexId(RequestIndexLocation.AD);
            requestIndexEntryQueryFilter.RequestType    = requestType;
            requestIndexEntryQueryFilter.RequestQueueId = requestQueueId;
            MRSRequestWrapper[] array = ADHandler.Find(configSession, requestIndexEntryQueryFilter, null, true, null);
            if (array != null && array.Length > 0)
            {
                bool needUpdateAD          = false;
                MRSRequestWrapper[] array2 = array;
                for (int i = 0; i < array2.Length; i++)
                {
                    MRSRequestWrapper request = array2[i];
                    CommonUtils.CatchKnownExceptions(delegate
                    {
                        needUpdateAD = false;
                        if (request.Status != RequestStatus.None)
                        {
                            RequestStatisticsBase requestStatisticsBase = (RequestStatisticsBase)rjProvider.Read <RequestStatisticsBase>(new RequestJobObjectId(request.RequestGuid, dbGuid, null));
                            if (requestStatisticsBase == null || (!requestStatisticsBase.IsFake && requestStatisticsBase.Status == RequestStatus.None))
                            {
                                MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests():AD orphan {0} found for DB {1}", new object[]
                                {
                                    request.RequestGuid,
                                    dbGuid
                                });
                                ADHandler.Delete(configSession, request);
                                return;
                            }
                            if (requestStatisticsBase.IsFake)
                            {
                                MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests():request {0} is uplevel/Fake, ignoring it", new object[]
                                {
                                    request.RequestGuid
                                });
                                return;
                            }
                            if (requestStatisticsBase.IndexEntries == null || requestStatisticsBase.IndexEntries.Count == 0)
                            {
                                MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests():request {0} has been removed from AD, ignoring it", new object[]
                                {
                                    request.RequestGuid
                                });
                                return;
                            }
                            if (requestStatisticsBase.TimeTracker.GetCurrentDurationChunk() > ADInconsistencyCheck.updateLatencyThreshhold)
                            {
                                if (requestStatisticsBase.Status != requestStatisticsBase.IndexEntries[0].Status)
                                {
                                    MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests():AD inconsistency {0} found for DB {1}, AD status is {2} but store status is {3}", new object[]
                                    {
                                        request.RequestGuid,
                                        dbGuid,
                                        request.Status,
                                        requestStatisticsBase.Status
                                    });
                                    request.Status = requestStatisticsBase.Status;
                                    needUpdateAD   = true;
                                }
                                if (requestStatisticsBase.Flags != requestStatisticsBase.IndexEntries[0].Flags)
                                {
                                    MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests():AD inconsistency {0} found for DB {1}, AD flags is {2} but store flags is {3}", new object[]
                                    {
                                        request.RequestGuid,
                                        dbGuid,
                                        request.Flags,
                                        requestStatisticsBase.Flags
                                    });
                                    request.Flags = requestStatisticsBase.Flags;
                                    needUpdateAD  = true;
                                }
                                if (needUpdateAD)
                                {
                                    ADHandler.Save(configSession, request);
                                    return;
                                }
                            }
                        }
                        else
                        {
                            MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests():request {0} for {1} has been removed from AD, store orphan will be handled by MRS pick up job logic", new object[]
                            {
                                request.RequestGuid,
                                dbGuid
                            });
                        }
                    }, delegate(Exception f)
                    {
                        MrsTracer.Service.Error("CleanADOrphanAndInconsistencyForRequests() failed for DB {0}. Request type {1} Request guid {2} Error: {3}", new object[]
                        {
                            dbGuid,
                            requestType.ToString(),
                            request.RequestGuid,
                            CommonUtils.FullExceptionMessage(f, true)
                        });
                        MRSService.LogEvent(MRSEventLogConstants.Tuple_ScanADInconsistencyRequestFailEvent, new object[]
                        {
                            dbGuid,
                            requestType.ToString(),
                            request.RequestGuid,
                            CommonUtils.FullExceptionMessage(f, true)
                        });
                    });
                }
                return;
            }
            MrsTracer.Service.Debug("CleanADOrphanAndInconsistencyForRequests(): No {0} requests found for DB {1}", new object[]
            {
                requestType,
                dbGuid
            });
        }