private bool MoveNextForeign() { bool needToRetry; do { needToRetry = false; GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: foreignMembers count={0}", _foreignMembers.Count); if (_foreignMembers.Count > 0) { // foreignDE is a DirectoryEntry in _this_ store representing a principal in another store DirectoryEntry foreignDE = _foreignMembers[0]; _foreignMembers.RemoveAt(0); GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: foreignDE={0}", foreignDE.Path); // foreignPrincipal is a principal from _another_ store (e.g., it's backed by an ADStoreCtx) Principal foreignPrincipal = _storeCtx.ResolveCrossStoreRefToPrincipal(foreignDE); // If we're not enumerating recursively, return the principal. // If we are enumerating recursively, and it's a group, save it off for later. if (!_recursive || !(foreignPrincipal is GroupPrincipal)) { // Return the principal. GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: setting currentForeign to {0}", foreignDE.Path); _current = null; _currentFakePrincipal = null; _currentForeign = foreignPrincipal; if (_foreignResultSet != null) { _foreignResultSet.Dispose(); } _foreignResultSet = null; return(true); } else { // Save off the group for recursive expansion, and go on to the next principal. GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: adding {0} to foreignGroups", foreignDE.Path); _foreignGroups.Add((GroupPrincipal)foreignPrincipal); needToRetry = true; continue; } } if (_foreignResultSet == null && _foreignGroups.Count > 0) { GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: getting foreignResultSet (foreignGroups count={0})", _foreignGroups.Count); // We're expanding recursively, and either (1) we're immediately before // the recursive expansion of the first foreign group, or (2) we just completed // the recursive expansion of a foreign group, and now are moving on to the next. Debug.Assert(_recursive == true); // Pull off a foreign group to expand. GroupPrincipal foreignGroup = _foreignGroups[0]; _foreignGroups.RemoveAt(0); // Since it's a foreign group, we don't know how to enumerate its members. So we'll // ask the group, through its StoreCtx, to do it for us. Effectively, we'll end up acting // as a proxy to the foreign group's ResultSet. _foreignResultSet = foreignGroup.GetStoreCtxToUse().GetGroupMembership(foreignGroup, true); } // We're either just beginning the recursive expansion of a foreign group, or we're continuing the expansion // that we started on a previous call to MoveNext(). if (_foreignResultSet != null) { Debug.Assert(_recursive == true); bool f = _foreignResultSet.MoveNext(); if (f) { // By setting current, currentFakePrincipal, and currentForeign to null, // CurrentAsPrincipal/CurrentAsIdentityReference will know to proxy out to foreignResultSet. GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: using foreignResultSet"); _current = null; _currentFakePrincipal = null; _currentForeign = null; return(true); } // Ran out of members in the foreign group, is there another foreign group remaining that we need // to expand? if (_foreignGroups.Count > 0) { // Yes, there is. Null out the foreignResultSet so we'll pull out the next foreign group // the next time around the loop. GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: ran out of members, using next foreignResultSet"); _foreignResultSet.Dispose(); _foreignResultSet = null; Debug.Assert(_foreignMembers.Count == 0); needToRetry = true; } else { // No, there isn't. Nothing left to do. We set foreignResultSet to null here just // to leave things in a clean state --- it shouldn't really be necessary. GlobalDebug.WriteLineIf(GlobalDebug.Info, "SAMMembersSet", "MoveNextForeign: ran out of members, nothing more to do"); _foreignResultSet.Dispose(); _foreignResultSet = null; } } }while (needToRetry); return(false); }
private bool MoveNextForeign() { bool flag; do { flag = false; if (this.foreignMembers.Count <= 0) { if (this.foreignResultSet == null && this.foreignGroups.Count > 0) { GroupPrincipal item = this.foreignGroups[0]; this.foreignGroups.RemoveAt(0); this.foreignResultSet = item.GetStoreCtxToUse().GetGroupMembership(item, true); } if (this.foreignResultSet == null) { continue; } bool flag1 = this.foreignResultSet.MoveNext(); if (!flag1) { if (this.foreignGroups.Count <= 0) { this.foreignResultSet.Dispose(); this.foreignResultSet = null; } else { this.foreignResultSet.Dispose(); this.foreignResultSet = null; flag = true; } } else { this.current = null; this.currentFakePrincipal = null; this.currentForeign = null; return(true); } } else { DirectoryEntry directoryEntry = this.foreignMembers[0]; this.foreignMembers.RemoveAt(0); Principal principal = this.storeCtx.ResolveCrossStoreRefToPrincipal(directoryEntry); if (!this.recursive || principal as GroupPrincipal == null) { this.current = null; this.currentFakePrincipal = null; this.currentForeign = principal; if (this.foreignResultSet != null) { this.foreignResultSet.Dispose(); } this.foreignResultSet = null; return(true); } else { this.foreignGroups.Add((GroupPrincipal)principal); flag = true; } } }while (flag); return(false); }