Example #1
0
        List <FolderRec> IMailbox.EnumerateFolderHierarchy(EnumerateFolderHierarchyFlags flags, PropTag[] additionalPtagsToLoad)
        {
            MrsTracer.Provider.Function("StorageMailbox.EnumerateFolderHierarchy({0})", new object[]
            {
                flags
            });
            base.VerifyMailboxConnection(VerifyMailboxConnectionFlags.None);
            List <FolderRec> list = new List <FolderRec>(50);

            using (base.RHTracker.Start())
            {
                bool flag = flags.HasFlag(EnumerateFolderHierarchyFlags.WellKnownPublicFoldersOnly);
                NativeStorePropertyDefinition[] propertiesToLoad;
                if (additionalPtagsToLoad == null || additionalPtagsToLoad.Length == 0)
                {
                    propertiesToLoad = this.FolderPropertyDefinitionsToLoad;
                }
                else
                {
                    List <NativeStorePropertyDefinition> list2 = new List <NativeStorePropertyDefinition>();
                    list2.AddRange(this.ConvertPropTagsToDefinitions(additionalPtagsToLoad));
                    list2.AddRange(this.FolderPropertyDefinitionsToLoad);
                    propertiesToLoad = list2.ToArray();
                }
                if (!flag)
                {
                    this.LoadFolderHierarchy(this.GetFolderId(null), propertiesToLoad, list);
                }
                else
                {
                    PublicFolderSession publicFolderSession = this.GetPublicFolderSession();
                    list.Add(this.GetFolderRec(this.GetFolderId(null), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetIpmSubtreeFolderId(), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetNonIpmSubtreeFolderId(), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetEFormsRegistryFolderId(), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetAsyncDeleteStateFolderId(), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetDumpsterRootFolderId(), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetInternalSubmissionFolderId(), propertiesToLoad));
                    list.Add(this.GetFolderRec(publicFolderSession.GetTombstonesRootFolderId(), propertiesToLoad));
                }
            }
            MrsTracer.Provider.Debug("Loaded {0} folders", new object[]
            {
                list.Count
            });
            return(list);
        }
        private static PublicFolderMailboxMonitoringInfo LoadMailboxInfo <TValue>(PublicFolderSession session, string stateInfoConfigurationName, string logInfoConfigurationName) where TValue : PublicFolderMailboxMonitoringInfo, new()
        {
            TValue tvalue = Activator.CreateInstance <TValue>();

            using (Folder folder = Folder.Bind(session, session.GetTombstonesRootFolderId()))
            {
                using (UserConfiguration configuration = UserConfiguration.GetConfiguration(folder, new UserConfigurationName(stateInfoConfigurationName, ConfigurationNameKind.Name), UserConfigurationTypes.Dictionary))
                {
                    tvalue.LastAttemptedSyncTime               = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastAttemptedSyncTime") as ExDateTime?);
                    tvalue.LastFailedSyncTime                  = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastFailedSyncTime") as ExDateTime?);
                    tvalue.LastSuccessfulSyncTime              = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastSuccessfulSyncTime") as ExDateTime?);
                    tvalue.LastSyncFailure                     = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastSyncFailure") as string);
                    tvalue.NumberofAttemptsAfterLastSuccess    = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberofAttemptsAfterLastSuccess") as int?);
                    tvalue.FirstFailedSyncTimeAfterLastSuccess = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "FirstFailedSyncTimeAfterLastSuccess") as ExDateTime?);
                    PublicFolderMailboxSynchronizerInfo publicFolderMailboxSynchronizerInfo = tvalue as PublicFolderMailboxSynchronizerInfo;
                    if (publicFolderMailboxSynchronizerInfo != null)
                    {
                        publicFolderMailboxSynchronizerInfo.NumberOfBatchesExecuted   = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberOfBatchesExecuted") as int?);
                        publicFolderMailboxSynchronizerInfo.NumberOfFoldersToBeSynced = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberOfFoldersToBeSynced") as int?);
                        publicFolderMailboxSynchronizerInfo.NumberOfFoldersSynced     = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberOfFoldersSynced") as int?);
                        publicFolderMailboxSynchronizerInfo.BatchSize = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "BatchSize") as int?);
                    }
                }
                using (UserConfiguration configuration2 = UserConfiguration.GetConfiguration(folder, new UserConfigurationName(logInfoConfigurationName, ConfigurationNameKind.Name), UserConfigurationTypes.Stream))
                {
                    using (Stream stream = configuration2.GetStream())
                    {
                        using (GZipStream gzipStream = new GZipStream(stream, CompressionMode.Decompress, true))
                        {
                            using (MemoryStream memoryStream = new MemoryStream())
                            {
                                gzipStream.CopyTo(memoryStream);
                                tvalue.LastSyncCycleLog = Encoding.ASCII.GetString(memoryStream.ToArray());
                            }
                        }
                    }
                }
            }
            return(tvalue);
        }
