diff --git a/build/Build.proj b/build/Build.proj index 73c06c80e3..db0138ccc6 100644 --- a/build/Build.proj +++ b/build/Build.proj @@ -1,3 +1,4 @@ + - + + + + + + + + + diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 7ab6fa3490..0acf98f842 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -158,7 +158,7 @@ namespace Umbraco.Core } else if (databaseProvider.ToLower().Contains("azure")) { - connectionString = string.Format("Server=tcp:{0}.database.windows.net;Database={1};User ID={2}@{0};Password={3}", server, databaseName, user, password); + connectionString = BuildAzureConnectionString(server, databaseName, user, password); } else { @@ -169,6 +169,52 @@ namespace Umbraco.Core Initialize(providerName); } + internal string BuildAzureConnectionString(string server, string databaseName, string user, string password) + { + if (server.Contains(".") && ServerStartsWithTcp(server) == false) + server = string.Format("tcp:{0}", server); + + if (server.Contains(".") == false && ServerStartsWithTcp(server)) + { + string serverName = server.Contains(",") + ? server.Substring(0, server.IndexOf(",", StringComparison.Ordinal)) + : server; + + var portAddition = string.Empty; + + if (server.Contains(",")) + portAddition = server.Substring(server.IndexOf(",", StringComparison.Ordinal)); + + server = string.Format("{0}.database.windows.net{1}", serverName, portAddition); + } + + if (ServerStartsWithTcp(server) == false) + server = string.Format("tcp:{0}.database.windows.net", server); + + if (server.Contains(",") == false) + server = string.Format("{0},1433", server); + + if (user.Contains("@") == false) + { + var userDomain = server; + + if (ServerStartsWithTcp(server)) + userDomain = userDomain.Substring(userDomain.IndexOf(":", StringComparison.Ordinal) + 1); + + if (userDomain.Contains(".")) + userDomain = userDomain.Substring(0, userDomain.IndexOf(".", StringComparison.Ordinal)); + + user = string.Format("{0}@{1}", user, userDomain); + } + + return string.Format("Server={0};Database={1};User ID={2};Password={3}", server, databaseName, user, password); + } + + private static bool ServerStartsWithTcp(string server) + { + return server.ToLower().StartsWith("tcp:".ToLower()); + } + /// /// Saves the connection string as a proper .net ConnectionString and the legacy AppSettings key/value. /// @@ -232,7 +278,8 @@ namespace Umbraco.Core /// internal void Initialize() { - if (ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName] != null) + var databaseSettings = ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName]; + if (databaseSettings != null && string.IsNullOrWhiteSpace(databaseSettings.ConnectionString) == false && string.IsNullOrWhiteSpace(databaseSettings.ProviderName) == false) { var providerName = "System.Data.SqlClient"; if (!string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ProviderName)) @@ -254,8 +301,7 @@ namespace Umbraco.Core { ConfigureEmbeddedDatabaseConnection(); } - else if (legacyConnString.ToLowerInvariant().Contains("database.windows.net") && - legacyConnString.ToLowerInvariant().Contains("tcp:")) + else if (legacyConnString.ToLowerInvariant().Contains("tcp:")) { //Must be sql azure SaveConnectionString(legacyConnString, "System.Data.SqlClient"); diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index d7c155a90c..a2be51720b 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -85,5 +85,31 @@ namespace Umbraco.Tests.Persistence Assert.That(umbracoUserTable, Is.True); Assert.That(cmsTagsTable, Is.True); } + + [TestCase("MyServer", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("MyServer", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer,1433", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer,1433", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net,1433", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net,1433", "MyDatabase", "MyUser@MyServer", "MyPassword")] + public void Build_Azure_Connection_String_Regular(string server, string databaseName, string userName, string password) + { + var connectionString = _dbContext.BuildAzureConnectionString(server, databaseName, userName, password); + Assert.AreEqual(connectionString, "Server=tcp:MyServer.database.windows.net,1433;Database=MyDatabase;User ID=MyUser@MyServer;Password=MyPassword"); + } + + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com,1433", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com,1433", "MyDatabase", "MyUser@kzeej5z8ty", "MyPassword")] + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com", "MyDatabase", "MyUser@kzeej5z8ty", "MyPassword")] + public void Build_Azure_Connection_String_CustomServer(string server, string databaseName, string userName, string password) + { + var connectionString = _dbContext.BuildAzureConnectionString(server, databaseName, userName, password); + Assert.AreEqual(connectionString, "Server=tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com,1433;Database=MyDatabase;User ID=MyUser@kzeej5z8ty;Password=MyPassword"); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs index 19e4ec1020..6be3712f8e 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicPublishedContentTests.cs @@ -1,7 +1,9 @@ using System; +using System.IO; using System.Linq; using NUnit.Framework; using Umbraco.Core; +using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; using Umbraco.Web; @@ -22,6 +24,8 @@ namespace Umbraco.Tests.PublishedContent typeof(YesNoPropertyEditorValueConverter) }); + UmbracoSettings.SettingsFilePath = Core.IO.IOHelper.MapPath(Core.IO.SystemDirectories.Config + Path.DirectorySeparatorChar, false); + PublishedContentStoreResolver.Current = new PublishedContentStoreResolver(new DefaultPublishedContentStore()); //need to specify a custom callback for unit tests diff --git a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs index 7d8c136d55..909ce35bd1 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs @@ -27,7 +27,6 @@ namespace Umbraco.Tests.Routing return new DefaultRoutesCache(false); } - void InitializeLanguagesAndDomains() { var domains = Domain.GetDomains(); diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index f227411371..67e07cb7b8 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -121,6 +121,7 @@ namespace Umbraco.Tests.TestHelpers AppDomain.CurrentDomain.SetData("DataDirectory", null); PluginManager.Current = null; + SettingsForTests.Reset(); UmbracoSettings.ResetSetters(); try @@ -134,8 +135,10 @@ namespace Umbraco.Tests.TestHelpers catch (Exception ex) { LogHelper.Error("Could not remove the old database file", ex); - + //We will swallow this exception! That's because a sub class might require further teardown logic. + } + } } diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs index e9437b1d98..99af05579e 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseTest.cs @@ -33,8 +33,7 @@ namespace Umbraco.Tests.TestHelpers string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); - //If the Database Provider is Sql Ce we need to ensure the database - if (ProviderName.Contains("SqlServerCe")) + try { try { @@ -54,11 +53,16 @@ namespace Umbraco.Tests.TestHelpers } UmbracoSettings.UseLegacyXmlSchema = false; - - //Create the Sql CE database - var engine = new SqlCeEngine(ConnectionString); - engine.CreateDatabase(); } + catch (Exception) + { + //if this doesn't work we have to make sure everything is reset! otherwise + // well run into issues because we've already set some things up + TearDown(); + throw; + } + + UmbracoSettings.UseLegacyXmlSchema = false; RepositoryResolver.Current = new RepositoryResolver( new RepositoryFactory()); diff --git a/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs b/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs index 69525d361d..cc7873afbf 100644 --- a/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs +++ b/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs @@ -52,8 +52,6 @@ namespace Umbraco.Tests.TestHelpers SaveSetting("umbracoReservedPaths"); SaveSetting("umbracoReservedUrls"); SaveSetting("umbracoConfigurationStatus"); - - SaveSetting(GlobalSettings.UmbracoConnectionName); } public static bool HideTopLevelNodeFromPath diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 74a9d7309b..fe7ffe8a7e 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -269,6 +269,7 @@ + diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config index 0075c105c0..75ee09afef 100644 --- a/src/Umbraco.Web.UI/web.Template.config +++ b/src/Umbraco.Web.UI/web.Template.config @@ -79,7 +79,11 @@ - + + + + + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadNodeTypes.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadNodeTypes.cs index 8a0b143521..1dca0daa7d 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadNodeTypes.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadNodeTypes.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Text; using Umbraco.Core.Services; using umbraco.businesslogic; @@ -57,7 +58,7 @@ function openNodeType(id) { public override void Render(ref XmlTree tree) { - var docTypes = Service.GetContentTypeChildren(base.m_id); + var docTypes = Service.GetContentTypeChildren(base.m_id).OrderBy(x => x.Name); foreach (var docType in docTypes) { diff --git a/src/umbraco.providers/members/MembersProfileProvider.cs b/src/umbraco.providers/members/MembersProfileProvider.cs index ef3f6c14e3..bd8f6a5ce7 100644 --- a/src/umbraco.providers/members/MembersProfileProvider.cs +++ b/src/umbraco.providers/members/MembersProfileProvider.cs @@ -153,7 +153,7 @@ namespace umbraco.providers.members { if (m.getProperty(spv.Name) != null) m.getProperty(spv.Name).Value = spv.PropertyValue; } - + m.Save(); } } }