mirror of
https://github.com/bitwarden/server.git
synced 2024-12-01 13:43:23 +01:00
4377c7a897
* Rewrite Icon fetching * Move validation to IconUri, Uri, or UriBuilder * `dotnet format` 🤖 * PR suggestions * Add not null compiler hint * Add twitter to test case * Move Uri manipulation to UriService * Implement MockedHttpClient Presents better, fluent handling of message matching and response building. * Add redirect handling tests * Add testing to models * More aggressively dispose content in icon link * Format 🤖 * Update icon lockfile * Convert to cloned stream for HttpResponseBuilder Content was being disposed when HttResponseMessage was being disposed. This avoids losing our reference to our content and allows multiple usages of the same `MockedHttpMessageResponse` * Move services to extension Extension is shared by testing and allows access to services from our service tests * Remove unused `using` * Prefer awaiting asyncs for better exception handling * `dotnet format` 🤖 * Await async * Update tests to use test TLD and ip ranges * Remove unused interfaces * Make assignments static when possible * Prefer invariant comparer to downcasing * Prefer injecting interface services to implementations * Prefer comparer set in HashSet initialization * Allow SVG icons * Filter out icons with unknown formats * Seek to beginning of MemoryStream after writing it * More appropriate to not return icon if it's invalid * Add svg icon test
88 lines
2.3 KiB
C#
88 lines
2.3 KiB
C#
using System.Globalization;
|
|
using Bit.Core.Settings;
|
|
using Bit.Core.Utilities;
|
|
using Bit.Icons.Extensions;
|
|
using Bit.SharedWeb.Utilities;
|
|
using Microsoft.Net.Http.Headers;
|
|
|
|
namespace Bit.Icons;
|
|
|
|
public class Startup
|
|
{
|
|
public Startup(IWebHostEnvironment env, IConfiguration configuration)
|
|
{
|
|
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
|
|
Configuration = configuration;
|
|
Environment = env;
|
|
}
|
|
|
|
public IConfiguration Configuration { get; }
|
|
public IWebHostEnvironment Environment { get; }
|
|
|
|
public void ConfigureServices(IServiceCollection services)
|
|
{
|
|
// Options
|
|
services.AddOptions();
|
|
|
|
// Settings
|
|
var globalSettings = services.AddGlobalSettingsServices(Configuration, Environment);
|
|
var iconsSettings = new IconsSettings();
|
|
ConfigurationBinder.Bind(Configuration.GetSection("IconsSettings"), iconsSettings);
|
|
services.AddSingleton(s => iconsSettings);
|
|
|
|
// Http client
|
|
services.ConfigureHttpClients();
|
|
|
|
// Add HtmlParser
|
|
services.AddHtmlParsing();
|
|
|
|
// Cache
|
|
services.AddMemoryCache(options =>
|
|
{
|
|
options.SizeLimit = iconsSettings.CacheSizeLimit;
|
|
});
|
|
|
|
// Services
|
|
services.AddServices();
|
|
|
|
// Mvc
|
|
services.AddMvc();
|
|
}
|
|
|
|
public void Configure(
|
|
IApplicationBuilder app,
|
|
IWebHostEnvironment env,
|
|
IHostApplicationLifetime appLifetime,
|
|
GlobalSettings globalSettings)
|
|
{
|
|
app.UseSerilog(env, appLifetime, globalSettings);
|
|
|
|
// Add general security headers
|
|
app.UseMiddleware<SecurityHeadersMiddleware>();
|
|
|
|
// Forwarding Headers
|
|
if (globalSettings.SelfHosted)
|
|
{
|
|
app.UseForwardedHeaders(globalSettings);
|
|
}
|
|
|
|
if (env.IsDevelopment())
|
|
{
|
|
app.UseDeveloperExceptionPage();
|
|
}
|
|
|
|
app.Use(async (context, next) =>
|
|
{
|
|
context.Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue
|
|
{
|
|
Public = true,
|
|
MaxAge = TimeSpan.FromDays(7)
|
|
};
|
|
await next();
|
|
});
|
|
|
|
app.UseRouting();
|
|
app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());
|
|
}
|
|
}
|