82 lines
2.4 KiB
Python
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)
|