1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-16 07:50:49 -05:00

Use IHttpClientFactory in more places

This commit is contained in:
Justin Baur 2025-05-01 08:59:15 -04:00
parent 7a99f5dc5d
commit 284501a493
No known key found for this signature in database
7 changed files with 44 additions and 25 deletions

View File

@ -11,13 +11,17 @@ namespace Bit.Admin.Controllers;
public class HomeController : Controller public class HomeController : Controller
{ {
private readonly GlobalSettings _globalSettings; private readonly GlobalSettings _globalSettings;
private readonly HttpClient _httpClient = new HttpClient(); private readonly HttpClient _httpClient;
private readonly ILogger<HomeController> _logger; private readonly ILogger<HomeController> _logger;
public HomeController(GlobalSettings globalSettings, ILogger<HomeController> logger) public HomeController(
GlobalSettings globalSettings,
ILogger<HomeController> logger,
IHttpClientFactory httpClientFactory)
{ {
_globalSettings = globalSettings; _globalSettings = globalSettings;
_logger = logger; _logger = logger;
_httpClient = httpClientFactory.CreateClient();
} }
[Authorize] [Authorize]

View File

@ -8,14 +8,16 @@ namespace Bit.Admin.Jobs;
public class AliveJob : BaseJob public class AliveJob : BaseJob
{ {
private readonly GlobalSettings _globalSettings; private readonly GlobalSettings _globalSettings;
private HttpClient _httpClient = new HttpClient(); private readonly HttpClient _httpClient;
public AliveJob( public AliveJob(
GlobalSettings globalSettings, GlobalSettings globalSettings,
ILogger<AliveJob> logger) ILogger<AliveJob> logger,
IHttpClientFactory httpClientFactory)
: base(logger) : base(logger)
{ {
_globalSettings = globalSettings; _globalSettings = globalSettings;
_httpClient = httpClientFactory.CreateClient();
} }
protected async override Task ExecuteJobAsync(IJobExecutionContext context) protected async override Task ExecuteJobAsync(IJobExecutionContext context)

View File

@ -16,27 +16,24 @@ public class HibpController : Controller
{ {
private const string HibpBreachApi = "https://haveibeenpwned.com/api/v3/breachedaccount/{0}" + private const string HibpBreachApi = "https://haveibeenpwned.com/api/v3/breachedaccount/{0}" +
"?truncateResponse=false&includeUnverified=false"; "?truncateResponse=false&includeUnverified=false";
private static HttpClient _httpClient; private readonly HttpClient _httpClient;
private readonly IUserService _userService; private readonly IUserService _userService;
private readonly ICurrentContext _currentContext; private readonly ICurrentContext _currentContext;
private readonly GlobalSettings _globalSettings; private readonly GlobalSettings _globalSettings;
private readonly string _userAgent; private readonly string _userAgent;
static HibpController()
{
_httpClient = new HttpClient();
}
public HibpController( public HibpController(
IUserService userService, IUserService userService,
ICurrentContext currentContext, ICurrentContext currentContext,
GlobalSettings globalSettings) GlobalSettings globalSettings,
IHttpClientFactory httpClientFactory)
{ {
_userService = userService; _userService = userService;
_currentContext = currentContext; _currentContext = currentContext;
_globalSettings = globalSettings; _globalSettings = globalSettings;
_userAgent = _globalSettings.SelfHosted ? "Bitwarden Self-Hosted" : "Bitwarden"; _userAgent = _globalSettings.SelfHosted ? "Bitwarden Self-Hosted" : "Bitwarden";
_httpClient = httpClientFactory.CreateClient();
} }
[HttpGet("breach")] [HttpGet("breach")]

View File

@ -1,5 +1,4 @@
using System.Net.Http.Headers; using System.Text.Json.Serialization;
using System.Text.Json.Serialization;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Settings; using Bit.Core.Settings;
@ -25,23 +24,16 @@ public class FreshsalesController : Controller
IOrganizationRepository organizationRepository, IOrganizationRepository organizationRepository,
IOptions<BillingSettings> billingSettings, IOptions<BillingSettings> billingSettings,
ILogger<FreshsalesController> logger, ILogger<FreshsalesController> logger,
GlobalSettings globalSettings) GlobalSettings globalSettings,
IHttpClientFactory httpClientFactory)
{ {
_userRepository = userRepository; _userRepository = userRepository;
_organizationRepository = organizationRepository; _organizationRepository = organizationRepository;
_logger = logger; _logger = logger;
_globalSettings = globalSettings; _globalSettings = globalSettings;
_httpClient = httpClientFactory.CreateClient("Freshsales");
_httpClient = new HttpClient
{
BaseAddress = new Uri("https://bitwarden.freshsales.io/api/")
};
_freshsalesApiKey = billingSettings.Value.FreshsalesApiKey; _freshsalesApiKey = billingSettings.Value.FreshsalesApiKey;
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Token",
$"token={_freshsalesApiKey}");
} }

View File

@ -10,6 +10,7 @@ using Bit.Core.Settings;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Bit.SharedWeb.Utilities; using Bit.SharedWeb.Utilities;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using Quartz; using Quartz;
using Stripe; using Stripe;
@ -102,6 +103,15 @@ public class Startup
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", billingSettings.Onyx.ApiKey); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", billingSettings.Onyx.ApiKey);
}); });
services.AddHttpClient("Freshsales", (sp, client) =>
{
var billingSettings = sp.GetRequiredService<IOptions<BillingSettings>>().Value;
client.BaseAddress = new Uri("https://bitwarden.freshsales.io/api/");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Token",
$"token={billingSettings.FreshsalesApiKey}"
);
});
services.AddScoped<IStripeFacade, StripeFacade>(); services.AddScoped<IStripeFacade, StripeFacade>();
services.AddScoped<IStripeEventService, StripeEventService>(); services.AddScoped<IStripeEventService, StripeEventService>();

View File

@ -31,12 +31,18 @@ public class FreshsalesControllerTests
var globalSettings = new GlobalSettings(); var globalSettings = new GlobalSettings();
globalSettings.BaseServiceUri.Admin = "https://test.com"; globalSettings.BaseServiceUri.Admin = "https://test.com";
var httpClientFactory = Substitute.For<IHttpClientFactory>();
httpClientFactory
.CreateClient("Freshsales")
.Returns(new HttpClient());
var sut = new FreshsalesController( var sut = new FreshsalesController(
userRepository, userRepository,
organizationRepository, organizationRepository,
billingSettings, billingSettings,
Substitute.For<ILogger<FreshsalesController>>(), Substitute.For<ILogger<FreshsalesController>>(),
globalSettings globalSettings,
httpClientFactory
); );
return (sut, userRepository, organizationRepository); return (sut, userRepository, organizationRepository);

View File

@ -2,6 +2,7 @@
using System.Net.Http.Json; using System.Net.Http.Json;
using Bit.Migrator; using Bit.Migrator;
using Bit.Setup.Enums; using Bit.Setup.Enums;
using Microsoft.Extensions.DependencyInjection;
namespace Bit.Setup; namespace Bit.Setup;
@ -285,7 +286,14 @@ public class Program
url = $"{installationUrl}/installations/"; url = $"{installationUrl}/installations/";
} }
var response = new HttpClient().GetAsync(url + _context.Install.InstallationId).GetAwaiter().GetResult(); // We need to get an HttpClient that has been configured with custom trust certificates.
var httpClient = new ServiceCollection()
.AddX509ChainCustomization()
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>()
.CreateClient();
var response = httpClient.GetAsync(url + _context.Install.InstallationId).GetAwaiter().GetResult();
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
{ {