Merge branch 'netcore/feature/move-more-install-stuff' into netcore/feature/executable-backoffice

This commit is contained in:
Bjarke Berg
2020-02-27 10:04:30 +01:00
36 changed files with 199 additions and 287 deletions

View File

@@ -1,4 +1,5 @@
using System.Configuration;
using Umbraco.Configuration;
using Umbraco.Core.Configuration.HealthChecks;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.IO;
@@ -10,6 +11,7 @@ namespace Umbraco.Core.Configuration
public IHostingSettings HostingSettings { get; } = new HostingSettings();
public ICoreDebug CoreDebug { get; } = new CoreDebug();
public IMachineKeyConfig MachineKeyConfig { get; } = new MachineKeyConfig();
public IUmbracoSettingsSection UmbracoSettings { get; }
@@ -27,6 +29,7 @@ namespace Umbraco.Core.Configuration
configs.AddPasswordConfigurations();
configs.Add(() => CoreDebug);
configs.Add(() => MachineKeyConfig);
configs.Add<IConnectionStrings>(() => new ConnectionStrings(ioHelper));
configs.AddCoreConfigs(ioHelper);
return configs;

View File

@@ -0,0 +1,20 @@
using System.Configuration;
using Umbraco.Core.Configuration;
namespace Umbraco.Configuration
{
public class MachineKeyConfig : IMachineKeyConfig
{
//TODO all the machineKey stuff should be replaced: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey?view=aspnetcore-3.1
public bool HasMachineKey
{
get
{
var machineKeySection =
ConfigurationManager.GetSection("system.web/machineKey") as ConfigurationSection;
return !(machineKeySection?.ElementInformation?.Source is null);
}
}
}
}

View File

@@ -0,0 +1,7 @@
namespace Umbraco.Core.Configuration
{
public interface IMachineKeyConfig
{
bool HasMachineKey { get;}
}
}

View File

@@ -0,0 +1,7 @@
namespace Umbraco.Net
{
public interface IUmbracoApplicationLifetime
{
void Restart();
}
}

View File

@@ -0,0 +1,7 @@
namespace Umbraco.Net
{
public interface IUserAgentProvider
{
string GetUserAgent();
}
}

View File