Example #3
0
        // Token: 0x06000F1B RID: 3867 RVA: 0x0005A338 File Offset: 0x00058538
        public static bool IsSyncRequired(Guid mailboxGuid, OrganizationId organizationId, out bool isLongRunningOp, IXSOFactory xsoFactory, IPublicFolderMailboxLoggerBase logger)
        {
            isLongRunningOp = false;
            bool flag = true;

            using (PublicFolderSession publicFolderSession = PublicFolderSession.OpenAsAdmin(organizationId, null, mailboxGuid, null, CultureInfo.CurrentCulture, string.Format("{0};Action={1}", "Client=TBA", "PublicFolderSplitHelper"), null))
            {
                using (Folder folder = xsoFactory.BindToFolder(publicFolderSession, publicFolderSession.GetTombstonesRootFolderId()) as Folder)
                {
                    using (UserConfiguration configuration = UserConfiguration.GetConfiguration(folder, new UserConfigurationName("PublicFolderSyncInfo", ConfigurationNameKind.Name), UserConfigurationTypes.Dictionary))
                    {
                        IDictionary dictionary = configuration.GetDictionary();
                        int?        num        = dictionary.Contains("NumberOfFoldersToBeSynced") ? ((int?)dictionary["NumberOfFoldersToBeSynced"]) : null;
                        int?        num2       = dictionary.Contains("NumberOfFoldersSynced") ? ((int?)dictionary["NumberOfFoldersSynced"]) : null;
                        int?        num3       = (num == null) ? null : (num - (num2 ?? 0));
                        flag            = (num3 == null || num3 > 0);
                        isLongRunningOp = (flag && (num3 == null || num3 > PublicFolderSplitConfig.Instance.LongRunningSyncChangeCount));
                        logger.LogEvent(LogEventType.Statistics, string.Format("PublicFolderSplitHelper::IsSyncRequired - FTBS={0},FS={1},FTBSN={2}", num, num2, num3));
                    }
                }
            }
            return(flag);
        }
