Browse Source

Only check if there are more than or equal to 4 numbers.

pull/18612/head
maliming 3 years ago
parent
commit
3a2326984e
  1. 44
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs
  2. 6
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs

44
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Numerics;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using JetBrains.Annotations; using JetBrains.Annotations;
@ -444,12 +445,19 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
var userName = email.Split('@')[0]; 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 do
{ {
var randomUserName = await GetRandomUserNameAsync(userName.Length); var randomUserName = userName + RandomHelper.GetRandom(1000, 9999);
if ( await ValidateUserNameAsync(randomUserName)) if ( await ValidateUserNameAsync(randomUserName))
{ {
return randomUserName; return randomUserName;
@ -457,18 +465,36 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
tryCount++; tryCount++;
} while (tryCount < maxTryCount); } while (tryCount < maxTryCount);
} }
else if (await ValidateUserNameAsync(userName)) else if (!userName.All(Options.User.AllowedUserNameCharacters.Contains))
{ {
// The username is valid. // The username contains not allowed characters. So, we are generating a random username.
return 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; tryCount = 0;
do do
{ {
var randomUserName = userName + RandomHelper.GetRandom(1000, 9999); var randomUserName = userName + RandomHelper.GetRandom(min, max);
if ( await ValidateUserNameAsync(randomUserName)) if ( await ValidateUserNameAsync(randomUserName))
{ {
return randomUserName; return randomUserName;

6
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"); username.ShouldContain("admin");
Regex.IsMatch(username, @"\d{4}$").ShouldBeTrue(); 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"; _identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz";
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io"); username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 characters username.Length.ShouldBe(9); //admin and random 4 characters

Loading…
Cancel
Save