71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
# DRF Rack
|
|
# Библиотека классов расширений для Django REST Framework
|
|
#
|
|
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
|
# Все права защищены. Лицензия: MIT
|
|
|
|
"""
|
|
Описание класса CryptoManager
|
|
"""
|
|
|
|
import secrets
|
|
|
|
|
|
class CryptoManager:
|
|
"""
|
|
Реализует методы работы со случайными и криптографическими значениями
|
|
"""
|
|
|
|
DEFAULT_TOKEN_LENGTH = 32
|
|
""" Длина токена по умолчанию """
|
|
|
|
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)
|