Skip to content

Commit a24f19c

Browse files
committed
C#: Use the RegistryUrls from the dependabot proxy as default feeds is replaces-base is set, otherwise use nuget.org.
1 parent 4a25db2 commit a24f19c

3 files changed

Lines changed: 71 additions & 27 deletions

File tree

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ internal sealed partial class FeedManager : IDisposable
1717
private readonly IFileProvider fileProvider;
1818
private readonly DependencyDirectory emptyPackageDirectory;
1919
private readonly ImmutableHashSet<string> privateRegistryFeeds;
20+
private readonly ImmutableHashSet<string> defaultFeeds;
21+
2022
private readonly IFeedManagerIO feedManagerIo;
2123

2224
/// <summary>
@@ -72,6 +74,13 @@ internal sealed partial class FeedManager : IDisposable
7274
/// </summary>
7375
public ImmutableHashSet<string> ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value;
7476

77+
private readonly Lazy<ImmutableHashSet<string>> lazyReachableDefaultFeeds;
78+
79+
/// <summary>
80+
/// Gets the list of reachable default NuGet feeds.
81+
/// </summary>
82+
public ImmutableHashSet<string> ReachableDefaultFeeds => lazyReachableDefaultFeeds.Value;
83+
7584
public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider, IFeedManagerIO feedManagerIo)
7685
{
7786
this.logger = logger;
@@ -80,6 +89,9 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
8089
this.feedManagerIo = feedManagerIo;
8190
privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? [];
8291
HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0;
92+
defaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true
93+
? dependabotProxy.RegistryBaseURLs
94+
: [PublicNugetOrgFeed];
8395
emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger);
8496

8597
lazyExplicitFeeds = new Lazy<ImmutableHashSet<string>>(GetExplicitFeeds);
@@ -96,6 +108,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
96108
var reachableFallbackFeeds = GetReachableFallbackNugetFeeds();
97109
return reachableFallbackFeeds.ToImmutableHashSet();
98110
});
111+
lazyReachableDefaultFeeds = new Lazy<ImmutableHashSet<string>>(() => CheckSpecifiedFeeds(defaultFeeds));
99112
}
100113

101114
public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider)
@@ -266,22 +279,6 @@ private ImmutableHashSet<string> CheckSpecifiedFeeds(ImmutableHashSet<string> fe
266279
return reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet();
267280
}
268281

269-
/// <summary>
270-
/// Return true if the default NuGet feed is reachable, false otherwise.
271-
/// If the reachability check is disabled, this method will always return true.
272-
/// </summary>
273-
/// <returns>True if the default NuGet feed is reachable, false otherwise.</returns>
274-
public bool IsDefaultFeedReachable()
275-
{
276-
if (CheckNugetFeedResponsiveness)
277-
{
278-
var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false);
279-
return feedManagerIo.IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount);
280-
}
281-
282-
return true;
283-
}
284-
285282
/// <summary>
286283
/// Tests which of the feeds given by <paramref name="feedsToCheck"/> are reachable.
287284
/// </summary>
@@ -315,8 +312,8 @@ private List<string> GetReachableFallbackNugetFeeds()
315312
var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet();
316313
if (fallbackFeeds.Count == 0)
317314
{
318-
fallbackFeeds.Add(PublicNugetOrgFeed);
319-
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feed: {PublicNugetOrgFeed}");
315+
fallbackFeeds.UnionWith(defaultFeeds);
316+
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", defaultFeeds.OrderBy(f => f))}");
320317

321318
var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback);
322319
logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}");

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,6 @@ private class NugetExeWrapper : IPackagesConfigRestore
6767

6868
private bool IsWindows => SystemBuildActions.Instance.IsWindows();
6969

70-
private bool? isDefaultFeedReachable;
71-
private bool IsDefaultFeedReachable =>
72-
isDefaultFeedReachable ??= feedManager.IsDefaultFeedReachable();
73-
7470
/// <summary>
7571
/// Create the package manager for a specified source tree.
7672
/// </summary>
@@ -169,15 +165,15 @@ private bool TryRestoreNugetPackage(string packagesConfig)
169165

170166
List<string> sourcesArgument = [];
171167
var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList();
172-
var useDefaultFeed = feedsToUse.Count == 0 && IsDefaultFeedReachable;
168+
var useDefaultFeeds = feedsToUse.Count == 0 && feedManager.ReachableDefaultFeeds.Count > 0;
173169

174170
// Explicitly construct the sources to be used for the restore command when checking feed
175-
// responsiveness, using private registries, or falling back to nuget.org.
176-
if (feedManager.CheckNugetFeedResponsiveness || feedManager.HasPrivateRegistryFeeds || useDefaultFeed)
171+
// responsiveness, using private registries, or falling back to default feeds.
172+
if (feedManager.CheckNugetFeedResponsiveness || feedManager.HasPrivateRegistryFeeds || useDefaultFeeds)
177173
{
178-
if (useDefaultFeed)
174+
if (useDefaultFeeds)
179175
{
180-
feedsToUse.Add(FeedManager.PublicNugetOrgFeed);
176+
feedsToUse.AddRange(feedManager.ReachableDefaultFeeds);
181177
}
182178
var restoreFeeds = feedManager.RestoreFeeds(feedsToUse);
183179
sourcesArgument = restoreFeeds.SelectMany<string, string>(feed => ["-Source", feed]).ToList();

csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ public class DependabotProxyStub : IDependabotProxy
1919
public void Dispose() { }
2020
}
2121

22+
public class DependabotProxyStubWithBaseUrls : IDependabotProxy
23+
{
24+
public string Address { get; } = "";
25+
public ImmutableHashSet<string> RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2", "https://example.com/base1", "https://example.com/base2"];
26+
public ImmutableHashSet<string> RegistryBaseURLs { get; } = ["https://example.com/base1", "https://example.com/base2"];
27+
public string? CertificatePath { get; } = null;
28+
public System.Security.Cryptography.X509Certificates.X509Certificate2? Certificate { get; } = null;
29+
30+
public void Dispose() { }
31+
}
32+
2233
public class FeedManagerIOStub : IFeedManagerIO
2334
{
2435
private readonly List<string> unreachableFeeds;
@@ -185,5 +196,45 @@ public void TestFeedsToUse()
185196
"https://feed.from/folder1"
186197
], feedsToUse);
187198
}
199+
200+
[Fact]
201+
public void TestDefaultFeeds1()
202+
{
203+
// Setup
204+
var feedManager = MakeFeedManager();
205+
206+
// Execute
207+
var reachableDefault = feedManager.ReachableDefaultFeeds;
208+
209+
// Verify
210+
Assert.Equal([
211+
"https://api.nuget.org/v3/index.json"
212+
], reachableDefault);
213+
}
214+
215+
[Fact]
216+
public void TestDefaultFeeds2()
217+
{
218+
// Setup
219+
var logger = new LoggerStub();
220+
var dotnet = new DotNetStub([], [], [], []);
221+
var dependabotProxy = new DependabotProxyStubWithBaseUrls();
222+
var fileProvider = new FileProviderStub();
223+
var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]);
224+
var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo);
225+
226+
// Execute
227+
var reachableDefault = feedManager.ReachableDefaultFeeds;
228+
var reachableFallback = feedManager.ReachableFallbackFeeds;
229+
230+
// Verify
231+
Assert.Equal([
232+
"https://example.com/base2"
233+
], reachableDefault);
234+
Assert.Equal([
235+
"https://example.com/registry1",
236+
"https://example.com/base2"
237+
], reachableFallback);
238+
}
188239
}
189240
}

0 commit comments

Comments
 (0)