diff --git a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs index ded14c40ab..c9f74d689d 100644 --- a/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs +++ b/src/Umbraco.Tests/TestHelpers/ControllerTesting/TestControllerActivatorBase.cs @@ -29,6 +29,7 @@ using Umbraco.Web.Security; using Umbraco.Web.WebApi; using LightInject; using System.Globalization; +using Umbraco.Core.Logging; using Umbraco.Tests.Testing.Objects.Accessors; namespace Umbraco.Tests.TestHelpers.ControllerTesting @@ -157,7 +158,7 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting urlHelper.Setup(provider => provider.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns("/hello/world/1234"); - var membershipHelper = new MembershipHelper(umbCtx, Mock.Of(), Mock.Of()); + var membershipHelper = new MembershipHelper(new TestUmbracoContextAccessor(umbCtx), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), null); var mockedTypedContent = Mock.Of(); diff --git a/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs b/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs index da93218907..4f3b801af9 100644 --- a/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs +++ b/src/Umbraco.Tests/Testing/Objects/Accessors/TestUmbracoContextAccessor.cs @@ -5,5 +5,14 @@ namespace Umbraco.Tests.Testing.Objects.Accessors public class TestUmbracoContextAccessor : IUmbracoContextAccessor { public UmbracoContext UmbracoContext { get; set; } + + public TestUmbracoContextAccessor() + { + } + + public TestUmbracoContextAccessor(UmbracoContext umbracoContext) + { + UmbracoContext = umbracoContext; + } } } diff --git a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs index f21a953ae7..6b815bc434 100644 --- a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs +++ b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs @@ -7,6 +7,7 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Dictionary; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; @@ -65,7 +66,7 @@ namespace Umbraco.Tests.Testing.TestingTests Mock.Of(), Mock.Of(), Mock.Of(), - new MembershipHelper(umbracoContext, Mock.Of(), Mock.Of()), + new MembershipHelper(new TestUmbracoContextAccessor(umbracoContext), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), null), new ServiceContext(), CacheHelper.CreateDisabledCacheHelper()); Assert.Pass(); diff --git a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs index f9cff5af9b..dfa917459f 100644 --- a/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Dictionary; +using Umbraco.Core.Logging; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; @@ -129,7 +130,7 @@ namespace Umbraco.Tests.Web.Mvc Mock.Of(), Mock.Of(), Mock.Of(), - new MembershipHelper(umbracoContext, Mock.Of(), Mock.Of()), + new MembershipHelper(new TestUmbracoContextAccessor(umbracoContext), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), null), new ServiceContext(), CacheHelper.CreateDisabledCacheHelper()); diff --git a/src/Umbraco.Web/Composing/CompositionRoots/HelperCompositionRoot.cs b/src/Umbraco.Web/Composing/CompositionRoots/HelperCompositionRoot.cs new file mode 100644 index 0000000000..d708493016 --- /dev/null +++ b/src/Umbraco.Web/Composing/CompositionRoots/HelperCompositionRoot.cs @@ -0,0 +1,17 @@ +using System.Web.Security; +using LightInject; +using Umbraco.Web.Security; +using Umbraco.Web.Security.Providers; + +namespace Umbraco.Web.Composing.CompositionRoots +{ + public class HelperCompositionRoot : ICompositionRoot + { + public void Compose(IServiceRegistry container) + { + container.Register((factory) => Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider()); + container.Register((factory) => Roles.Enabled ? Roles.Provider : new MembersRoleProvider(Core.Composing.Current.Services.MemberService)); + container.Register(); + } + } +} diff --git a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs index 6b3581aeab..e39113c953 100644 --- a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs +++ b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs @@ -97,7 +97,7 @@ namespace Umbraco.Web } if (cacheByMember) { - var helper = new MembershipHelper(Current.UmbracoContext); + var helper = Current.Container.GetInstance(); var currentMember = helper.GetCurrentMember(); cacheKey.AppendFormat("m{0}-", currentMember == null ? 0 : currentMember.Id); } diff --git a/src/Umbraco.Web/Models/LoginStatusModel.cs b/src/Umbraco.Web/Models/LoginStatusModel.cs index 78425969dd..dd2b517b99 100644 --- a/src/Umbraco.Web/Models/LoginStatusModel.cs +++ b/src/Umbraco.Web/Models/LoginStatusModel.cs @@ -25,7 +25,7 @@ namespace Umbraco.Web.Models { if (doLookup && Current.UmbracoContext != null) { - var helper = new MembershipHelper(Current.UmbracoContext); + var helper = Current.Container.GetInstance(); var model = helper.GetCurrentLoginStatus(); if (model != null) { diff --git a/src/Umbraco.Web/Models/ProfileModel.cs b/src/Umbraco.Web/Models/ProfileModel.cs index c999657b6a..9c5bff0f7e 100644 --- a/src/Umbraco.Web/Models/ProfileModel.cs +++ b/src/Umbraco.Web/Models/ProfileModel.cs @@ -27,7 +27,7 @@ namespace Umbraco.Web.Models MemberProperties = new List(); if (doLookup && Current.UmbracoContext != null) { - var helper = new MembershipHelper(Current.UmbracoContext); + var helper = Current.Container.GetInstance(); var model = helper.GetCurrentMemberProfileModel(); MemberProperties = model.MemberProperties; } diff --git a/src/Umbraco.Web/Models/RegisterModel.cs b/src/Umbraco.Web/Models/RegisterModel.cs index 2851db54a4..e5a04b06bb 100644 --- a/src/Umbraco.Web/Models/RegisterModel.cs +++ b/src/Umbraco.Web/Models/RegisterModel.cs @@ -31,7 +31,7 @@ namespace Umbraco.Web.Models CreatePersistentLoginCookie = true; if (doLookup && Current.UmbracoContext != null) { - var helper = new MembershipHelper(Current.UmbracoContext); + var helper = Current.Container.GetInstance(); var model = helper.CreateRegistrationModel(MemberTypeAlias); MemberProperties = model.MemberProperties; } diff --git a/src/Umbraco.Web/Routing/PublishedRouter.cs b/src/Umbraco.Web/Routing/PublishedRouter.cs index 8e7d786e93..c6c4ef94c8 100644 --- a/src/Umbraco.Web/Routing/PublishedRouter.cs +++ b/src/Umbraco.Web/Routing/PublishedRouter.cs @@ -7,6 +7,7 @@ using System.IO; using System.Web.Security; using umbraco; using Umbraco.Core; +using Umbraco.Core.Composing; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -633,7 +634,7 @@ namespace Umbraco.Web.Routing { _logger.Debug(() => $"{tracePrefix}Page is protected, check for access"); - var membershipHelper = new MembershipHelper(request.UmbracoContext); + var membershipHelper = Current.Container.GetInstance(); if (membershipHelper.IsLoggedIn() == false) { diff --git a/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs b/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs index a4e5db0767..91715fe016 100644 --- a/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs +++ b/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs @@ -70,6 +70,8 @@ namespace Umbraco.Web.Runtime //it still needs to use the install controller so we can't do that composition.Container.RegisterFrom(); + composition.Container.RegisterFrom(); + // register accessors for cultures composition.Container.RegisterSingleton(); composition.Container.RegisterSingleton(); diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index 7a56679086..a3923e9353 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Text; using System.Web; using System.Web.Security; -using LightInject; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -34,69 +33,53 @@ namespace Umbraco.Web.Security private readonly IPublishedMemberCache _memberCache; private readonly UmbracoContext _umbracoContext; - [Inject] - private IMemberService MemberService { get; set; } + private IMemberService MemberService { get; } - [Inject] - private IMemberTypeService MemberTypeService { get; set; } + private IMemberTypeService MemberTypeService { get; } - [Inject] - private IUserService UserService { get; set; } + private IUserService UserService { get; } - [Inject] - private IPublicAccessService PublicAccessService { get; set; } + private IPublicAccessService PublicAccessService { get; } + public CacheHelper CacheHelper { get; } - [Inject] - private CacheHelper ApplicationCache { get; set; } + private CacheHelper ApplicationCache { get; } - [Inject] - private ILogger Logger { get; set; } + private ILogger Logger { get; } - [Inject] - private PublishedRouter Router { get; set; } + private PublishedRouter Router { get; } #region Constructors - // used here and there for IMember operations (not front-end stuff, no need for _memberCache) - - [Obsolete("Use the constructor specifying an UmbracoContext")] - [EditorBrowsable(EditorBrowsableState.Never)] - public MembershipHelper(HttpContextBase httpContext) + public MembershipHelper + ( + IUmbracoContextAccessor accessor, + MembershipProvider membershipProvider, + RoleProvider roleProvider, + IMemberService memberService, + IMemberTypeService memberTypeService, + IUserService userService, + IPublicAccessService publicAccessService, + CacheHelper cacheHelper, + ILogger logger, + PublishedRouter router + ) { - if (httpContext == null) throw new ArgumentNullException(nameof(httpContext)); - _httpContext = httpContext; - _membershipProvider = MPE.GetMembersMembershipProvider(); - _roleProvider = Roles.Enabled ? Roles.Provider : new MembersRoleProvider(MemberService); - - // _memberCache remains null - not supposed to use it - // alternatively we'd need to get if from the 'current' UmbracoContext? - - // helpers are *not* instanciated by the container so we have to - // get our dependencies injected manually, through properties. - ((IServiceContainer)Current.Container.ConcreteContainer).InjectProperties(this); - } - - // used everywhere - public MembershipHelper(UmbracoContext umbracoContext) - : this(umbracoContext, MPE.GetMembersMembershipProvider(), Roles.Enabled ? Roles.Provider : new MembersRoleProvider(Current.Services.MemberService)) - { } - - // used in tests and (this) - public MembershipHelper(UmbracoContext umbracoContext, MembershipProvider membershipProvider, RoleProvider roleProvider) - { - if (umbracoContext == null) throw new ArgumentNullException(nameof(umbracoContext)); + if (accessor.UmbracoContext == null) throw new ArgumentNullException(nameof(accessor)); if (membershipProvider == null) throw new ArgumentNullException(nameof(membershipProvider)); if (roleProvider == null) throw new ArgumentNullException(nameof(roleProvider)); + MemberService = memberService; + MemberTypeService = memberTypeService; + UserService = userService; + PublicAccessService = publicAccessService; + CacheHelper = cacheHelper; + Logger = logger; + Router = router; - _httpContext = umbracoContext.HttpContext; - _umbracoContext = umbracoContext; + _httpContext = accessor.UmbracoContext.HttpContext; + _umbracoContext = accessor.UmbracoContext; _membershipProvider = membershipProvider; _roleProvider = roleProvider; - _memberCache = umbracoContext.PublishedSnapshot.Members; - - // helpers are *not* instanciated by the container so we have to - // get our dependencies injected manually, through properties. - ((IServiceContainer)Current.Container.ConcreteContainer).InjectProperties(this); + _memberCache = accessor.UmbracoContext.PublishedSnapshot.Members; } #endregion diff --git a/src/Umbraco.Web/Security/WebSecurity.cs b/src/Umbraco.Web/Security/WebSecurity.cs index 5de163b638..1dd0f6f34c 100644 --- a/src/Umbraco.Web/Security/WebSecurity.cs +++ b/src/Umbraco.Web/Security/WebSecurity.cs @@ -57,7 +57,7 @@ namespace Umbraco.Web.Security { return false; } - var helper = new MembershipHelper(Current.UmbracoContext); + var helper = Current.Container.GetInstance(); return helper.IsMemberAuthorized(allowAll, allowTypes, allowGroups, allowMembers); } diff --git a/src/Umbraco.Web/UI/Controls/UmbracoUserControl.cs b/src/Umbraco.Web/UI/Controls/UmbracoUserControl.cs index 2875cb82bd..919a614034 100644 --- a/src/Umbraco.Web/UI/Controls/UmbracoUserControl.cs +++ b/src/Umbraco.Web/UI/Controls/UmbracoUserControl.cs @@ -33,7 +33,7 @@ namespace Umbraco.Web.UI.Controls if (umbracoContext == null) throw new ArgumentNullException(nameof(umbracoContext)); UmbracoContext = umbracoContext; Umbraco = new UmbracoHelper(umbracoContext, services, appCache); - Members = new MembershipHelper(umbracoContext); + Members = Current.Container.GetInstance(); // fixme inject somehow Logger = Current.Logger; diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index f9708e5c04..2e06668954 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -109,6 +109,7 @@ + diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index 7375dac98d..a20a08fd76 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -160,7 +160,7 @@ namespace Umbraco.Web /// Gets the membership helper. /// public MembershipHelper MembershipHelper => _membershipHelper - ?? (_membershipHelper = new MembershipHelper(UmbracoContext)); + ?? (_membershipHelper = Current.Container.GetInstance()); /// /// Gets the url provider.