From dbe793974f8f9e6db5d5831759c1cf77c9de828a Mon Sep 17 00:00:00 2001 From: iscarelli Date: Wed, 10 Jun 2026 12:23:04 -0300 Subject: [PATCH] =?UTF-8?q?fix(demo):=20n=C3=A3o=20oferecer=20troca=20de?= =?UTF-8?q?=20senha=20/=202FA=20no=20menu=20em=20modo=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O backend já bloqueia /account/password e /account/2fa via @demo_blocked, mas o menu do usuário ainda mostrava os links (beco sem saída). No DEMO_MODE o menu agora exibe só o nome do usuário, sem ações de conta. Testes: tests/test_demo_account.py (GET/POST bloqueados, senha intacta, links ausentes no demo e presentes fora dele). 123 passando. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 5 +++++ VERSION | 2 +- templates/base.html | 8 ++++++++ tests/test_demo_account.py | 39 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/test_demo_account.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d17b06..ee3755b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,11 @@ Versioning follows [SemVer](https://semver.org/): **MAJOR.MINOR.PATCH** --- +## [1.35.1] — 2026-06-10 + +### Fixed +- **Modo demo não oferece mais "Trocar senha" e "Verificação em duas etapas".** O backend já bloqueava ambas (`@demo_blocked`), mas o menu do usuário ainda exibia os links — que viravam beco sem saída (clique → aviso → volta). No `DEMO_MODE` o menu agora mostra apenas o nome do usuário, sem ações de conta. + ## [1.35.0] — 2026-06-10 ### Added diff --git a/VERSION b/VERSION index 2aeaa11..7eee785 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.35.0 +1.35.1 diff --git a/templates/base.html b/templates/base.html index 92700cc..0399515 100644 --- a/templates/base.html +++ b/templates/base.html @@ -144,6 +144,13 @@ + {% if demo_mode %} + {# No modo demo as ações de conta (trocar senha / 2FA) são bloqueadas no backend; + não oferecemos os links para não virarem beco sem saída. Só o nome do usuário. #} + + {{ session.username }} + + {% else %} + {% endif %}
diff --git a/tests/test_demo_account.py b/tests/test_demo_account.py new file mode 100644 index 0000000..3df5d2b --- /dev/null +++ b/tests/test_demo_account.py @@ -0,0 +1,39 @@ +"""Modo demo: ações de conta bloqueadas e não oferecidas na UI. + +No DEMO_MODE o admin não pode trocar a senha nem ativar 2FA — o backend bloqueia +(@demo_blocked) e o menu do usuário não mostra esses links (viram beco sem saída). +""" +from werkzeug.security import check_password_hash + + +def test_demo_mode_blocks_password_change_get(auth_client, app_module, monkeypatch): + monkeypatch.setattr(app_module, "DEMO_MODE", True) + resp = auth_client.get("/account/password") + assert resp.status_code == 302 # demo_blocked redireciona + + +def test_demo_mode_blocks_password_change_post(auth_client, app_module, db, monkeypatch): + monkeypatch.setattr(app_module, "DEMO_MODE", True) + before = db.get_user_by_username("admin")["password_hash"] + resp = auth_client.post("/account/password", data={ + "current_password": "admin-test-pass", + "new_password": "nova-senha-123", + "confirm_password": "nova-senha-123", + }) + assert resp.status_code == 302 # bloqueado, não processa + after = db.get_user_by_username("admin")["password_hash"] + assert after == before # senha intacta + assert not check_password_hash(after, "nova-senha-123") + + +def test_demo_mode_hides_account_menu_links(auth_client, app_module, monkeypatch): + monkeypatch.setattr(app_module, "DEMO_MODE", True) + html = auth_client.get("/").get_data(as_text=True) + assert "/account/password" not in html + assert "/account/2fa" not in html + + +def test_non_demo_shows_account_menu_links(auth_client): + html = auth_client.get("/").get_data(as_text=True) + assert "/account/password" in html + assert "/account/2fa" in html