MirrorAPI/actions/validations/hash.py

83 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(
# expires_minutes: int,
# secret_key: str,
# algorithm: str,
# ) -> str:
# """Gera um token JWT válido por poucos minutos."""
# expire = datetime.utcnow() + timedelta(minutes=expires_minutes)
# payload = {
# "exp": expire,
# }
# return jwt.encode(payload, secret_key, algorithm=algorithm)
def generate_temporary_token(
file_path: str,
expires_minutes: int,
secret_key: str,
algorithm: str,
) -> str:
"""Gera um token JWT válido por poucos minutos."""
expire = datetime.utcnow() + timedelta(minutes=expires_minutes)
payload = {
"sub": file_id,
"filename": file_path, # caminho relativo completo
"exp": expire,
}
return jwt.encode(payload, secret_key, algorithm=algorithm)