Adiciona a segunda rotina recuperada do Chave.exe original: chave de
instalacao (8 caracteres tipicos), ao lado da chave de reativacao ja
existente na mesma tela, com um seletor de tipo.
Algoritmo (confirmado matematicamente contra os 3 exemplos reais
fornecidos, byte a byte):
- codigoCliente * 19 + 31 vira um numero inserido sem cifrar no meio
da chave final.
- A modalidade ("30"=ALUGUEL / "00"=COMPRA) e cifrada com o MESMO
algoritmo/chave interna ja usado na reativacao (soma modular + XOR),
gerando 6 hex (3 bytes: 1 aleatorio + 2 cifrados).
- Chave final = 3 primeiros hex + valor do cliente + 3 ultimos hex.
100% client-side (mesmo js puro da reativacao), nunca grava no banco.
Verifiquei os 3 exemplos (DC45092C, 2E35083D, 3D25090C) reproduzindo
o algoritmo em Python antes de trocar o JS - bateram exatamente.
106/106 testes passando.
26 lines
845 B
Python
26 lines
845 B
Python
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.auth import exigir_login
|
|
from app.routers import chave_manual as router_chave_manual
|
|
|
|
app_teste = FastAPI()
|
|
app_teste.include_router(router_chave_manual.router)
|
|
app_teste.dependency_overrides[exigir_login] = lambda: "teste"
|
|
client = TestClient(app_teste)
|
|
|
|
|
|
def test_pagina_gerador_carrega():
|
|
resposta = client.get("/gerador-chave")
|
|
assert resposta.status_code == 200
|
|
assert "gerarReativacao" in resposta.text
|
|
assert "gerarInstalacao" in resposta.text
|
|
assert "Gerador de Chave" in resposta.text
|
|
|
|
|
|
def test_pagina_gerador_nao_grava_nada():
|
|
# Rota é GET-only: não existe POST /gerador-chave, então não há como
|
|
# este router gravar em Clientes_Chaves.
|
|
resposta = client.post("/gerador-chave")
|
|
assert resposta.status_code == 405
|