Loading portal-gui/src/features/api-clients/api-clients.tsx +1 −1 Changes for portal-gui/src/features/api-clients/api-clients.tsx: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ export function ApiClientsPage() { {unavailable ? ( <EmptyState title="API clients are not available" description="This deployment is not set up for API clients." description="This deployment is not set up for API clients. With login turned off (development mode), the APIs can be called without credentials." /> ) : ( <> Loading src/portal_service/api/dependencies.py +15 −3 Changes for src/portal_service/api/dependencies.py: 15 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -27,7 +27,13 @@ from portal_service.app_state import AppState from portal_service.application.api_client_service import ApiClientService from portal_service.application.login_service import LoginService from portal_service.application.session_service import ActiveSession, SessionService from portal_service.config import OIDCSettings, ProvisioningSettings, Settings, get_settings from portal_service.config import ( OIDCSettings, ProvisioningSettings, SecurityMode, Settings, get_settings, ) from portal_service.domain.api_products import ApiProductCatalog from portal_service.domain.errors import ( AuthenticationError, Loading Loading @@ -233,9 +239,15 @@ class Provisioning: def get_provisioning(request: Request, settings: SettingsDep) -> Provisioning: """The API clients feature is off unless provisioning is configured.""" """The API clients feature is off unless provisioning is configured, and with login off: the dev user is unknown to Keycloak, so nothing could be registered for it.""" token = get_app_state(request=request).provisioner_token if settings.provisioning is None or settings.oidc is None or token is None: if ( settings.auth.security_mode == SecurityMode.NONE or settings.provisioning is None or settings.oidc is None or token is None ): raise HTTPException(status.HTTP_404_NOT_FOUND, "API clients are not available here") return Provisioning(settings.provisioning, settings.oidc, token) Loading tests/unit/test_api_client_routes.py +19 −0 Changes for tests/unit/test_api_client_routes.py: 19 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -228,3 +228,22 @@ def test_products_needs_the_app_provider_role(client: TestClient, app: FastAPI) assert client.get("/api/api-products").status_code == 403 assert client.get("/api/api-clients/connection").status_code == 403 def test_with_login_off_the_feature_is_unavailable_even_when_provisioning_is_set( monkeypatch: pytest.MonkeyPatch, s: Setup ) -> None: _apply_env( monkeypatch, AUTH__SECURITY_MODE="none", OIDC__ISSUER="http://localhost:30081/realms/oop", OIDC__CLIENT_ID="oop-portal", OIDC__CLIENT_SECRET="secret", OIDC__REDIRECT_URI="http://localhost:3000/api/auth/callback", **PROVISIONING_ENV, ) from portal_service.main import create_app with TestClient(create_app()) as client: assert client.get("/api/api-clients").status_code == 404 assert client.get("/api/api-clients/connection").status_code == 404 tests/unit/test_api_client_wiring.py +1 −1 Changes for tests/unit/test_api_client_wiring.py: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -69,7 +69,7 @@ def test_provisioning_needs_a_keycloak_style_issuer() -> None: def _app_with_service_route(monkeypatch: pytest.MonkeyPatch, **env: str) -> FastAPI: _apply_env(monkeypatch, AUTH__SECURITY_MODE="none", **env) _apply_env(monkeypatch, AUTH__SECURITY_MODE="jwt", **env) from portal_service.main import create_app app = create_app() Loading Loading
portal-gui/src/features/api-clients/api-clients.tsx +1 −1 Changes for portal-gui/src/features/api-clients/api-clients.tsx: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ export function ApiClientsPage() { {unavailable ? ( <EmptyState title="API clients are not available" description="This deployment is not set up for API clients." description="This deployment is not set up for API clients. With login turned off (development mode), the APIs can be called without credentials." /> ) : ( <> Loading
src/portal_service/api/dependencies.py +15 −3 Changes for src/portal_service/api/dependencies.py: 15 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -27,7 +27,13 @@ from portal_service.app_state import AppState from portal_service.application.api_client_service import ApiClientService from portal_service.application.login_service import LoginService from portal_service.application.session_service import ActiveSession, SessionService from portal_service.config import OIDCSettings, ProvisioningSettings, Settings, get_settings from portal_service.config import ( OIDCSettings, ProvisioningSettings, SecurityMode, Settings, get_settings, ) from portal_service.domain.api_products import ApiProductCatalog from portal_service.domain.errors import ( AuthenticationError, Loading Loading @@ -233,9 +239,15 @@ class Provisioning: def get_provisioning(request: Request, settings: SettingsDep) -> Provisioning: """The API clients feature is off unless provisioning is configured.""" """The API clients feature is off unless provisioning is configured, and with login off: the dev user is unknown to Keycloak, so nothing could be registered for it.""" token = get_app_state(request=request).provisioner_token if settings.provisioning is None or settings.oidc is None or token is None: if ( settings.auth.security_mode == SecurityMode.NONE or settings.provisioning is None or settings.oidc is None or token is None ): raise HTTPException(status.HTTP_404_NOT_FOUND, "API clients are not available here") return Provisioning(settings.provisioning, settings.oidc, token) Loading
tests/unit/test_api_client_routes.py +19 −0 Changes for tests/unit/test_api_client_routes.py: 19 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -228,3 +228,22 @@ def test_products_needs_the_app_provider_role(client: TestClient, app: FastAPI) assert client.get("/api/api-products").status_code == 403 assert client.get("/api/api-clients/connection").status_code == 403 def test_with_login_off_the_feature_is_unavailable_even_when_provisioning_is_set( monkeypatch: pytest.MonkeyPatch, s: Setup ) -> None: _apply_env( monkeypatch, AUTH__SECURITY_MODE="none", OIDC__ISSUER="http://localhost:30081/realms/oop", OIDC__CLIENT_ID="oop-portal", OIDC__CLIENT_SECRET="secret", OIDC__REDIRECT_URI="http://localhost:3000/api/auth/callback", **PROVISIONING_ENV, ) from portal_service.main import create_app with TestClient(create_app()) as client: assert client.get("/api/api-clients").status_code == 404 assert client.get("/api/api-clients/connection").status_code == 404
tests/unit/test_api_client_wiring.py +1 −1 Changes for tests/unit/test_api_client_wiring.py: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -69,7 +69,7 @@ def test_provisioning_needs_a_keycloak_style_issuer() -> None: def _app_with_service_route(monkeypatch: pytest.MonkeyPatch, **env: str) -> FastAPI: _apply_env(monkeypatch, AUTH__SECURITY_MODE="none", **env) _apply_env(monkeypatch, AUTH__SECURITY_MODE="jwt", **env) from portal_service.main import create_app app = create_app() Loading