Example #4
0
 protected override void InternalProcessRecord()
 {
     TaskLogger.LogEnter();
     try
     {
         ADUser aduser = this.DataObject as ADUser;
         if (aduser == null || aduser.RecipientTypeDetails != RecipientTypeDetails.PublicFolderMailbox)
         {
             base.WriteError(new ObjectNotFoundException(Strings.PublicFolderMailboxNotFound), ExchangeErrorCategory.Client, aduser);
         }
         ExchangePrincipal exchangePrincipal = ExchangePrincipal.FromADUser(base.SessionSettings, aduser);
         string            serverFqdn        = exchangePrincipal.MailboxInfo.Location.ServerFqdn;
         if (this.InvokeSynchronizer)
         {
             TenantPublicFolderConfiguration value = TenantPublicFolderConfigurationCache.Instance.GetValue(aduser.OrganizationId);
             Organization orgContainer             = this.ConfigurationSession.GetOrgContainer();
             if (orgContainer.DefaultPublicFolderMailbox.HierarchyMailboxGuid != value.GetHierarchyMailboxInformation().HierarchyMailboxGuid || value.GetLocalMailboxRecipient(aduser.ExchangeGuid) == null)
             {
                 TenantPublicFolderConfigurationCache.Instance.RemoveValue(aduser.OrganizationId);
             }
             if (aduser.ExchangeGuid == value.GetHierarchyMailboxInformation().HierarchyMailboxGuid)
             {
                 base.WriteError(new TaskArgumentException(Strings.ErrorSecondaryMailboxIdRequired), ExchangeErrorCategory.Client, exchangePrincipal);
             }
             if (this.FullSync)
             {
                 using (PublicFolderSession publicFolderSession = PublicFolderSession.OpenAsAdmin(this.DataObject.OrganizationId, null, aduser.ExchangeGuid, null, CultureInfo.CurrentCulture, "Client=Management;Action=UpdatePublicFolderMailbox", null))
                 {
                     using (Folder folder = Folder.Bind(publicFolderSession, publicFolderSession.GetTombstonesRootFolderId()))
                     {
                         using (UserConfiguration configuration = UserConfiguration.GetConfiguration(folder, new UserConfigurationName("PublicFolderSyncInfo", ConfigurationNameKind.Name), UserConfigurationTypes.Dictionary))
                         {
                             IDictionary dictionary = configuration.GetDictionary();
                             dictionary["SyncState"] = null;
                             configuration.Save();
                         }
                     }
                 }
             }
             PublicFolderSyncJobState publicFolderSyncJobState = PublicFolderSyncJobRpc.StartSyncHierarchy(exchangePrincipal, this.ReconcileFolders);
             if (!this.SuppressStatus)
             {
                 base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageStartUpdatePublicFolderMailbox(this.Identity.ToString())));
                 int num = 0;
                 while (publicFolderSyncJobState.JobStatus != PublicFolderSyncJobState.Status.Completed && publicFolderSyncJobState.LastError == null && num++ < UpdatePublicFolderMailbox.timeToWaitInMilliseconds / UpdatePublicFolderMailbox.QueryIntervalInMilliseconds)
                 {
                     base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageUpdatePublicFolderMailboxUnderProgress(publicFolderSyncJobState.JobStatus.ToString())));
                     Thread.Sleep(UpdatePublicFolderMailbox.QueryIntervalInMilliseconds);
                     publicFolderSyncJobState = PublicFolderSyncJobRpc.QueryStatusSyncHierarchy(exchangePrincipal);
                 }
                 if (publicFolderSyncJobState.LastError != null)
                 {
                     base.WriteError(publicFolderSyncJobState.LastError, ExchangeErrorCategory.ServerOperation, publicFolderSyncJobState);
                 }
                 if (publicFolderSyncJobState.JobStatus == PublicFolderSyncJobState.Status.Completed)
                 {
                     base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageUpdatePublicFolderMailboxCompleted));
                 }
                 else
                 {
                     base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageSynchronizerRunningInBackground));
                 }
             }
         }
         else if (aduser.ExchangeGuid != Guid.Empty)
         {
             MailboxDatabase mailboxDatabase = base.GlobalConfigSession.Read <MailboxDatabase>(aduser.Database);
             if (mailboxDatabase == null)
             {
                 base.WriteError(new TaskArgumentException(Strings.ElcMdbNotFound(this.Identity.ToString())), ExchangeErrorCategory.Client, null);
             }
             this.EnsureMailboxExistsOnDatabase(aduser.ExchangeGuid);
             AssistantsRpcClient assistantsRpcClient = new AssistantsRpcClient(serverFqdn);
             try
             {
                 assistantsRpcClient.Start("PublicFolderAssistant", aduser.ExchangeGuid, mailboxDatabase.Guid);
             }
             catch (RpcException ex)
             {
                 base.WriteError(new TaskException(RpcUtility.MapRpcErrorCodeToMessage(ex.ErrorCode, serverFqdn)), ExchangeErrorCategory.Client, null);
             }
         }
     }
     finally
     {
         TaskLogger.LogExit();
     }
 }
Example #5
0
 private void ExecuteSyncStateOperation(Action <StoreSession, CoreFolder> operation)
 {
     using (base.RHTracker.Start())
     {
         if (base.IsPublicFolderMove || base.IsPublicFolderMailboxRestore)
         {
             PublicFolderSession publicFolderSession = this.GetPublicFolderSession();
             using (CoreFolder coreFolder = CoreFolder.Bind(publicFolderSession, publicFolderSession.GetTombstonesRootFolderId()))
             {
                 operation(publicFolderSession, coreFolder);
                 goto IL_A9;
             }
         }
         MailboxSession mailboxSession = null;
         bool           flag           = false;
         try
         {
             if (base.UseHomeMDB)
             {
                 mailboxSession = this.GetMailboxSession();
             }
             else
             {
                 mailboxSession = this.OpenSystemMailbox();
                 flag           = true;
             }
             using (CoreFolder coreFolder2 = CoreFolder.Create(mailboxSession, mailboxSession.GetDefaultFolderId(DefaultFolderType.Configuration), false, "MailboxReplicationService SyncStates", CreateMode.OpenIfExists))
             {
                 coreFolder2.Save(SaveMode.FailOnAnyConflict);
                 operation(mailboxSession, coreFolder2);
             }
         }
         finally
         {
             if (flag && mailboxSession != null)
             {
                 mailboxSession.Dispose();
             }
         }
         IL_A9 :;
     }
 }