From 3a2326984ef8febd91ede6a627bd5675e84e369f Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 1 Jan 2024 11:29:00 +0800 Subject: [PATCH] Only check if there are more than or equal to 4 numbers. --- .../Volo/Abp/Identity/IdentityUserManager.cs | 44 +++++++++++++++---- .../Abp/Identity/IdentityUserManager_Tests.cs | 6 +++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 33c3c7baaf..a8e6a08ead 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using System.Threading; using System.Threading.Tasks; using JetBrains.Annotations; @@ -444,12 +445,19 @@ public class IdentityUserManager : UserManager, IDomainService var userName = email.Split('@')[0]; - if (!Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() && !userName.All(Options.User.AllowedUserNameCharacters.Contains)) + if (await ValidateUserNameAsync(userName)) { - // The username contains not allowed characters. So, we are generating a random username. + // The username is valid. + return userName; + } + + if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace()) + { + // The AllowedUserNameCharacters is not set. So, we are generating a random username. + tryCount = 0; do { - var randomUserName = await GetRandomUserNameAsync(userName.Length); + var randomUserName = userName + RandomHelper.GetRandom(1000, 9999); if ( await ValidateUserNameAsync(randomUserName)) { return randomUserName; @@ -457,18 +465,36 @@ public class IdentityUserManager : UserManager, IDomainService tryCount++; } while (tryCount < maxTryCount); } - else if (await ValidateUserNameAsync(userName)) + else if (!userName.All(Options.User.AllowedUserNameCharacters.Contains)) { - // The username is valid. - return userName; + // The username contains not allowed characters. So, we are generating a random username. + do + { + var randomUserName = await GetRandomUserNameAsync(userName.Length); + if ( await ValidateUserNameAsync(randomUserName)) + { + return randomUserName; + } + tryCount++; + } while (tryCount < maxTryCount); } - else if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() || "0123456789".All(Options.User.AllowedUserNameCharacters.Contains)) + else if (Options.User.AllowedUserNameCharacters.Where(char.IsDigit).Distinct().Count() >= 4) { - // The AllowedUserNameCharacters includes numbers. So, we are generating 4 random numbers and appending to the username. + // The AllowedUserNameCharacters includes 4 numbers. So, we are generating 4 random numbers and appending to the username. + var numbers = Options.User.AllowedUserNameCharacters.Where(char.IsDigit).OrderBy(x => Guid.NewGuid()).Take(4).ToArray(); + var minArray = numbers.OrderBy(x => x).ToArray(); + if (minArray[0] == '0') + { + var secondItem = minArray[1]; + minArray[0] = secondItem; + minArray[1] = '0'; + } + var min = int.Parse(new string(minArray)); + var max = int.Parse(new string(numbers.OrderByDescending(x => x).ToArray())); tryCount = 0; do { - var randomUserName = userName + RandomHelper.GetRandom(1000, 9999); + var randomUserName = userName + RandomHelper.GetRandom(min, max); if ( await ValidateUserNameAsync(randomUserName)) { return randomUserName; diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs index 52f50fba1d..da26de3e3d 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -437,6 +437,12 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase username.ShouldContain("admin"); Regex.IsMatch(username, @"\d{4}$").ShouldBeTrue(); + _identityUserManager.Options.User.AllowedUserNameCharacters = "admin01234"; + username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io"); + username.Length.ShouldBe(9); //admin and random 4 numbers + username.ShouldContain("admin"); + Regex.IsMatch(username, @"[0-4]{3}$").ShouldBeTrue(); + _identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz"; username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io"); username.Length.ShouldBe(9); //admin and random 4 characters