From d5f3708c506c0f219f484df69fff38e72781ded2 Mon Sep 17 00:00:00 2001 From: StNicolay Date: Tue, 15 Nov 2022 15:08:27 +0300 Subject: [PATCH] Refactored utils.py Created constants FORBIDDEN_CHARS, PUNCTUATION, PASSWORD_CHARS Removed pipe from forbidden chars Moved Message type alias to the top of the file Optimized _base_check and made its parameter positional only Changed gen_password to use said constants --- src/bot/utils.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/bot/utils.py b/src/bot/utils.py index b841c53..b1db49f 100644 --- a/src/bot/utils.py +++ b/src/bot/utils.py @@ -11,6 +11,15 @@ from sqlalchemy.future import Engine from .. import cryptography, database +FORBIDDEN_CHARS = frozenset("`\n") +PUNCTUATION = frozenset(string.punctuation).difference(FORBIDDEN_CHARS) +PASSWORD_CHARS = tuple( + frozenset(string.ascii_letters + string.digits).difference(FORBIDDEN_CHARS) + | PUNCTUATION +) +Message = telebot.types.Message + + class _Account(pydantic.BaseModel): name: str login: str @@ -38,9 +47,6 @@ def json_to_accounts(json_: str) -> list[tuple[str, str, str]]: return [i.as_tuple() for i in accounts.accounts] -Message = telebot.types.Message - - def send_tmp_message( bot: telebot.TeleBot, chat_id: telebot.types.Message, text: str, timeout: int = 5 ) -> None: @@ -78,9 +84,9 @@ def accounts_to_json(accounts: list[tuple[str, str, str]]) -> io.StringIO: return file -def _base_check(val: str) -> bool: +def _base_check(val: str, /) -> bool: "Returns false if finds new lines or backtick (`)" - return not ("\n" in val or "`" in val) + return not any(i in FORBIDDEN_CHARS for i in val) def check_account_name(name: str) -> bool: @@ -106,17 +112,14 @@ def check_account(name: str, login: str, passwd: str) -> bool: def gen_passwd() -> str: """Generates password of length 32""" choices = SystemRandom().choices - # Remove backtick and pipe from pucntuation - punctuation = set(string.punctuation).difference("`|") - chars = tuple(string.ascii_letters + string.digits + "".join(punctuation)) while True: - passwd = "".join(choices(chars, k=32)) + passwd = "".join(choices(PASSWORD_CHARS, k=32)) # If there is at least one lowercase character, uppercase character # and one punctuation character if ( any(c.islower() for c in passwd) and any(c.isupper() for c in passwd) and any(c.isdigit() for c in passwd) - and any(c in punctuation for c in passwd) + and any(c in PUNCTUATION for c in passwd) ): return passwd