@@ -19,7 +19,7 @@ namespace Umbraco.Core.Models.Packaging
/// <remarks>
/// This is used only for conversions and will not 'get' a PackageDefinition from the repository with a valid ID
/// </remarks>
internal static PackageDefinition FromCompiledPackage(CompiledPackage compiled)
public static PackageDefinition FromCompiledPackage(CompiledPackage compiled)
{
return new PackageDefinition
{

View File

@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Cookie;
@@ -12,8 +11,9 @@ using Umbraco.Core.Migrations.Install;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Serialization;
using Umbraco.Core.Services;
using Umbraco.Web.Composing;
using Umbraco.Net;
using Umbraco.Web.Install.Models;
namespace Umbraco.Web.Install
@@ -22,25 +22,28 @@ namespace Umbraco.Web.Install
{
private static HttpClient _httpClient;
private readonly DatabaseBuilder _databaseBuilder;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ILogger _logger;
private readonly IGlobalSettings _globalSettings;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IConnectionStrings _connectionStrings;
private readonly IInstallationService _installationService;
private readonly ICookieManager _cookieManager;
private readonly IUserAgentProvider _userAgentProvider;
private readonly Lazy<ISqlContext> _sqlContext;
private readonly IJsonSerializer _jsonSerializer;
private InstallationType? _installationType;
public InstallHelper(IHttpContextAccessor httpContextAccessor,
DatabaseBuilder databaseBuilder,
public InstallHelper(DatabaseBuilder databaseBuilder,
ILogger logger,
IGlobalSettings globalSettings,
IUmbracoVersion umbracoVersion,
IConnectionStrings connectionStrings,
IInstallationService installationService,
ICookieManager cookieManager)
ICookieManager cookieManager,
IUserAgentProvider userAgentProvider,
Lazy<ISqlContext> sqlContext,
IJsonSerializer jsonSerializer)
{
_httpContextAccessor = httpContextAccessor;
_logger = logger;
_globalSettings = globalSettings;
_umbracoVersion = umbracoVersion;
@@ -48,6 +51,9 @@ namespace Umbraco.Web.Install
_connectionStrings = connectionStrings ?? throw new ArgumentNullException(nameof(connectionStrings));
_installationService = installationService;
_cookieManager = cookieManager;
_userAgentProvider = userAgentProvider;
_sqlContext = sqlContext;
_jsonSerializer = jsonSerializer;
}
public InstallationType GetInstallationType()
@@ -57,11 +63,9 @@ namespace Umbraco.Web.Install
public async Task InstallStatus(bool isCompleted, string errorMsg)
{
var httpContext = _httpContextAccessor.GetRequiredHttpContext();
try
{
var userAgent = httpContext.Request.UserAgent;
var userAgent = _userAgentProvider.GetUserAgent();
// Check for current install Id
var installId = Guid.NewGuid();
@@ -88,7 +92,7 @@ namespace Umbraco.Web.Install
{
// we don't have DatabaseProvider anymore... doing it differently
//dbProvider = ApplicationContext.Current.DatabaseContext.DatabaseProvider.ToString();
dbProvider = GetDbProviderString(Current.SqlContext);
dbProvider = GetDbProviderString(_sqlContext.Value);
}
var installLog = new InstallLog(installId: installId, isUpgrade: IsBrandNewInstall == false,
@@ -107,19 +111,7 @@ namespace Umbraco.Web.Install
internal static string GetDbProviderString(ISqlContext sqlContext)
{
var dbProvider = string.Empty;
// we don't have DatabaseProvider anymore...
//dbProvider = ApplicationContext.Current.DatabaseContext.DatabaseProvider.ToString();
//
// doing it differently
var syntax = sqlContext.SqlSyntax;
if (syntax is SqlCeSyntaxProvider)
dbProvider = "SqlServerCE";
else if (syntax is SqlServerSyntaxProvider)
dbProvider = (syntax as SqlServerSyntaxProvider).ServerVersion.IsAzure ? "SqlAzure" : "SqlServer";
return dbProvider;
return sqlContext.SqlSyntax.DbProvider;
}
/// <summary>
@@ -162,7 +154,10 @@ namespace Umbraco.Web.Install
using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
{
var response = _httpClient.SendAsync(request).Result;
packages = response.Content.ReadAsAsync<IEnumerable<Package>>().Result.ToList();
var json = response.Content.ReadAsStringAsync().Result;
packages = _jsonSerializer.Deserialize<IEnumerable<Package>>(json).ToList();
}
}
catch (AggregateException ex)

View File

@@ -1,7 +1,7 @@
using System.Linq;
using System.Threading.Tasks;
using System.Web.Configuration;
using System.Xml.Linq;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.Security;
using Umbraco.Web.Install.Models;
@@ -12,13 +12,15 @@ namespace Umbraco.Web.Install.InstallSteps
"ConfigureMachineKey", "machinekey", 2,
"Updating some security settings...",
PerformsAppRestart = true)]
internal class ConfigureMachineKey : InstallSetupStep<bool?>
public class ConfigureMachineKey : InstallSetupStep<bool?>
{
private readonly IIOHelper _ioHelper;
private readonly IMachineKeyConfig _machineKeyConfig;
public ConfigureMachineKey(IIOHelper ioHelper)
public ConfigureMachineKey(IIOHelper ioHelper, IMachineKeyConfig machineKeyConfig)
{
_ioHelper = ioHelper;
_machineKeyConfig = machineKeyConfig;
}
public override string View => HasMachineKey() == false ? base.View : "";
@@ -27,10 +29,11 @@ namespace Umbraco.Web.Install.InstallSteps
/// Don't display the view or execute if a machine key already exists
/// </summary>
/// <returns></returns>
private static bool HasMachineKey()
private bool HasMachineKey()
{
var section = (MachineKeySection) WebConfigurationManager.GetSection("system.web/machineKey");
return section.ElementInformation.Source != null;
return _machineKeyConfig.HasMachineKey;
// var section = (MachineKeySection) WebConfigurationManager.GetSection("system.web/machineKey");
// return section.ElementInformation.Source != null;
}
/// <summary>

View File

@@ -1,44 +1,31 @@
using System.Threading.Tasks;
using System.Web;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Services;
using Umbraco.Web.Cache;
using Umbraco.Web.Composing;
using Umbraco.Web.Install.Models;
using Umbraco.Web.Security;
namespace Umbraco.Web.Install.InstallSteps
{
[InstallSetupStep(InstallationType.NewInstall | InstallationType.Upgrade,
"UmbracoVersion", 50, "Installation is complete!, get ready to be redirected to your new CMS.",
PerformsAppRestart = true)]
internal class SetUmbracoVersionStep : InstallSetupStep<object>
public class SetUmbracoVersionStep : InstallSetupStep<object>
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly InstallHelper _installHelper;
private readonly IGlobalSettings _globalSettings;
private readonly IUserService _userService;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IIOHelper _ioHelper;
public SetUmbracoVersionStep(IHttpContextAccessor httpContextAccessor, InstallHelper installHelper, IGlobalSettings globalSettings, IUserService userService, IUmbracoVersion umbracoVersion, IIOHelper ioHelper)
public SetUmbracoVersionStep(IUmbracoContextAccessor umbracoContextAccessor, InstallHelper installHelper, IGlobalSettings globalSettings, IUmbracoVersion umbracoVersion)
{
_httpContextAccessor = httpContextAccessor;
_umbracoContextAccessor = umbracoContextAccessor;
_installHelper = installHelper;
_globalSettings = globalSettings;
_userService = userService;
_umbracoVersion = umbracoVersion;
_ioHelper = ioHelper;
}
public override Task<InstallSetupResult> ExecuteAsync(object model)
{
var security = new WebSecurity(_httpContextAccessor, _userService, _globalSettings, _ioHelper);
var security = _umbracoContextAccessor.UmbracoContext.Security;
if (security.IsAuthenticated() == false && _globalSettings.ConfigurationStatus.IsNullOrWhiteSpace())
{
security.PerformLogin(-1);

View File

@@ -1,13 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Umbraco.Core.Services;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models.Packaging;
using Umbraco.Web.Composing;
using Umbraco.Net;
using Umbraco.Web.Install.Models;
namespace Umbraco.Web.Install.InstallSteps
@@ -20,14 +18,16 @@ namespace Umbraco.Web.Install.InstallSteps
private readonly InstallHelper _installHelper;
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime;
private readonly IContentService _contentService;
private readonly IPackagingService _packageService;
public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IUmbracoContextAccessor umbracoContextAccessor, IUmbracoVersion umbracoVersion)
public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IUmbracoContextAccessor umbracoContextAccessor, IUmbracoVersion umbracoVersion, IUmbracoApplicationLifetime umbracoApplicationLifetime)
{
_installHelper = installHelper;
_umbracoContextAccessor = umbracoContextAccessor;
_umbracoVersion = umbracoVersion;
_umbracoApplicationLifetime = umbracoApplicationLifetime;
_contentService = contentService;
_packageService = packageService;
}
@@ -54,7 +54,7 @@ namespace Umbraco.Web.Install.InstallSteps
var (packageFile, packageId) = await DownloadPackageFilesAsync(starterKitId.Value);
UmbracoApplication.Restart();
_umbracoApplicationLifetime.Restart();
return new InstallSetupResult(new Dictionary<string, object>
{

View File

@@ -2,9 +2,8 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Umbraco.Core.Services;
using Umbraco.Web.Composing;
using Umbraco.Net;
using Umbraco.Web.Install.Models;
namespace Umbraco.Web.Install.InstallSteps
@@ -14,13 +13,13 @@ namespace Umbraco.Web.Install.InstallSteps
PerformsAppRestart = true)]
internal class StarterKitInstallStep : InstallSetupStep<object>
{
private readonly IHttpContextAccessor _httContextAccessor;
private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime;
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IPackagingService _packagingService;
public StarterKitInstallStep(IHttpContextAccessor httContextAccessor, IUmbracoContextAccessor umbracoContextAccessor, IPackagingService packagingService)
public StarterKitInstallStep(IUmbracoApplicationLifetime umbracoApplicationLifetime, IUmbracoContextAccessor umbracoContextAccessor, IPackagingService packagingService)
{
_httContextAccessor = httContextAccessor;
_umbracoApplicationLifetime = umbracoApplicationLifetime;
_umbracoContextAccessor = umbracoContextAccessor;
_packagingService = packagingService;
}
@@ -34,7 +33,9 @@ namespace Umbraco.Web.Install.InstallSteps
InstallBusinessLogic(packageId);
UmbracoApplication.Restart(_httContextAccessor.GetRequiredHttpContext());
_umbracoApplicationLifetime.Restart();
return Task.FromResult<InstallSetupResult>(null);
}

View File

@@ -77,12 +77,13 @@ namespace Umbraco.Core.Persistence.SqlSyntax
string ConvertIntegerToOrderableString { get; }
string ConvertDateToOrderableString { get; }
string ConvertDecimalToOrderableString { get; }
/// <summary>
/// Returns the default isolation level for the database
/// </summary>
IsolationLevel DefaultIsolationLevel { get; }
string DbProvider { get; }
IEnumerable<string> GetTablesInSchema(IDatabase db);
IEnumerable<ColumnInfo> GetColumnsInSchema(IDatabase db);

View File

@@ -175,6 +175,8 @@ namespace Umbraco.Core.Persistence.SqlSyntax
return items.Select(x => new Tuple<string, string, string, string>(x.TableName, x.ColumnName, x.Name, x.Definition));
}
public override string DbProvider => ServerVersion.IsAzure ? "SqlAzure" : "SqlServer";
public override IEnumerable<string> GetTablesInSchema(IDatabase db)
{
var items = db.Fetch<dynamic>("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT SCHEMA_NAME())");

View File

@@ -202,6 +202,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax
}
public abstract IsolationLevel DefaultIsolationLevel { get; }
public abstract string DbProvider { get; }
public virtual IEnumerable<string> GetTablesInSchema(IDatabase db)
{

View File

@@ -55,6 +55,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax
}
public override System.Data.IsolationLevel DefaultIsolationLevel => System.Data.IsolationLevel.RepeatableRead;
public override string DbProvider => "SqlServerCE";
public override string FormatColumnRename(string tableName, string oldName, string newName)
{

View File

@@ -156,14 +156,12 @@ namespace Umbraco.Tests.Routing
var handler = new RenderRouteHandler(umbracoContext, new TestControllerFactory(umbracoContextAccessor, Mock.Of<ILogger>(), context =>
{
var membershipHelper = new MembershipHelper(
httpContextAccessor, Mock.Of<IPublishedMemberCache>(), Mock.Of<MembersMembershipProvider>(), Mock.Of<RoleProvider>(), Mock.Of<IMemberService>(), Mock.Of<IMemberTypeService>(), Mock.Of<IPublicAccessService>(), AppCaches.Disabled, Mock.Of<ILogger>(), ShortStringHelper, Mock.Of<IEntityService>());
return new CustomDocumentController(Factory.GetInstance<IGlobalSettings>(),
return new CustomDocumentController(Factory.GetInstance<IGlobalSettings>(),
umbracoContextAccessor,
Factory.GetInstance<ServiceContext>(),
Factory.GetInstance<AppCaches>(),
Factory.GetInstance<IProfilingLogger>(),
new UmbracoHelper(Mock.Of<IPublishedContent>(), Mock.Of<ITagQuery>(), Mock.Of<ICultureDictionaryFactory>(), Mock.Of<IUmbracoComponentRenderer>(), Mock.Of<IPublishedContentQuery>(), membershipHelper));
new UmbracoHelper(Mock.Of<IPublishedContent>(), Mock.Of<ITagQuery>(), Mock.Of<ICultureDictionaryFactory>(), Mock.Of<IUmbracoComponentRenderer>(), Mock.Of<IPublishedContentQuery>()));
}), ShortStringHelper);
handler.GetHandlerForRoute(httpContext.Request.RequestContext, frequest);

View File

@@ -154,14 +154,11 @@ namespace Umbraco.Tests.TestHelpers.ControllerTesting
urlHelper.Setup(provider => provider.GetUrl(It.IsAny<IPublishedContent>(), It.IsAny<UrlMode>(), It.IsAny<string>(), It.IsAny<Uri>()))
.Returns(UrlInfo.Url("/hello/world/1234"));
var membershipHelper = new MembershipHelper(httpContextAccessor, Mock.Of<IPublishedMemberCache>(), Mock.Of<MembersMembershipProvider>(), Mock.Of<RoleProvider>(), Mock.Of<IMemberService>(), Mock.Of<IMemberTypeService>(), Mock.Of<IPublicAccessService>(), AppCaches.Disabled, Mock.Of<ILogger>(), new MockShortStringHelper(), Mock.Of<IEntityService>());
var umbHelper = new UmbracoHelper(Mock.Of<IPublishedContent>(),
Mock.Of<ITagQuery>(),
Mock.Of<ICultureDictionaryFactory>(),
Mock.Of<IUmbracoComponentRenderer>(),
Mock.Of<IPublishedContentQuery>(),
membershipHelper);
Mock.Of<IPublishedContentQuery>());
return CreateController(controllerType, request, umbracoContextAccessor, umbHelper);
}

View File

@@ -69,8 +69,7 @@ namespace Umbraco.Tests.Testing.TestingTests
Mock.Of<ITagQuery>(),
Mock.Of<ICultureDictionaryFactory>(),
Mock.Of<IUmbracoComponentRenderer>(),
Mock.Of<IPublishedContentQuery>(),
new MembershipHelper(Mock.Of<IHttpContextAccessor>(), Mock.Of<IPublishedMemberCache>(), Mock.Of<MembersMembershipProvider>(), Mock.Of<RoleProvider>(), Mock.Of<IMemberService>(), Mock.Of<IMemberTypeService>(), Mock.Of<IPublicAccessService>(), AppCaches.Disabled, Mock.Of<ILogger>(), ShortStringHelper, Mock.Of<IEntityService>()));
Mock.Of<IPublishedContentQuery>());
Assert.Pass();
}
@@ -107,7 +106,8 @@ namespace Umbraco.Tests.Testing.TestingTests
var memberTypeService = Mock.Of<IMemberTypeService>();
var membershipProvider = new MembersMembershipProvider(memberService, memberTypeService, Mock.Of<IUmbracoVersion>(), TestHelper.GetHostingEnvironment(), TestHelper.GetIpResolver());
var membershipHelper = new MembershipHelper(Mock.Of<IHttpContextAccessor>(), Mock.Of<IPublishedMemberCache>(), membershipProvider, Mock.Of<RoleProvider>(), memberService, memberTypeService, Mock.Of<IPublicAccessService>(), AppCaches.Disabled, logger, ShortStringHelper, Mock.Of<IEntityService>());
var umbracoHelper = new UmbracoHelper(Mock.Of<IPublishedContent>(), Mock.Of<ITagQuery>(), Mock.Of<ICultureDictionaryFactory>(), Mock.Of<IUmbracoComponentRenderer>(), Mock.Of<IPublishedContentQuery>(), membershipHelper);
var umbracoHelper = new UmbracoHelper(Mock.Of<IPublishedContent>(), Mock.Of<ITagQuery>(), Mock.Of<ICultureDictionaryFactory>(),
Mock.Of<IUmbracoComponentRenderer>(), Mock.Of<IPublishedContentQuery>());
var umbracoMapper = new UmbracoMapper(new MapDefinitionCollection(new[] { Mock.Of<IMapDefinition>() }));
var umbracoApiController = new FakeUmbracoApiController(Mock.Of<IGlobalSettings>(), Mock.Of<IUmbracoContextAccessor>(), Mock.Of<ISqlContext>(), ServiceContext.CreatePartial(), AppCaches.NoCache, logger, Mock.Of<IRuntimeState>(), umbracoHelper, umbracoMapper, Mock.Of<IPublishedUrlProvider>());

