MirrorAPI/actions/validations/hash.py

82 lines
2.4 KiB
Python

# utils/hash_generator.py
from jose import jwt
from datetime import datetime, timedelta
from datetime import date
import hashlib
# Separa a última parte de uma string com três partes separadas por "/"
def get_last_part(text: str) -> str:
"""
Separa uma string por "/" e retorna a última parte.
Exemplo: "100/15/arquivo.txt" -> "arquivo.txt"
Args:
text (str): String no formato com três partes separadas por "/"
Returns:
str: Última parte da string (após a última "/")
"""
# Se for set, converte o primeiro elemento para string
if isinstance(text, set):
text = next(iter(text)) # pega o primeiro valor do set
# Se ainda não for string, força conversão
text = str(text)
# Retorna a última parte da string separada por "/"
return text.split("/")[-1]
# Função que gera o hash baseado na data atual
def generate_storage_hash() -> str:
"""
Gera um hash SHA-256 baseado na data atual no formato YYYYMMDD.
Útil, por exemplo, para criar chaves ou nomes únicos em arquivos estáticos.
Retorna:
str: Hash SHA-256 em formato hexadecimal.
"""
# Obtém a data atual (somente ano, mês e dia)
today = date.today()
# Formata a data como string "YYYYMMDD"
storage_date = today.strftime("%Y%m%d")
# Cria o objeto de hash SHA-256
h = hashlib.sha256()
# Atualiza o hash com o texto codificado em UTF-8
h.update(storage_date.encode("utf-8"))
# Retorna apenas os 12 primeiros caracteres do hash hexadecimal
return h.hexdigest()[:12]
# Função que gera o token temporário para acesso ao documento
def generate_temporary_token(
file_path: str,
expires_minutes: int,
secret_key: str,
algorithm: str,
) -> str:
# Se for set, converte o primeiro elemento para string
if isinstance(file_path, set):
file_path = next(iter(file_path)) # pega o primeiro valor do set
# Se ainda não for string, força conversão
file_path = str(file_path)
# Retorna a string separada por "/"
file_path = file_path.split("/")
"""Gera um token JWT válido por poucos minutos."""
expire = datetime.utcnow() + timedelta(minutes=expires_minutes)
payload = {
"faixa_superior": file_path[0],
"ato_id": file_path[1],
"file_name": file_path[2], # caminho relativo completo
"exp": expire,
}
return jwt.encode(payload, secret_key, algorithm=algorithm)