Skip to content

Commit d9fed45

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 c7c2b92 commit d9fed45

3 files changed

Lines changed: 73 additions & 29 deletions

File tree

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

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ 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;
2021
private readonly IFeedManagerIO feedManagerIo;
2122

2223
/// <summary>
@@ -72,6 +73,13 @@ internal sealed partial class FeedManager : IDisposable
7273
/// </summary>
7374
public ImmutableHashSet<string> ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value;
7475

76+
private readonly Lazy<ImmutableHashSet<string>> lazyReachableDefaultFeeds;
77+
78+
/// <summary>
79+
/// Gets the list of reachable default NuGet feeds.
80+
/// </summary>
81+
public ImmutableHashSet<string> ReachableDefaultFeeds => lazyReachableDefaultFeeds.Value;
82+
7583
public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider, IFeedManagerIO feedManagerIo)
7684
{
7785
this.logger = logger;
@@ -80,6 +88,9 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
8088
this.feedManagerIo = feedManagerIo;
8189
privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? [];
8290
HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0;
91+
defaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true
92+
? dependabotProxy.RegistryBaseURLs
93+
: [PublicNugetOrgFeed];
8394
emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger);
8495

8596
lazyExplicitFeeds = new Lazy<ImmutableHashSet<string>>(GetExplicitFeeds);
@@ -96,6 +107,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
96107
var reachableFallbackFeeds = GetReachableFallbackNugetFeeds();
97108
return reachableFallbackFeeds.ToImmutableHashSet();
98109
});
110+
lazyReachableDefaultFeeds = new Lazy<ImmutableHashSet<string>>(() => CheckSpecifiedFeeds(defaultFeeds));
99111
}
100112

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

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-
285281
/// <summary>
286282
/// Tests which of the feeds given by <paramref name="feedsToCheck"/> are reachable.
287283
/// </summary>
@@ -315,8 +311,8 @@ private List<string> GetReachableFallbackNugetFeeds()
315311
var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet();
316312
if (fallbackFeeds.Count == 0)
317313
{
318-
fallbackFeeds.Add(PublicNugetOrgFeed);
319-
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feed: {PublicNugetOrgFeed}");
314+
fallbackFeeds.UnionWith(defaultFeeds);
315+
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", defaultFeeds.OrderBy(f => f))}");
320316

321317
var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback);
322318
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: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using Xunit;
22
using System;
33
using System.Collections.Generic;
4+
using System.Collections.Immutable;
45
using System.IO;
56
using System.Linq;
7+
using System.Security.Cryptography.X509Certificates;
68
using Semmle.Extraction.CSharp.DependencyFetching;
7-
using System.Collections.Immutable;
89

910
namespace Semmle.Extraction.Tests
1011
{
@@ -14,7 +15,18 @@ public class DependabotProxyStub : IDependabotProxy
1415
public ImmutableHashSet<string> RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2"];
1516
public ImmutableHashSet<string> RegistryBaseURLs { get; } = [];
1617
public string? CertificatePath { get; } = null;
17-
public System.Security.Cryptography.X509Certificates.X509Certificate2? Certificate { get; } = null;
18+
public X509Certificate2? Certificate { get; } = null;
19+
20+
public void Dispose() { }
21+
}
22+
23+
public class DependabotProxyStubWithBaseUrls : IDependabotProxy
24+
{
25+
public string Address { get; } = "";
26+
public ImmutableHashSet<string> RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2", "https://example.com/base1", "https://example.com/base2"];
27+
public ImmutableHashSet<string> RegistryBaseURLs { get; } = ["https://example.com/base1", "https://example.com/base2"];
28+
public string? CertificatePath { get; } = null;
29+
public X509Certificate2? Certificate { get; } = null;
1830

1931
public void Dispose() { }
2032
}
@@ -185,5 +197,45 @@ public void TestFeedsToUse()
185197
"https://feed.from/folder1"
186198
], feedsToUse);
187199
}
200+
201+
[Fact]
202+
public void TestDefaultFeeds1()
203+
{
204+
// Setup
205+
var feedManager = MakeFeedManager();
206+
207+
// Execute
208+
var reachableDefault = feedManager.ReachableDefaultFeeds;
209+
210+
// Verify
211+
Assert.Equal([
212+
"https://api.nuget.org/v3/index.json"
213+
], reachableDefault);
214+
}
215+
216+
[Fact]
217+
public void TestDefaultFeeds2()
218+
{
219+
// Setup
220+
var logger = new LoggerStub();
221+
var dotnet = new DotNetStub([], [], [], []);
222+
var dependabotProxy = new DependabotProxyStubWithBaseUrls();
223+
var fileProvider = new FileProviderStub();
224+
var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]);
225+
var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo);
226+
227+
// Execute
228+
var reachableDefault = feedManager.ReachableDefaultFeeds;
229+
var reachableFallback = feedManager.ReachableFallbackFeeds;
230+
231+
// Verify
232+
Assert.Equal([
233+
"https://example.com/base2"
234+
], reachableDefault);
235+
Assert.Equal([
236+
"https://example.com/registry1",
237+
"https://example.com/base2"
238+
], reachableFallback);
239+
}
188240
}
189241
}

0 commit comments

Comments
 (0)