diff --git a/PasswordGenerator.Tests/OmitCharactersTests.cs b/PasswordGenerator.Tests/OmitCharactersTests.cs new file mode 100644 index 0000000..20d1bb5 --- /dev/null +++ b/PasswordGenerator.Tests/OmitCharactersTests.cs @@ -0,0 +1,42 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Text; + +namespace PasswordGenerator.Tests +{ + public class OmitCharactersTests + { + [Test] + public void TestOmit_IlO0B8() + { + var charactersToOmit = "IlO0B8"; + var pwd = new Password(true, true, true, true, charactersToOmit, 8, 100); + var result = pwd.NextGroup(1000); + + foreach (var password in result) + { + var index = password.IndexOfAny(charactersToOmit.ToCharArray()); + Assert.AreEqual(-1, index); + } + } + + [Test] + public void TestNotOmit_IlO0B8() + { + var pwd = new Password(true, true, true, true, null, 8, 100); + var result = pwd.NextGroup(1000); + + var charactersToOmit = "IlO0B8"; + long hasOmitedCharacters = 0; + foreach (var password in result) + { + var index = password.IndexOfAny(charactersToOmit.ToCharArray()); + if (index >= 0) + hasOmitedCharacters++; + } + + Assert.IsTrue(hasOmitedCharacters > 0); + } + } +} diff --git a/PasswordGenerator/IPasswordSettings.cs b/PasswordGenerator/IPasswordSettings.cs index 7ea2d9f..d2c8d80 100644 --- a/PasswordGenerator/IPasswordSettings.cs +++ b/PasswordGenerator/IPasswordSettings.cs @@ -20,5 +20,6 @@ public interface IPasswordSettings IPasswordSettings AddSpecial(); IPasswordSettings AddSpecial(string specialCharactersToAdd); string SpecialCharacters { get; set; } + string OmitCharacters { get; } } } \ No newline at end of file diff --git a/PasswordGenerator/Password.cs b/PasswordGenerator/Password.cs index a09685c..653c16b 100644 --- a/PasswordGenerator/Password.cs +++ b/PasswordGenerator/Password.cs @@ -17,13 +17,14 @@ public class Password : IPassword private const bool DefaultIncludeUppercase = true; private const bool DefaultIncludeNumeric = true; private const bool DefaultIncludeSpecial = true; + private const string DefaultOmitCharacters = null; private static RNGCryptoServiceProvider _rng; public Password() { Settings = new PasswordSettings(DefaultIncludeLowercase, DefaultIncludeUppercase, DefaultIncludeNumeric, DefaultIncludeSpecial, DefaultPasswordLength, DefaultMaxPasswordAttempts, - true); + true, DefaultOmitCharacters); _rng = new RNGCryptoServiceProvider(); } @@ -38,7 +39,8 @@ public Password(IPasswordSettings settings) public Password(int passwordLength) { Settings = new PasswordSettings(DefaultIncludeLowercase, DefaultIncludeUppercase, - DefaultIncludeNumeric, DefaultIncludeSpecial, passwordLength, DefaultMaxPasswordAttempts, true); + DefaultIncludeNumeric, DefaultIncludeSpecial, passwordLength, DefaultMaxPasswordAttempts, true, + DefaultOmitCharacters); _rng = new RNGCryptoServiceProvider(); } @@ -46,7 +48,7 @@ public Password(int passwordLength) public Password(bool includeLowercase, bool includeUppercase, bool includeNumeric, bool includeSpecial) { Settings = new PasswordSettings(includeLowercase, includeUppercase, includeNumeric, - includeSpecial, DefaultPasswordLength, DefaultMaxPasswordAttempts, false); + includeSpecial, DefaultPasswordLength, DefaultMaxPasswordAttempts, false, DefaultOmitCharacters); _rng = new RNGCryptoServiceProvider(); } @@ -55,7 +57,7 @@ public Password(bool includeLowercase, bool includeUppercase, bool includeNumeri int passwordLength) { Settings = new PasswordSettings(includeLowercase, includeUppercase, includeNumeric, - includeSpecial, passwordLength, DefaultMaxPasswordAttempts, false); + includeSpecial, passwordLength, DefaultMaxPasswordAttempts, false, DefaultOmitCharacters); _rng = new RNGCryptoServiceProvider(); } @@ -64,7 +66,16 @@ public Password(bool includeLowercase, bool includeUppercase, bool includeNumeri int passwordLength, int maximumAttempts) { Settings = new PasswordSettings(includeLowercase, includeUppercase, includeNumeric, - includeSpecial, passwordLength, maximumAttempts, false); + includeSpecial, passwordLength, maximumAttempts, false, DefaultOmitCharacters); + + _rng = new RNGCryptoServiceProvider(); + } + + public Password(bool includeLowercase, bool includeUppercase, bool includeNumeric, bool includeSpecial, + string omitCharacters ,int passwordLength, int maximumAttempts) + { + Settings = new PasswordSettings(includeLowercase, includeUppercase, includeNumeric, + includeSpecial, passwordLength, maximumAttempts, false, omitCharacters); _rng = new RNGCryptoServiceProvider(); } diff --git a/PasswordGenerator/PasswordGeneratorSettings.cs b/PasswordGenerator/PasswordGeneratorSettings.cs index 67dcaa9..08f9a05 100644 --- a/PasswordGenerator/PasswordGeneratorSettings.cs +++ b/PasswordGenerator/PasswordGeneratorSettings.cs @@ -5,7 +5,7 @@ public class PasswordGeneratorSettings : PasswordSettings public PasswordGeneratorSettings(bool includeLowercase, bool includeUppercase, bool includeNumeric, bool includeSpecial, int passwordLength, int maximumAttempts, bool usingDefaults) : base(includeLowercase, includeUppercase, includeNumeric, - includeSpecial, passwordLength, maximumAttempts, usingDefaults) + includeSpecial, passwordLength, maximumAttempts, usingDefaults, null) { } } diff --git a/PasswordGenerator/PasswordSettings.cs b/PasswordGenerator/PasswordSettings.cs index 9af29ab..8531794 100644 --- a/PasswordGenerator/PasswordSettings.cs +++ b/PasswordGenerator/PasswordSettings.cs @@ -14,9 +14,10 @@ public class PasswordSettings : IPasswordSettings private const int DefaultMinPasswordLength = 4; private const int DefaultMaxPasswordLength = 256; public string SpecialCharacters { get; set; } + public string OmitCharacters { get; private set; } public PasswordSettings(bool includeLowercase, bool includeUppercase, bool includeNumeric, bool includeSpecial, - int passwordLength, int maximumAttempts, bool usingDefaults) + int passwordLength, int maximumAttempts, bool usingDefaults, string omitCharacters) { IncludeLowercase = includeLowercase; IncludeUppercase = includeUppercase; @@ -28,6 +29,8 @@ public PasswordSettings(bool includeLowercase, bool includeUppercase, bool inclu MaximumLength = DefaultMaxPasswordLength; UsingDefaults = usingDefaults; SpecialCharacters = DefaultSpecialCharacters; + OmitCharacters = omitCharacters; + CharacterSet = BuildCharacterSet(includeLowercase, includeUppercase, includeNumeric, includeSpecial); } @@ -96,9 +99,18 @@ private string BuildCharacterSet(bool includeLowercase, bool includeUppercase, b if (includeNumeric) characterSet.Append(NumericCharacters); if (includeSpecial) characterSet.Append(SpecialCharacters); + + if (!string.IsNullOrEmpty(OmitCharacters)) RemoveOmittedCharacters(characterSet); + return characterSet.ToString(); } + private void RemoveOmittedCharacters(StringBuilder characterSet) + { + foreach (var character in OmitCharacters) + characterSet.Replace(character.ToString(), string.Empty); + } + private void StopUsingDefaults() { if (!UsingDefaults) return;