예제 #1
0
        public static SyncCookie FromBytes(byte[] cookieData)
        {
            Exception  ex     = null;
            SyncCookie result = null;

            if (!SyncCookie.TryFromBytes(cookieData, out result, out ex))
            {
                throw ex;
            }
            return(result);
        }
예제 #2
0
 public static QueryFilter GetDeltaFilter(SyncCookie inputCookie)
 {
     if (inputCookie == null)
     {
         throw new ArgumentNullException("inputCookie");
     }
     return(new AndFilter(new QueryFilter[]
     {
         new ComparisonFilter(ComparisonOperator.GreaterThan, SyncMailboxSchema.UsnChanged, inputCookie.LowWatermark),
         new ComparisonFilter(ComparisonOperator.LessThanOrEqual, SyncMailboxSchema.UsnChanged, inputCookie.HighWatermark)
     }));
 }
예제 #3
0
        private static LocalizedString FormatCookieVerboseString(SyncCookie cookie)
        {
            if (cookie == null)
            {
                return(Strings.VerboseSyncTaskNullCookie);
            }
            string pageCookie = "<null>";

            if (cookie.PageCookie != null && cookie.PageCookie.Length > 0)
            {
                pageCookie = string.Format("{{{0}, ...}}", cookie.PageCookie[0]);
            }
            return(Strings.VerboseSyncTaskPopulateCookie(cookie.Version, cookie.DomainController, cookie.LowWatermarks.Count, cookie.LowWatermark, cookie.HighWatermarks.Count, cookie.HighWatermark, pageCookie));
        }
예제 #4
0
 public static bool TryFromBytes(byte[] cookieData, out SyncCookie cookie, out Exception ex)
 {
     ex     = null;
     cookie = null;
     if (cookieData == null)
     {
         ex = new ArgumentNullException("cookieData");
         return(false);
     }
     try
     {
         string   @string = Encoding.UTF8.GetString(cookieData);
         string[] array   = @string.Split(new string[]
         {
             SyncCookie.Delimiter
         }, StringSplitOptions.None);
         if (array.Length < 1)
         {
             ex = new InvalidCookieException();
             return(false);
         }
         int num = int.Parse(array[0]);
         if (num != 1 && num != 2 && num != 3)
         {
             ex = new CookieVersionUnsupportedException(num);
             return(false);
         }
         if (((num == 1 || num == 2) && array.Length != 5) || (num == 3 && array.Length != 6))
         {
             ex = new InvalidCookieException();
             return(false);
         }
         Guid         guid         = new Guid(array[1]);
         WatermarkMap watermarkMap = WatermarkMap.Empty;
         if (num == 1)
         {
             long value = long.Parse(array[2]);
             watermarkMap.Add(guid, value);
         }
         else
         {
             watermarkMap = WatermarkMap.Parse(array[2]);
         }
         WatermarkMap watermarkMap2 = WatermarkMap.Empty;
         if (num == 1)
         {
             long value2 = long.Parse(array[3]);
             watermarkMap2.Add(guid, value2);
         }
         else
         {
             watermarkMap2 = WatermarkMap.Parse(array[3]);
         }
         byte[] pageCookie = null;
         if (!string.IsNullOrEmpty(array[4]))
         {
             pageCookie = Convert.FromBase64String(array[4]);
         }
         byte[] pageCookie2 = null;
         if (num == 3 && !string.IsNullOrEmpty(array[5]))
         {
             pageCookie2 = Convert.FromBase64String(array[5]);
         }
         cookie = new SyncCookie(guid, watermarkMap, watermarkMap2, pageCookie, pageCookie2);
     }
     catch (DecoderFallbackException innerException)
     {
         ex = new InvalidCookieException(innerException);
         return(false);
     }
     catch (FormatException innerException2)
     {
         ex = new InvalidCookieException(innerException2);
         return(false);
     }
     catch (OverflowException innerException3)
     {
         ex = new InvalidCookieException(innerException3);
         return(false);
     }
     return(true);
 }
예제 #5
0
 public CookieObjectTriple(int currentPage, T dataObject, SyncCookie cookie)
 {
     this.CurrentPage = currentPage;
     this.DataObject  = dataObject;
     this.Cookie      = cookie;
 }
