Skip to content

Commit

Permalink
v1.0.1
Browse files Browse the repository at this point in the history
  • Loading branch information
Tynab committed Jan 26, 2023
1 parent 56a6a36 commit b6fed11
Show file tree
Hide file tree
Showing 9 changed files with 411 additions and 9 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ private void Func(string s)
- Text
- List
- Random
- Process
- Task

### OTHER
- Password
Expand Down
18 changes: 11 additions & 7 deletions YANLib/YANLib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,20 @@
<PackAsTool>False</PackAsTool>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryType>git</RepositoryType>
<PackageReleaseNotes>Extension:
- Numeric
- Text
- List
- Random
Other:
- Password</PackageReleaseNotes>
<PackageReleaseNotes>Fix:
- HasValue (YANText)
- HasCharater (YANText)
Add:
- HasValues (YANText)
- HasCharaters (YANText)
- WaitAnyWithCondition (YANTask)
- ProcessKiller (YANProcess)
- IsValidPasswordStandard (YANPass)
- IsValidPassword (YANPass)</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
<PackageId>Tynab.YANLib</PackageId>
<Version>1.0.1</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
315 changes: 315 additions & 0 deletions YANLib/YANPass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@
using static System.Security.Cryptography.CryptographicOperations;
using static System.Security.Cryptography.RandomNumberGenerator;
using static System.Security.Cryptography.Rfc2898DeriveBytes;
using static System.Threading.Tasks.Task;

namespace YANLib;

public class YANPass
{
#region Fields
private readonly List<char> PASSWORD_SPECIAL_CHARATERS_STANDARD = new() { '@', '#', '$', '%' };
#endregion

#region Properties
public int SaltSize { get; set; } = 16; // 128 bits
public int KeySize { get; set; } = 32; // 256 bits
Expand Down Expand Up @@ -47,5 +52,315 @@ public bool Verify(string password, string strHash)
return false;
}
}

/// <summary>
/// Check if password is valid (standard).
/// </summary>
/// <param name="password">Input password.</param>
/// <returns>Password is valid or not.</returns>
public bool IsValidPasswordStandard(string password)
{
// has character
if (!password.HasCharater())
{
return false;
}
// has 8 character
if (password.Length < 8)
{
return false;
}
var tasks = new Task<bool>[4];
// has lower case
tasks[0] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToLower())
{
return true;
}
}
return false;
});
// has upper case
tasks[1] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToUpper())
{
return true;
}
}
return false;
});
// has number
tasks[2] = Run(() =>
{
foreach (var c in password)
{
if (int.TryParse(c.ToString(), out var _))
{
return true;
}
}
return false;
});
// has special character
tasks[3] = Run(() =>
{
foreach (var c in password)
{
if (PASSWORD_SPECIAL_CHARATERS_STANDARD.Contains(c))
{
return true;
}
}
return false;
});
WaitAll(tasks);
return tasks[0].Result && tasks[1].Result && tasks[2].Result && tasks[3].Result;
}

/// <summary>
/// Check if password is valid.
/// </summary>
/// <param name="password">Input password.</param>
/// <param name="len">Password length limit.</param>
/// <returns>Password is valid or not.</returns>
public bool IsValidPassword(string password, int len)
{
// has character
if (!password.HasCharater())
{
return false;
}
// has 8 character
if (password.Length < len)
{
return false;
}
var tasks = new Task<bool>[4];
// has lower case
tasks[0] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToLower())
{
return true;
}
}
return false;
});
// has upper case
tasks[1] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToUpper())
{
return true;
}
}
return false;
});
// has number
tasks[2] = Run(() =>
{
foreach (var c in password)
{
if (int.TryParse(c.ToString(), out var _))
{
return true;
}
}
return false;
});
// has special character
tasks[3] = Run(() =>
{
foreach (var c in password)
{
if (PASSWORD_SPECIAL_CHARATERS_STANDARD.Contains(c))
{
return true;
}
}
return false;
});
WaitAll(tasks);
return tasks[0].Result && tasks[1].Result && tasks[2].Result && tasks[3].Result;
}

/// <summary>
/// Check if password is valid.
/// </summary>
/// <param name="password">Input password.</param>
/// <param name="splChars">Special characters check.</param>
/// <returns>Password is valid or not.</returns>
public bool IsValidPassword(string password, params char[] splChars)
{
// has character
if (!password.HasCharater())
{
return false;
}
// has 8 character
if (password.Length < 8)
{
return false;
}
var tasks = new Task<bool>[4];
// create new list password special charaters
var newPwdSplChar = new List<char>(PASSWORD_SPECIAL_CHARATERS_STANDARD);
foreach (var c in splChars)
{
if (!newPwdSplChar.Contains(c))
{
newPwdSplChar.Add(c);
}
}
// has lower case
tasks[0] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToLower())
{
return true;
}
}
return false;
});
// has upper case
tasks[1] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToUpper())
{
return true;
}
}
return false;
});
// has number
tasks[2] = Run(() =>
{
foreach (var c in password)
{
if (int.TryParse(c.ToString(), out var _))
{
return true;
}
}
return false;
});
// has special character
tasks[3] = Run(() =>
{
foreach (var c in password)
{
if (newPwdSplChar.Contains(c))
{
return true;
}
}
return false;
});
WaitAll(tasks);
return tasks[0].Result && tasks[1].Result && tasks[2].Result && tasks[3].Result;
}

/// <summary>
/// Check if password is valid.
/// </summary>
/// <param name="password">Input password.</param>
/// <param name="len">Password length limit.</param>
/// <param name="splChars">Special characters check.</param>
/// <returns>Password is valid or not.</returns>
public bool IsValidPassword(string password, int len, params char[] splChars)
{
// has character
if (!password.HasCharater())
{
return false;
}
// has 8 character
if (password.Length < len)
{
return false;
}
var tasks = new Task<bool>[4];
// create new list password special charaters
var newPwdSplChar = new List<char>(PASSWORD_SPECIAL_CHARATERS_STANDARD);
foreach (var c in splChars)
{
if (!newPwdSplChar.Contains(c))
{
newPwdSplChar.Add(c);
}
}
// has lower case
tasks[0] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToLower())
{
return true;
}
}
return false;
});
// has upper case
tasks[1] = Run(() =>
{
foreach (var c in password)
{
var str = c.ToString();
if (str == str.ToUpper())
{
return true;
}
}
return false;
});
// has number
tasks[2] = Run(() =>
{
foreach (var c in password)
{
if (int.TryParse(c.ToString(), out var _))
{
return true;
}
}
return false;
});
// has special character
tasks[3] = Run(() =>
{
foreach (var c in password)
{
if (newPwdSplChar.Contains(c))
{
return true;
}
}
return false;
});
WaitAll(tasks);
return tasks[0].Result && tasks[1].Result && tasks[2].Result && tasks[3].Result;
}
#endregion
}
18 changes: 18 additions & 0 deletions YANLib/YANProcess.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using static System.Diagnostics.Process;

namespace YANLib;

public static partial class YANProcess
{
/// <summary>
/// Kill all process with name.
/// </summary>
/// <param name="name">Process name.</param>
public static void ProcessKiller(this string name)
{
while (GetProcessesByName(name).Length > 0)
{
GetProcessesByName(name).FirstOrDefault()?.Kill();
}
}
}
Loading

0 comments on commit b6fed11

Please sign in to comment.