diff --git a/projects/Random_password_generator/README.md b/projects/Random_password_generator/README.md index be2b0671..69a6a3ff 100644 --- a/projects/Random_password_generator/README.md +++ b/projects/Random_password_generator/README.md @@ -1,5 +1,5 @@ # Python Password Generator -##### THIS SIMPLE PROJECT WAS MADE USING PYTHON LIBRARY FUNCTIONS LIKE `string` & `random`. +##### THIS SIMPLE PROJECT WAS MADE USING PYTHON LIBRARY FUNCTIONS LIKE `string` , `random` & `pyperclip`. * `string.ascii_letters` - The concatenation of the ascii_lowercase and ascii_uppercase constants described below. This value is not locale-dependent. @@ -21,3 +21,22 @@ The string 01234567. * `string.punctuation` - String of ASCII characters which are considered punctuation characters in the C locale: `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~` + + +-------------------------- +## Password Security Level + +* `a` + - the password with ascii letters , digits & punctuation + +* `b` + - the password with ascii letters & digits. + +* `c` + - the password just with ascii letters . + +* `d` + - the password with ascii lowercase & digits . + +* `e` + - the password just with digits . \ No newline at end of file diff --git a/projects/Random_password_generator/cli.py b/projects/Random_password_generator/cli.py new file mode 100644 index 00000000..8acc6949 --- /dev/null +++ b/projects/Random_password_generator/cli.py @@ -0,0 +1,33 @@ +from psw import password_generator, PasswordSecurityLevel as PSL +from pyperclip import copy + +def main(): + y = 'y' + + print('Hello World !') + print('Wellcome to password generator') + print('------------------------------') + + while(True): + level = input('\n < Enter level of password security > [a/b/c/d/e] : ') + lenght = int(input(' < Enter lenght of password > : ')) + psw_level = PSL.get(level) + + psw = password_generator(psw_level, lenght) + + print(" < your random passwoed > : ", psw) + + copy_condition = input( + " would you like to copy it in your clipboard ? [y/n] : ") + if copy_condition == y: + copy(psw) + print(' done!') + + continue_condition = input(" continue ? [y/n] : ") + if continue_condition != y: + break + + print('so long.') + +if __name__ == '__main__': + main() diff --git a/projects/Random_password_generator/psw.py b/projects/Random_password_generator/psw.py new file mode 100644 index 00000000..d0387d14 --- /dev/null +++ b/projects/Random_password_generator/psw.py @@ -0,0 +1,26 @@ +from string import ascii_lowercase as lowercase +from string import ascii_uppercase as uppercase +from string import digits +from string import punctuation as spacial +from typing import Iterator + +from toolbox import * + + +class PasswordSecurityLevel: + a = mixer(digits, lowercase, uppercase, spacial) + b = mixer(lowercase, uppercase, digits) + c = mixer(lowercase, uppercase) + d = mixer(digits, lowercase) + e = mixer(digits) + + @classmethod + def get(cls, level: str) -> List: + """ return level by level title """ + if len(level) == 1: + return cls.__dict__[level] + + +def password_generator(source: Iterable = PasswordSecurityLevel.a, lenght: int = 8) -> str: + password = ''.join(choice(source, lenght)) + return password diff --git a/projects/Random_password_generator/python-password-generator.py b/projects/Random_password_generator/python-password-generator.py deleted file mode 100644 index 02ff7091..00000000 --- a/projects/Random_password_generator/python-password-generator.py +++ /dev/null @@ -1,10 +0,0 @@ -import random -import string - -total = string.ascii_letters + string.digits + string.punctuation - -length = 16 - -password = "".join(random.sample(total, length)) - -print(password) diff --git a/projects/Random_password_generator/random_password_gen.py b/projects/Random_password_generator/random_password_gen.py deleted file mode 100644 index 9acd726e..00000000 --- a/projects/Random_password_generator/random_password_gen.py +++ /dev/null @@ -1,43 +0,0 @@ -import random -import math - -alpha = "abcdefghijklmnopqrstuvwxyz" -num = "0123456789" -special = "@#$%&*" - -# pass_len=random.randint(8,13) #without User INput -pass_len = int(input("Enter Password Length")) - -# length of password by 50-30-20 formula -alpha_len = pass_len//2 -num_len = math.ceil(pass_len*30/100) -special_len = pass_len-(alpha_len+num_len) - - -password = [] - - -def generate_pass(length, array, is_alpha=False): - for i in range(length): - index = random.randint(0, len(array) - 1) - character = array[index] - if is_alpha: - case = random.randint(0, 1) - if case == 1: - character = character.upper() - password.append(character) - - -# alpha password -generate_pass(alpha_len, alpha, True) -# numeric password -generate_pass(num_len, num) -# special Character password -generate_pass(special_len, special) -# suffle the generated password list -random.shuffle(password) -# convert List To string -gen_password = "" -for i in password: - gen_password = gen_password + str(i) -print(gen_password) diff --git a/projects/Random_password_generator/requirements.txt b/projects/Random_password_generator/requirements.txt new file mode 100644 index 00000000..e69de29b diff --git a/projects/Random_password_generator/toolbox.py b/projects/Random_password_generator/toolbox.py new file mode 100644 index 00000000..8ee02fe4 --- /dev/null +++ b/projects/Random_password_generator/toolbox.py @@ -0,0 +1,12 @@ +from random import choices +from typing import Iterable, List + + +def mixer(*iterators: Iterable) -> List: + """ merge itrators to one itrator """ + return list(value for row in zip(*iterators) for value in row) + + +def choice(iterator: Iterable, count: int) -> List: + """ shortcut for random.choices """ + return choices(iterator, k=count) diff --git a/requirementsALL.txt b/requirementsALL.txt index e1238a78..d7175d5f 100644 --- a/requirementsALL.txt +++ b/requirementsALL.txt @@ -60,3 +60,4 @@ wikipedia==1.4.0 win10toast==0.9 wordcloud==1.8.0 xmltodict==0.12.0 +pyperclip==1.8.2 \ No newline at end of file