Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.35.0
1.35.1
8 changes: 8 additions & 0 deletions templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,13 @@
</ul>
</div>

{% 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. #}
<span class="btn btn-outline-secondary btn-sm disabled d-inline-flex align-items-center justify-content-center me-2" style="height:2rem">
<i class="bi bi-person-circle me-1"></i>{{ session.username }}
</span>
{% else %}
<div class="dropdown me-2">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle d-inline-flex align-items-center justify-content-center" data-bs-toggle="dropdown" style="height:2rem">
<i class="bi bi-person-circle me-1"></i>{{ session.username }}
Expand All @@ -153,6 +160,7 @@
<li><a class="dropdown-item" href="{{ url_for('account_2fa') }}"><i class="bi bi-shield-lock me-2"></i>{{ _('Verificação em duas etapas') }}</a></li>
</ul>
</div>
{% endif %}
<form method="post" action="{{ url_for('logout') }}" class="d-inline">
<button class="btn btn-outline-secondary btn-sm d-inline-flex align-items-center justify-content-center" type="submit" style="height:2rem">{{ _('Sair') }}</button>
</form>
Expand Down
39 changes: 39 additions & 0 deletions tests/test_demo_account.py
Original file line number Diff line number Diff line change
@@ -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