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