From 27f4e38263ff8c355b916aafe449cd5e7093c426 Mon Sep 17 00:00:00 2001 From: Simone Chiaretta Date: Thu, 2 Sep 2021 14:11:13 +0200 Subject: [PATCH] Cannot migrate from Umbraco 7 to Umbraco 8 with v8.14+ because userId 0 is skipped over (#10622) --- .../Repositories/Implement/UserRepository.cs | 24 +++++++++++++++---- .../Repositories/UserRepositoryTest.cs | 9 +++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs index a4b19ea2f3..bafc3348e9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs @@ -28,6 +28,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly IMapperCollection _mapperCollection; private readonly IGlobalSettings _globalSettings; + private readonly IRuntimeState _runtimeState; private string _passwordConfigJson; private bool _passwordConfigInitialized; @@ -41,19 +42,22 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// A dictionary specifying the configuration for user passwords. If this is null then no password configuration will be persisted or read. /// /// - public UserRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger, IMapperCollection mapperCollection, IGlobalSettings globalSettings) + /// + public UserRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger, IMapperCollection mapperCollection, IGlobalSettings globalSettings, IRuntimeState runtimeState) : base(scopeAccessor, appCaches, logger) { _mapperCollection = mapperCollection; _globalSettings = globalSettings; + _runtimeState = runtimeState; } // for tests - internal UserRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger, IMapperCollection mapperCollection, IDictionary passwordConfig, IGlobalSettings globalSettings) + internal UserRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger, IMapperCollection mapperCollection, IDictionary passwordConfig, IGlobalSettings globalSettings, IRuntimeState runtimeState) : base(scopeAccessor, appCaches, logger) { _mapperCollection = mapperCollection; _globalSettings = globalSettings; + _runtimeState = runtimeState; _passwordConfigJson = JsonConvert.SerializeObject(passwordConfig); _passwordConfigInitialized = true; } @@ -86,9 +90,21 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // This will never resolve to a user, yet this is asked // for all of the time (especially in cases of members). // Don't issue a SQL call for this, we know it will not exist. - if (id == default || id < -1) + if (_runtimeState.Level == RuntimeLevel.Upgrade) { - return null; + // when upgrading people might come from version 7 where user 0 was the default, + // only in upgrade mode do we want to fetch the user of Id 0 + if (id < -1) + { + return null; + } + } + else + { + if (id == default || id < -1) + { + return null; + } } var sql = SqlContext.Sql() diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index b2efbd34b8..73430826d6 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -17,6 +17,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; using System; using Umbraco.Core.Persistence.Dtos; +using Umbraco.Tests.Components; namespace Umbraco.Tests.Persistence.Repositories { @@ -67,7 +68,7 @@ namespace Umbraco.Tests.Persistence.Repositories private UserRepository CreateRepository(IScopeProvider provider) { var accessor = (IScopeAccessor) provider; - var repository = new UserRepository(accessor, AppCaches.Disabled, Logger, Mappers, TestObjects.GetGlobalSettings()); + var repository = new UserRepository(accessor, AppCaches.Disabled, Logger, Mappers, TestObjects.GetGlobalSettings(), ComponentTests.MockRuntimeState(RuntimeLevel.Run)); return repository; } @@ -85,8 +86,8 @@ namespace Umbraco.Tests.Persistence.Repositories var user = MockedUser.CreateUser(); using (var scope = provider.CreateScope(autoComplete: true)) { - var repository = CreateRepository(provider); - repository.Save(user); + var repository = CreateRepository(provider); + repository.Save(user); } using (var scope = provider.CreateScope(autoComplete: true)) @@ -253,7 +254,7 @@ namespace Umbraco.Tests.Persistence.Repositories var id = user.Id; - var repository2 = new UserRepository((IScopeAccessor) provider, AppCaches.Disabled, Logger, Mock.Of(),TestObjects.GetGlobalSettings()); + var repository2 = new UserRepository((IScopeAccessor) provider, AppCaches.Disabled, Logger, Mock.Of(), TestObjects.GetGlobalSettings(), ComponentTests.MockRuntimeState(RuntimeLevel.Run)); repository2.Delete(user);