Files
drf-rack/net/xeaf/rack/managers/crypto_manager.py

71 lines
2.1 KiB
Python

# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CryptoManager
"""
import secrets
class CryptoManager:
"""
Реализует методы работы со случайными и криптографическими значениями
"""
DEFAULT_TOKEN_LENGTH = 40
""" Длина токена по умолчанию """
DEFAULT_PIN_CODE_LENGTH = 4
""" Длина PIN-кода по умолчанию """
DEFAULT_PIN_CODE_ALPHABET = "0123456789"
""" Алфавит PIN-кода по умолчанию """
DEFAULT_SLUG_LENGTH = 8
""" Длина slug по умолчанию """
@classmethod
def gen_token(cls, length: int = DEFAULT_TOKEN_LENGTH) -> str:
"""
Генерирует случайный токен
:param length: Длина токена
:return: Сгенерированный токен
"""
bytes_needed = (length + 1) // 2
token = secrets.token_hex(bytes_needed)
return token[:length]
@classmethod
def gen_pin_code(cls, length: int = DEFAULT_PIN_CODE_LENGTH, alphabet: str = DEFAULT_PIN_CODE_ALPHABET):
"""
Генерирует случайный PIN-код
:param length: Длина PIN-кода
:param alphabet: Алфавит PIN-кода
:return: Сгенерированный PIN-код
"""
return "".join(secrets.choice(alphabet) for _ in range(length))
@classmethod
def gen_slug(cls, prefix: str, length: int = DEFAULT_SLUG_LENGTH):
"""
Генерирует случайный slug
:param prefix: Префикс slug
:param length: Длина slug
:return: Сгенерированный slug
"""
l = length - len(prefix)
if l <= 0:
return prefix
return prefix + cls.gen_token(l)