diff --git a/src/Umbraco.Core/Security/AuthenticationExtensions.cs b/src/Umbraco.Core/Security/AuthenticationExtensions.cs deleted file mode 100644 index 7c3e835a77..0000000000 --- a/src/Umbraco.Core/Security/AuthenticationExtensions.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Globalization; -using System.Linq; -using System.Security.Claims; -using System.Security.Principal; -using System.Threading; - -namespace Umbraco.Core.Security -{ - public static class AuthenticationExtensions - { - /// - /// This will return the current back office identity if the IPrincipal is the correct type - /// - /// - /// - internal static UmbracoBackOfficeIdentity GetUmbracoIdentity(this IPrincipal user) - { - //If it's already a UmbracoBackOfficeIdentity - if (user.Identity is UmbracoBackOfficeIdentity backOfficeIdentity) return backOfficeIdentity; - - //Check if there's more than one identity assigned and see if it's a UmbracoBackOfficeIdentity and use that - if (user is ClaimsPrincipal claimsPrincipal) - { - backOfficeIdentity = claimsPrincipal.Identities.OfType().FirstOrDefault(); - if (backOfficeIdentity != null) return backOfficeIdentity; - } - - //Otherwise convert to a UmbracoBackOfficeIdentity if it's auth'd and has the back office session - if (user.Identity is ClaimsIdentity claimsIdentity && claimsIdentity.IsAuthenticated && claimsIdentity.HasClaim(x => x.Type == Constants.Security.SessionIdClaimType)) - { - try - { - return UmbracoBackOfficeIdentity.FromClaimsIdentity(claimsIdentity); - } - catch (InvalidOperationException) - { - } - } - - return null; - } - - /// - /// Ensures that the thread culture is set based on the back office user's culture - /// - /// - internal static void EnsureCulture(this IIdentity identity) - { - if (identity is UmbracoBackOfficeIdentity umbIdentity && umbIdentity.IsAuthenticated) - { - Thread.CurrentThread.CurrentUICulture = - Thread.CurrentThread.CurrentCulture = UserCultures.GetOrAdd(umbIdentity.Culture, s => new CultureInfo(s)); - } - } - - - /// - /// Used so that we aren't creating a new CultureInfo object for every single request - /// - private static readonly ConcurrentDictionary UserCultures = new ConcurrentDictionary(); - - } -} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index ed3726a74c..b194102f12 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -126,31 +126,11 @@ Constants.cs --> - - - - - - - - - - - - - - - - - - - - Properties\SolutionInfo.cs diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs index 7169b93cb4..af99b3f843 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs @@ -1,6 +1,8 @@ -using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.Configuration.UmbracoSettings; -namespace Umbraco.Core.Composing.CompositionExtensions +namespace Umbraco.Web.Composing.CompositionExtensions { /// /// Compose configurations. diff --git a/src/Umbraco.Core/Composing/CompositionExtensions/CoreMappingProfiles.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs similarity index 51% rename from src/Umbraco.Core/Composing/CompositionExtensions/CoreMappingProfiles.cs rename to src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs index 165fa10be7..8d7098a0fb 100644 --- a/src/Umbraco.Core/Composing/CompositionExtensions/CoreMappingProfiles.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs @@ -1,7 +1,8 @@ -using Umbraco.Core.Mapping; -using Umbraco.Core.Models.Identity; +using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.Mapping; -namespace Umbraco.Core.Composing.CompositionExtensions +namespace Umbraco.Web.Composing.CompositionExtensions { public static class CoreMappingProfiles @@ -9,8 +10,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions public static Composition ComposeCoreMappingProfiles(this Composition composition) { composition.RegisterUnique(); - composition.WithCollectionBuilder() - .Add(); + return composition; } } diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs index e13b4f9477..caa228d922 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs @@ -1,9 +1,12 @@ -using Umbraco.Core.Configuration; +using Umbraco.Core.Composing; +using Umbraco.Web.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.IO.MediaPathSchemes; using Umbraco.Core.Logging; +using Umbraco.Core; -namespace Umbraco.Core.Composing.CompositionExtensions +namespace Umbraco.Web.Composing.CompositionExtensions { internal static class FileSystems { @@ -74,10 +77,10 @@ namespace Umbraco.Core.Composing.CompositionExtensions // it needs to be registered (not only the interface) because it provides additional // functionality eg for scoping, and is injected in the scope provider - whereas the // interface is really for end-users to get access to filesystems. - composition.RegisterUnique(factory => factory.CreateInstance(factory)); + composition.RegisterUnique(factory => factory.CreateInstance(factory)); // register IFileSystems, which gives access too all filesystems - composition.RegisterUnique(factory => factory.GetInstance()); + composition.RegisterUnique(factory => factory.GetInstance()); // register the scheme for media paths composition.RegisterUnique(); diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs index 0939dd0f71..de2361549f 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs @@ -1,7 +1,9 @@ -using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; -namespace Umbraco.Core.Composing.CompositionExtensions +namespace Umbraco.Web.Composing.CompositionExtensions { /// /// Composes repositories. diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs index c746c2b8b4..b923b0ced8 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs @@ -1,7 +1,9 @@ using System; using System.IO; using System.Linq; +using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Dictionary; using Umbraco.Core.Events; @@ -11,7 +13,7 @@ using Umbraco.Core.Packaging; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; -namespace Umbraco.Core.Composing.CompositionExtensions +namespace Umbraco.Web.Composing.CompositionExtensions { internal static class Services { diff --git a/src/Umbraco.Infrastructure/Models/Membership/User.cs b/src/Umbraco.Infrastructure/Models/Membership/User.cs index ed35aea8f3..30e99af04f 100644 --- a/src/Umbraco.Infrastructure/Models/Membership/User.cs +++ b/src/Umbraco.Infrastructure/Models/Membership/User.cs @@ -322,7 +322,7 @@ namespace Umbraco.Core.Models.Membership } [IgnoreDataMember] - internal bool DefaultToLiveEditing + public bool DefaultToLiveEditing { get => _defaultToLiveEditing; set => SetPropertyValueAndDetectChanges(value, ref _defaultToLiveEditing, nameof(DefaultToLiveEditing)); diff --git a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs similarity index 97% rename from src/Umbraco.Core/Runtime/CoreInitialComposer.cs rename to src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs index 159eb8bca9..4f21944a38 100644 --- a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs @@ -1,25 +1,21 @@ using System; using Umbraco.Core.Cache; using Umbraco.Core.Composing; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Hosting; using Umbraco.Core.Dictionary; -using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Manifest; using Umbraco.Core.Migrations; using Umbraco.Core.Migrations.Install; using Umbraco.Core.Migrations.PostMigrations; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.PackageActions; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.PropertyEditors; using Umbraco.Core.PropertyEditors.Validators; using Umbraco.Core.Scoping; -using Umbraco.Core.Security; using Umbraco.Core.Serialization; using Umbraco.Core.Services; using Umbraco.Core.Strings; diff --git a/src/Umbraco.Core/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs similarity index 98% rename from src/Umbraco.Core/Runtime/CoreRuntime.cs rename to src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs index 077ce2b760..17b6486856 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs @@ -169,12 +169,9 @@ namespace Umbraco.Core.Runtime // type finder/loader var typeLoader = new TypeLoader(IOHelper, TypeFinder, appCaches.RuntimeCache, new DirectoryInfo(HostingEnvironment.LocalTempPath), ProfilingLogger); - // main dom - var mainDom = new MainDom(Logger, HostingEnvironment); - // create the composition composition = new Composition(register, typeLoader, ProfilingLogger, _state, Configs, IOHelper, appCaches); - composition.RegisterEssentials(Logger, Profiler, ProfilingLogger, mainDom, appCaches, databaseFactory, typeLoader, _state, TypeFinder, IOHelper, UmbracoVersion, DbProviderFactoryCreator, BulkSqlInsertProvider); + composition.RegisterEssentials(Logger, Profiler, ProfilingLogger, MainDom, appCaches, databaseFactory, typeLoader, _state, TypeFinder, IOHelper, UmbracoVersion, DbProviderFactoryCreator, BulkSqlInsertProvider); // run handlers RuntimeOptions.DoRuntimeEssentials(composition, appCaches, typeLoader, databaseFactory); diff --git a/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs index e551017295..4876772c86 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs @@ -546,7 +546,7 @@ namespace Umbraco.Core.Services.Implement return _memberRepository.GetPage(query, pageIndex, pageSize, out totalRecords, null, Ordering.By("Name")); } } - + /// /// Finds a list of objects by a partial email string /// @@ -1114,7 +1114,7 @@ namespace Umbraco.Core.Services.Implement /// /// Occurs after members have been exported. /// - internal static event TypedEventHandler Exported; + public static event TypedEventHandler Exported; #endregion diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index 5667c6b1f6..41509aec4c 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -61,10 +61,6 @@ - - - - diff --git a/src/Umbraco.Tests/IO/FileSystemsTests.cs b/src/Umbraco.Tests/IO/FileSystemsTests.cs index 8b8b71304a..11eb9242aa 100644 --- a/src/Umbraco.Tests/IO/FileSystemsTests.cs +++ b/src/Umbraco.Tests/IO/FileSystemsTests.cs @@ -13,7 +13,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Services; using Umbraco.Tests.Components; using Umbraco.Tests.TestHelpers; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Current = Umbraco.Web.Composing.Current; using FileSystems = Umbraco.Core.IO.FileSystems; diff --git a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs index 87bd661015..5e10ad5552 100644 --- a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs +++ b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs @@ -3,7 +3,7 @@ using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Models; diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs index c7bb4415bc..68ab217865 100644 --- a/src/Umbraco.Tests/Models/ContentTests.cs +++ b/src/Umbraco.Tests/Models/ContentTests.cs @@ -10,7 +10,7 @@ using Umbraco.Core; using NUnit.Framework; using Umbraco.Core.Cache; using Umbraco.Core.Composing; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; using Umbraco.Core.Models; diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index ad65ef0a47..2b1722832f 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -3,7 +3,7 @@ using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Services; using Umbraco.Core.Logging; diff --git a/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs b/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs index b0702f0063..b4ee163df0 100644 --- a/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs +++ b/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs @@ -16,7 +16,7 @@ using Umbraco.Core.Services; using Umbraco.Tests.Services; using Umbraco.Tests.Services.Importing; using Umbraco.Tests.Testing; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Configuration; using Umbraco.Core.Strings; diff --git a/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs b/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs index 6b16f49d7d..8d55db6b19 100644 --- a/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs @@ -8,7 +8,7 @@ using Umbraco.Web.Composing; using Umbraco.Core.IO; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Logging; using FileSystems = Umbraco.Core.IO.FileSystems; diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 014959cd1f..1556d0999f 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -38,7 +38,7 @@ using Umbraco.Web.Actions; using Umbraco.Web.ContentApps; using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; -using Umbraco.Core.Composing.CompositionExtensions; +using Umbraco.Web.Composing.CompositionExtensions; using Umbraco.Core.Hosting; using Umbraco.Core.Mapping; using Umbraco.Core.Serialization; diff --git a/src/Umbraco.Core/Compose/AuditEventsComposer.cs b/src/Umbraco.Web/Compose/AuditEventsComposer.cs similarity index 100% rename from src/Umbraco.Core/Compose/AuditEventsComposer.cs rename to src/Umbraco.Web/Compose/AuditEventsComposer.cs diff --git a/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs b/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs index 2d32517001..219111fc56 100644 --- a/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs +++ b/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs @@ -1,6 +1,7 @@ using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Mapping; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Models.Mapping; namespace Umbraco.Web.Composing.CompositionExtensions @@ -27,7 +28,8 @@ namespace Umbraco.Web.Composing.CompositionExtensions .Add() .Add() .Add() - .Add(); + .Add() + .Add();; composition.Register(); composition.Register(); diff --git a/src/Umbraco.Web/Editors/AuthenticationController.cs b/src/Umbraco.Web/Editors/AuthenticationController.cs index 434fadc716..4249cc09fe 100644 --- a/src/Umbraco.Web/Editors/AuthenticationController.cs +++ b/src/Umbraco.Web/Editors/AuthenticationController.cs @@ -27,6 +27,7 @@ using Umbraco.Core.Persistence; using Umbraco.Web.Composing; using IUser = Umbraco.Core.Models.Membership.IUser; using Umbraco.Core.Mapping; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.Editors { diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 4d2f655724..caed09c995 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -23,6 +23,7 @@ using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web.Features; using Umbraco.Web.JavaScript; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Security; using Constants = Umbraco.Core.Constants; using JArray = Newtonsoft.Json.Linq.JArray; diff --git a/src/Umbraco.Web/Editors/PasswordChanger.cs b/src/Umbraco.Web/Editors/PasswordChanger.cs index 6da4e364e1..179ef8fb45 100644 --- a/src/Umbraco.Web/Editors/PasswordChanger.cs +++ b/src/Umbraco.Web/Editors/PasswordChanger.cs @@ -7,6 +7,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; using Umbraco.Web.Models; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Security; using IUser = Umbraco.Core.Models.Membership.IUser; diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 09590c6d2b..2fc79baa44 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -27,6 +27,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Web.Editors.Filters; using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; diff --git a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs index 5b5cc39a06..fd29946ba2 100644 --- a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Migrations.Install; using Umbraco.Core.Models.Identity; using Umbraco.Core.Services; using Umbraco.Web.Install.Models; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Security; namespace Umbraco.Web.Install.InstallSteps diff --git a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs b/src/Umbraco.Web/Models/Identity/BackOfficeIdentityUser.cs similarity index 99% rename from src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs rename to src/Umbraco.Web/Models/Identity/BackOfficeIdentityUser.cs index 7998e4d69c..8f77de67f2 100644 --- a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs +++ b/src/Umbraco.Web/Models/Identity/BackOfficeIdentityUser.cs @@ -4,12 +4,14 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Linq; +using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Models.Entities; +using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; -namespace Umbraco.Core.Models.Identity +namespace Umbraco.Web.Models.Identity { public class BackOfficeIdentityUser : IdentityUser, IdentityUserClaim>, IRememberBeingDirty { diff --git a/src/Umbraco.Core/Models/Identity/IdentityMapDefinition.cs b/src/Umbraco.Web/Models/Identity/IdentityMapDefinition.cs similarity index 97% rename from src/Umbraco.Core/Models/Identity/IdentityMapDefinition.cs rename to src/Umbraco.Web/Models/Identity/IdentityMapDefinition.cs index ef848d545d..7c20c6108a 100644 --- a/src/Umbraco.Core/Models/Identity/IdentityMapDefinition.cs +++ b/src/Umbraco.Web/Models/Identity/IdentityMapDefinition.cs @@ -1,10 +1,12 @@ using System; +using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Mapping; +using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; -namespace Umbraco.Core.Models.Identity +namespace Umbraco.Web.Models.Identity { public class IdentityMapDefinition : IMapDefinition { diff --git a/src/Umbraco.Core/Models/Identity/IdentityUser.cs b/src/Umbraco.Web/Models/Identity/IdentityUser.cs similarity index 98% rename from src/Umbraco.Core/Models/Identity/IdentityUser.cs rename to src/Umbraco.Web/Models/Identity/IdentityUser.cs index 70f2cee9dd..df104fcafe 100644 --- a/src/Umbraco.Core/Models/Identity/IdentityUser.cs +++ b/src/Umbraco.Web/Models/Identity/IdentityUser.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Identity; +using Umbraco.Core.Models.Identity; -namespace Umbraco.Core.Models.Identity +namespace Umbraco.Web.Models.Identity { /// /// Default IUser implementation diff --git a/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs b/src/Umbraco.Web/Models/Identity/UserLoginInfoWrapper.cs similarity index 89% rename from src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs rename to src/Umbraco.Web/Models/Identity/UserLoginInfoWrapper.cs index 926d919ca9..cd3cd51d3f 100644 --- a/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs +++ b/src/Umbraco.Web/Models/Identity/UserLoginInfoWrapper.cs @@ -1,6 +1,7 @@ using Microsoft.AspNet.Identity; +using Umbraco.Core.Models.Identity; -namespace Umbraco.Core.Models.Identity +namespace Umbraco.Web.Models.Identity { internal class UserLoginInfoWrapper : IUserLoginInfo { diff --git a/src/Umbraco.Web/OwinExtensions.cs b/src/Umbraco.Web/OwinExtensions.cs index 6961f5c915..685868a76b 100644 --- a/src/Umbraco.Web/OwinExtensions.cs +++ b/src/Umbraco.Web/OwinExtensions.cs @@ -6,6 +6,7 @@ using Microsoft.Owin.Security; using Umbraco.Core; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Security; namespace Umbraco.Web diff --git a/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs b/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs index 7f43740fcd..48f171434a 100644 --- a/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs +++ b/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs @@ -3,6 +3,7 @@ using System.Configuration; using System.DirectoryServices.AccountManagement; using System.Threading.Tasks; using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.Security { diff --git a/src/Umbraco.Web/Security/AppBuilderExtensions.cs b/src/Umbraco.Web/Security/AppBuilderExtensions.cs index 3f459cf734..c54de50ba7 100644 --- a/src/Umbraco.Web/Security/AppBuilderExtensions.cs +++ b/src/Umbraco.Web/Security/AppBuilderExtensions.cs @@ -20,6 +20,7 @@ using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Net; using Umbraco.Web.Composing; +using Umbraco.Web.Models.Identity; using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Security diff --git a/src/Umbraco.Web/Security/AuthenticationExtensions.cs b/src/Umbraco.Web/Security/AuthenticationExtensions.cs index e2bbd52a5c..1b89002188 100644 --- a/src/Umbraco.Web/Security/AuthenticationExtensions.cs +++ b/src/Umbraco.Web/Security/AuthenticationExtensions.cs @@ -1,6 +1,10 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Globalization; +using System.Linq; using System.Security.Claims; +using System.Security.Principal; using System.Threading; using System.Web; using Microsoft.AspNet.Identity; @@ -340,5 +344,57 @@ namespace Umbraco.Web.Security return secureDataFormat.Unprotect(formsCookie); } + + /// + /// This will return the current back office identity if the IPrincipal is the correct type + /// + /// + /// + public static UmbracoBackOfficeIdentity GetUmbracoIdentity(this IPrincipal user) + { + //If it's already a UmbracoBackOfficeIdentity + if (user.Identity is UmbracoBackOfficeIdentity backOfficeIdentity) return backOfficeIdentity; + + //Check if there's more than one identity assigned and see if it's a UmbracoBackOfficeIdentity and use that + if (user is ClaimsPrincipal claimsPrincipal) + { + backOfficeIdentity = claimsPrincipal.Identities.OfType().FirstOrDefault(); + if (backOfficeIdentity != null) return backOfficeIdentity; + } + + //Otherwise convert to a UmbracoBackOfficeIdentity if it's auth'd and has the back office session + if (user.Identity is ClaimsIdentity claimsIdentity && claimsIdentity.IsAuthenticated && claimsIdentity.HasClaim(x => x.Type == Constants.Security.SessionIdClaimType)) + { + try + { + return UmbracoBackOfficeIdentity.FromClaimsIdentity(claimsIdentity); + } + catch (InvalidOperationException) + { + } + } + + return null; + } + + /// + /// Ensures that the thread culture is set based on the back office user's culture + /// + /// + public static void EnsureCulture(this IIdentity identity) + { + if (identity is UmbracoBackOfficeIdentity umbIdentity && umbIdentity.IsAuthenticated) + { + Thread.CurrentThread.CurrentUICulture = + Thread.CurrentThread.CurrentCulture = UserCultures.GetOrAdd(umbIdentity.Culture, s => new CultureInfo(s)); + } + } + + + /// + /// Used so that we aren't creating a new CultureInfo object for every single request + /// + private static readonly ConcurrentDictionary UserCultures = new ConcurrentDictionary(); + } } diff --git a/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs b/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs index e1cdf272d9..487e16539b 100644 --- a/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs +++ b/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs @@ -6,6 +6,7 @@ using Microsoft.AspNet.Identity; using Umbraco.Core; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; +using Umbraco.Web.Models.Identity; using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Security diff --git a/src/Umbraco.Web/Security/BackOfficeSignInManager.cs b/src/Umbraco.Web/Security/BackOfficeSignInManager.cs index 1779f8e257..1440abc13c 100644 --- a/src/Umbraco.Web/Security/BackOfficeSignInManager.cs +++ b/src/Umbraco.Web/Security/BackOfficeSignInManager.cs @@ -11,6 +11,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; +using Umbraco.Web.Models.Identity; using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Security diff --git a/src/Umbraco.Web/Security/BackOfficeUserManager.cs b/src/Umbraco.Web/Security/BackOfficeUserManager.cs index 688447e52a..6dda5a8b44 100644 --- a/src/Umbraco.Web/Security/BackOfficeUserManager.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserManager.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Net; +using Umbraco.Web.Models.Identity; using IPasswordHasher = Microsoft.AspNet.Identity.IPasswordHasher; namespace Umbraco.Web.Security diff --git a/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs b/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs index 2f5a160198..03477db730 100644 --- a/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs @@ -3,6 +3,7 @@ using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.Security { diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Web/Security/BackOfficeUserStore.cs similarity index 99% rename from src/Umbraco.Core/Security/BackOfficeUserStore.cs rename to src/Umbraco.Web/Security/BackOfficeUserStore.cs index 5dcc472224..7325f10d8b 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserStore.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; +using Umbraco.Web.Models.Identity; using IUser = Umbraco.Core.Models.Membership.IUser; using Task = System.Threading.Tasks.Task; diff --git a/src/Umbraco.Core/Security/BackOfficeUserValidator.cs b/src/Umbraco.Web/Security/BackOfficeUserValidator.cs similarity index 96% rename from src/Umbraco.Core/Security/BackOfficeUserValidator.cs rename to src/Umbraco.Web/Security/BackOfficeUserValidator.cs index 8f15de2378..0f6b9aa1d4 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserValidator.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserValidator.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Identity; -using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; namespace Umbraco.Core.Security { diff --git a/src/Umbraco.Core/Security/ConfiguredPasswordValidator.cs b/src/Umbraco.Web/Security/ConfiguredPasswordValidator.cs similarity index 100% rename from src/Umbraco.Core/Security/ConfiguredPasswordValidator.cs rename to src/Umbraco.Web/Security/ConfiguredPasswordValidator.cs diff --git a/src/Umbraco.Core/Security/EmailService.cs b/src/Umbraco.Web/Security/EmailService.cs similarity index 100% rename from src/Umbraco.Core/Security/EmailService.cs rename to src/Umbraco.Web/Security/EmailService.cs diff --git a/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs b/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs index db26127bfb..56773293da 100644 --- a/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs +++ b/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs @@ -3,6 +3,7 @@ using Microsoft.AspNet.Identity.Owin; using Umbraco.Core; using Umbraco.Web.Composing; using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.Security { diff --git a/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs b/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs index 53e72ef159..b1f3530879 100644 --- a/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs +++ b/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs @@ -1,5 +1,6 @@ using Microsoft.Owin; using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.Security { diff --git a/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs b/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs index c3ce15b487..9b9e7443be 100644 --- a/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs +++ b/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.Security { diff --git a/src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs b/src/Umbraco.Web/Security/IUserAwarePasswordHasher.cs similarity index 100% rename from src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs rename to src/Umbraco.Web/Security/IUserAwarePasswordHasher.cs diff --git a/src/Umbraco.Core/Security/IUserSessionStore.cs b/src/Umbraco.Web/Security/IUserSessionStore.cs similarity index 100% rename from src/Umbraco.Core/Security/IUserSessionStore.cs rename to src/Umbraco.Web/Security/IUserSessionStore.cs diff --git a/src/Umbraco.Core/Security/PasswordSecurity.cs b/src/Umbraco.Web/Security/PasswordSecurity.cs similarity index 100% rename from src/Umbraco.Core/Security/PasswordSecurity.cs rename to src/Umbraco.Web/Security/PasswordSecurity.cs diff --git a/src/Umbraco.Core/Security/UmbracoBackOfficeIdentity.cs b/src/Umbraco.Web/Security/UmbracoBackOfficeIdentity.cs similarity index 100% rename from src/Umbraco.Core/Security/UmbracoBackOfficeIdentity.cs rename to src/Umbraco.Web/Security/UmbracoBackOfficeIdentity.cs diff --git a/src/Umbraco.Core/Security/UmbracoEmailMessage.cs b/src/Umbraco.Web/Security/UmbracoEmailMessage.cs similarity index 100% rename from src/Umbraco.Core/Security/UmbracoEmailMessage.cs rename to src/Umbraco.Web/Security/UmbracoEmailMessage.cs diff --git a/src/Umbraco.Core/Security/UserAwarePasswordHasher.cs b/src/Umbraco.Web/Security/UserAwarePasswordHasher.cs similarity index 98% rename from src/Umbraco.Core/Security/UserAwarePasswordHasher.cs rename to src/Umbraco.Web/Security/UserAwarePasswordHasher.cs index 66545ab70e..bbfc4905bf 100644 --- a/src/Umbraco.Core/Security/UserAwarePasswordHasher.cs +++ b/src/Umbraco.Web/Security/UserAwarePasswordHasher.cs @@ -1,6 +1,6 @@ using System; using Microsoft.AspNet.Identity; -using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; namespace Umbraco.Core.Security { diff --git a/src/Umbraco.Web/Security/WebSecurity.cs b/src/Umbraco.Web/Security/WebSecurity.cs index c4836168dc..cef4c926a4 100644 --- a/src/Umbraco.Web/Security/WebSecurity.cs +++ b/src/Umbraco.Web/Security/WebSecurity.cs @@ -10,6 +10,7 @@ using Microsoft.Owin; using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Core.Models.Identity; +using Umbraco.Web.Models.Identity; using Current = Umbraco.Web.Composing.Current; namespace Umbraco.Web.Security diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index bb4df93eb6..feea890438 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -138,6 +138,8 @@ + + @@ -241,6 +243,10 @@ + + + + @@ -275,9 +281,19 @@ + + + + + + + + + + diff --git a/src/Umbraco.Web/UmbracoInjectedModule.cs b/src/Umbraco.Web/UmbracoInjectedModule.cs index 110fe4abd8..f8725632ae 100644 --- a/src/Umbraco.Web/UmbracoInjectedModule.cs +++ b/src/Umbraco.Web/UmbracoInjectedModule.cs @@ -11,6 +11,7 @@ using Umbraco.Web.Routing; using Umbraco.Core.Exceptions; using Umbraco.Core.Security; using Umbraco.Web.Composing; +using Umbraco.Web.Security; namespace Umbraco.Web { diff --git a/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs b/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs index 20419cc99a..c68b949bba 100644 --- a/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Security; using Umbraco.Web.Security; using Umbraco.Core.Mapping; using Umbraco.Core.Models; +using Umbraco.Web.Models.Identity; namespace Umbraco.Web.WebApi.Filters { diff --git a/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs b/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs index 97af5e768f..cf9707d40b 100644 --- a/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs +++ b/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs @@ -6,6 +6,7 @@ using Umbraco.Web.WebApi.Filters; using Umbraco.Core.Models.Identity; using Umbraco.Core.Persistence; using Umbraco.Core.Services; +using Umbraco.Web.Models.Identity; using Umbraco.Web.Security; namespace Umbraco.Web.WebApi