Merge pull request #11068 from umbraco/v9/bugfix/options-monitor-connection-strings

Fixes reading connection strings after install
This commit is contained in:
Bjarke Berg
2021-09-10 09:22:39 +02:00
committed by GitHub
9 changed files with 31 additions and 36 deletions

View File

@@ -219,7 +219,7 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection
builder.Services.AddSingleton<IMainDomLock>(factory =>
{
var globalSettings = factory.GetRequiredService<IOptions<GlobalSettings>>();
var connectionStrings = factory.GetRequiredService<IOptions<ConnectionStrings>>();
var connectionStrings = factory.GetRequiredService<IOptionsMonitor<ConnectionStrings>>();
var hostingEnvironment = factory.GetRequiredService<IHostingEnvironment>();
var dbCreator = factory.GetRequiredService<IDbProviderFactoryCreator>();

View File

@@ -22,37 +22,33 @@ namespace Umbraco.Cms.Infrastructure.Install
{
public sealed class InstallHelper
{
private static HttpClient _httpClient;
private readonly DatabaseBuilder _databaseBuilder;
private readonly ILogger<InstallHelper> _logger;
private readonly IUmbracoVersion _umbracoVersion;
private readonly ConnectionStrings _connectionStrings;
private readonly IOptionsMonitor<ConnectionStrings> _connectionStrings;
private readonly IInstallationService _installationService;
private readonly ICookieManager _cookieManager;
private readonly IUserAgentProvider _userAgentProvider;
private readonly IUmbracoDatabaseFactory _umbracoDatabaseFactory;
private readonly IJsonSerializer _jsonSerializer;
private InstallationType? _installationType;
public InstallHelper(DatabaseBuilder databaseBuilder,
ILogger<InstallHelper> logger,
IUmbracoVersion umbracoVersion,
IOptions<ConnectionStrings> connectionStrings,
IOptionsMonitor<ConnectionStrings> connectionStrings,
IInstallationService installationService,
ICookieManager cookieManager,
IUserAgentProvider userAgentProvider,
IUmbracoDatabaseFactory umbracoDatabaseFactory,
IJsonSerializer jsonSerializer)
IUmbracoDatabaseFactory umbracoDatabaseFactory)
{
_logger = logger;
_umbracoVersion = umbracoVersion;
_databaseBuilder = databaseBuilder;
_connectionStrings = connectionStrings.Value ?? throw new ArgumentNullException(nameof(connectionStrings));
_connectionStrings = connectionStrings;
_installationService = installationService;
_cookieManager = cookieManager;
_userAgentProvider = userAgentProvider;
_umbracoDatabaseFactory = umbracoDatabaseFactory;
_jsonSerializer = jsonSerializer;
//We need to initialize the type already, as we can't detect later, if the connection string is added on the fly.
GetInstallationType();
@@ -118,7 +114,7 @@ namespace Umbraco.Cms.Infrastructure.Install
{
get
{
var databaseSettings = _connectionStrings.UmbracoConnectionString;
var databaseSettings = _connectionStrings.CurrentValue.UmbracoConnectionString;
if (databaseSettings.IsConnectionStringConfigured() == false)
{
//no version or conn string configured, must be a brand new install

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
@@ -18,12 +18,12 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
{
private readonly DatabaseBuilder _databaseBuilder;
private readonly ILogger<DatabaseConfigureStep> _logger;
private readonly ConnectionStrings _connectionStrings;
private readonly IOptionsMonitor<ConnectionStrings> _connectionStrings;
public DatabaseConfigureStep(DatabaseBuilder databaseBuilder, IOptions<ConnectionStrings> connectionStrings, ILogger<DatabaseConfigureStep> logger)
public DatabaseConfigureStep(DatabaseBuilder databaseBuilder, IOptionsMonitor<ConnectionStrings> connectionStrings, ILogger<DatabaseConfigureStep> logger)
{
_databaseBuilder = databaseBuilder;
_connectionStrings = connectionStrings.Value ?? throw new ArgumentNullException(nameof(connectionStrings));
_connectionStrings = connectionStrings;
_logger = logger;
}
@@ -110,7 +110,7 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
private bool ShouldDisplayView()
{
//If the connection string is already present in web.config we don't need to show the settings page and we jump to installing/upgrading.
var databaseSettings = _connectionStrings.UmbracoConnectionString;
var databaseSettings = _connectionStrings.CurrentValue.UmbracoConnectionString;
if (databaseSettings.IsConnectionStringConfigured())
{

View File

@@ -24,20 +24,20 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
private readonly IRuntimeState _runtime;
private readonly ILogger<DatabaseUpgradeStep> _logger;
private readonly IUmbracoVersion _umbracoVersion;
private readonly ConnectionStrings _connectionStrings;
private readonly IOptionsMonitor<ConnectionStrings> _connectionStrings;
public DatabaseUpgradeStep(
DatabaseBuilder databaseBuilder,
IRuntimeState runtime,
ILogger<DatabaseUpgradeStep> logger,
IUmbracoVersion umbracoVersion,
IOptions<ConnectionStrings> connectionStrings)
IOptionsMonitor<ConnectionStrings> connectionStrings)
{
_databaseBuilder = databaseBuilder;
_runtime = runtime;
_logger = logger;
_umbracoVersion = umbracoVersion;
_connectionStrings = connectionStrings.Value ?? throw new ArgumentNullException(nameof(connectionStrings));
_connectionStrings = connectionStrings;
}
public override Task<InstallSetupResult> ExecuteAsync(object model)
@@ -77,7 +77,7 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
return false;
}
var databaseSettings = _connectionStrings.UmbracoConnectionString;
var databaseSettings = _connectionStrings.CurrentValue.UmbracoConnectionString;
if (databaseSettings.IsConnectionStringConfigured())
{

View File

@@ -30,10 +30,10 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
{
private readonly IUserService _userService;
private readonly DatabaseBuilder _databaseBuilder;
private static HttpClient _httpClient;
private readonly IHttpClientFactory _httpClientFactory;
private readonly UserPasswordConfigurationSettings _passwordConfiguration;
private readonly SecuritySettings _securitySettings;
private readonly ConnectionStrings _connectionStrings;
private readonly IOptionsMonitor<ConnectionStrings> _connectionStrings;
private readonly ICookieManager _cookieManager;
private readonly IBackOfficeUserManager _userManager;
private readonly IDbProviderFactoryCreator _dbProviderFactoryCreator;
@@ -41,18 +41,20 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
public NewInstallStep(
IUserService userService,
DatabaseBuilder databaseBuilder,
IHttpClientFactory httpClientFactory,
IOptions<UserPasswordConfigurationSettings> passwordConfiguration,
IOptions<SecuritySettings> securitySettings,
IOptions<ConnectionStrings> connectionStrings,
IOptionsMonitor<ConnectionStrings> connectionStrings,
ICookieManager cookieManager,
IBackOfficeUserManager userManager,
IDbProviderFactoryCreator dbProviderFactoryCreator)
{
_userService = userService ?? throw new ArgumentNullException(nameof(userService));
_databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder));
_httpClientFactory = httpClientFactory;
_passwordConfiguration = passwordConfiguration.Value ?? throw new ArgumentNullException(nameof(passwordConfiguration));
_securitySettings = securitySettings.Value ?? throw new ArgumentNullException(nameof(securitySettings));
_connectionStrings = connectionStrings.Value ?? throw new ArgumentNullException(nameof(connectionStrings));
_connectionStrings = connectionStrings;
_cookieManager = cookieManager;
_userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
_dbProviderFactoryCreator = dbProviderFactoryCreator ?? throw new ArgumentNullException(nameof(dbProviderFactoryCreator));
@@ -89,15 +91,14 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
if (user.SubscribeToNewsLetter)
{
if (_httpClient == null)
_httpClient = new HttpClient();
var values = new NameValueCollection { { "name", admin.Name }, { "email", admin.Email } };
var content = new StringContent(JsonConvert.SerializeObject(values), Encoding.UTF8, "application/json");
HttpClient httpClient = _httpClientFactory.CreateClient();
try
{
var response = _httpClient.PostAsync("https://shop.umbraco.com/base/Ecom/SubmitEmail/installer.aspx", content).Result;
var response = httpClient.PostAsync("https://shop.umbraco.com/base/Ecom/SubmitEmail/installer.aspx", content).Result;
}
catch { /* fail in silence */ }
}
@@ -140,7 +141,7 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps
// TODO: we need to do a null check here since this could be entirely missing and we end up with a null ref
// exception in the installer.
var databaseSettings = _connectionStrings.UmbracoConnectionString;
var databaseSettings = _connectionStrings.CurrentValue.UmbracoConnectionString;
var hasConnString = databaseSettings != null && _databaseBuilder.IsDatabaseConfigured;
if (hasConnString)

View File

@@ -80,7 +80,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence
ILogger<UmbracoDatabaseFactory> logger,
ILoggerFactory loggerFactory,
IOptions<GlobalSettings> globalSettings,
IOptions<ConnectionStrings> connectionStrings,
IOptionsMonitor<ConnectionStrings> connectionStrings,
IMapperCollection mappers,
IDbProviderFactoryCreator dbProviderFactoryCreator,
DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory,
@@ -95,7 +95,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_loggerFactory = loggerFactory;
var settings = connectionStrings.Value.UmbracoConnectionString;
var settings = connectionStrings.CurrentValue.UmbracoConnectionString;
if (settings == null)
{

View File

@@ -45,7 +45,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime
ILogger<SqlMainDomLock> logger,
ILoggerFactory loggerFactory,
IOptions<GlobalSettings> globalSettings,
IOptions<ConnectionStrings> connectionStrings,
IOptionsMonitor<ConnectionStrings> connectionStrings,
IDbProviderFactoryCreator dbProviderFactoryCreator,
IHostingEnvironment hostingEnvironment,
DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory,

View File

@@ -19,7 +19,7 @@ namespace Umbraco.Cms.Tests.Integration.Testing
{
private readonly ILoggerFactory _loggerFactory;
private readonly IOptions<GlobalSettings> _globalSettings;
private readonly IOptions<ConnectionStrings> _connectionStrings;
private readonly IOptionsMonitor<ConnectionStrings> _connectionStrings;
private readonly IMapperCollection _mappers;
private readonly IDbProviderFactoryCreator _dbProviderFactoryCreator;
private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory;
@@ -28,7 +28,7 @@ namespace Umbraco.Cms.Tests.Integration.Testing
public TestUmbracoDatabaseFactoryProvider(
ILoggerFactory loggerFactory,
IOptions<GlobalSettings> globalSettings,
IOptions<ConnectionStrings> connectionStrings,
IOptionsMonitor<ConnectionStrings> connectionStrings,
IMapperCollection mappers,
IDbProviderFactoryCreator dbProviderFactoryCreator,
DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory,

View File

@@ -22,8 +22,6 @@ using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Hosting;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Logging;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.PropertyEditors;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Core.Strings;
using Umbraco.Cms.Infrastructure.Migrations.Install;
@@ -54,7 +52,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Components
loggerFactory.CreateLogger<UmbracoDatabaseFactory>(),
loggerFactory,
Options.Create(globalSettings),
Options.Create(connectionStrings),
Mock.Of<IOptionsMonitor<ConnectionStrings>>(x => x.CurrentValue == connectionStrings),
new MapperCollection(() => Enumerable.Empty<BaseMapper>()),
TestHelper.DbProviderFactoryCreator,
new DatabaseSchemaCreatorFactory(loggerFactory.CreateLogger<DatabaseSchemaCreator>(), loggerFactory, new UmbracoVersion(), Mock.Of<IEventAggregator>()),