View File

@@ -123,8 +123,7 @@ namespace Umbraco.Tests.Web.Mvc
Mock.Of<ITagQuery>(),
Mock.Of<ICultureDictionaryFactory>(),
Mock.Of<IUmbracoComponentRenderer>(),
Mock.Of<IPublishedContentQuery>(query => query.Content(2) == content.Object),
new MembershipHelper(Mock.Of<IHttpContextAccessor>(), Mock.Of<IPublishedMemberCache>(), Mock.Of<MembersMembershipProvider>(), Mock.Of<RoleProvider>(), Mock.Of<IMemberService>(), Mock.Of<IMemberTypeService>(), Mock.Of<IPublicAccessService>(), AppCaches.Disabled, Mock.Of<ILogger>(), ShortStringHelper, Mock.Of<IEntityService>()));
Mock.Of<IPublishedContentQuery>(query => query.Content(2) == content.Object));
var ctrl = new TestSurfaceController(umbracoContextAccessor, helper);
var result = ctrl.GetContent(2) as PublishedContentResult;

View File

@@ -0,0 +1,19 @@
using Umbraco.Net;
namespace Umbraco.Web.AspNet
{
public class AspNetUmbracoApplicationLifetime : IUmbracoApplicationLifetime
{
private readonly IHttpContextAccessor _httpContextAccessor;
public AspNetUmbracoApplicationLifetime(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void Restart()
{
UmbracoApplication.Restart(_httpContextAccessor.HttpContext);
}
}
}

View File

@@ -0,0 +1,19 @@
using Umbraco.Net;
namespace Umbraco.Web.AspNet
{
public class AspNetUserAgentProvider : IUserAgentProvider
{
private readonly IHttpContextAccessor _httpContextAccessor;
public AspNetUserAgentProvider(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public string GetUserAgent()
{
return _httpContextAccessor.GetRequiredHttpContext().Request.UserAgent;
}
}
}

View File

@@ -6,18 +6,24 @@ using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Security;
namespace Umbraco.Web.Controllers
{
public class UmbLoginController : SurfaceController
{
private readonly MembershipHelper _membershipHelper;
public UmbLoginController()
{
}
public UmbLoginController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper)
public UmbLoginController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory,
ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper,
MembershipHelper membershipHelper)
: base(umbracoContextAccessor, databaseFactory, services, appCaches, logger, profilingLogger, umbracoHelper)
{
_membershipHelper = membershipHelper;
}
[HttpPost]
@@ -30,7 +36,7 @@ namespace Umbraco.Web.Controllers
return CurrentUmbracoPage();
}
if (Members.Login(model.Username, model.Password) == false)
if (_membershipHelper.Login(model.Username, model.Password) == false)
{
//don't add a field level error, just model level
ModelState.AddModelError("loginModel", "Invalid username or password");

View File

@@ -7,19 +7,25 @@ using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Security;
namespace Umbraco.Web.Controllers
{
[MemberAuthorize]
public class UmbLoginStatusController : SurfaceController
{
private readonly MembershipHelper _membershipHelper;
public UmbLoginStatusController()
{
}
public UmbLoginStatusController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper)
public UmbLoginStatusController(IUmbracoContextAccessor umbracoContextAccessor,
IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger,
IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper, MembershipHelper membershipHelper)
: base(umbracoContextAccessor, databaseFactory, services, appCaches, logger, profilingLogger, umbracoHelper)
{
_membershipHelper = membershipHelper;
}
[HttpPost]
@@ -32,7 +38,7 @@ namespace Umbraco.Web.Controllers
return CurrentUmbracoPage();
}
if (Members.IsLoggedIn())
if (_membershipHelper.IsLoggedIn())
{
FormsAuthentication.SignOut();
}

View File

@@ -15,12 +15,18 @@ namespace Umbraco.Web.Controllers
[MemberAuthorize]
public class UmbProfileController : SurfaceController
{
private readonly MembershipHelper _membershipHelper;
public UmbProfileController()
{ }
public UmbProfileController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper)
public UmbProfileController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory,
ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger,
UmbracoHelper umbracoHelper, MembershipHelper membershipHelper)
: base(umbracoContextAccessor, databaseFactory, services, appCaches, logger, profilingLogger, umbracoHelper)
{ }
{
_membershipHelper = membershipHelper;
}
[HttpPost]
[ValidateAntiForgeryToken]
@@ -32,7 +38,7 @@ namespace Umbraco.Web.Controllers
return CurrentUmbracoPage();
}
var updateAttempt = Members.UpdateMemberProfile(model);
var updateAttempt = _membershipHelper.UpdateMemberProfile(model);
if (updateAttempt.Success == false)
{
//don't add a field level error, just model level

View File

@@ -8,18 +8,24 @@ using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
using Umbraco.Web.Models;
using Umbraco.Web.Mvc;
using Umbraco.Web.Security;
namespace Umbraco.Web.Controllers
{
public class UmbRegisterController : SurfaceController
{
private readonly MembershipHelper _membershipHelper;
public UmbRegisterController()
{
}
public UmbRegisterController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger, IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper)
public UmbRegisterController(IUmbracoContextAccessor umbracoContextAccessor,
IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, ILogger logger,
IProfilingLogger profilingLogger, UmbracoHelper umbracoHelper, MembershipHelper membershipHelper)
: base(umbracoContextAccessor, databaseFactory, services, appCaches, logger, profilingLogger, umbracoHelper)
{
_membershipHelper = membershipHelper;
}
[HttpPost]
@@ -40,7 +46,7 @@ namespace Umbraco.Web.Controllers
}
MembershipCreateStatus status;
var member = Members.RegisterMember(model, out status, model.LoginOnSuccess);
var member = _membershipHelper.RegisterMember(model, out status, model.LoginOnSuccess);
switch (status)
{

View File

@@ -331,7 +331,7 @@ namespace Umbraco.Web.Macros
/// <returns>The text output of the macro execution.</returns>
private MacroContent ExecutePartialView(MacroModel macro, IPublishedContent content)
{
var engine = new PartialViewMacroEngine();
var engine = new PartialViewMacroEngine(_umbracoContextAccessor, _httpContextAccessor, _ioHelper);
return engine.Execute(macro, content);
}

View File

@@ -5,6 +5,7 @@ using System.Web.Routing;
using System.Web.WebPages;
using Umbraco.Web.Mvc;
using Umbraco.Core;
using Umbraco.Core.IO;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Web.Composing;
@@ -15,37 +16,24 @@ namespace Umbraco.Web.Macros
/// </summary>
public class PartialViewMacroEngine
{
private readonly Func<HttpContextBase> _getHttpContext;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IIOHelper _ioHelper;
private readonly Func<IUmbracoContext> _getUmbracoContext;
public PartialViewMacroEngine()
public PartialViewMacroEngine(IUmbracoContextAccessor umbracoContextAccessor, IHttpContextAccessor httpContextAccessor, IIOHelper ioHelper)
{
_getHttpContext = () =>
{
if (HttpContext.Current == null)
throw new InvalidOperationException($"The {GetType()} cannot execute with a null HttpContext.Current reference.");
return new HttpContextWrapper(HttpContext.Current);
};
_httpContextAccessor = httpContextAccessor;
_ioHelper = ioHelper;
_getUmbracoContext = () =>
{
if (Current.UmbracoContext == null)
var context = umbracoContextAccessor.UmbracoContext;
if (context == null)
throw new InvalidOperationException($"The {GetType()} cannot execute with a null UmbracoContext.Current reference.");
return Current.UmbracoContext;
return context;
};
}
/// <summary>
/// Constructor generally used for unit testing
/// </summary>
/// <param name="httpContext"></param>
/// <param name="umbracoContext"> </param>
internal PartialViewMacroEngine(HttpContextBase httpContext, IUmbracoContext umbracoContext)
{
_getHttpContext = () => httpContext;
_getUmbracoContext = () => umbracoContext;
}
public bool Validate(string code, string tempFileName, IPublishedContent currentPage, out string errorMessage)
{
var temp = GetVirtualPathFromPhysicalPath(tempFileName);
@@ -68,7 +56,7 @@ namespace Umbraco.Web.Macros
if (content == null) throw new ArgumentNullException(nameof(content));
if (macro.MacroSource.IsNullOrWhiteSpace()) throw new ArgumentException("The MacroSource property of the macro object cannot be null or empty");
var http = _getHttpContext();
var httpContext = _httpContextAccessor.GetRequiredHttpContext();
var umbCtx = _getUmbracoContext();
var routeVals = new RouteData();
routeVals.Values.Add("controller", "PartialViewMacro");
@@ -79,13 +67,14 @@ namespace Umbraco.Web.Macros
var viewContext = new ViewContext { ViewData = new ViewDataDictionary() };
//try and extract the current view context from the route values, this would be set in the UmbracoViewPage or in
// the UmbracoPageResult if POSTing to an MVC controller but rendering in Webforms
if (http.Request.RequestContext.RouteData.DataTokens.ContainsKey(Mvc.Constants.DataTokenCurrentViewContext))
if (httpContext.Request.RequestContext.RouteData.DataTokens.ContainsKey(Mvc.Constants.DataTokenCurrentViewContext))
{
viewContext = (ViewContext)http.Request.RequestContext.RouteData.DataTokens[Mvc.Constants.DataTokenCurrentViewContext];
viewContext = (ViewContext)httpContext.Request.RequestContext.RouteData.DataTokens[Mvc.Constants.DataTokenCurrentViewContext];
}
routeVals.DataTokens.Add("ParentActionViewContext", viewContext);
var request = new RequestContext(http, routeVals);
var request = new RequestContext(httpContext, routeVals);
string output;
using (var controller = new PartialViewMacroController(macro, content))
{
@@ -103,7 +92,7 @@ namespace Umbraco.Web.Macros
private string GetVirtualPathFromPhysicalPath(string physicalPath)
{
var rootpath = _getHttpContext().Server.MapPath("~/");
var rootpath = _ioHelper.MapPath("~/");
physicalPath = physicalPath.Replace(rootpath, "");
physicalPath = physicalPath.Replace("\\", "/");
return "~/" + physicalPath;

View File

@@ -59,11 +59,6 @@ namespace Umbraco.Web.Mvc
/// </summary>
public IProfilingLogger ProfilingLogger { get; }
/// <summary>
/// Gets the membership helper.
/// </summary>
public MembershipHelper Members => Umbraco.MembershipHelper;
/// <summary>
/// Gets the Umbraco helper.
/// </summary>

View File

@@ -57,11 +57,6 @@ namespace Umbraco.Web.Mvc
protected IOwinContext OwinContext => Request.GetOwinContext();
/// <summary>
/// Gets the membership helper.
/// </summary>
public MembershipHelper Members => Umbraco.MembershipHelper;
/// <summary>
/// Gets the Umbraco helper.
/// </summary>

View File

@@ -101,11 +101,6 @@ namespace Umbraco.Web.Mvc
}
}
/// <summary>
/// Gets the membership helper.
/// </summary>
public MembershipHelper Members => Umbraco.MembershipHelper;
protected UmbracoViewPage()
: this(
Current.Factory.GetInstance<ServiceContext>(),

View File

@@ -49,6 +49,7 @@ using Current = Umbraco.Web.Composing.Current;
using Umbraco.Web.PropertyEditors;
using Umbraco.Examine;
using Umbraco.Core.Models;
using Umbraco.Web.AspNet;
using Umbraco.Web.Models;
namespace Umbraco.Web.Runtime
@@ -64,9 +65,11 @@ namespace Umbraco.Web.Runtime
composition.Register<UmbracoInjectedModule>();
composition.Register<IIpResolver, AspNetIpResolver>();
composition.Register<IUserAgentProvider, AspNetUserAgentProvider>();
composition.Register<ISessionIdResolver, AspNetSessionIdResolver>();
composition.Register<IHostingEnvironment, AspNetHostingEnvironment>();
composition.Register<IBackOfficeInfo, AspNetBackOfficeInfo>();
composition.Register<IUmbracoApplicationLifetime, AspNetUmbracoApplicationLifetime>();
composition.Register<IPasswordHasher, AspNetPasswordHasher>();
composition.Register<IFilePermissionHelper, FilePermissionHelper>(Lifetime.Singleton);
@@ -131,8 +134,7 @@ namespace Umbraco.Web.Runtime
var umbCtx = factory.GetInstance<IUmbracoContext>();
return new UmbracoHelper(umbCtx.IsFrontEndUmbracoRequest ? umbCtx.PublishedRequest?.PublishedContent : null,
factory.GetInstance<ITagQuery>(), factory.GetInstance<ICultureDictionaryFactory>(),
factory.GetInstance<IUmbracoComponentRenderer>(), factory.GetInstance<IPublishedContentQuery>(),
factory.GetInstance<MembershipHelper>());
factory.GetInstance<IUmbracoComponentRenderer>(), factory.GetInstance<IPublishedContentQuery>());
});
else
composition.Register(_ => new UmbracoHelper());

View File

@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
using Umbraco.Core;
using Umbraco.Core.Logging;

View File

@@ -134,7 +134,9 @@
<Compile Include="AppBuilderExtensions.cs" />
<Compile Include="AreaRegistrationContextExtensions.cs" />
<Compile Include="AspNet\AspNetHostingEnvironment.cs" />
<Compile Include="AspNet\AspNetUserAgentProvider.cs" />
<Compile Include="AspNet\FrameworkMarchal.cs" />
<Compile Include="AspNet\AspNetUmbracoApplicationLifetime.cs" />
<Compile Include="Cache\WebCachingAppCache.cs" />
<Compile Include="Compose\AuditEventsComponent.cs" />
<Compile Include="Compose\AuditEventsComposer.cs" />
@@ -158,8 +160,6 @@
<Compile Include="HttpContextExtensions.cs" />
<Compile Include="ImageCropperTemplateCoreExtensions.cs" />
<Compile Include="Install\ChangesMonitor.cs" />
<Compile Include="Install\InstallSteps\StarterKitDownloadStep.cs" />
<Compile Include="Install\InstallSteps\StarterKitInstallStep.cs" />
<Compile Include="Logging\OwinLogger.cs" />
<Compile Include="Logging\OwinLoggerFactory.cs" />
<Compile Include="Logging\WebProfiler.cs" />
@@ -270,7 +270,6 @@
<Compile Include="Composing\CompositionExtensions\WebMappingProfiles.cs" />
<Compile Include="Editors\BackOfficeNotificationsController.cs" />
<Compile Include="Install\InstallStepCollection.cs" />
<Compile Include="Install\InstallSteps\ConfigureMachineKey.cs" />
<Compile Include="Editors\MemberGroupController.cs" />
<Compile Include="Composing\CompositionExtensions\Controllers.cs" />
<Compile Include="HealthCheck\HealthCheckController.cs" />
@@ -359,7 +358,6 @@
<Compile Include="Editors\RelationController.cs" />
<Compile Include="GridTemplateExtensions.cs" />
<Compile Include="Editors\TemplateQueryController.cs" />
<Compile Include="Install\InstallSteps\SetUmbracoVersionStep.cs" />
<Compile Include="Install\InstallSteps\NewInstallStep.cs" />
<Compile Include="Install\UmbracoInstallArea.cs" />
<Compile Include="Install\Controllers\InstallApiController.cs" />
@@ -455,7 +453,6 @@
<Compile Include="HttpRequestExtensions.cs" />
<Compile Include="HttpUrlHelperExtensions.cs" />
<Compile Include="Install\FilePermissionHelper.cs" />
<Compile Include="Install\InstallHelper.cs" />
<Compile Include="Install\HttpInstallAuthorizeAttribute.cs" />
<Compile Include="Macros\PartialViewMacroController.cs" />
<Compile Include="Macros\PartialViewMacroEngine.cs" />

View File

@@ -70,7 +70,6 @@ namespace Umbraco.Web
_variationContextAccessor.VariationContext = new VariationContext(_defaultCultureAccessor.DefaultCulture);
}
var webSecurity = new WebSecurity(_httpContextAccessor, _userService, _globalSettings, _ioHelper);
return new UmbracoContext(_httpContextAccessor, _publishedSnapshotService, webSecurity, _globalSettings, _variationContextAccessor, _ioHelper, _uriUtility, _cookieManager);

View File

@@ -3,15 +3,12 @@ using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.XPath;
using Umbraco.Composing;
using Umbraco.Core;
using Umbraco.Core.Dictionary;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Xml;
using Umbraco.Web.Composing;
using Umbraco.Web.Mvc;
using Umbraco.Web.Security;
namespace Umbraco.Web
{
@@ -25,7 +22,6 @@ namespace Umbraco.Web
{
private readonly IPublishedContentQuery _publishedContentQuery;
private readonly ITagQuery _tagQuery;
private readonly MembershipHelper _membershipHelper;
private readonly IUmbracoComponentRenderer _componentRenderer;
private readonly ICultureDictionaryFactory _cultureDictionaryFactory;
@@ -48,13 +44,11 @@ namespace Umbraco.Web
ITagQuery tagQuery,
ICultureDictionaryFactory cultureDictionary,
IUmbracoComponentRenderer componentRenderer,
IPublishedContentQuery publishedContentQuery,
MembershipHelper membershipHelper)
IPublishedContentQuery publishedContentQuery)
{
_tagQuery = tagQuery ?? throw new ArgumentNullException(nameof(tagQuery));
_cultureDictionaryFactory = cultureDictionary ?? throw new ArgumentNullException(nameof(cultureDictionary));
_componentRenderer = componentRenderer ?? throw new ArgumentNullException(nameof(componentRenderer));
_membershipHelper = membershipHelper ?? throw new ArgumentNullException(nameof(membershipHelper));
_publishedContentQuery = publishedContentQuery ?? throw new ArgumentNullException(nameof(publishedContentQuery));
_currentPage = currentPage;
}
@@ -84,11 +78,6 @@ namespace Umbraco.Web
/// </summary>
public IPublishedContentQuery ContentQuery => Ensure(_publishedContentQuery);
/// <summary>
/// Gets the membership helper.
/// </summary>
public MembershipHelper MembershipHelper => Ensure(_membershipHelper);
/// <summary>
/// Gets (or sets) the current <see cref="IPublishedContent"/> item assigned to the UmbracoHelper.
/// </summary>
@@ -208,141 +197,7 @@ namespace Umbraco.Web
#endregion
#region Membership
/// <summary>
/// Check if the current user has access to a document
/// </summary>
/// <param name="path">The full path of the document object to check</param>
/// <returns>True if the current user has access or if the current document isn't protected</returns>
public bool MemberHasAccess(string path)
{
return MembershipHelper.MemberHasAccess(path);
}
/// <summary>
/// Whether or not the current member is logged in (based on the membership provider)
/// </summary>
/// <returns>True is the current user is logged in</returns>
public bool MemberIsLoggedOn()
{
return MembershipHelper.IsLoggedIn();
}
#endregion
#region Member/Content/Media from Udi
public IPublishedContent PublishedContent(Udi udi)
{
var guidUdi = udi as GuidUdi;
if (guidUdi == null) return null;
var umbracoType = UdiEntityTypeHelper.ToUmbracoObjectType(udi.EntityType);
switch (umbracoType)
{
case UmbracoObjectTypes.Document:
return Content(guidUdi.Guid);
case UmbracoObjectTypes.Media:
return Media(guidUdi.Guid);
case UmbracoObjectTypes.Member:
return Member(guidUdi.Guid);
}
return null;
}
#endregion
#region Members
public IPublishedContent Member(Udi id)
{
var guidUdi = id as GuidUdi;
return guidUdi == null ? null : Member(guidUdi.Guid);
}
public IPublishedContent Member(Guid id)
{
return MembershipHelper.GetById(id);
}
public IPublishedContent Member(object id)
{
if (ConvertIdObjectToInt(id, out var intId))
return Member(intId);
if (ConvertIdObjectToGuid(id, out var guidId))
return Member(guidId);
if (ConvertIdObjectToUdi(id, out var udiId))
return Member(udiId);
return null;
}
public IPublishedContent Member(int id)
{
return MembershipHelper.GetById(id);
}
public IPublishedContent Member(string id)
{
var asInt = id.TryConvertTo<int>();
return asInt ? MembershipHelper.GetById(asInt.Result) : MembershipHelper.GetByProviderKey(id);
}
public IEnumerable<IPublishedContent> Members(IEnumerable<int> ids)
{
return MembershipHelper.GetByIds(ids);
}
public IEnumerable<IPublishedContent> Members(IEnumerable<string> ids)
{
return ids.Select(Member).WhereNotNull();
}
public IEnumerable<IPublishedContent> Members(IEnumerable<Guid> ids)
{
return MembershipHelper.GetByIds(ids);
}
public IEnumerable<IPublishedContent> Members(IEnumerable<Udi> ids)
{
return ids.Select(Member).WhereNotNull();
}
public IEnumerable<IPublishedContent> Members(IEnumerable<object> ids)
{
return ids.Select(Member).WhereNotNull();
}
public IEnumerable<IPublishedContent> Members(params int[] ids)
{
return ids.Select(Member).WhereNotNull();
}
public IEnumerable<IPublishedContent> Members(params string[] ids)
{
return ids.Select(Member).WhereNotNull();
}
public IEnumerable<IPublishedContent> Members(params Guid[] ids)
{
return MembershipHelper.GetByIds(ids);
}
public IEnumerable<IPublishedContent> Members(params Udi[] ids)
{
return ids.Select(Member).WhereNotNull();
}
public IEnumerable<IPublishedContent> Members(params object[] ids)
{
return ids.Select(Member).WhereNotNull();
}
#endregion
#region Content

View File

@@ -120,11 +120,6 @@ namespace Umbraco.Web.WebApi
/// </summary>
protected Uri ApplicationUrl => RuntimeState.ApplicationUrl;
/// <summary>
/// Gets the membership helper.
/// </summary>
public MembershipHelper Members => Umbraco.MembershipHelper;
/// <summary>
/// Gets the Umbraco helper.
/// </summary>