Browse Source

Handle the case when email contains invalid chars.

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

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

@ -439,54 +439,58 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
public virtual async Task<string> GetUserNameFromEmailAsync(string email) public virtual async Task<string> GetUserNameFromEmailAsync(string email)
{ {
const int maxTryCount = 20;
var tryCount = 0;
var userName = email.Split('@')[0]; var userName = email.Split('@')[0];
if (!Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() && !userName.All(Options.User.AllowedUserNameCharacters.Contains)) if (!Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() && !userName.All(Options.User.AllowedUserNameCharacters.Contains))
{ {
// The user name contains not allowed characters. We will use the email address as user name. // The username contains not allowed characters. So, we are generating a random username.
return email; do
{
var randomUserName = await GetRandomUserNameAsync(userName.Length);
if ( await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
} }
else if (await ValidateUserNameAsync(userName))
if (await ValidateUserNameAsync(userName))
{ {
// The username is valid.
return userName; return userName;
} }
else if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() || "0123456789".All(Options.User.AllowedUserNameCharacters.Contains))
const int maxTryCount = 10;
var tryCount = 0;
if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace() || "0123456789".All(Options.User.AllowedUserNameCharacters.Contains))
{ {
var randomUserName = userName; // The AllowedUserNameCharacters includes numbers. So, we are generating 4 random numbers and appending to the username.
var isUserNameValid = await ValidateUserNameAsync(randomUserName); tryCount = 0;
while (tryCount < maxTryCount) do
{ {
randomUserName = userName + RandomHelper.GetRandom(1000, 9999); var randomUserName = userName + RandomHelper.GetRandom(1000, 9999);
isUserNameValid = await ValidateUserNameAsync(randomUserName); if ( await ValidateUserNameAsync(randomUserName))
if (isUserNameValid)
{ {
return randomUserName; return randomUserName;
} }
tryCount++; tryCount++;
} } while (tryCount < maxTryCount);
if (isUserNameValid)
{
return randomUserName;
}
} }
else
tryCount = 0;
while (tryCount < maxTryCount)
{ {
var randomUserName = userName + await GetRandomUserNameAsync(4); tryCount = 0;
var isUserNameValid = await ValidateUserNameAsync(randomUserName); do
if (isUserNameValid)
{ {
return randomUserName; // The AllowedUserNameCharacters does not include numbers. So, we are generating 4 random characters and appending to the username.
} var randomUserName = userName + await GetRandomUserNameAsync(4);
tryCount++; if (await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
} }
// We could not find a valid user name so we are returning the email address. throw new AbpException($"Could not get a valid user name for the given email address: {email}, allowed characters: {Options.User.AllowedUserNameCharacters}, tried {maxTryCount} times.");
return email;
} }
} }

7
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs

@ -427,7 +427,12 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
public async Task GetUserNameFromEmailAsync() public async Task GetUserNameFromEmailAsync()
{ {
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789"; _identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
var username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io"); var username = await _identityUserManager.GetUserNameFromEmailAsync("Yönetici@abp.io");
username.Length.ShouldBe("Yönetici".Length); //random username
username.All(c => "abcdefghijklmnopqrstuvwxyz0123456789".Contains(c)).ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 numbers username.Length.ShouldBe(9); //admin and random 4 numbers
username.ShouldContain("admin"); username.ShouldContain("admin");
Regex.IsMatch(username, @"\d{4}$").ShouldBeTrue(); Regex.IsMatch(username, @"\d{4}$").ShouldBeTrue();

Loading…
Cancel
Save