Commit c5f05072 authored by Dimitrios Gogos's avatar Dimitrios Gogos
Browse files

feat: update API clients availability messages and enhance provisioning checks

parent dc5c9819
Loading
Loading
Loading
Loading
+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
@@ -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."
          />
        ) : (
          <>
+15 −3
Changes for src/portal_service/api/dependencies.py: 15 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -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,
@@ -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)

+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
@@ -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
+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
@@ -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()