예제 #6
0
        public static bool HandleTaskWritePagedResult <T>(IEnumerable <T> dataObjects, IEnumerable <T> dataObjects2, SyncCookie inputCookie, ref SyncCookie outputCookie, SyncTaskHelper.ParameterlessMethod <bool> isStopping, SyncTaskHelper.OneParameterMethod <bool, IConfigurable> shouldSkipObject, SyncTaskHelper.VoidOneParameterMethod <IConfigurable> writeResult, int pages, Task.TaskVerboseLoggingDelegate writeVerbose, Task.TaskErrorLoggingDelegate writeError, out bool hasOutput) where T : IConfigurable, new()
        {
            TaskLogger.LogEnter(new object[]
            {
                dataObjects
            });
            int  num   = 1000;
            int  num2  = 0;
            bool flag  = true;
            bool flag2 = true;

            SyncTaskHelper.CookieObjectTriple <T> cookieObjectTriple = null;
            int num3 = 1;
            ADPagedReader <T> adpagedReader  = dataObjects as ADPagedReader <T>;
            ADPagedReader <T> adpagedReader2 = dataObjects2 as ADPagedReader <T>;

            byte[] pageCookie = null;
            byte[] array      = null;
            byte[] cookie     = adpagedReader.Cookie;
            byte[] cookie2    = adpagedReader2.Cookie;
            byte[] array2     = cookie2;
            hasOutput = false;
            for (;;)
            {
                using (IEnumerator <T> enumerator = flag ? dataObjects.GetEnumerator() : dataObjects2.GetEnumerator())
                {
                    bool flag3 = enumerator.MoveNext();
                    bool flag4 = !flag && ((cookieObjectTriple == null && num2 == 0) || (cookieObjectTriple != null && num2 == num - 1));
                    if ((adpagedReader.LastRetrievedCount == 0 && adpagedReader.Cookie != null && adpagedReader.Cookie.Length != 0) || (adpagedReader2.LastRetrievedCount == 0 && adpagedReader2.Cookie != null && adpagedReader2.Cookie.Length != 0))
                    {
                        return(false);
                    }
                    while (!isStopping() && flag3)
                    {
                        T t = enumerator.Current;
                        if (flag)
                        {
                            pageCookie = adpagedReader.Cookie;
                        }
                        else if (array != adpagedReader2.Cookie)
                        {
                            array2 = array;
                            array  = adpagedReader2.Cookie;
                        }
                        flag3 = enumerator.MoveNext();
                        if (!shouldSkipObject(t))
                        {
                            hasOutput = true;
                            if (cookieObjectTriple != null)
                            {
                                if (num2 == num - 1 || flag2)
                                {
                                    outputCookie = cookieObjectTriple.Cookie;
                                }
                                else
                                {
                                    outputCookie = null;
                                }
                                writeResult(cookieObjectTriple.DataObject);
                                flag2 = false;
                                if (num2 == num - 1)
                                {
                                    num2 = 0;
                                    num3++;
                                }
                                else
                                {
                                    num2++;
                                }
                                if (outputCookie != null)
                                {
                                    pages--;
                                    if (pages < 0)
                                    {
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                pageCookie = cookie;
                                array      = cookie2;
                                array2     = cookie2;
                            }
                            cookieObjectTriple = new SyncTaskHelper.CookieObjectTriple <T>(num3, t, new SyncCookie(inputCookie.DomainController, inputCookie.LowWatermarks, inputCookie.HighWatermarks, pageCookie, flag4 ? array : array2));
                        }
                    }
                    if (pages >= 0)
                    {
                        if (!flag && !flag3 && cookieObjectTriple != null && pages >= 0)
                        {
                            outputCookie = new SyncCookie(inputCookie.DomainController, inputCookie.HighWatermarks, WatermarkMap.Empty, null, null);
                            writeResult(cookieObjectTriple.DataObject);
                        }
                        else if (flag)
                        {
                            flag = false;
                            continue;
                        }
                    }
                }
                break;
            }
            TaskLogger.LogExit();
            return(true);
        }
예제 #7
0
        public static bool HandleTaskWritePagedResult <T>(IEnumerable <T> dataObjects, SyncCookie inputCookie, ref SyncCookie outputCookie, SyncTaskHelper.ParameterlessMethod <bool> isStopping, SyncTaskHelper.OneParameterMethod <bool, IConfigurable> shouldSkipObject, SyncTaskHelper.VoidOneParameterMethod <IConfigurable> writeResult, int pages, Task.TaskVerboseLoggingDelegate writeVerbose, Task.TaskErrorLoggingDelegate writeError, out bool hasOutput) where T : IConfigurable, new()
        {
            TaskLogger.LogEnter(new object[]
            {
                dataObjects
            });
            ADPagedReader <T> adpagedReader = dataObjects as ADPagedReader <T>;

            hasOutput = false;
            using (IEnumerator <T> enumerator = dataObjects.GetEnumerator())
            {
                bool flag = true;
                SyncTaskHelper.CookieObjectTriple <T> cookieObjectTriple = null;
                byte[] cookie = adpagedReader.Cookie;
                bool   flag2  = enumerator.MoveNext();
                if (adpagedReader.LastRetrievedCount == 0 && adpagedReader.Cookie != null && adpagedReader.Cookie.Length != 0)
                {
                    return(false);
                }
                while (!isStopping() && flag2)
                {
                    T      t             = enumerator.Current;
                    byte[] pageCookie    = adpagedReader.Cookie;
                    int    pagesReturned = adpagedReader.PagesReturned;
                    flag2 = enumerator.MoveNext();
                    if (!shouldSkipObject(t))
                    {
                        hasOutput = true;
                        if (cookieObjectTriple != null)
                        {
                            if (cookieObjectTriple.CurrentPage != pagesReturned || flag)
                            {
                                outputCookie = cookieObjectTriple.Cookie;
                            }
                            else
                            {
                                outputCookie = null;
                            }
                            writeResult(cookieObjectTriple.DataObject);
                            if (outputCookie != null)
                            {
                                pages--;
                                if (pages < 0)
                                {
                                    break;
                                }
                            }
                            flag = false;
                        }
                        else
                        {
                            pageCookie = cookie;
                        }
                        cookieObjectTriple = new SyncTaskHelper.CookieObjectTriple <T>(pagesReturned, t, new SyncCookie(inputCookie.DomainController, inputCookie.LowWatermarks, inputCookie.HighWatermarks, pageCookie));
                    }
                }
                if (!flag2 && cookieObjectTriple != null && pages >= 0)
                {
                    outputCookie = new SyncCookie(inputCookie.DomainController, inputCookie.HighWatermarks, WatermarkMap.Empty, null);
                    writeResult(cookieObjectTriple.DataObject);
                }
            }
            TaskLogger.LogExit();
            return(true);
        }
예제 #8
0
        public static bool HandleTaskWritePagedResult <T>(IEnumerable <T> dataObjects, SyncCookie inputCookie, ref SyncCookie outputCookie, SyncTaskHelper.ParameterlessMethod <bool> isStopping, SyncTaskHelper.OneParameterMethod <bool, IConfigurable> shouldSkipObject, SyncTaskHelper.VoidOneParameterMethod <IConfigurable> writeResult, int pages, Task.TaskVerboseLoggingDelegate writeVerbose, Task.TaskErrorLoggingDelegate writeError) where T : IConfigurable, new()
        {
            bool flag;

            return(SyncTaskHelper.HandleTaskWritePagedResult <T>(dataObjects, inputCookie, ref outputCookie, isStopping, shouldSkipObject, writeResult, pages, writeVerbose, writeError, out flag));
        }
예제 #9
0
        public static SyncCookie ResolveSyncCookie(byte[] cookieData, IDirectorySession session, Task.TaskVerboseLoggingDelegate writeVerbose, Task.TaskErrorLoggingDelegate writeError)
        {
            if (session == null)
            {
                throw new ArgumentNullException("session");
            }
            string text = SyncTaskHelper.GetCurrentServerFromSession(session);
            ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(text, true, ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 84, "ResolveSyncCookie", "f:\\15.00.1497\\sources\\dev\\Management\\src\\Management\\Common\\recipient\\SyncTaskHelper.cs");
            Guid guid = topologyConfigurationSession.GetInvocationIdByFqdn(text);

            writeVerbose(Strings.VerboseSyncTaskDomainControllerToUse(text, guid));
            if (cookieData == null)
            {
                writeVerbose(SyncTaskHelper.FormatCookieVerboseString(null));
                SyncCookie syncCookie = new SyncCookie(guid, WatermarkMap.Empty, SyncConfiguration.GetReplicationCursors(topologyConfigurationSession), null);
                writeVerbose(Strings.VerboseSyncTaskHighestCommittedUSN(text, syncCookie.HighWatermark));
                return(syncCookie);
            }
            SyncCookie syncCookie2 = null;
            Exception  exception   = null;

            if (!SyncCookie.TryFromBytes(cookieData, out syncCookie2, out exception))
            {
                writeError(exception, ErrorCategory.InvalidData, null);
            }
            writeVerbose(SyncTaskHelper.FormatCookieVerboseString(syncCookie2));
            if (syncCookie2.DomainController != guid)
            {
                writeVerbose(Strings.VerboseSyncTaskDomainControllerMismatch(syncCookie2.DomainController, guid));
                ADServer adserver = topologyConfigurationSession.FindDCByFqdn(text);
                if (syncCookie2.PageCookie != null)
                {
                    writeVerbose(Strings.VerboseSyncTaskCookieHasPageData(syncCookie2.DomainController, guid));
                    string text2 = SyncTaskHelper.FindAvailableServerByInvocationId(syncCookie2.DomainController, topologyConfigurationSession, adserver.Site);
                    if (text2 != null)
                    {
                        session.DomainController = text2;
                        writeVerbose(Strings.VerboseSyncTaskHighestCommittedUSN(text2, syncCookie2.HighWatermark));
                        return(syncCookie2);
                    }
                    writeError(new PageCookieInterruptedException(), ErrorCategory.InvalidData, null);
                }
                if (!syncCookie2.LowWatermarks.ContainsKey(guid))
                {
                    writeVerbose(Strings.VerboseSyncTaskCookieCurrentWatermarksMissingCurrentDC(syncCookie2.DomainController, guid));
                    string text3 = SyncTaskHelper.FindAvailableServerByInvocationId(syncCookie2.DomainController, topologyConfigurationSession, adserver.Site);
                    if (text3 != null)
                    {
                        session.DomainController = text3;
                        topologyConfigurationSession.DomainController = text3;
                        text = text3;
                        guid = syncCookie2.DomainController;
                    }
                    else
                    {
                        writeVerbose(Strings.VerboseSyncTaskCookieOriginatingDCNotAvailable(syncCookie2.DomainController));
                        Guid   guid2;
                        string text4 = SyncTaskHelper.FindAvailableServerFromWatermarks(syncCookie2.LowWatermarks, topologyConfigurationSession, adserver.Site, out guid2);
                        if (text4 != null)
                        {
                            session.DomainController = text4;
                            topologyConfigurationSession.DomainController = text4;
                            text = text4;
                            guid = guid2;
                        }
                        else
                        {
                            writeError(new CookieExpiredException(syncCookie2.DomainController, guid), ErrorCategory.InvalidData, null);
                        }
                    }
                }
            }
            WatermarkMap lowWatermarks  = SyncTaskHelper.FallbackWatermarks(syncCookie2.LowWatermarks, syncCookie2.DomainController, guid);
            WatermarkMap highWatermarks = SyncTaskHelper.FallbackWatermarks(syncCookie2.HighWatermarks, syncCookie2.DomainController, guid);

            if (syncCookie2.HighWatermark == 0L)
            {
                syncCookie2 = new SyncCookie(guid, lowWatermarks, SyncConfiguration.GetReplicationCursors(topologyConfigurationSession), null);
            }
            else
            {
                syncCookie2 = new SyncCookie(guid, lowWatermarks, highWatermarks, syncCookie2.PageCookie);
            }
            writeVerbose(Strings.VerboseSyncTaskHighestCommittedUSN(text, syncCookie2.HighWatermark));
            return(syncCookie2);
        }