From b665099657bd2fa9f6ec6da9328fb540ca35fc09 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Thu, 23 Mar 2023 08:59:28 +0100 Subject: [PATCH 1/4] Updated reference for JSON schema to latest release of Forms 10. (#13996) --- src/JsonSchema/JsonSchema.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JsonSchema/JsonSchema.csproj b/src/JsonSchema/JsonSchema.csproj index 901f89e8b2..3d31dd265d 100644 --- a/src/JsonSchema/JsonSchema.csproj +++ b/src/JsonSchema/JsonSchema.csproj @@ -13,6 +13,6 @@ - + From 5598cc2491f32ca6329d2c1e7641b55cef09eb8f Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Thu, 23 Mar 2023 09:20:20 +0100 Subject: [PATCH 2/4] Convert path to absolute --- .../PropertyEditors/RichTextEditorPastedImages.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs b/src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs index 569f38139d..5044a5b13e 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs @@ -29,6 +29,7 @@ public sealed class RichTextEditorPastedImages private readonly IPublishedUrlProvider _publishedUrlProvider; private readonly IShortStringHelper _shortStringHelper; private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly string _tempFolderAbsolutePath; public RichTextEditorPastedImages( IUmbracoContextAccessor umbracoContextAccessor, @@ -52,6 +53,9 @@ public sealed class RichTextEditorPastedImages _mediaUrlGenerators = mediaUrlGenerators; _shortStringHelper = shortStringHelper; _publishedUrlProvider = publishedUrlProvider; + + _tempFolderAbsolutePath = _hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.TempImageUploads); + } /// @@ -85,12 +89,14 @@ public sealed class RichTextEditorPastedImages continue; } - if (IsValidPath(tmpImgPath) == false) + + var absoluteTempImagePath = Path.GetFullPath(_hostingEnvironment.MapPathContentRoot(tmpImgPath)); + + if (IsValidPath(absoluteTempImagePath) == false) { continue; } - var absoluteTempImagePath = _hostingEnvironment.MapPathContentRoot(tmpImgPath); var fileName = Path.GetFileName(absoluteTempImagePath); var safeFileName = fileName.ToSafeFileName(_shortStringHelper); @@ -191,5 +197,8 @@ public sealed class RichTextEditorPastedImages return htmlDoc.DocumentNode.OuterHtml; } - private bool IsValidPath(string imagePath) => imagePath.StartsWith(Constants.SystemDirectories.TempImageUploads); + private bool IsValidPath(string imagePath) + { + return imagePath.StartsWith(_tempFolderAbsolutePath); + } } From ce47281c04f20e476b99c1a178818d4aece80eab Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Thu, 30 Mar 2023 10:19:35 +0200 Subject: [PATCH 3/4] Determine correct if we can create a database with current connectionstring (#14030) * Fix CanForceCreateDatabase method and add some unit tests * Fixed an old copy/paste error * A little nitpicking over wording and formatting --------- Co-authored-by: kjac --- .../Constants.cs | 4 +- .../SqlAzureDatabaseProviderMetadata.cs | 20 ++++++++++ .../SqlLocalDbDatabaseProviderMetadata.cs | 21 +++++++++++ .../SqlServerDatabaseProviderMetadata.cs | 23 ++++++++++++ .../SqliteDatabaseProviderMetadata.cs | 20 ++++++++++ .../Install/InstallHelper.cs | 2 +- .../DatabaseProviderMetadataExtensions.cs | 27 +++++++++++++- .../Persistence/IDatabaseProviderMetadata.cs | 6 +++ .../Runtime/RuntimeState.cs | 2 +- .../SqAzureDatabaseProviderMetadataTests.cs | 37 +++++++++++++++++++ ...SqlLocalDbDatabaseProviderMetadataTests.cs | 37 +++++++++++++++++++ .../SqlServerDatabaseProviderMetadataTests.cs | 37 +++++++++++++++++++ .../SqliteDatabaseProviderMetadataTests.cs | 37 +++++++++++++++++++ .../Factories/DatabaseSettingsFactoryTests.cs | 2 + .../Umbraco.Tests.UnitTests.csproj | 1 + 15 files changed, 271 insertions(+), 5 deletions(-) create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqAzureDatabaseProviderMetadataTests.cs create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlLocalDbDatabaseProviderMetadataTests.cs create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlServerDatabaseProviderMetadataTests.cs create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.Sqlite/SqliteDatabaseProviderMetadataTests.cs diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Constants.cs b/src/Umbraco.Cms.Persistence.SqlServer/Constants.cs index ae16a9735f..6b5099b314 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Constants.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Constants.cs @@ -1,12 +1,12 @@ namespace Umbraco.Cms.Persistence.SqlServer; /// -/// Constants related to SQLite. +/// Constants related to SQL Server. /// public static class Constants { /// - /// SQLite provider name. + /// SQL Server provider name. /// public const string ProviderName = "Microsoft.Data.SqlClient"; } diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlAzureDatabaseProviderMetadata.cs b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlAzureDatabaseProviderMetadata.cs index 112d556712..95dda5fe7b 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlAzureDatabaseProviderMetadata.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlAzureDatabaseProviderMetadata.cs @@ -1,4 +1,5 @@ using System.Runtime.Serialization; +using Microsoft.Data.SqlClient; using Umbraco.Cms.Core.Install.Models; using Umbraco.Cms.Infrastructure.Persistence; using Umbraco.Extensions; @@ -50,6 +51,25 @@ public class SqlAzureDatabaseProviderMetadata : IDatabaseProviderMetadata /// public bool ForceCreateDatabase => false; + /// + public bool CanRecognizeConnectionString(string? connectionString) + { + if (connectionString is null) + { + return false; + } + + try + { + var builder = new SqlConnectionStringBuilder(connectionString); + + return string.IsNullOrEmpty(builder.AttachDBFilename) && builder.DataSource.Contains("database.windows.net"); + } + catch (ArgumentException) + { + return false; + } + } /// public string GenerateConnectionString(DatabaseModel databaseModel) { diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlLocalDbDatabaseProviderMetadata.cs b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlLocalDbDatabaseProviderMetadata.cs index 30a503e5f9..589ef5a623 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlLocalDbDatabaseProviderMetadata.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlLocalDbDatabaseProviderMetadata.cs @@ -51,6 +51,27 @@ public class SqlLocalDbDatabaseProviderMetadata : IDatabaseProviderMetadata /// public bool ForceCreateDatabase => true; + /// + public bool CanRecognizeConnectionString(string? connectionString) + { + if (connectionString is null) + { + return false; + } + + try + { + var builder = new SqlConnectionStringBuilder(connectionString); + + return !string.IsNullOrEmpty(builder.AttachDBFilename); + + } + catch (ArgumentException) + { + return false; + } + } + /// public string GenerateConnectionString(DatabaseModel databaseModel) { diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs index 8b36736804..edb44700d8 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs @@ -1,6 +1,9 @@ +using System.Data.Common; using System.Runtime.Serialization; +using Microsoft.Data.SqlClient; using Umbraco.Cms.Core.Install.Models; using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Extensions; namespace Umbraco.Cms.Persistence.SqlServer.Services; @@ -49,6 +52,26 @@ public class SqlServerDatabaseProviderMetadata : IDatabaseProviderMetadata /// public bool ForceCreateDatabase => false; + /// + public bool CanRecognizeConnectionString(string? connectionString) + { + if (connectionString is null) + { + return false; + } + + try + { + var builder = new SqlConnectionStringBuilder(connectionString); + + return string.IsNullOrEmpty(builder.AttachDBFilename); + } + catch (ArgumentException) + { + return false; + } + } + /// public string GenerateConnectionString(DatabaseModel databaseModel) => databaseModel.IntegratedAuth diff --git a/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDatabaseProviderMetadata.cs b/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDatabaseProviderMetadata.cs index 54a7a5cb1d..d087acc8cb 100644 --- a/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDatabaseProviderMetadata.cs +++ b/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDatabaseProviderMetadata.cs @@ -56,6 +56,26 @@ public class SqliteDatabaseProviderMetadata : IDatabaseProviderMetadata /// public bool ForceCreateDatabase => true; + /// + public bool CanRecognizeConnectionString(string? connectionString) + { + if (connectionString is null) + { + return false; + } + + try + { + var builder = new SqliteConnectionStringBuilder(connectionString); + + return !string.IsNullOrEmpty(builder.DataSource); + + } + catch (ArgumentException) + { + return false; + } + } /// public string GenerateConnectionString(DatabaseModel databaseModel) { diff --git a/src/Umbraco.Infrastructure/Install/InstallHelper.cs b/src/Umbraco.Infrastructure/Install/InstallHelper.cs index 9305c4444e..0ea4a1a84c 100644 --- a/src/Umbraco.Infrastructure/Install/InstallHelper.cs +++ b/src/Umbraco.Infrastructure/Install/InstallHelper.cs @@ -164,7 +164,7 @@ namespace Umbraco.Cms.Infrastructure.Install private bool IsBrandNewInstall => _connectionStrings.CurrentValue.IsConnectionStringConfigured() == false || _databaseBuilder.IsDatabaseConfigured == false || - (_databaseBuilder.CanConnectToDatabase == false && _databaseProviderMetadata.CanForceCreateDatabase(_umbracoDatabaseFactory.SqlContext.SqlSyntax.DbProvider)) || + (_databaseBuilder.CanConnectToDatabase == false && _databaseProviderMetadata.CanForceCreateDatabase(_umbracoDatabaseFactory)) || _databaseBuilder.IsUmbracoInstalled() == false; } } diff --git a/src/Umbraco.Infrastructure/Persistence/DatabaseProviderMetadataExtensions.cs b/src/Umbraco.Infrastructure/Persistence/DatabaseProviderMetadataExtensions.cs index 1ea941932e..09c0a121dc 100644 --- a/src/Umbraco.Infrastructure/Persistence/DatabaseProviderMetadataExtensions.cs +++ b/src/Umbraco.Infrastructure/Persistence/DatabaseProviderMetadataExtensions.cs @@ -1,4 +1,5 @@ using Umbraco.Cms.Core.Install.Models; +using Umbraco.Cms.Infrastructure.Persistence.SqlSyntax; namespace Umbraco.Cms.Infrastructure.Persistence; @@ -26,8 +27,32 @@ public static class DatabaseProviderMetadataExtensions /// /// true if a database can be created for the specified provider name; otherwise, false. /// + [Obsolete("Use CanForceCreateDatabase that takes an IUmbracoDatabaseFactory. Scheduled for removal in Umbraco 13.")] public static bool CanForceCreateDatabase(this IEnumerable databaseProviderMetadata, string? providerName) - => databaseProviderMetadata.FirstOrDefault(x => string.Equals(x.ProviderName, providerName, StringComparison.InvariantCultureIgnoreCase))?.ForceCreateDatabase == true; + { + return databaseProviderMetadata + .FirstOrDefault(x => + string.Equals(x.ProviderName, providerName, StringComparison.InvariantCultureIgnoreCase)) + ?.ForceCreateDatabase == true; + } + + /// + /// Determines whether a database can be created for the specified provider name while ignoring the value of . + /// + /// The database provider metadata. + /// The database factory. + /// + /// true if a database can be created for the specified database; otherwise, false. + /// + public static bool CanForceCreateDatabase(this IEnumerable databaseProviderMetadata, IUmbracoDatabaseFactory umbracoDatabaseFactory) + { + // In case more metadata providers can recognize the connection string, we need to check if any can force create. + // E.g. Both SqlServer and SqlAzure will recognize an azure connection string, but luckily none of those can force create. + return databaseProviderMetadata + .Where(x => + string.Equals(x.ProviderName, umbracoDatabaseFactory.SqlContext.SqlSyntax.ProviderName, StringComparison.InvariantCultureIgnoreCase) + && x.CanRecognizeConnectionString(umbracoDatabaseFactory.ConnectionString) && x.IsAvailable).Any(x => x.ForceCreateDatabase == true); + } /// /// Generates the connection string. diff --git a/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs b/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs index 1c06dd089f..55a7c3a686 100644 --- a/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs +++ b/src/Umbraco.Infrastructure/Persistence/IDatabaseProviderMetadata.cs @@ -82,6 +82,12 @@ public interface IDatabaseProviderMetadata /// public bool ForceCreateDatabase { get; } + + /// + /// Gets a value indicating whether this connections could have been build using . + /// + public bool CanRecognizeConnectionString(string? connectionString) => false; + /// /// Creates a connection string for this provider. /// diff --git a/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs b/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs index 74b00d3644..ec1cfc5d6e 100644 --- a/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs +++ b/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs @@ -210,7 +210,7 @@ public class RuntimeState : IRuntimeState // cannot connect to configured database, this is bad, fail _logger.LogDebug("Could not connect to database."); - if (_globalSettings.Value.InstallMissingDatabase || _databaseProviderMetadata.CanForceCreateDatabase(_databaseFactory.ProviderName)) + if (_globalSettings.Value.InstallMissingDatabase || _databaseProviderMetadata.CanForceCreateDatabase(_databaseFactory)) { // ok to install on a configured but missing database Level = RuntimeLevel.Install; diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqAzureDatabaseProviderMetadataTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqAzureDatabaseProviderMetadataTests.cs new file mode 100644 index 0000000000..e945eeae07 --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqAzureDatabaseProviderMetadataTests.cs @@ -0,0 +1,37 @@ +using NUnit.Framework; +using Umbraco.Cms.Core.Install.Models; +using Umbraco.Cms.Persistence.SqlServer.Services; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Persistence.SqlServer; + +[TestFixture] +public class SqlAzureDatabaseProviderMetadataTests +{ + [Test] + [TestCase("myServer", "myDatabase", "myLogin", "myPassword", true /*ignored*/, ExpectedResult = "Server=tcp:myServer.database.windows.net,1433;Database=myDatabase;User ID=myLogin@myServer;Password=myPassword")] + [TestCase("myServer", "myDatabase", "myLogin", "myPassword", false, ExpectedResult = "Server=tcp:myServer.database.windows.net,1433;Database=myDatabase;User ID=myLogin@myServer;Password=myPassword")] + public string GenerateConnectionString(string server, string databaseName, string login, string password, bool integratedAuth) + { + var sut = new SqlAzureDatabaseProviderMetadata(); + return sut.GenerateConnectionString(new DatabaseModel() + { + DatabaseName = databaseName, + Login = login, + Password = password, + Server = server, + IntegratedAuth = integratedAuth + }); + } + + [Test] + [TestCase("Server=myServer;Database=myDatabase;Integrated Security=true", ExpectedResult = false)] // SqlServer + [TestCase("Server=myServer;Database=myDatabase;User Id=myLogin;Password=myPassword", ExpectedResult = false)] // SqlServer + [TestCase("Server=tcp:cmstest27032000.database.windows.net,1433;Database=test_27032000;User ID=asdasdas@cmstest27032000;Password=123456879", ExpectedResult = true)] // Azure + [TestCase("Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True", ExpectedResult = false)] // Sqlite + [TestCase("Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=aspnet-MvcMovie;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\\umbraco.mdf", ExpectedResult = false)] // localDB + public bool CanRecognizeConnectionString(string connectionString) + { + var sut = new SqlAzureDatabaseProviderMetadata(); + return sut.CanRecognizeConnectionString(connectionString); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlLocalDbDatabaseProviderMetadataTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlLocalDbDatabaseProviderMetadataTests.cs new file mode 100644 index 0000000000..24728a6c3e --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlLocalDbDatabaseProviderMetadataTests.cs @@ -0,0 +1,37 @@ +using NUnit.Framework; +using Umbraco.Cms.Core.Install.Models; +using Umbraco.Cms.Persistence.SqlServer.Services; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Persistence.SqlServer; + +[TestFixture] +public class SqlLocalDbDatabaseProviderMetadataTests +{ + [Test] + [TestCase("ignored", "myDatabase", "ignored", "ignored", true, ExpectedResult = "Data Source=(localdb)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\myDatabase.mdf;Integrated Security=True")] + [TestCase("ignored", "myDatabase2", "ignored", "ignored", false /*ignored*/, ExpectedResult = "Data Source=(localdb)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\myDatabase2.mdf;Integrated Security=True")] + public string GenerateConnectionString(string server, string databaseName, string login, string password, bool integratedAuth) + { + var sut = new SqlLocalDbDatabaseProviderMetadata(); + return sut.GenerateConnectionString(new DatabaseModel() + { + DatabaseName = databaseName, + Login = login, + Password = password, + Server = server, + IntegratedAuth = integratedAuth, + }); + } + + [Test] + [TestCase("Server=myServer;Database=myDatabase;Integrated Security=true", ExpectedResult = false)] // SqlServer + [TestCase("Server=myServer;Database=myDatabase;User Id=myLogin;Password=myPassword", ExpectedResult = false)] // SqlServer + [TestCase("Server=tcp:cmstest27032000.database.windows.net,1433;Database=test_27032000;User ID=asdasdas@cmstest27032000;Password=123456879", ExpectedResult = false)] // Azure + [TestCase("Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True", ExpectedResult = false)] // Sqlite + [TestCase("Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=aspnet-MvcMovie;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\\umbraco.mdf", ExpectedResult = true)] // localDB + public bool CanRecognizeConnectionString(string connectionString) + { + var sut = new SqlLocalDbDatabaseProviderMetadata(); + return sut.CanRecognizeConnectionString(connectionString); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlServerDatabaseProviderMetadataTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlServerDatabaseProviderMetadataTests.cs new file mode 100644 index 0000000000..4e96c375e1 --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.SqlServer/SqlServerDatabaseProviderMetadataTests.cs @@ -0,0 +1,37 @@ +using NUnit.Framework; +using Umbraco.Cms.Core.Install.Models; +using Umbraco.Cms.Persistence.SqlServer.Services; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Persistence.SqlServer; + +[TestFixture] +public class SqlServerDatabaseProviderMetadataTests +{ + [Test] + [TestCase("myServer", "myDatabase", "myLogin", "myPassword", true, ExpectedResult = "Server=myServer;Database=myDatabase;Integrated Security=true")] + [TestCase("myServer", "myDatabase", "myLogin", "myPassword", false, ExpectedResult = "Server=myServer;Database=myDatabase;User Id=myLogin;Password=myPassword")] + public string GenerateConnectionString(string server, string databaseName, string login, string password, bool integratedAuth) + { + var sut = new SqlServerDatabaseProviderMetadata(); + return sut.GenerateConnectionString(new DatabaseModel() + { + DatabaseName = databaseName, + Login = login, + Password = password, + Server = server, + IntegratedAuth = integratedAuth + }); + } + + [Test] + [TestCase("Server=myServer;Database=myDatabase;Integrated Security=true", ExpectedResult = true)] // SqlServer + [TestCase("Server=myServer;Database=myDatabase;User Id=myLogin;Password=myPassword", ExpectedResult = true)] // SqlServer + [TestCase("Server=tcp:cmstest27032000.database.windows.net,1433;Database=test_27032000;User ID=asdasdas@cmstest27032000;Password=123456879", ExpectedResult = true)] // Azure + [TestCase("Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True", ExpectedResult = false)] // Sqlite + [TestCase("Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=aspnet-MvcMovie;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\\umbraco.mdf", ExpectedResult = false)] // localDB + public bool CanRecognizeConnectionString(string connectionString) + { + var sut = new SqlServerDatabaseProviderMetadata(); + return sut.CanRecognizeConnectionString(connectionString); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.Sqlite/SqliteDatabaseProviderMetadataTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.Sqlite/SqliteDatabaseProviderMetadataTests.cs new file mode 100644 index 0000000000..63eb6c86fd --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Persistence.Sqlite/SqliteDatabaseProviderMetadataTests.cs @@ -0,0 +1,37 @@ +using NUnit.Framework; +using Umbraco.Cms.Core.Install.Models; +using Umbraco.Cms.Persistence.Sqlite.Services; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Persistence.Sqlite; + +[TestFixture] +public class SqliteDatabaseProviderMetadataTests +{ + [Test] + [TestCase("ignored", "myDatabase", "ignored", "ignored", true /*ignored*/, ExpectedResult = "Data Source=|DataDirectory|/myDatabase.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True")] + [TestCase("ignored", "myDatabase2", "ignored", "ignored", false /*ignored*/, ExpectedResult = "Data Source=|DataDirectory|/myDatabase2.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True")] + public string GenerateConnectionString(string server, string databaseName, string login, string password, bool integratedAuth) + { + var sut = new SqliteDatabaseProviderMetadata(); + return sut.GenerateConnectionString(new DatabaseModel() + { + DatabaseName = databaseName, + Login = login, + Password = password, + Server = server, + IntegratedAuth = integratedAuth + }); + } + + [Test] + [TestCase("Server=myServer;Database=myDatabase;Integrated Security=true", ExpectedResult = false)] // SqlServer + [TestCase("Server=myServer;Database=myDatabase;User Id=myLogin;Password=myPassword", ExpectedResult = false)] // SqlServer + [TestCase("Server=tcp:cmstest27032000.database.windows.net,1433;Database=test_27032000;User ID=asdasdas@cmstest27032000;Password=123456879", ExpectedResult = false)] // Azure + [TestCase("Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True", ExpectedResult = true)] // Sqlite + [TestCase("Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=aspnet-MvcMovie;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\\umbraco.mdf", ExpectedResult = false)] // localDB + public bool CanRecognizeConnectionString(string connectionString) + { + var sut = new SqliteDatabaseProviderMetadata(); + return sut.CanRecognizeConnectionString(connectionString); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.New.Cms.Infrastructure/Factories/DatabaseSettingsFactoryTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.New.Cms.Infrastructure/Factories/DatabaseSettingsFactoryTests.cs index fd2c7315b0..82beaeeab9 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.New.Cms.Infrastructure/Factories/DatabaseSettingsFactoryTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.New.Cms.Infrastructure/Factories/DatabaseSettingsFactoryTests.cs @@ -177,6 +177,8 @@ public class DatabaseSettingsFactoryTests public Func GenerateConnectionStringDelegate { get; set; } = _ => "ConnectionString"; + public bool CanRecognizeConnectionString(string? connectionString) => false; + public string? GenerateConnectionString(DatabaseModel databaseModel) => GenerateConnectionStringDelegate(databaseModel); } } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj index fcbb4d6908..8b6085bf6d 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj @@ -16,6 +16,7 @@ + From 8e32ac3e20312c7f8317d1b026b7367366685470 Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Wed, 12 Apr 2023 09:35:23 +0200 Subject: [PATCH 4/4] Bump to non-rc --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 8fc9e69f4e..4c30184f1a 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "10.5.0-rc", + "version": "10.5.0", "assemblyVersion": { "precision": "build" },