From 8d1b2b90273ca7ac4c030f7ada26b261f05a7273 Mon Sep 17 00:00:00 2001 From: Marian Date: Mon, 20 Jul 2026 14:38:28 +0000 Subject: [PATCH] chore(config): register BAMBUDDY_OIDC_* in the typo-guard Unknown BAMBUDDY_* vars log "possible typo" on every boot, so a correct OIDC config would have told its operator it was wrong, once per restart. The test asserts against the reader's own variable list rather than a copied one, so a thirteenth variable added later fails here instead of surfacing in somebody's logs. Refs #2593 --- backend/app/core/config.py | 14 ++++++++++++++ backend/tests/unit/test_oidc_env_reader.py | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index a5a99b3e3..72bbca2e5 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -135,6 +135,20 @@ _INTENTIONAL_UNSETTINGS = { "LOG_DIR", # config.py (above) "LOG_LEVEL", # main.py logging setup "BUG_REPORT_RELAY_URL", # config.py (above) + # #2593 — core/oidc_env.py reads these directly; they are not Settings + # fields because they map to an OIDCProvider row, not to app config. + "BAMBUDDY_OIDC_NAME", + "BAMBUDDY_OIDC_ISSUER_URL", + "BAMBUDDY_OIDC_CLIENT_ID", + "BAMBUDDY_OIDC_CLIENT_SECRET", + "BAMBUDDY_OIDC_SCOPES", + "BAMBUDDY_OIDC_ENABLED", + "BAMBUDDY_OIDC_AUTO_CREATE_USERS", + "BAMBUDDY_OIDC_AUTO_LINK_EXISTING", + "BAMBUDDY_OIDC_EMAIL_CLAIM", + "BAMBUDDY_OIDC_REQUIRE_EMAIL_VERIFIED", + "BAMBUDDY_OIDC_ICON_URL", + "BAMBUDDY_OIDC_AUTOLOGIN", } _known_settings_fields = {f.upper() for f in settings.model_fields} diff --git a/backend/tests/unit/test_oidc_env_reader.py b/backend/tests/unit/test_oidc_env_reader.py index 7e8c7b875..307bf3dba 100644 --- a/backend/tests/unit/test_oidc_env_reader.py +++ b/backend/tests/unit/test_oidc_env_reader.py @@ -116,3 +116,14 @@ def test_optional_strings_override_their_defaults(monkeypatch): assert cfg["scopes"] == "openid profile groups" assert cfg["email_claim"] == "mail" assert cfg["icon_url"] == "https://sso.example.com/logo.png" + + +def test_every_var_the_reader_knows_is_registered_in_the_typo_guard(): + """An unregistered BAMBUDDY_* var logs "possible typo" at every boot, which + would tell operators their correct config is wrong. Asserted against the + reader's own vars rather than a copied list, so a var added later is caught + here instead of in someone's logs.""" + from backend.app.core.config import _INTENTIONAL_UNSETTINGS + + unregistered = {v for v in (*REQUIRED, *OPTIONAL) if v not in _INTENTIONAL_UNSETTINGS} + assert not unregistered