// Token: 0x06001BF9 RID: 7161 RVA: 0x0006D354 File Offset: 0x0006B554
        private static void AddDLMembersToResults(List <string> results, ADRecipientExpansion expansion, string dlSmtpAddress)
        {
            ADRawEntry adrawEntryFromSmtpAddress = UpdateAttachmentPermissions.GetADRawEntryFromSmtpAddress(dlSmtpAddress);

            if (adrawEntryFromSmtpAddress != null)
            {
                new List <ADRawEntry>();
                ADRecipientExpansion.HandleRecipientDelegate handleRecipient = delegate(ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
                {
                    if (recipientExpansionType == ExpansionType.GroupMembership)
                    {
                        return(ExpansionControl.Continue);
                    }
                    string item = recipient[ADRecipientSchema.PrimarySmtpAddress].ToString();
                    if (!results.Contains(item))
                    {
                        results.Add(item);
                    }
                    return(ExpansionControl.Skip);
                };
                expansion.Expand(adrawEntryFromSmtpAddress, handleRecipient, null);
                return;
            }
            ExTraceGlobals.AttachmentHandlingTracer.TraceError(0L, "[UpdateAttachmentPermissions : AddDLMembersToResults] Unable to get RawADEntry from SmtpAddress.");
        }
Exemple #2
0
        private IEnumerable <ADObjectId> ExpandGroupMembers(IEnumerable <string> sourceLegacyDNs, OrganizationId organizationId, IList <string> notFoundMailboxes)
        {
            ADRecipientExpansion adrecipientExpansion = new ADRecipientExpansion(organizationId);
            HashSet <ADObjectId> expandedMemberIds    = new HashSet <ADObjectId>();

            foreach (string text in sourceLegacyDNs)
            {
                this.CheckRecipientSessionIsNotNull();
                ADRecipient adrecipient = this.recipientSession.FindByLegacyExchangeDN(text);
                if (adrecipient == null)
                {
                    notFoundMailboxes.Add(text);
                }
                else
                {
                    adrecipientExpansion.Expand(adrecipient, delegate(ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentType)
                    {
                        if (recipientExpansionType == ExpansionType.GroupMembership)
                        {
                            return(ExpansionControl.Continue);
                        }
                        if (((RecipientType)recipient[ADRecipientSchema.RecipientType] == RecipientType.UserMailbox || (RecipientTypeDetails)recipient[ADRecipientSchema.RecipientTypeDetails] == (RecipientTypeDetails)((ulong)-2147483648) || (RecipientTypeDetails)recipient[ADRecipientSchema.RecipientTypeDetails] == RecipientTypeDetails.RemoteRoomMailbox || (RecipientTypeDetails)recipient[ADRecipientSchema.RecipientTypeDetails] == RecipientTypeDetails.RemoteEquipmentMailbox || (RecipientTypeDetails)recipient[ADRecipientSchema.RecipientTypeDetails] == RecipientTypeDetails.RemoteTeamMailbox || (RecipientTypeDetails)recipient[ADRecipientSchema.RecipientTypeDetails] == RecipientTypeDetails.RemoteSharedMailbox) && !expandedMemberIds.Contains(recipient.Id))
                        {
                            expandedMemberIds.Add(recipient.Id);
                        }
                        return(ExpansionControl.Skip);
                    }, delegate(ExpansionFailure expansionFailure, ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
                    {
                        Util.Tracer.TraceDebug <ADObjectId, ExpansionType>((long)this.GetHashCode(), "Expand group member failed for {0}, reason {1}", recipient.Id, recipientExpansionType);
                        return(ExpansionControl.Skip);
                    });
                }
            }
            return(expandedMemberIds);
        }
 public DLExpansionHandler(Participant organizerParticipant, Dictionary <ADObjectId, UserObject> individualAttendees, HashSet <ADObjectId> allVisitedAttendees, int expandedDLCount, Attendee attendee, ADRawEntry attendeeRawEntry, IRecipientSession session, ADRecipientExpansion expansionManager)
 {
     this.OrganizerParticipant = organizerParticipant;
     this.IndividualAttendees  = individualAttendees;
     this.AllVisitedAttendees  = allVisitedAttendees;
     this.ExpandedDLCount      = expandedDLCount;
     this.Attendee             = attendee;
     this.AttendeeRawEntry     = attendeeRawEntry;
     this.Session          = session;
     this.ExpansionManager = expansionManager;
 }
        // Token: 0x06001BF8 RID: 7160 RVA: 0x0006D088 File Offset: 0x0006B288
        private static string[] ExpandDLsAndGetAllUsers(UserContext userContext, string[] userIds, out List <string> largeDLsList, CallContext callContext)
        {
            List <string> list = new List <string>(userIds);

            largeDLsList = new List <string>();
            Stopwatch stopwatch = Stopwatch.StartNew();
            GetMailTipsResponseMessage mailTipsForUsers = UpdateAttachmentPermissions.GetMailTipsForUsers(userContext, userIds);

            stopwatch.Stop();
            callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.GetMailTipsTime, stopwatch.ElapsedMilliseconds);
            if (mailTipsForUsers.ResponseMessages != null && mailTipsForUsers.ResponseMessages.Length > 0)
            {
                stopwatch = Stopwatch.StartNew();
                int num  = 0;
                int num2 = 0;
                int num3 = 0;
                int num4 = int.MaxValue;
                int num5 = 0;
                ADRecipientExpansion expansion = new ADRecipientExpansion(userContext.ExchangePrincipal.MailboxInfo.OrganizationId);
                foreach (MailTipsResponseMessage mailTipsResponseMessage in mailTipsForUsers.ResponseMessages)
                {
                    XmlDocument xmlDocument = new XmlDocument();
                    xmlDocument.LoadXml(mailTipsResponseMessage.MailTips.OuterXml);
                    XmlNode xmlNode  = xmlDocument.SelectSingleNode("//*[local-name()=\"EmailAddress\"]");
                    XmlNode xmlNode2 = xmlDocument.SelectSingleNode("//*[local-name()=\"TotalMemberCount\"]");
                    if (xmlNode2 != null && !string.IsNullOrEmpty(xmlNode2.InnerText) && xmlNode != null && !string.IsNullOrEmpty(xmlNode.InnerText))
                    {
                        int num6 = int.Parse(xmlNode2.InnerText);
                        if (num6 != 1)
                        {
                            list.Remove(xmlNode.InnerText);
                            num++;
                            num3 += num6;
                            if (num4 > num6)
                            {
                                num4 = num6;
                            }
                            if (num5 < num6)
                            {
                                num5 = num6;
                            }
                        }
                        if (num6 > 1 && num6 <= 100)
                        {
                            UpdateAttachmentPermissions.AddDLMembersToResults(list, expansion, xmlNode.InnerText);
                        }
                        else if (num6 > 100)
                        {
                            largeDLsList.Add(xmlNode.InnerText);
                            ExTraceGlobals.AttachmentHandlingTracer.TraceError <string, int>(0L, "[UpdateAttachmentPermissions : ExpandDLsAndGetAllUsers] size of DL {0} was {1}, not setting permissions.", xmlNode.InnerText, num6);
                            num2++;
                        }
                    }
                    else
                    {
                        ExTraceGlobals.AttachmentHandlingTracer.TraceError(0L, "[UpdateAttachmentPermissions : ExpandDLsAndGetAllUsers] Error parsing GetMailTips response.");
                    }
                }
                stopwatch.Stop();
                callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.DLExpandTime, stopwatch.ElapsedMilliseconds);
                callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.NumberOfDLs, num);
                if (num > 0)
                {
                    callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.NumberOfLargeDLs, num2);
                    callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.NumberOfRecipientsInDLs, num3);
                    callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.NumberOfRecipientsInSmallestDL, num4);
                    callContext.ProtocolLog.Set(UpdateAttachmentPermissionsMetadata.NumberOfRecipientsInLargestDL, num5);
                }
            }
            else
            {
                ExTraceGlobals.AttachmentHandlingTracer.TraceError(0L, "[UpdateAttachmentPermissions : ExpandDLsAndGetAllUsers] GetMailTips response was empty.");
            }
            return(list.ToArray());
        }
        private bool IsGroupEmpty(ADGroup group)
        {
            if (group.Members.Count == 0)
            {
                if (!this.expandedRoleGroups.ContainsKey(group.Id))
                {
                    this.expandedRoleGroups.Add(group.Id, 0);
                }
                return(true);
            }
            if (this.expandedRoleGroups.ContainsKey(group.Id))
            {
                return(this.expandedRoleGroups[group.Id] == 0);
            }
            int numberOfUsers = 0;
            ADRecipientExpansion adrecipientExpansion = new ADRecipientExpansion(this.recipientSession, true);

            adrecipientExpansion.Expand(group, delegate(ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
            {
                if (group.Id.Equals(recipient.Id))
                {
                    return(ExpansionControl.Continue);
                }
                if (this.excludedFromEmptinessValidation != null && this.excludedFromEmptinessValidation.Contains(recipient.Id) && (this.isObjectRemovalValidation || (parent != null && parent.Id.Equals(group.Id))))
                {
                    return(ExpansionControl.Skip);
                }
                if (recipientExpansionType == ExpansionType.None)
                {
                    if (this.includeOnlyPowerShellEnabledRecipients)
                    {
                        if (this.IsPowerShellEnabled(recipient.Id))
                        {
                            numberOfUsers++;
                        }
                    }
                    else
                    {
                        numberOfUsers++;
                    }
                }
                if (this.expandedRoleGroups.ContainsKey(recipient.Id))
                {
                    numberOfUsers += this.expandedRoleGroups[recipient.Id];
                    if (numberOfUsers == 0)
                    {
                        return(ExpansionControl.Skip);
                    }
                }
                if (numberOfUsers > 0)
                {
                    return(ExpansionControl.Terminate);
                }
                return(ExpansionControl.Continue);
            }, delegate(ExpansionFailure failure, ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
            {
                if (failure.Equals(ExpansionFailure.NoMembers))
                {
                    return(ExpansionControl.Continue);
                }
                return(ExpansionControl.Skip);
            });
            this.expandedRoleGroups.Add(group.Id, numberOfUsers);
            return(numberOfUsers == 0);
        }
        public IEnumerable <SearchRecipient> Query(ISearchPolicy policy, DirectoryQueryParameters request)
        {
            Recorder.Trace(5L, TraceType.InfoTrace, new object[]
            {
                "ActiveDirectoryProvider.Query Query:",
                request.Query,
                "PageSize:",
                request.PageSize,
                "Properties:",
                request.Properties,
                "ExpandGroups:",
                request.ExpandGroups
            });
            ADPagedReader <ADRawEntry> pagedReader = policy.RecipientSession.FindPagedADRawEntry(null, QueryScope.SubTree, request.Query, null, request.PageSize, request.Properties);

            new List <SearchRecipient>();
            foreach (ADRawEntry entry in pagedReader)
            {
                if (request.ExpandGroups && SearchRecipient.IsMembershipGroup(entry))
                {
                    Recorder.Trace(5L, TraceType.InfoTrace, "ActiveDirectoryProvider.Query Expanding:", entry);
                    List <ADRawEntry>    groupEntries = new List <ADRawEntry>();
                    ADRecipientExpansion expansion    = new ADRecipientExpansion(policy.RecipientSession, false, request.Properties);
                    ADRecipientExpansion.HandleRecipientDelegate handleDelegate = delegate(ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
                    {
                        if (recipientExpansionType == ExpansionType.GroupMembership)
                        {
                            return(ExpansionControl.Continue);
                        }
                        groupEntries.Add(recipient);
                        return(ExpansionControl.Skip);
                    };
                    ADRecipientExpansion.HandleFailureDelegate failureDelegate = delegate(ExpansionFailure expansionFailure, ADRawEntry recipient, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
                    {
                        Recorder.Trace(5L, TraceType.ErrorTrace, new object[]
                        {
                            "ActiveDirectoryProvider.Query Expansion Failed:",
                            recipient,
                            "Error:",
                            expansionFailure,
                            "ExpansionType:",
                            recipientExpansionType,
                            "Parent:",
                            parent,
                            "ParentyExpansionType:",
                            parentExpansionType
                        });
                        return(ExpansionControl.Skip);
                    };
                    expansion.Expand(entry, handleDelegate, failureDelegate);
                    foreach (ADRawEntry groupEntry in groupEntries)
                    {
                        yield return(new SearchRecipient(groupEntry, entry));
                    }
                }
                else
                {
                    yield return(new SearchRecipient(entry, null));
                }
            }
            yield break;
        }
 public ADDistributionListExpansion(CertificateManager manager, ADRecipientExpansion adrecipientExpansion)
 {
     this.manager = manager;
     this.adrecipientExpansion = adrecipientExpansion;
 }
        // 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);
        }
Exemple #9
0
        internal static MultiValuedProperty <string> ConvertSourceMailboxesCollection(IEnumerable <RecipientIdParameter> recipientIds, bool inplaceHoldEnabled, Func <RecipientIdParameter, ADRecipient> recipientGetter, IRecipientSession recipientSession, Task.TaskErrorLoggingDelegate writeErrorDelegate, Action <LocalizedString> writeWarningDelegate, Func <LocalizedString, bool> shouldContinueDelegate)
        {
            MultiValuedProperty <string> results = null;

            if (recipientIds != null)
            {
                RecipientType[] source = new RecipientType[]
                {
                    RecipientType.UserMailbox,
                    RecipientType.Group,
                    RecipientType.MailUniversalDistributionGroup,
                    RecipientType.MailUniversalSecurityGroup,
                    RecipientType.MailNonUniversalGroup,
                    RecipientType.DynamicDistributionGroup
                };
                bool flag = false;
                foreach (RecipientIdParameter arg in recipientIds)
                {
                    if (results == null)
                    {
                        results = new MultiValuedProperty <string>();
                    }
                    ADRecipient       adrecipient     = recipientGetter(arg);
                    string            text            = null;
                    ADSessionSettings sessionSettings = adrecipient.OrganizationId.ToADSessionSettings();
                    if (Utils.IsPublicFolderMailbox(adrecipient))
                    {
                        writeErrorDelegate(new MailboxSearchTaskException(Strings.ErrorInvalidRecipientTypeDetails(adrecipient.ToString())), ErrorCategory.InvalidArgument, null);
                    }
                    else if (Utils.IsValidMailboxType(adrecipient))
                    {
                        if (adrecipient.ExchangeVersion.IsOlderThan(ExchangeObjectVersion.Exchange2012) && !RemoteMailbox.IsRemoteMailbox(adrecipient.RecipientTypeDetails) && ExchangePrincipal.FromADUser(sessionSettings, (ADUser)adrecipient, RemotingOptions.AllowCrossSite).MailboxInfo.Location.ServerVersion < Server.E15MinVersion)
                        {
                            writeErrorDelegate(new MailboxSearchTaskException(Strings.SourceMailboxMustBeE15OrLater(adrecipient.DisplayName)), ErrorCategory.InvalidArgument, null);
                        }
                        text = adrecipient.LegacyExchangeDN;
                    }
                    else if (source.Contains(adrecipient.RecipientType))
                    {
                        if (inplaceHoldEnabled)
                        {
                            if (!flag)
                            {
                                if (shouldContinueDelegate(Strings.ShouldContinueToExpandGroupsForHold))
                                {
                                    flag = true;
                                }
                                else
                                {
                                    writeErrorDelegate(new MailboxSearchTaskException(Strings.GroupsIsNotAllowedForHold(adrecipient.DisplayName)), ErrorCategory.InvalidArgument, null);
                                }
                            }
                            bool invalidTypeSkipped                   = false;
                            bool oldVersionMailboxSkipped             = false;
                            ADRecipientExpansion adrecipientExpansion = new ADRecipientExpansion(new PropertyDefinition[]
                            {
                                ADRecipientSchema.LegacyExchangeDN,
                                ADRecipientSchema.RecipientTypeDetailsValue,
                                ADObjectSchema.ExchangeVersion
                            }, adrecipient.OrganizationId);
                            adrecipientExpansion.Expand(adrecipient, delegate(ADRawEntry expandedRecipient, ExpansionType expansionType, ADRawEntry parent, ExpansionType parentType)
                            {
                                if (expansionType == ExpansionType.GroupMembership)
                                {
                                    return(ExpansionControl.Continue);
                                }
                                if (Utils.IsValidMailboxType(expandedRecipient))
                                {
                                    ExchangeObjectVersion exchangeObjectVersion = (ExchangeObjectVersion)expandedRecipient[ADObjectSchema.ExchangeVersion];
                                    string text2 = (string)expandedRecipient[ADRecipientSchema.LegacyExchangeDN];
                                    if (!oldVersionMailboxSkipped && exchangeObjectVersion.IsOlderThan(ExchangeObjectVersion.Exchange2012) && !RemoteMailbox.IsRemoteMailbox((RecipientTypeDetails)expandedRecipient[ADRecipientSchema.RecipientTypeDetails]) && ExchangePrincipal.FromLegacyDN(sessionSettings, text2).MailboxInfo.Location.ServerVersion < Server.E15MinVersion)
                                    {
                                        oldVersionMailboxSkipped = true;
                                        writeWarningDelegate(Strings.OldVersionMailboxSkipped);
                                    }
                                    if (!results.Contains(text2))
                                    {
                                        results.Add(text2);
                                    }
                                }
                                else if (!invalidTypeSkipped)
                                {
                                    invalidTypeSkipped = true;
                                    writeWarningDelegate(Strings.SkippingInvalidTypeInGroupExpansion);
                                }
                                return(ExpansionControl.Skip);
                            }, delegate(ExpansionFailure failure, ADRawEntry expandedRecipient, ExpansionType expansionType, ADRawEntry parent, ExpansionType parentType)
                            {
                                TaskLogger.Trace("Skipping invalid AD entry {0} because of failure: {1}", new object[]
                                {
                                    expandedRecipient,
                                    failure
                                });
                                return(ExpansionControl.Skip);
                            });
                        }
                        else
                        {
                            text = adrecipient.LegacyExchangeDN;
                        }
                    }
                    else
                    {
                        writeErrorDelegate(new MailboxSearchTaskException(Strings.ErrorInvalidRecipientType(adrecipient.ToString(), adrecipient.RecipientType.ToString())), ErrorCategory.InvalidArgument, null);
                    }
                    if (text != null && !results.Contains(text))
                    {
                        results.Add(text);
                    }
                    if (results.Count > Utils.MaxNumberOfMailboxesInSingleHold)
                    {
                        writeErrorDelegate(new MailboxSearchTaskException(Strings.ErrorTooManyMailboxesInSingleHold(Utils.MaxNumberOfMailboxesInSingleHold)), ErrorCategory.InvalidArgument, null);
                    }
                }
                if (results != null)
                {
                    uint discoveryMaxMailboxes = SearchUtils.GetDiscoveryMaxMailboxes(recipientSession);
                    if ((long)results.Count > (long)((ulong)discoveryMaxMailboxes) && !shouldContinueDelegate(Strings.ShouldContinueMoreMailboxesThanMaxSearch(results.Count, discoveryMaxMailboxes)))
                    {
                        writeErrorDelegate(new MailboxSearchTaskException(Strings.ErrorTaskCancelledBecauseMoreMailboxesThanSearchSupported), ErrorCategory.InvalidArgument, null);
                    }
                }
            }
            return(results);
        }
        // Token: 0x0600108A RID: 4234 RVA: 0x00060890 File Offset: 0x0005EA90
        internal void GetMetricsForSingleGroup(IRecipientSession session, string groupDN, TypedHashSet calculatedGroups, Dictionary <string, object> parentGroupDictionary, IList <string> parentGroupList)
        {
            ADObjectId        id                = new ADObjectId(groupDN);
            ADRawEntry        group             = null;
            ADOperationResult adoperationResult = this.TryRunPerGroupADOperation(delegate
            {
                group = session.ReadADRawEntry(id, GroupMetricsGenerator.groupProperties);
            }, groupDN);

            if (!adoperationResult.Succeeded || group == null)
            {
                return;
            }
            ulong hash = GroupMetricsUtility.GetHash(group.Id.ObjectGuid);

            if (calculatedGroups.Contains(hash))
            {
                return;
            }
            int                  externalMemberCount = 0;
            HashSet <ulong>      allMemberHashes     = new HashSet <ulong>(2000);
            ADRecipientExpansion expander            = new ADRecipientExpansion(session, false);

            adoperationResult = this.TryRunPerGroupADOperation(delegate
            {
                if (GroupMetricsUtility.Fault == GroupMetricsFault.TransientExceptionInExpansion)
                {
                    throw new ADTransientException(new LocalizedString("Fault Injection"));
                }
                if (GroupMetricsUtility.Fault == GroupMetricsFault.InvalidCredentialExceptionInExpansion)
                {
                    throw new ADInvalidCredentialException(new LocalizedString("Fault Injection"));
                }
                if (GroupMetricsUtility.Fault == GroupMetricsFault.PermanentExceptionInExpansion)
                {
                    throw new DataSourceOperationException(new LocalizedString("Fault Injection"));
                }
                expander.Expand(group, delegate(ADRawEntry member, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType)
                {
                    this.RunData.ThrowIfShuttingDown();
                    if (recipientExpansionType == ExpansionType.GroupMembership)
                    {
                        return(ExpansionControl.Continue);
                    }
                    ulong hash2 = GroupMetricsUtility.GetHash(member.Id.ObjectGuid);
                    if (allMemberHashes.TryAdd(hash2) && this.IsExternal(member))
                    {
                        externalMemberCount++;
                    }
                    if (allMemberHashes.Count >= 1000)
                    {
                        return(ExpansionControl.Terminate);
                    }
                    if (recipientExpansionType != ExpansionType.None)
                    {
                        return(ExpansionControl.Skip);
                    }
                    return(ExpansionControl.Continue);
                }, (ExpansionFailure failure, ADRawEntry member, ExpansionType recipientExpansionType, ADRawEntry parent, ExpansionType parentExpansionType) => ExpansionControl.Continue);
            }, groupDN);
            if (!adoperationResult.Succeeded)
            {
                return;
            }
            MultiValuedProperty <ADObjectId> multiValuedProperty = group[ADRecipientSchema.MemberOfGroup] as MultiValuedProperty <ADObjectId>;

            foreach (ADObjectId adobjectId in multiValuedProperty)
            {
                string distinguishedName = adobjectId.DistinguishedName;
                if (!parentGroupDictionary.ContainsKey(distinguishedName))
                {
                    parentGroupDictionary.Add(distinguishedName, null);
                    parentGroupList.Add(distinguishedName);
                }
            }
            int count = allMemberHashes.Count;

            calculatedGroups.Add(hash);
            this.groupsExpanded++;
            int oldValue  = (int)group[ADGroupSchema.GroupMemberCount];
            int oldValue2 = (int)group[ADGroupSchema.GroupExternalMemberCount];

            if (this.ShouldSaveToAD(oldValue, count) || this.ShouldSaveToAD(oldValue2, externalMemberCount))
            {
                this.SaveGroupMetricsToAD(session, group, count, externalMemberCount);
            }
        }