// Token: 0x0600167D RID: 5757 RVA: 0x0007F5C0 File Offset: 0x0007D7C0
        private DistributionGroupExpansionError ExpandGroupMemberRecipients(MessageItem messageItem, List <ADRecipient> groupRecipients, RecipientItemType recipientType, GroupExpansionRecipients groupExpansionRecipients)
        {
            DistributionGroupExpansionError result = DistributionGroupExpansionError.NoError;

            if (groupRecipients.Count > 0)
            {
                List <RecipientToIndex> collection = this.ExpandGroupMemberRecipients(messageItem, groupRecipients, recipientType, out result);
                groupExpansionRecipients.Recipients.AddRange(collection);
            }
            return(result);
        }
 // Token: 0x06001682 RID: 5762 RVA: 0x0007FFE2 File Offset: 0x0007E1E2
 private bool IsDLExpansionLimitError(DistributionGroupExpansionError expansionError)
 {
     return((expansionError & DistributionGroupExpansionError.ToGroupExpansionHitDepthsLimit) == DistributionGroupExpansionError.ToGroupExpansionHitDepthsLimit || (expansionError & DistributionGroupExpansionError.ToGroupExpansionHitRecipientsLimit) == DistributionGroupExpansionError.ToGroupExpansionHitRecipientsLimit || (expansionError & DistributionGroupExpansionError.CcGroupExpansionHitDepthsLimit) == DistributionGroupExpansionError.CcGroupExpansionHitDepthsLimit || (expansionError & DistributionGroupExpansionError.CcGroupExpansionHitRecipientsLimit) == DistributionGroupExpansionError.CcGroupExpansionHitRecipientsLimit || (expansionError & DistributionGroupExpansionError.BccGroupExpansionHitDepthsLimit) == DistributionGroupExpansionError.BccGroupExpansionHitDepthsLimit || (expansionError & DistributionGroupExpansionError.BccGroupExpansionHitRecipientsLimit) == DistributionGroupExpansionError.BccGroupExpansionHitRecipientsLimit);
 }
 // Token: 0x06001680 RID: 5760 RVA: 0x0007FDF8 File Offset: 0x0007DFF8
 private bool AddPerRecipientListToFinalExpansionList(MessageItem messageItem, List <RecipientToIndex> perRecipientExpansionList, List <RecipientToIndex> finalExpansionList, RecipientItemType recipientType, out DistributionGroupExpansionError errorCode)
 {
     errorCode = DistributionGroupExpansionError.NoError;
     foreach (RecipientToIndex recipientToIndex in perRecipientExpansionList)
     {
         if (!finalExpansionList.Contains(recipientToIndex))
         {
             if ((long)finalExpansionList.Count >= (long)((ulong)this.maxDGExpansionRecipients))
             {
                 if (recipientType == RecipientItemType.Cc)
                 {
                     errorCode = DistributionGroupExpansionError.CcGroupExpansionHitRecipientsLimit;
                 }
                 else if (recipientType == RecipientItemType.Bcc)
                 {
                     errorCode = DistributionGroupExpansionError.BccGroupExpansionHitRecipientsLimit;
                 }
                 else
                 {
                     errorCode = DistributionGroupExpansionError.ToGroupExpansionHitRecipientsLimit;
                 }
                 RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "DL expansion on message with id: {0}, mailbox guid: {1}, tenant: {2}, is terminated because number of total member recipients ({3}) is greater than the limit ({4})", new object[]
                 {
                     messageItem.StoreObjectId,
                     messageItem.Session.MailboxGuid,
                     messageItem.Session.MailboxOwner.MailboxInfo.OrganizationId,
                     finalExpansionList.Count,
                     this.maxDGExpansionRecipients
                 });
                 StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMaxRecipientsLimit, null, new object[]
                 {
                     this.maxDGExpansionRecipients,
                     messageItem.StoreObjectId,
                     messageItem.Session.MailboxGuid,
                     messageItem.Session.MailboxOwner.MailboxInfo.OrganizationId
                 });
                 return(false);
             }
             if (recipientToIndex.RecipientType != recipientType)
             {
                 finalExpansionList.Add(new RecipientToIndex(recipientType, recipientToIndex.DisplayName, recipientToIndex.EmailAddress));
             }
             else
             {
                 finalExpansionList.Add(recipientToIndex);
             }
         }
     }
     return(true);
 }
        // Token: 0x0600167F RID: 5759 RVA: 0x0007FC88 File Offset: 0x0007DE88
        private bool AddRecipientToExpansionList(MessageItem messageItem, ADRawEntry recipient, List <RecipientToIndex> perRecipientExpansionList, List <RecipientToIndex> finalExpansionList, RecipientItemType recipientType, out DistributionGroupExpansionError errorCode)
        {
            errorCode = DistributionGroupExpansionError.NoError;
            SmtpAddress      smtpAddress = (SmtpAddress)recipient[ADRecipientSchema.PrimarySmtpAddress];
            string           displayName = recipient[ADRecipientSchema.DisplayName] as string;
            RecipientToIndex item        = new RecipientToIndex(recipientType, displayName, smtpAddress.ToString());

            if (!perRecipientExpansionList.Contains(item))
            {
                perRecipientExpansionList.Add(item);
            }
            if (finalExpansionList.Contains(item))
            {
                return(true);
            }
            if ((long)finalExpansionList.Count < (long)((ulong)this.maxDGExpansionRecipients))
            {
                finalExpansionList.Add(item);
                return(true);
            }
            if (recipientType == RecipientItemType.Cc)
            {
                errorCode = DistributionGroupExpansionError.CcGroupExpansionHitRecipientsLimit;
            }
            else if (recipientType == RecipientItemType.Bcc)
            {
                errorCode = DistributionGroupExpansionError.BccGroupExpansionHitRecipientsLimit;
            }
            else
            {
                errorCode = DistributionGroupExpansionError.ToGroupExpansionHitRecipientsLimit;
            }
            RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "DL expansion on message with id: {0}, mailbox guid: {1}, tenant: {2} is terminated because number of total member recipients ({3}) is greater than the limit ({4})", new object[]
            {
                messageItem.StoreObjectId,
                messageItem.Session.MailboxGuid,
                messageItem.Session.MailboxOwner.MailboxInfo.OrganizationId,
                finalExpansionList.Count,
                this.maxDGExpansionRecipients
            });
            StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMaxRecipientsLimit, null, new object[]
            {
                this.maxDGExpansionRecipients,
                messageItem.StoreObjectId,
                messageItem.Session.MailboxGuid,
                messageItem.Session.MailboxOwner.MailboxInfo.OrganizationId
            });
            return(false);
        }
        // Token: 0x0600167E RID: 5758 RVA: 0x0007F8A0 File Offset: 0x0007DAA0
        private List <RecipientToIndex> ExpandGroupMemberRecipients(MessageItem messageItem, List <ADRecipient> groupRecipients, RecipientItemType recipientType, out DistributionGroupExpansionError errorCode)
        {
            errorCode = DistributionGroupExpansionError.NoError;
            DistributionGroupExpansionError tempErrorCode      = errorCode;
            List <RecipientToIndex>         finalExpansionList = new List <RecipientToIndex>();
            List <ADRecipient> list = new List <ADRecipient>(groupRecipients.Count);

            foreach (ADRecipient adrecipient in groupRecipients)
            {
                OrganizationId organizationId  = messageItem.Session.MailboxOwner.MailboxInfo.OrganizationId;
                string         uniqueLookupKey = RecipientDLExpansionCache.GetUniqueLookupKey(organizationId, adrecipient);
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <string>((long)this.GetHashCode(), "Get recipients list from the cache for lookup key: {0}", uniqueLookupKey);
                List <RecipientToIndex> perRecipientExpansionList = RecipientDLExpansionCache.Instance.Get(uniqueLookupKey);
                if (perRecipientExpansionList != null)
                {
                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <string>((long)this.GetHashCode(), "The recipients list exists in the cache for lookup key: {0}", uniqueLookupKey);
                    if (!this.AddPerRecipientListToFinalExpansionList(messageItem, perRecipientExpansionList, finalExpansionList, recipientType, out tempErrorCode))
                    {
                        break;
                    }
                    list.Add(adrecipient);
                }
                else
                {
                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug((long)this.GetHashCode(), "Message with id: {0} and subject: '{1}' has recipient '{2}' which is not in the cache (with lookup key: {3}), hence need to make AD call.", new object[]
                    {
                        messageItem.StoreObjectId,
                        messageItem.Subject,
                        adrecipient.DisplayName,
                        uniqueLookupKey
                    });
                    perRecipientExpansionList = new List <RecipientToIndex>();
                    int numOfGroups = 0;
                    ADRecipientExpansion adrecipientExpansion = new ADRecipientExpansion(RecipientDLExpansionEventBasedAssistant.RecipientProperties, organizationId);
                    adrecipientExpansion.Expand(adrecipient, delegate(ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentType)
                    {
                        if (recipientExpansionType == ExpansionType.GroupMembership)
                        {
                            if ((long)numOfGroups++ >= (long)((ulong)this.maxExpansionNestedDGs))
                            {
                                if (recipientType == RecipientItemType.Cc)
                                {
                                    tempErrorCode = DistributionGroupExpansionError.CcGroupExpansionHitDepthsLimit;
                                }
                                else if (recipientType == RecipientItemType.Bcc)
                                {
                                    tempErrorCode = DistributionGroupExpansionError.BccGroupExpansionHitDepthsLimit;
                                }
                                else
                                {
                                    tempErrorCode = DistributionGroupExpansionError.ToGroupExpansionHitDepthsLimit;
                                }
                                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "DL expansion on message with id: {0}, mailbox guid: {1}, tenant: {2} is terminated because number of nested DLs ({3}) is greater than the limit ({4})", new object[]
                                {
                                    messageItem.StoreObjectId,
                                    messageItem.Session.MailboxGuid,
                                    organizationId,
                                    numOfGroups,
                                    this.maxExpansionNestedDGs
                                });
                                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMaxNestedDLsLimit, null, new object[]
                                {
                                    this.maxExpansionNestedDGs,
                                    messageItem.StoreObjectId,
                                    messageItem.Session.MailboxGuid,
                                    organizationId
                                });
                                DistributionGroupExpansionError distributionGroupExpansionError = DistributionGroupExpansionError.NoError;
                                this.AddRecipientToExpansionList(messageItem, recipient, perRecipientExpansionList, finalExpansionList, recipientType, out distributionGroupExpansionError);
                                if (distributionGroupExpansionError != DistributionGroupExpansionError.NoError)
                                {
                                    tempErrorCode |= distributionGroupExpansionError;
                                }
                                return(ExpansionControl.Terminate);
                            }
                            RecipientDLExpansionPerfmon.TotalExpandedNestedDLs.Increment();
                            if (this.AddRecipientToExpansionList(messageItem, recipient, perRecipientExpansionList, finalExpansionList, recipientType, out tempErrorCode))
                            {
                                return(ExpansionControl.Continue);
                            }
                            return(ExpansionControl.Terminate);
                        }
                        else
                        {
                            if (!this.AddRecipientToExpansionList(messageItem, recipient, perRecipientExpansionList, finalExpansionList, recipientType, out tempErrorCode))
                            {
                                return(ExpansionControl.Terminate);
                            }
                            return(ExpansionControl.Skip);
                        }
                    }, delegate(ExpansionFailure expansionFailure, ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
                    {
                        if (recipientType == RecipientItemType.Cc)
                        {
                            tempErrorCode = DistributionGroupExpansionError.CcGroupExpansionFailed;
                        }
                        else if (recipientType == RecipientItemType.Bcc)
                        {
                            tempErrorCode = DistributionGroupExpansionError.BccGroupExpansionFailed;
                        }
                        else
                        {
                            tempErrorCode = DistributionGroupExpansionError.ToGroupExpansionFailed;
                        }
                        return(ExpansionControl.Skip);
                    });
                    errorCode = tempErrorCode;
                    if (tempErrorCode != DistributionGroupExpansionError.NoError)
                    {
                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <string>((long)this.GetHashCode(), "Failed or partially success when performing the DG expansion: {0}", tempErrorCode.ToString());
                        break;
                    }
                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <string>((long)this.GetHashCode(), "Add the recipients list to the cache for key: {0}", uniqueLookupKey);
                    RecipientDLExpansionCache.Instance.Add(uniqueLookupKey, perRecipientExpansionList);
                    list.Add(adrecipient);
                }
            }
            if (list.Count != groupRecipients.Count)
            {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.AppendFormat("There are total of {0} group recipients, which only {1} of them successfully expanded.\r\n", groupRecipients.Count, list.Count);
                StringBuilder stringBuilder2 = new StringBuilder();
                stringBuilder.AppendLine("List of successful expanded group recipients:");
                foreach (ADRecipient adrecipient2 in groupRecipients)
                {
                    if (list.Contains(adrecipient2))
                    {
                        stringBuilder.AppendLine(adrecipient2.DisplayName);
                    }
                    else
                    {
                        stringBuilder2.AppendLine(adrecipient2.DisplayName);
                    }
                }
                stringBuilder.AppendLine("List of not successful expanded group recipients:");
                stringBuilder.AppendLine(stringBuilder2.ToString());
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), stringBuilder.ToString());
                if (!this.IsDLExpansionLimitError(errorCode))
                {
                    StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMismatchResults, null, new object[]
                    {
                        messageItem.StoreObjectId,
                        messageItem.Session.MailboxGuid,
                        messageItem.Session.MailboxOwner.MailboxInfo.OrganizationId,
                        stringBuilder.ToString()
                    });
                }
            }
            return(finalExpansionList);
        }
        // Token: 0x0600167A RID: 5754 RVA: 0x0007EF34 File Offset: 0x0007D134
        private void PerformDLExpansionOnItemRecipients(MailboxSession itemStore, MessageItem messageItem, ref bool isExpectedException)
        {
            Exception ex = null;

            try
            {
                GroupExpansionRecipients groupExpansionRecipients = null;
                if (this.MessageAlreadyHasRecipientsExpanded(messageItem, MessageItemSchema.GroupExpansionRecipients, out groupExpansionRecipients))
                {
                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <StoreObjectId, string>((long)this.GetHashCode(), "Message with id: {0} and subject: '{1}' already have group recipients expanded.", messageItem.StoreObjectId, messageItem.Subject);
                    StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMessageAlreadyProcessed, null, new object[]
                    {
                        messageItem.StoreObjectId,
                        groupExpansionRecipients
                    });
                    return;
                }
                IRecipientSession  tenantOrRootOrgRecipientSession = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(true, ConsistencyMode.IgnoreInvalid, itemStore.GetADSessionSettings(), 314, "PerformDLExpansionOnItemRecipients", "f:\\15.00.1497\\sources\\dev\\MailboxAssistants\\src\\assistants\\Compliance\\RecipientDLExpansionEventBasedAssistant.cs");
                List <ADRecipient> list  = new List <ADRecipient>();
                List <ADRecipient> list2 = new List <ADRecipient>();
                List <ADRecipient> list3 = new List <ADRecipient>();
                foreach (Recipient recipient in messageItem.Recipients)
                {
                    bool?flag = recipient.IsDistributionList();
                    if (flag != null && flag.Value)
                    {
                        if (recipient.RecipientItemType == RecipientItemType.To)
                        {
                            ADRecipient adrecipient = null;
                            if (recipient.Participant.TryGetADRecipient(tenantOrRootOrgRecipientSession, out adrecipient) && adrecipient != null && !list.Contains(adrecipient))
                            {
                                list.Add(adrecipient);
                            }
                        }
                        else if (recipient.RecipientItemType == RecipientItemType.Cc)
                        {
                            ADRecipient adrecipient2 = null;
                            if (recipient.Participant.TryGetADRecipient(tenantOrRootOrgRecipientSession, out adrecipient2) && adrecipient2 != null && !list2.Contains(adrecipient2))
                            {
                                list2.Add(adrecipient2);
                            }
                        }
                        else if (recipient.RecipientItemType == RecipientItemType.Bcc)
                        {
                            ADRecipient adrecipient3 = null;
                            if (recipient.Participant.TryGetADRecipient(tenantOrRootOrgRecipientSession, out adrecipient3) && adrecipient3 != null && !list3.Contains(adrecipient3))
                            {
                                list3.Add(adrecipient3);
                            }
                        }
                    }
                }
                if (list.Count > 0 || list2.Count > 0 || list3.Count > 0)
                {
                    RecipientDLExpansionPerfmon.TotalDLExpansionMessages.Increment();
                    RecipientDLExpansionPerfmon.TotalRecipientDLsInMessage.IncrementBy((long)(list.Count + list2.Count + list3.Count));
                    using (AverageTimeCounter averageTimeCounter = new AverageTimeCounter(RecipientDLExpansionPerfmon.AverageMessageDLExpansionProcessing, RecipientDLExpansionPerfmon.AverageMessageDLExpansionProcessingBase, true))
                    {
                        try
                        {
                            GroupExpansionRecipients        groupExpansionRecipients2       = new GroupExpansionRecipients();
                            DistributionGroupExpansionError distributionGroupExpansionError = DistributionGroupExpansionError.NoError;
                            distributionGroupExpansionError |= this.ExpandGroupMemberRecipients(messageItem, list, RecipientItemType.To, groupExpansionRecipients2);
                            distributionGroupExpansionError |= this.ExpandGroupMemberRecipients(messageItem, list2, RecipientItemType.Cc, groupExpansionRecipients2);
                            distributionGroupExpansionError |= this.ExpandGroupMemberRecipients(messageItem, list3, RecipientItemType.Bcc, groupExpansionRecipients2);
                            int num = 0;
                            while (num++ <= 1)
                            {
                                try
                                {
                                    groupExpansionRecipients2.SaveToStore(messageItem, MessageItemSchema.GroupExpansionRecipients);
                                    if (distributionGroupExpansionError != DistributionGroupExpansionError.NoError)
                                    {
                                        messageItem[MessageItemSchema.GroupExpansionError] = distributionGroupExpansionError;
                                    }
                                    SaveMode saveMode = SaveMode.NoConflictResolution;
                                    messageItem.Save(saveMode);
                                    break;
                                }
                                catch (TransientException ex2)
                                {
                                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceError <TransientException>((long)this.GetHashCode(), "Got transient exception when trying to update the message: \r\n{0}", ex2);
                                    if (num > 1)
                                    {
                                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <int>((long)this.GetHashCode(), "It still failed after retry for {0} times, so give up.", 1);
                                        throw;
                                    }
                                    if (ex2 is SaveConflictException)
                                    {
                                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug((long)this.GetHashCode(), "Got SaveConflictException, will reload the item and retry immediately.");
                                        StoreId     id           = messageItem.Id;
                                        MessageItem messageItem2 = Item.BindAsMessage(itemStore, id, RecipientDLExpansionEventBasedAssistant.ItemProperties);
                                        messageItem.Dispose();
                                        messageItem = messageItem2;
                                    }
                                    else
                                    {
                                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <int>((long)this.GetHashCode(), "Wait for {0} milliseconds before retry again.", 30000);
                                        Thread.Sleep(30000);
                                    }
                                }
                            }
                        }
                        finally
                        {
                            averageTimeCounter.Stop();
                        }
                        goto IL_382;
                    }
                }
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning <StoreObjectId, string>((long)this.GetHashCode(), "Message with id: {0} and subject: '{1}' does not have any DG recipients.", messageItem.StoreObjectId, messageItem.Subject);
                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMessageNoDLRecipients, null, new object[]
                {
                    messageItem.StoreObjectId
                });
                IL_382 :;
            }
            catch (AccessDeniedException ex3)
            {
                ex = ex3;
                isExpectedException = true;
            }
            catch (ObjectNotFoundException ex4)
            {
                ex = ex4;
                isExpectedException = true;
            }
            catch (RecoverableItemsAccessDeniedException ex5)
            {
                isExpectedException = true;
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "Can't save DL expansion list to message with id: {0} and subject: '{1}' in mailbox: {2}, tenant: {3} because update item in Dumpster is not allowed. Exception: \r\n{4}", new object[]
                {
                    messageItem.StoreObjectId,
                    messageItem.Subject,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex5
                });
                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionUpdateItemInDumpster, null, new object[]
                {
                    messageItem.StoreObjectId,
                    messageItem.Subject,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex5
                });
            }
            if (ex != null)
            {
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "Can't process message with id: {0} and subject: '{1}' in mailbox: {2}, tenant: {3} because it may no longer exist. Exception: \r\n{4}", new object[]
                {
                    messageItem.StoreObjectId,
                    messageItem.Subject,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex
                });
                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMessageNoLongerExist, null, new object[]
                {
                    messageItem.StoreObjectId,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex
                });
            }
        }