| File: ClientCertificate\ClientCertificateProvider.cs | Web Access |
| Project: src\nuget-client\src\NuGet.Core\NuGet.Configuration\NuGet.Configuration.csproj (NuGet.Configuration) |
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Globalization; using System.Linq; namespace NuGet.Configuration { public class ClientCertificateProvider : IClientCertificateProvider { private readonly ISettings _settings; public ClientCertificateProvider(ISettings settings) { _settings = settings ?? throw new ArgumentNullException(nameof(settings)); } public void AddOrUpdate(ClientCertItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } Remove(new[] { item }); _settings.AddOrUpdate(ConfigurationConstants.ClientCertificates, item); _settings.SaveToDisk(); } public void Remove(IReadOnlyList<ClientCertItem> items) { if (items == null || !items.Any()) { throw new ArgumentException(Resources.Argument_Cannot_Be_Null_Or_Empty, nameof(items)); } foreach (ClientCertItem signer in items) { try { _settings.Remove(ConfigurationConstants.ClientCertificates, signer); } catch { // An error means the item doesn't exist or is in a machine wide config, therefore just ignore it } } _settings.SaveToDisk(); } public IReadOnlyList<ClientCertItem> GetClientCertificates() { SettingSection? clientCertificatesSection = _settings.GetSection(ConfigurationConstants.ClientCertificates); if (clientCertificatesSection == null) { return Enumerable.Empty<ClientCertItem>().ToList(); } var result = clientCertificatesSection.Items.OfType<ClientCertItem>().ToList(); //Distinct by PackageSource var groupedByPackageSourceItems = result.ToLookup(i => i.PackageSource, i => i, StringComparer.OrdinalIgnoreCase); var groupsWithSamePackageSource = groupedByPackageSourceItems.Where(g => g.Count() > 1).ToList(); if (groupsWithSamePackageSource.Any()) { var message = string.Format(CultureInfo.CurrentCulture, Resources.ClientCertificateDuplicateConfiguration, string.Join(", ", $"'{groupsWithSamePackageSource.Select(g => g.Key)}'")); throw new NuGetConfigurationException(message); } return result; } public ClientCertItem? GetClientCertificate(string packageSourceName) { return GetClientCertificates().FirstOrDefault(i => string.Equals(i.PackageSource, packageSourceName, StringComparison.Ordinal)); } } }