diff --git a/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs b/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs index d8a07d7bbc..19ad5614b4 100644 --- a/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs +++ b/src/Umbraco.Abstractions/Hosting/IHostingEnvironment.cs @@ -7,5 +7,10 @@ namespace Umbraco.Core.Hosting string ApplicationPhysicalPath { get; } string LocalTempPath { get; } + string ApplicationVirtualPath { get; } + + bool IsDebugMode { get; } + bool IsHosted { get; } + string MapPath(string path); } } diff --git a/src/Umbraco.Core/Composing/Current.cs b/src/Umbraco.Core/Composing/Current.cs index 3661695c54..bfd323a31d 100644 --- a/src/Umbraco.Core/Composing/Current.cs +++ b/src/Umbraco.Core/Composing/Current.cs @@ -2,6 +2,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Dictionary; +using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Mapping; @@ -210,6 +211,8 @@ namespace Umbraco.Core.Composing public static IUmbracoVersion UmbracoVersion => Factory.GetInstance(); + public static IHostingEnvironment HostingEnvironment => Factory.GetInstance(); + #endregion } } diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index df5e568e1a..61ac1f72c8 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Web; using System.Web.Hosting; +using Umbraco.Core.Composing; namespace Umbraco.Core.IO { @@ -297,7 +298,7 @@ namespace Umbraco.Core.IO { if (_root != null) return _root; - var appPath = HttpRuntime.AppDomainAppVirtualPath; + var appPath = HostingEnvironment.ApplicationVirtualPath; // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (appPath == null || appPath == "/") appPath = string.Empty; diff --git a/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs b/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs index 951d6f8787..86f9ff3f6b 100644 --- a/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs +++ b/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs @@ -1,12 +1,12 @@ using System; using System.Text; -using System.Web; using Serilog; using Serilog.Configuration; using Serilog.Core; using Serilog.Events; using Serilog.Formatting; using Serilog.Formatting.Compact; +using Umbraco.Core.Hosting; using Umbraco.Core.Logging.Serilog.Enrichers; namespace Umbraco.Core.Logging.Serilog @@ -14,13 +14,15 @@ namespace Umbraco.Core.Logging.Serilog public static class LoggerConfigExtensions { private const string AppDomainId = "AppDomainId"; + /// /// This configures Serilog with some defaults /// Such as adding ProcessID, Thread, AppDomain etc /// It is highly recommended that you keep/use this default in your own logging config customizations /// /// A Serilog LoggerConfiguration - public static LoggerConfiguration MinimalConfiguration(this LoggerConfiguration logConfig) + /// + public static LoggerConfiguration MinimalConfiguration(this LoggerConfiguration logConfig, IHostingEnvironment hostingEnvironment) { global::Serilog.Debugging.SelfLog.Enable(msg => System.Diagnostics.Debug.WriteLine(msg)); @@ -34,7 +36,7 @@ namespace Umbraco.Core.Logging.Serilog .Enrich.WithProcessName() .Enrich.WithThreadId() .Enrich.WithProperty(AppDomainId, AppDomain.CurrentDomain.Id) - .Enrich.WithProperty("AppDomainAppId", HttpRuntime.AppDomainAppId.ReplaceNonAlphanumericChars(string.Empty)) + .Enrich.WithProperty("AppDomainAppId", hostingEnvironment.ApplicationId.ReplaceNonAlphanumericChars(string.Empty)) .Enrich.WithProperty("MachineName", Environment.MachineName) .Enrich.With() .Enrich.With() diff --git a/src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs b/src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs index a51628030e..40be4e0079 100644 --- a/src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs +++ b/src/Umbraco.Core/Logging/Serilog/SerilogLogger.cs @@ -5,8 +5,8 @@ using System.Threading; using Serilog; using Serilog.Events; using Umbraco.Core.Composing; -using Umbraco.Core.Configuration; using Umbraco.Core.Diagnostics; +using Umbraco.Core.Hosting; namespace Umbraco.Core.Logging.Serilog { @@ -36,11 +36,11 @@ namespace Umbraco.Core.Logging.Serilog /// Creates a logger with some pre-defined configuration and remainder from config file /// /// Used by UmbracoApplicationBase to get its logger. - public static SerilogLogger CreateWithDefaultConfiguration() + public static SerilogLogger CreateWithDefaultConfiguration(IHostingEnvironment hostingEnvironment) { var loggerConfig = new LoggerConfiguration(); loggerConfig - .MinimalConfiguration() + .MinimalConfiguration(hostingEnvironment) .ReadFromConfigFile() .ReadFromUserConfigFile(); diff --git a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs b/src/Umbraco.Core/Runtime/CoreInitialComposer.cs index 143e22943b..71b984f4a0 100644 --- a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Core/Runtime/CoreInitialComposer.cs @@ -104,7 +104,6 @@ namespace Umbraco.Core.Runtime factory.GetInstance(), factory.GetInstance(), true, new DatabaseServerMessengerOptions(), - factory.GetInstance(), factory.GetInstance() )); diff --git a/src/Umbraco.Core/Runtime/CoreRuntime.cs b/src/Umbraco.Core/Runtime/CoreRuntime.cs index d7313ab86d..03ed51c280 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Core/Runtime/CoreRuntime.cs @@ -46,7 +46,7 @@ namespace Umbraco.Core.Runtime Configs.Settings(), Configs.Global(), new Lazy(() => _factory.GetInstance()), new Lazy(() => _factory.GetInstance()), - UmbracoVersion) + UmbracoVersion,HostingEnvironment) { Level = RuntimeLevel.Boot }; diff --git a/src/Umbraco.Core/RuntimeState.cs b/src/Umbraco.Core/RuntimeState.cs index e0ce17f769..9931942de2 100644 --- a/src/Umbraco.Core/RuntimeState.cs +++ b/src/Umbraco.Core/RuntimeState.cs @@ -6,6 +6,7 @@ using Semver; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Exceptions; +using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.Core.Migrations.Upgrade; using Umbraco.Core.Persistence; @@ -26,12 +27,14 @@ namespace Umbraco.Core private readonly Lazy _mainDom; private readonly Lazy _serverRegistrar; private readonly IUmbracoVersion _umbracoVersion; + private readonly IHostingEnvironment _hostingEnvironment; /// /// Initializes a new instance of the class. /// public RuntimeState(ILogger logger, IUmbracoSettingsSection settings, IGlobalSettings globalSettings, - Lazy mainDom, Lazy serverRegistrar, IUmbracoVersion umbracoVersion) + Lazy mainDom, Lazy serverRegistrar, IUmbracoVersion umbracoVersion, + IHostingEnvironment hostingEnvironment) { _logger = logger; _settings = settings; @@ -39,6 +42,9 @@ namespace Umbraco.Core _mainDom = mainDom; _serverRegistrar = serverRegistrar; _umbracoVersion = umbracoVersion; + _hostingEnvironment = hostingEnvironment; + + ApplicationVirtualPath = _hostingEnvironment.ApplicationVirtualPath; } /// @@ -67,7 +73,7 @@ namespace Umbraco.Core public SemVersion SemanticVersion => _umbracoVersion.SemanticVersion; /// - public bool Debug => HttpContext.Current != null ? HttpContext.Current.IsDebuggingEnabled : _globalSettings.DebugMode; + public bool Debug => _hostingEnvironment.IsDebugMode; /// public bool IsMainDom => MainDom.IsMainDom; @@ -79,7 +85,7 @@ namespace Umbraco.Core public Uri ApplicationUrl { get; private set; } /// - public string ApplicationVirtualPath { get; } = HttpRuntime.AppDomainAppVirtualPath; + public string ApplicationVirtualPath { get; } /// public string CurrentMigrationState { get; internal set; } diff --git a/src/Umbraco.Core/Security/MembershipProviderBase.cs b/src/Umbraco.Core/Security/MembershipProviderBase.cs index aa0ef43b5c..298f849591 100644 --- a/src/Umbraco.Core/Security/MembershipProviderBase.cs +++ b/src/Umbraco.Core/Security/MembershipProviderBase.cs @@ -7,9 +7,9 @@ using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Configuration; -using System.Web.Hosting; using System.Web.Security; using Umbraco.Core.Composing; +using Umbraco.Core.Hosting; using Umbraco.Core.Logging; namespace Umbraco.Core.Security @@ -19,6 +19,12 @@ namespace Umbraco.Core.Security /// public abstract class MembershipProviderBase : MembershipProvider { + private readonly IHostingEnvironment _hostingEnvironment; + + protected MembershipProviderBase(IHostingEnvironment hostingEnvironment) + { + _hostingEnvironment = hostingEnvironment; + } public string HashPasswordForStorage(string password) { @@ -250,7 +256,7 @@ namespace Umbraco.Core.Security _applicationName = config["applicationName"]; if (string.IsNullOrEmpty(_applicationName)) - _applicationName = GetDefaultAppName(); + _applicationName = GetDefaultAppName(_hostingEnvironment); //by default we will continue using the legacy encoding. UseLegacyEncoding = config.GetValue("useLegacyEncoding", DefaultUseLegacyEncoding); @@ -605,11 +611,11 @@ namespace Umbraco.Core.Security /// Gets the name of the default app. /// /// - internal static string GetDefaultAppName() + internal static string GetDefaultAppName(IHostingEnvironment hostingEnvironment) { try { - string applicationVirtualPath = HostingEnvironment.ApplicationVirtualPath; + string applicationVirtualPath = hostingEnvironment.ApplicationVirtualPath; if (string.IsNullOrEmpty(applicationVirtualPath)) { return "/"; diff --git a/src/Umbraco.Core/Security/MembershipProviderExtensions.cs b/src/Umbraco.Core/Security/MembershipProviderExtensions.cs index 367e6f5c5a..43d54c2c06 100644 --- a/src/Umbraco.Core/Security/MembershipProviderExtensions.cs +++ b/src/Umbraco.Core/Security/MembershipProviderExtensions.cs @@ -2,10 +2,8 @@ using System.Security.Principal; using System.Threading; using System.Web; -using System.Web.Hosting; using System.Web.Security; using Umbraco.Core.Composing; -using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Services; @@ -128,7 +126,7 @@ namespace Umbraco.Core.Security /// internal static string GetCurrentUserName(this MembershipProvider membershipProvider) { - if (HostingEnvironment.IsHosted) + if (Current.HostingEnvironment.IsHosted) { HttpContext current = HttpContext.Current; if (current != null && current.User != null && current.User.Identity != null) diff --git a/src/Umbraco.Core/Security/UmbracoMembershipProviderBase.cs b/src/Umbraco.Core/Security/UmbracoMembershipProviderBase.cs index 6f88c9bcd5..7d4c251f98 100644 --- a/src/Umbraco.Core/Security/UmbracoMembershipProviderBase.cs +++ b/src/Umbraco.Core/Security/UmbracoMembershipProviderBase.cs @@ -1,5 +1,6 @@ using System.Text; using System.Web.Security; +using Umbraco.Core.Hosting; namespace Umbraco.Core.Security { @@ -8,7 +9,9 @@ namespace Umbraco.Core.Security /// public abstract class UmbracoMembershipProviderBase : MembershipProviderBase { - + protected UmbracoMembershipProviderBase(IHostingEnvironment hostingEnvironment) : base(hostingEnvironment) + { + } public abstract string DefaultMemberTypeAlias { get; } diff --git a/src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs b/src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs index d9ce978274..2090796531 100644 --- a/src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs +++ b/src/Umbraco.Core/Services/Implement/ServerRegistrationService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Web; +using Umbraco.Core.Composing; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -20,7 +21,7 @@ namespace Umbraco.Core.Services.Implement private readonly IServerRegistrationRepository _serverRegistrationRepository; private static readonly string CurrentServerIdentityValue = NetworkHelper.MachineName // eg DOMAIN\SERVER - + "/" + HttpRuntime.AppDomainAppId; // eg /LM/S3SVC/11/ROOT + + "/" + Current.HostingEnvironment.ApplicationId; // eg /LM/S3SVC/11/ROOT private ServerRole _currentServerRole = ServerRole.Unknown; diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 854a96a51f..de85fe86ee 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -1,16 +1,10 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; using System.IO; using System.Linq; -using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Web.Security; -using Newtonsoft.Json; -using Umbraco.Core.Configuration; using Umbraco.Core.Composing; using Umbraco.Core.Exceptions; using Umbraco.Core.IO; diff --git a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs b/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs index 04bd838e39..0e7194d5de 100644 --- a/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs +++ b/src/Umbraco.Core/Sync/DatabaseServerMessenger.cs @@ -5,17 +5,14 @@ using System.Globalization; using System.IO; using System.Linq; using System.Threading; -using System.Web; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Composing; -using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Dtos; -using Umbraco.Core.Configuration; using Umbraco.Core.Hosting; using Umbraco.Core.Scoping; @@ -35,7 +32,6 @@ namespace Umbraco.Core.Sync private readonly ManualResetEvent _syncIdle; private readonly object _locko = new object(); private readonly IProfilingLogger _profilingLogger; - private readonly IIOHelper _ioHelper; private readonly IHostingEnvironment _hostingEnvironment; private readonly ISqlContext _sqlContext; private readonly Lazy _distCacheFilePath; @@ -50,14 +46,13 @@ namespace Umbraco.Core.Sync public DatabaseServerMessenger( IRuntimeState runtime, IScopeProvider scopeProvider, ISqlContext sqlContext, IProfilingLogger proflog, - bool distributedEnabled, DatabaseServerMessengerOptions options, IIOHelper ioHelper, IHostingEnvironment hostingEnvironment) + bool distributedEnabled, DatabaseServerMessengerOptions options, IHostingEnvironment hostingEnvironment) : base(distributedEnabled) { ScopeProvider = scopeProvider ?? throw new ArgumentNullException(nameof(scopeProvider)); _sqlContext = sqlContext; _runtime = runtime; _profilingLogger = proflog ?? throw new ArgumentNullException(nameof(proflog)); - _ioHelper = ioHelper; _hostingEnvironment = hostingEnvironment; Logger = proflog; Options = options ?? throw new ArgumentNullException(nameof(options)); @@ -530,14 +525,14 @@ namespace Umbraco.Core.Sync /// and debugging purposes. /// protected static readonly string LocalIdentity = NetworkHelper.MachineName // eg DOMAIN\SERVER - + "/" + HttpRuntime.AppDomainAppId // eg /LM/S3SVC/11/ROOT + + "/" + Current.HostingEnvironment.ApplicationId // eg /LM/S3SVC/11/ROOT + " [P" + Process.GetCurrentProcess().Id // eg 1234 + "/D" + AppDomain.CurrentDomain.Id // eg 22 + "] " + Guid.NewGuid().ToString("N").ToUpper(); // make it truly unique private string GetDistCacheFilePath(IHostingEnvironment hostingEnvironment) { - var fileName = HttpRuntime.AppDomainAppId.ReplaceNonAlphanumericChars(string.Empty) + "-lastsynced.txt"; + var fileName = _hostingEnvironment.ApplicationId.ReplaceNonAlphanumericChars(string.Empty) + "-lastsynced.txt"; var distCacheFilePath = Path.Combine(hostingEnvironment.LocalTempPath, "DistCache", fileName); diff --git a/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs b/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs index 333181f27c..d4b4636563 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Web.Hosting; +using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.ModelsBuilder.Embedded.Building; using Umbraco.ModelsBuilder.Embedded.Configuration; @@ -17,16 +18,18 @@ namespace Umbraco.ModelsBuilder.Embedded private readonly IModelsBuilderConfig _config; private readonly ModelsGenerator _modelGenerator; private readonly ModelsGenerationError _mbErrors; + private readonly IHostingEnvironment _hostingEnvironment; // we do not manage pure live here internal bool IsEnabled => _config.ModelsMode.IsLiveNotPure(); - public LiveModelsProvider(ILogger logger, IModelsBuilderConfig config, ModelsGenerator modelGenerator, ModelsGenerationError mbErrors) + public LiveModelsProvider(ILogger logger, IModelsBuilderConfig config, ModelsGenerator modelGenerator, ModelsGenerationError mbErrors, IHostingEnvironment hostingEnvironment) { _logger = logger; _config = config ?? throw new ArgumentNullException(nameof(config)); _modelGenerator = modelGenerator; _mbErrors = mbErrors; + _hostingEnvironment = hostingEnvironment; } internal void Install() @@ -38,7 +41,7 @@ namespace Umbraco.ModelsBuilder.Embedded // initialize mutex // ApplicationId will look like "/LM/W3SVC/1/Root/AppName" // name is system-wide and must be less than 260 chars - var name = HostingEnvironment.ApplicationID + "/UmbracoLiveModelsProvider"; + var name = _hostingEnvironment.ApplicationId + "/UmbracoLiveModelsProvider"; _mutex = new Mutex(false, name); //TODO: Replace this with MainDom? Seems we now have 2x implementations of almost the same thing diff --git a/src/Umbraco.Tests/Membership/MembershipProviderBaseTests.cs b/src/Umbraco.Tests/Membership/MembershipProviderBaseTests.cs index 091ea6f9a0..7a7d39b044 100644 --- a/src/Umbraco.Tests/Membership/MembershipProviderBaseTests.cs +++ b/src/Umbraco.Tests/Membership/MembershipProviderBaseTests.cs @@ -6,6 +6,7 @@ using System.Web.Security; using Moq; using NUnit.Framework; using Umbraco.Core.Security; +using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; namespace Umbraco.Tests.Membership @@ -17,7 +18,7 @@ namespace Umbraco.Tests.Membership [Test] public void Change_Password_Without_AllowManuallyChangingPassword_And_No_Pass_Validation() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.AllowManuallyChangingPassword).Returns(false); var provider = providerMock.Object; @@ -27,7 +28,7 @@ namespace Umbraco.Tests.Membership [Test] public void Change_Password_With_AllowManuallyChangingPassword_And_Invalid_Creds() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.AllowManuallyChangingPassword).Returns(false); providerMock.Setup(@base => @base.ValidateUser("test", "test")).Returns(false); var provider = providerMock.Object; @@ -39,7 +40,7 @@ namespace Umbraco.Tests.Membership [Test] public void ChangePasswordQuestionAndAnswer_Without_RequiresQuestionAndAnswer() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.RequiresQuestionAndAnswer).Returns(false); var provider = providerMock.Object; @@ -49,7 +50,7 @@ namespace Umbraco.Tests.Membership [Test] public void ChangePasswordQuestionAndAnswer_Without_AllowManuallyChangingPassword_And_Invalid_Creds() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.RequiresQuestionAndAnswer).Returns(true); providerMock.Setup(@base => @base.AllowManuallyChangingPassword).Returns(false); providerMock.Setup(@base => @base.ValidateUser("test", "test")).Returns(false); @@ -61,7 +62,7 @@ namespace Umbraco.Tests.Membership [Test] public void CreateUser_Not_Whitespace() { - var providerMock = new Mock() {CallBase = true}; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) {CallBase = true}; var provider = providerMock.Object; MembershipCreateStatus status; @@ -74,7 +75,7 @@ namespace Umbraco.Tests.Membership [Test] public void CreateUser_Invalid_Question() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.RequiresQuestionAndAnswer).Returns(true); var provider = providerMock.Object; @@ -88,7 +89,7 @@ namespace Umbraco.Tests.Membership [Test] public void CreateUser_Invalid_Answer() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.RequiresQuestionAndAnswer).Returns(true); var provider = providerMock.Object; @@ -102,7 +103,7 @@ namespace Umbraco.Tests.Membership [Test] public void GetPassword_Without_EnablePasswordRetrieval() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.EnablePasswordRetrieval).Returns(false); var provider = providerMock.Object; @@ -112,7 +113,7 @@ namespace Umbraco.Tests.Membership [Test] public void GetPassword_With_Hashed() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.EnablePasswordRetrieval).Returns(true); providerMock.Setup(@base => @base.PasswordFormat).Returns(MembershipPasswordFormat.Hashed); var provider = providerMock.Object; @@ -127,7 +128,7 @@ namespace Umbraco.Tests.Membership [Ignore("makes no sense?")] public void ResetPassword_Without_EnablePasswordReset() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.EnablePasswordReset).Returns(false); var provider = providerMock.Object; @@ -137,12 +138,12 @@ namespace Umbraco.Tests.Membership [Test] public void Sets_Defaults() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection()); Assert.AreEqual("test", provider.Name); - Assert.AreEqual(MembershipProviderBase.GetDefaultAppName(), provider.ApplicationName); + Assert.AreEqual(MembershipProviderBase.GetDefaultAppName(TestHelper.GetHostingEnvironment()), provider.ApplicationName); Assert.AreEqual(false, provider.EnablePasswordRetrieval); Assert.AreEqual(true, provider.EnablePasswordReset); Assert.AreEqual(false, provider.RequiresQuestionAndAnswer); @@ -159,7 +160,7 @@ namespace Umbraco.Tests.Membership [Test] public void Throws_Exception_With_Hashed_Password_And_Password_Retrieval() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; Assert.Throws(() => provider.Initialize("test", new NameValueCollection() @@ -211,7 +212,7 @@ namespace Umbraco.Tests.Membership [Test] public void Get_Stored_Password_Hashed() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Hashed" }, { "hashAlgorithmType", "HMACSHA256" } }); @@ -227,7 +228,7 @@ namespace Umbraco.Tests.Membership [Test] public void Get_Stored_Password_Encrypted() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Encrypted" } }); @@ -242,7 +243,7 @@ namespace Umbraco.Tests.Membership [Test] public void Get_Stored_Password_Clear() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Clear" } }); @@ -258,7 +259,7 @@ namespace Umbraco.Tests.Membership [Test] public void Format_Pass_For_Storage_Hashed() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Hashed" }, { "hashAlgorithmType", "HMACSHA256" } }); @@ -273,7 +274,7 @@ namespace Umbraco.Tests.Membership [Test] public void Format_Pass_For_Storage_Encrypted() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Encrypted" } }); @@ -288,7 +289,7 @@ namespace Umbraco.Tests.Membership [Test] public void Format_Pass_For_Storage_Clear() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Clear" } }); @@ -303,7 +304,7 @@ namespace Umbraco.Tests.Membership [Test] public void Check_Password_Hashed_KeyedHashAlgorithm() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Hashed" }, { "hashAlgorithmType", "HMACSHA256" } }); @@ -320,7 +321,7 @@ namespace Umbraco.Tests.Membership [Test] public void Check_Password_Hashed_Non_KeyedHashAlgorithm() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Hashed" } }); @@ -337,7 +338,7 @@ namespace Umbraco.Tests.Membership [Test] public void Check_Password_Encrypted() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Encrypted" } }); @@ -353,7 +354,7 @@ namespace Umbraco.Tests.Membership [Test] public void Check_Password_Clear() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Clear" } }); @@ -367,7 +368,7 @@ namespace Umbraco.Tests.Membership [Test] public void Can_Decrypt_Password() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Encrypted" } }); @@ -384,7 +385,7 @@ namespace Umbraco.Tests.Membership [Test] public void Get_Hash_Algorithm_Legacy() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { {"useLegacyEncoding", "true"}, { "passwordFormat", "Hashed" }, { "hashAlgorithmType", "HMACSHA256" } }); @@ -396,7 +397,7 @@ namespace Umbraco.Tests.Membership [Test] public void Get_Hash_Algorithm() { - var providerMock = new Mock() { CallBase = true }; + var providerMock = new Mock(TestHelper.GetHostingEnvironment()) { CallBase = true }; var provider = providerMock.Object; provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Hashed" }, { "hashAlgorithmType", "HMACSHA256" } }); diff --git a/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs b/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs index c70f304d66..82d66fd9de 100644 --- a/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs +++ b/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs @@ -23,7 +23,7 @@ namespace Umbraco.Tests.Membership { var memberTypeServiceMock = new Mock(); memberTypeServiceMock.Setup(x => x.GetDefault()).Returns("Blah"); - var provider = new MembersMembershipProvider(Mock.Of(), memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(Mock.Of(), memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection()); Assert.AreEqual("Blah", provider.DefaultMemberTypeAlias); @@ -34,7 +34,7 @@ namespace Umbraco.Tests.Membership { var memberTypeServiceMock = new Mock(); memberTypeServiceMock.Setup(x => x.GetDefault()).Returns("Blah"); - var provider = new MembersMembershipProvider(Mock.Of(), memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(Mock.Of(), memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection { { "defaultMemberTypeAlias", "Hello" } }); Assert.AreEqual("Hello", provider.DefaultMemberTypeAlias); @@ -48,7 +48,7 @@ namespace Umbraco.Tests.Membership var membershipServiceMock = new Mock(); membershipServiceMock.Setup(service => service.Exists("test")).Returns(true); - var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection()); MembershipCreateStatus status; @@ -65,7 +65,7 @@ namespace Umbraco.Tests.Membership var membershipServiceMock = new Mock(); membershipServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => new Member("test", MockedContentTypes.CreateSimpleMemberType())); - var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection { { "requiresUniqueEmail", "true" } }); MembershipCreateStatus status; @@ -95,7 +95,7 @@ namespace Umbraco.Tests.Membership createdMember = new Member("test", e, u, p, memberType, isApproved); }) .Returns(() => createdMember); - var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection()); @@ -128,7 +128,7 @@ namespace Umbraco.Tests.Membership }) .Returns(() => createdMember); - var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Encrypted" } }); @@ -162,7 +162,7 @@ namespace Umbraco.Tests.Membership }) .Returns(() => createdMember); - var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, TestHelper.GetUmbracoVersion()); + var provider = new MembersMembershipProvider(membershipServiceMock.Object, memberTypeServiceMock.Object, UmbracoVersion, HostingEnvironment); provider.Initialize("test", new NameValueCollection { { "passwordFormat", "Hashed" }, { "hashAlgorithmType", "HMACSHA256" } }); diff --git a/src/Umbraco.Tests/Misc/ApplicationUrlHelperTests.cs b/src/Umbraco.Tests/Misc/ApplicationUrlHelperTests.cs index 8283b0b65a..f55185a690 100644 --- a/src/Umbraco.Tests/Misc/ApplicationUrlHelperTests.cs +++ b/src/Umbraco.Tests/Misc/ApplicationUrlHelperTests.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.Misc [Test] public void NoApplicationUrlByDefault() { - var state = new RuntimeState(Mock.Of(), Mock.Of(), Mock.Of(), new Lazy(), new Lazy(), TestHelper.GetUmbracoVersion()); + var state = new RuntimeState(Mock.Of(), Mock.Of(), Mock.Of(), new Lazy(), new Lazy(), TestHelper.GetUmbracoVersion(), TestHelper.GetHostingEnvironment()); Assert.IsNull(state.ApplicationUrl); } @@ -45,7 +45,7 @@ namespace Umbraco.Tests.Misc var registrar = new Mock(); registrar.Setup(x => x.GetCurrentServerUmbracoApplicationUrl()).Returns("http://server1.com/umbraco"); - var state = new RuntimeState(Mock.Of(), settings, globalConfig.Object, new Lazy(), new Lazy(() => registrar.Object), TestHelper.GetUmbracoVersion()); + var state = new RuntimeState(Mock.Of(), settings, globalConfig.Object, new Lazy(), new Lazy(() => registrar.Object), TestHelper.GetUmbracoVersion(), TestHelper.GetHostingEnvironment()); state.EnsureApplicationUrl(); @@ -67,7 +67,7 @@ namespace Umbraco.Tests.Misc - var state = new RuntimeState(Mock.Of(), settings, globalConfig.Object, new Lazy(), new Lazy(() => Mock.Of()), TestHelper.GetUmbracoVersion()); + var state = new RuntimeState(Mock.Of(), settings, globalConfig.Object, new Lazy(), new Lazy(() => Mock.Of()), TestHelper.GetUmbracoVersion(), TestHelper.GetHostingEnvironment()); state.EnsureApplicationUrl(); diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs index aed4dba493..59e1c0e4f8 100644 --- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs +++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs @@ -32,9 +32,8 @@ namespace Umbraco.Tests.Routing //create the module var logger = Mock.Of(); var globalSettings = TestObjects.GetGlobalSettings(); - var umbracoVersion = TestHelper.GetUmbracoVersion(); var runtime = new RuntimeState(logger, Mock.Of(), globalSettings, - new Lazy(), new Lazy(), umbracoVersion); + new Lazy(), new Lazy(), UmbracoVersion, HostingEnvironment); _module = new UmbracoInjectedModule ( diff --git a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs index 0db566a829..ff691c478d 100644 --- a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs +++ b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs @@ -68,7 +68,7 @@ namespace Umbraco.Tests.Runtimes var typeLoader = new TypeLoader(ioHelper, typeFinder, appCaches.RuntimeCache, new DirectoryInfo(ioHelper.MapPath("~/App_Data/TEMP")), profilingLogger); var mainDom = new SimpleMainDom(); var umbracoVersion = TestHelper.GetUmbracoVersion(); - var runtimeState = new RuntimeState(logger, null, null, new Lazy(() => mainDom), new Lazy(() => factory.GetInstance()), umbracoVersion); + var runtimeState = new RuntimeState(logger, null, null, new Lazy(() => mainDom), new Lazy(() => factory.GetInstance()), umbracoVersion, hostingEnvironment); var configs = TestHelper.GetConfigs(); // create the register and the composition diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index 7bcd3790d4..3dac633264 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -41,7 +41,7 @@ namespace Umbraco.Tests.Services base.SetUp(); // HACK: but we have no choice until we remove the SavePassword method from IMemberService - var providerMock = new Mock(ServiceContext.MemberService, ServiceContext.MemberTypeService, TestHelper.GetUmbracoVersion()) { CallBase = true }; + var providerMock = new Mock(ServiceContext.MemberService, ServiceContext.MemberTypeService, TestHelper.GetUmbracoVersion(), TestHelper.GetHostingEnvironment()) { CallBase = true }; providerMock.Setup(@base => @base.AllowManuallyChangingPassword).Returns(false); providerMock.Setup(@base => @base.PasswordFormat).Returns(MembershipPasswordFormat.Hashed); var provider = providerMock.Object; diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index cfc9f179ee..bdf2205945 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -49,7 +49,9 @@ namespace Umbraco.Tests.TestHelpers Mock.Of(), new Lazy(), new Lazy(), - TestHelper.GetUmbracoVersion()); + TestHelper.GetUmbracoVersion(), + TestHelper.GetHostingEnvironment() + ); } public static IConfigsFactory GetConfigsFactory() diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index dcee0cc466..1defcec889 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -61,7 +61,6 @@ namespace Umbraco.Tests.TestHelpers internal ScopeProvider ScopeProvider => Current.ScopeProvider as ScopeProvider; protected ISqlContext SqlContext => Factory.GetInstance(); - protected IHostingEnvironment HostingEnvironment => Factory.GetInstance(); public override void SetUp() { diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index e8b44362e9..283f515ba1 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -110,6 +110,7 @@ namespace Umbraco.Tests.Testing protected virtual IProfilingLogger ProfilingLogger => Factory.GetInstance(); + protected IHostingEnvironment HostingEnvironment => Factory.GetInstance(); protected AppCaches AppCaches => Factory.GetInstance(); protected virtual ISqlSyntaxProvider SqlSyntax => Factory.GetInstance(); diff --git a/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs b/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs index f3a06c06a2..85b8e62d28 100644 --- a/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs +++ b/src/Umbraco.Web/BatchedDatabaseServerMessenger.cs @@ -30,8 +30,8 @@ namespace Umbraco.Web private readonly IUmbracoDatabaseFactory _databaseFactory; public BatchedDatabaseServerMessenger( - IRuntimeState runtime, IUmbracoDatabaseFactory databaseFactory, IScopeProvider scopeProvider, ISqlContext sqlContext, IProfilingLogger proflog, DatabaseServerMessengerOptions options, IIOHelper ioHelper, IHostingEnvironment hostingEnvironment) - : base(runtime, scopeProvider, sqlContext, proflog, true, options, ioHelper, hostingEnvironment ) + IRuntimeState runtime, IUmbracoDatabaseFactory databaseFactory, IScopeProvider scopeProvider, ISqlContext sqlContext, IProfilingLogger proflog, DatabaseServerMessengerOptions options, IHostingEnvironment hostingEnvironment) + : base(runtime, scopeProvider, sqlContext, proflog, true, options, hostingEnvironment ) { _databaseFactory = databaseFactory; } diff --git a/src/Umbraco.Web/Composing/Current.cs b/src/Umbraco.Web/Composing/Current.cs index a3cdc599a3..41e4873584 100644 --- a/src/Umbraco.Web/Composing/Current.cs +++ b/src/Umbraco.Web/Composing/Current.cs @@ -11,6 +11,7 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; +using Umbraco.Core.Hosting; using Umbraco.Core.Mapping; using Umbraco.Core.PackageActions; using Umbraco.Core.Packaging; @@ -228,6 +229,8 @@ namespace Umbraco.Web.Composing public static IIOHelper IOHelper => CoreCurrent.IOHelper; public static IUmbracoVersion UmbracoVersion => CoreCurrent.UmbracoVersion; + public static IHostingEnvironment HostingEnvironment => CoreCurrent.HostingEnvironment; + public static IIpResolver IpResolver => Factory.GetInstance(); #endregion } diff --git a/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs b/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs index b57a19705f..07e77aa7d0 100644 --- a/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs +++ b/src/Umbraco.Web/Hosting/AspNetHostingEnvironment.cs @@ -22,12 +22,20 @@ namespace Umbraco.Web.Hosting SiteName = HostingEnvironment.SiteName; ApplicationId = HostingEnvironment.ApplicationID; ApplicationPhysicalPath = HostingEnvironment.ApplicationPhysicalPath; + ApplicationVirtualPath = HostingEnvironment.ApplicationVirtualPath; + + IsDebugMode = HttpContext.Current?.IsDebuggingEnabled ?? globalSettings.DebugMode; } public string SiteName { get; } public string ApplicationId { get; } public string ApplicationPhysicalPath { get; } + public string ApplicationVirtualPath { get; } + public bool IsDebugMode { get; } + public bool IsHosted => HostingEnvironment.IsHosted; + public string MapPath(string path) => HostingEnvironment.MapPath(path); + public string LocalTempPath { get @@ -65,5 +73,6 @@ namespace Umbraco.Web.Hosting } } } + } } diff --git a/src/Umbraco.Web/Runtime/WebRuntime.cs b/src/Umbraco.Web/Runtime/WebRuntime.cs index 05031f67a6..12de3d59e3 100644 --- a/src/Umbraco.Web/Runtime/WebRuntime.cs +++ b/src/Umbraco.Web/Runtime/WebRuntime.cs @@ -9,7 +9,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Runtime; using Umbraco.Web.Cache; using Umbraco.Web.Composing; -using Umbraco.Web.Hosting; using Umbraco.Web.Logging; namespace Umbraco.Web.Runtime @@ -62,7 +61,7 @@ namespace Umbraco.Web.Runtime "Booted.", "Boot failed.")) { - Logger.Info("Booting site '{HostingSiteName}', app '{HostingApplicationID}', path '{HostingPhysicalPath}', server '{MachineName}'.", + Logger.Info("Booting site '{HostingSiteName}', app '{HostingApplicationId}', path '{HostingPhysicalPath}', server '{MachineName}'.", HostingEnvironment.SiteName, HostingEnvironment.ApplicationId, HostingEnvironment.ApplicationPhysicalPath, diff --git a/src/Umbraco.Web/Security/AppBuilderExtensions.cs b/src/Umbraco.Web/Security/AppBuilderExtensions.cs index 0a3e57c4fd..179095152e 100644 --- a/src/Umbraco.Web/Security/AppBuilderExtensions.cs +++ b/src/Umbraco.Web/Security/AppBuilderExtensions.cs @@ -40,7 +40,8 @@ namespace Umbraco.Web.Security UmbracoMapper mapper, IContentSection contentSettings, IGlobalSettings globalSettings, - MembershipProviderBase userMembershipProvider) + MembershipProviderBase userMembershipProvider, + IIpResolver ipResolver) { if (services == null) throw new ArgumentNullException(nameof(services)); if (userMembershipProvider == null) throw new ArgumentNullException(nameof(userMembershipProvider)); @@ -56,7 +57,8 @@ namespace Umbraco.Web.Security userMembershipProvider, mapper, contentSettings, - globalSettings)); + globalSettings, + ipResolver)); app.SetBackOfficeUserManagerType(); @@ -73,12 +75,14 @@ namespace Umbraco.Web.Security /// /// /// + /// public static void ConfigureUserManagerForUmbracoBackOffice(this IAppBuilder app, IRuntimeState runtimeState, IContentSection contentSettings, IGlobalSettings globalSettings, MembershipProviderBase userMembershipProvider, - BackOfficeUserStore customUserStore) + BackOfficeUserStore customUserStore, + IIpResolver ipResolver) { if (runtimeState == null) throw new ArgumentNullException(nameof(runtimeState)); if (userMembershipProvider == null) throw new ArgumentNullException(nameof(userMembershipProvider)); @@ -87,6 +91,7 @@ namespace Umbraco.Web.Security //Configure Umbraco user manager to be created per request app.CreatePerOwinContext( (options, owinContext) => BackOfficeUserManager.Create( + ipResolver, options, customUserStore, userMembershipProvider, diff --git a/src/Umbraco.Web/Security/BackOfficeUserManager.cs b/src/Umbraco.Web/Security/BackOfficeUserManager.cs index 6205c1705c..6bdbf02c4c 100644 --- a/src/Umbraco.Web/Security/BackOfficeUserManager.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserManager.cs @@ -24,17 +24,18 @@ namespace Umbraco.Web.Security { public const string OwinMarkerKey = "Umbraco.Web.Security.Identity.BackOfficeUserManagerMarker"; - public BackOfficeUserManager(IUserStore store) - : base(store) + public BackOfficeUserManager(IIpResolver ipResolver, IUserStore store) + : base(ipResolver, store) { } public BackOfficeUserManager( + IIpResolver ipResolver, IUserStore store, IdentityFactoryOptions options, MembershipProviderBase membershipProvider, IContentSection contentSectionConfig) - : base(store) + : base(ipResolver, store) { if (options == null) throw new ArgumentNullException("options"); InitUserManager(this, membershipProvider, contentSectionConfig, options); @@ -51,8 +52,10 @@ namespace Umbraco.Web.Security /// /// /// + /// /// /// + /// /// public static BackOfficeUserManager Create( IdentityFactoryOptions options, @@ -63,14 +66,15 @@ namespace Umbraco.Web.Security MembershipProviderBase membershipProvider, UmbracoMapper mapper, IContentSection contentSectionConfig, - IGlobalSettings globalSettings) + IGlobalSettings globalSettings, + IIpResolver ipResolver) { if (options == null) throw new ArgumentNullException("options"); if (userService == null) throw new ArgumentNullException("userService"); if (memberTypeService == null) throw new ArgumentNullException("memberTypeService"); if (externalLoginService == null) throw new ArgumentNullException("externalLoginService"); - var manager = new BackOfficeUserManager( + var manager = new BackOfficeUserManager(ipResolver, new BackOfficeUserStore(userService, memberTypeService, entityService, externalLoginService, globalSettings, membershipProvider, mapper)); manager.InitUserManager(manager, membershipProvider, contentSectionConfig, options); return manager; @@ -79,18 +83,20 @@ namespace Umbraco.Web.Security /// /// Creates a BackOfficeUserManager instance with all default options and a custom BackOfficeUserManager instance /// + /// /// /// /// /// /// public static BackOfficeUserManager Create( + IIpResolver ipResolver, IdentityFactoryOptions options, BackOfficeUserStore customUserStore, MembershipProviderBase membershipProvider, IContentSection contentSectionConfig) { - var manager = new BackOfficeUserManager(customUserStore, options, membershipProvider, contentSectionConfig); + var manager = new BackOfficeUserManager(ipResolver, customUserStore, options, membershipProvider, contentSectionConfig); return manager; } #endregion @@ -120,9 +126,12 @@ namespace Umbraco.Web.Security public class BackOfficeUserManager : UserManager where T : BackOfficeIdentityUser { - public BackOfficeUserManager(IUserStore store) + private readonly IIpResolver _ipResolver; + + public BackOfficeUserManager(IIpResolver ipResolver, IUserStore store) : base(store) { + _ipResolver = ipResolver; } #region What we support do not currently @@ -572,63 +581,63 @@ namespace Umbraco.Web.Security internal void RaiseAccountLockedEvent(int userId) { - OnAccountLocked(new IdentityAuditEventArgs(AuditEvent.AccountLocked, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnAccountLocked(new IdentityAuditEventArgs(AuditEvent.AccountLocked, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseAccountUnlockedEvent(int userId) { - OnAccountUnlocked(new IdentityAuditEventArgs(AuditEvent.AccountUnlocked, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnAccountUnlocked(new IdentityAuditEventArgs(AuditEvent.AccountUnlocked, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseForgotPasswordRequestedEvent(int userId) { - OnForgotPasswordRequested(new IdentityAuditEventArgs(AuditEvent.ForgotPasswordRequested, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnForgotPasswordRequested(new IdentityAuditEventArgs(AuditEvent.ForgotPasswordRequested, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseForgotPasswordChangedSuccessEvent(int userId) { - OnForgotPasswordChangedSuccess(new IdentityAuditEventArgs(AuditEvent.ForgotPasswordChangedSuccess, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnForgotPasswordChangedSuccess(new IdentityAuditEventArgs(AuditEvent.ForgotPasswordChangedSuccess, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseLoginFailedEvent(int userId) { - OnLoginFailed(new IdentityAuditEventArgs(AuditEvent.LoginFailed, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnLoginFailed(new IdentityAuditEventArgs(AuditEvent.LoginFailed, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseInvalidLoginAttemptEvent(string username) { - OnLoginFailed(new IdentityAuditEventArgs(AuditEvent.LoginFailed, GetCurrentRequestIpAddress(), username, string.Format("Attempted login for username '{0}' failed", username))); + OnLoginFailed(new IdentityAuditEventArgs(AuditEvent.LoginFailed, _ipResolver.GetCurrentRequestIpAddress(), username, string.Format("Attempted login for username '{0}' failed", username))); } internal void RaiseLoginRequiresVerificationEvent(int userId) { - OnLoginRequiresVerification(new IdentityAuditEventArgs(AuditEvent.LoginRequiresVerification, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnLoginRequiresVerification(new IdentityAuditEventArgs(AuditEvent.LoginRequiresVerification, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseLoginSuccessEvent(int userId) { - OnLoginSuccess(new IdentityAuditEventArgs(AuditEvent.LoginSucces, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnLoginSuccess(new IdentityAuditEventArgs(AuditEvent.LoginSucces, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseLogoutSuccessEvent(int userId) { - OnLogoutSuccess(new IdentityAuditEventArgs(AuditEvent.LogoutSuccess, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnLogoutSuccess(new IdentityAuditEventArgs(AuditEvent.LogoutSuccess, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaisePasswordChangedEvent(int userId) { - OnPasswordChanged(new IdentityAuditEventArgs(AuditEvent.PasswordChanged, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnPasswordChanged(new IdentityAuditEventArgs(AuditEvent.PasswordChanged, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } // TODO: I don't think this is required anymore since from 7.7 we no longer display the reset password checkbox since that didn't make sense. internal void RaisePasswordResetEvent(int userId) { - OnPasswordReset(new IdentityAuditEventArgs(AuditEvent.PasswordReset, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnPasswordReset(new IdentityAuditEventArgs(AuditEvent.PasswordReset, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } internal void RaiseResetAccessFailedCountEvent(int userId) { - OnResetAccessFailedCount(new IdentityAuditEventArgs(AuditEvent.ResetAccessFailedCount, GetCurrentRequestIpAddress(), affectedUser: userId)); + OnResetAccessFailedCount(new IdentityAuditEventArgs(AuditEvent.ResetAccessFailedCount, _ipResolver.GetCurrentRequestIpAddress(), affectedUser: userId)); } public static event EventHandler AccountLocked; @@ -698,17 +707,6 @@ namespace Umbraco.Web.Security if (ResetAccessFailedCount != null) ResetAccessFailedCount(this, e); } - /// - /// Returns the current request IP address for logging if there is one - /// - /// - protected virtual string GetCurrentRequestIpAddress() - { - // TODO: inject a service to get this value, we should not be relying on the old HttpContext.Current especially in the ASP.NET Identity world. - var httpContext = HttpContext.Current == null ? (HttpContextBase)null : new HttpContextWrapper(HttpContext.Current); - return httpContext.GetCurrentRequestIpAddress(); - } - } } diff --git a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs index 656b4a4c66..6f77c352f7 100644 --- a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs @@ -3,6 +3,7 @@ using System.Configuration.Provider; using System.Web.Security; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.Hosting; using Umbraco.Core.Models; using Umbraco.Core.Security; using Umbraco.Core.Services; @@ -17,11 +18,11 @@ namespace Umbraco.Web.Security.Providers public class MembersMembershipProvider : UmbracoMembershipProvider, IUmbracoMemberTypeMembershipProvider { public MembersMembershipProvider() - : this(Current.Services.MemberService, Current.Services.MemberTypeService, Current.UmbracoVersion) + : this(Current.Services.MemberService, Current.Services.MemberTypeService, Current.UmbracoVersion, Current.HostingEnvironment) { } - public MembersMembershipProvider(IMembershipMemberService memberService, IMemberTypeService memberTypeService, IUmbracoVersion umbracoVersion) - : base(memberService, umbracoVersion) + public MembersMembershipProvider(IMembershipMemberService memberService, IMemberTypeService memberTypeService, IUmbracoVersion umbracoVersion, IHostingEnvironment hostingEnvironment) + : base(memberService, umbracoVersion, hostingEnvironment) { LockPropertyTypeAlias = Constants.Conventions.Member.IsLockedOut; LastLockedOutPropertyTypeAlias = Constants.Conventions.Member.LastLockoutDate; diff --git a/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs index 06b221288c..25fe97bb7e 100644 --- a/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs @@ -8,6 +8,7 @@ using System.Web.Configuration; using System.Web.Security; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.Hosting; using Umbraco.Core.Logging; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Querying; @@ -31,7 +32,8 @@ namespace Umbraco.Web.Security.Providers protected IMembershipMemberService MemberService { get; private set; } - protected UmbracoMembershipProvider(IMembershipMemberService memberService, IUmbracoVersion umbracoVersion) + protected UmbracoMembershipProvider(IMembershipMemberService memberService, IUmbracoVersion umbracoVersion, IHostingEnvironment hostingEnvironment) + :base(hostingEnvironment) { _umbracoVersion = umbracoVersion; MemberService = memberService; diff --git a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs index 9d169414bb..72872f7f27 100644 --- a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs @@ -6,6 +6,7 @@ using System.Web; using System.Web.Security; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.Hosting; using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; using Umbraco.Core.Security; @@ -21,12 +22,12 @@ namespace Umbraco.Web.Security.Providers { public UsersMembershipProvider() - : this(Current.Services.UserService, Current.Services.MemberTypeService, Current.UmbracoVersion) + : this(Current.Services.UserService, Current.Services.MemberTypeService, Current.UmbracoVersion, Current.HostingEnvironment) { } - public UsersMembershipProvider(IMembershipMemberService memberService, IMemberTypeService memberTypeService, IUmbracoVersion umbracoVersion) - : base(memberService, umbracoVersion) + public UsersMembershipProvider(IMembershipMemberService memberService, IMemberTypeService memberTypeService, IUmbracoVersion umbracoVersion, IHostingEnvironment hostingEnvironment) + : base(memberService, umbracoVersion, hostingEnvironment) { _memberTypeService = memberTypeService; } diff --git a/src/Umbraco.Web/UmbracoApplicationBase.cs b/src/Umbraco.Web/UmbracoApplicationBase.cs index 9da6bf650e..43e00c808f 100644 --- a/src/Umbraco.Web/UmbracoApplicationBase.cs +++ b/src/Umbraco.Web/UmbracoApplicationBase.cs @@ -29,11 +29,11 @@ namespace Umbraco.Web protected UmbracoApplicationBase() { - _logger = SerilogLogger.CreateWithDefaultConfiguration(); _ioHelper = IOHelper.Default; _configs = new ConfigsFactory(_ioHelper).Create(); _profiler = new LogProfiler(_logger); _hostingEnvironment = new AspNetHostingEnvironment(_configs.Global(), _ioHelper); + _logger = SerilogLogger.CreateWithDefaultConfiguration(_hostingEnvironment); } protected UmbracoApplicationBase(ILogger logger, Configs configs, IIOHelper ioHelper, IProfiler profiler, IHostingEnvironment hostingEnvironment) diff --git a/src/Umbraco.Web/UmbracoContextFactory.cs b/src/Umbraco.Web/UmbracoContextFactory.cs index 11d8952fa6..dcd810d0e0 100644 --- a/src/Umbraco.Web/UmbracoContextFactory.cs +++ b/src/Umbraco.Web/UmbracoContextFactory.cs @@ -61,7 +61,7 @@ namespace Umbraco.Web // since it's assuming that the Culture can be empty (invariant) when in reality of a website this will never be empty since a real culture is always set here. _variationContextAccessor.VariationContext = new VariationContext(_defaultCultureAccessor.DefaultCulture); } - + var webSecurity = new WebSecurity(httpContext, _userService, _globalSettings); diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index 0633cca3a0..ead5b258aa 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -30,6 +30,7 @@ namespace Umbraco.Web protected IRuntimeState RuntimeState => Core.Composing.Current.RuntimeState; protected ServiceContext Services => Current.Services; protected UmbracoMapper Mapper => Current.Mapper; + protected IIpResolver IpResolver => Current.IpResolver; /// /// Main startup method @@ -85,7 +86,8 @@ namespace Umbraco.Web Mapper, UmbracoSettings.Content, GlobalSettings, - Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider()); + Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider(), + IpResolver); } ///