conector-scardua/app/utils/cesar.py
Ricardo 7a9b0f8aa5 Adiciona testes do conector com fixtures offline
Cobre o caminho completo sem depender da VPS estar no ar: cifra com uma
chave de teste descartavel, troca a chave do app por monkeypatch e exercita
a rota.

8 casos: recusa sem token e com token errado; caminho feliz; envelope
adulterado (o GCM tem que estourar, nao passar); cifrado com outra chave;
payload fora do contrato (422, nao 200 nem 500); e dois travando o contrato
com a API da VPS — se o PayloadCompras dos dois lados divergir, quebra aqui
em vez de em producao.

Fixtures em tests/fixtures/: par de chaves so pra teste, o payload real do
Holmes e o payload ja tratado. O .gitignore abre excecao estreita pra
tests/fixtures/*.pem — chave real continua barrada.

Tambem:
- 422 passa a usar HTTP_422_UNPROCESSABLE_CONTENT (o _ENTITY deprecou)
- app/services/holmes.py removido: o conector nao fala com o Holmes
- app/utils/cesar.py entra como veio

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 06:13:13 -03:00

41 lines
1.3 KiB
Python

"""Cifra de Cesar para criptografar/descriptografar senhas."""
import sys
def caesar_encrypt(text: str, shift: int) -> str:
result = []
for char in text:
if char.isalpha():
base = ord("A") if char.isupper() else ord("a")
result.append(chr((ord(char) - base + shift) % 26 + base))
elif char.isdigit():
result.append(str((int(char) + shift) % 10))
else:
result.append(char)
return "".join(result)
def caesar_decrypt(text: str, shift: int) -> str:
return caesar_encrypt(text, -shift)
if __name__ == "__main__":
if len(sys.argv) < 4:
print("Uso: python cezar.py <encript|decript> <deslocamento> <texto> [texto2 ...]")
print("Exemplo: python cezar.py encript 12 minha_senha outra_senha")
sys.exit(1)
modo = sys.argv[1].lower()
shift = int(sys.argv[2])
textos = sys.argv[3:]
if modo == "encript":
for i, texto in enumerate(textos, start=1):
print(f"texto_criptografado{i}: {caesar_encrypt(texto, shift)}")
elif modo == "decript":
for i, texto in enumerate(textos, start=1):
print(f"texto_descriptografado{i}: {caesar_decrypt(texto, shift)}")
else:
print("Modo inválido. Use 'encript' ou 'decript'.")
sys.exit(1)