Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added test for CVE issue-11435 #889

Merged
merged 1 commit into from
Nov 22, 2024
Merged
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
95 changes: 68 additions & 27 deletions testsuite/tests/apicast/auth/test_basic_auth_app_id.py
Original file line number Diff line number Diff line change
@@ -1,65 +1,106 @@
"""
Service requires credentials (app_id, app_key) to be passed using the Basic Auth

Rewrite ./spec/functional_specs/auth/basic_auth_app_id_spec.rb
"""

import pytest

from threescale_api.resources import Service
from packaging.version import Version # noqa # pylint: disable=unused-import

from testsuite import TESTED_VERSION # noqa # pylint: disable=unused-import
from testsuite.capabilities import Capability
from testsuite.gateways.apicast.selfmanaged import SelfManagedApicast
from testsuite.gateways.apicast.system import SystemApicast
from testsuite.httpx import HttpxClient
from testsuite.utils import basic_auth_string


@pytest.fixture(scope="module")
def service_settings(service_settings):
"Set auth mode to app_id/app_key"
"""Set auth mode to app_id/app_key."""
service_settings.update({"backend_version": Service.AUTH_APP_ID_KEY})
return service_settings


@pytest.fixture(scope="module")
def service_proxy_settings(service_proxy_settings):
"Set credentials location to 'authorization' (Basic HTTP auth)"
"""Set credentials location to 'authorization' (Basic HTTP auth)."""
service_proxy_settings.update({"credentials_location": "authorization"})
return service_proxy_settings


@pytest.mark.smoke
def test_basic_auth_app_id_key(application, api_client):
"""Test client access with Basic HTTP Auth using app id and app key

Configure Api/Service to use App ID / App Key Authentication
and Basic HTTP Auth to pass the credentials.
@pytest.fixture(scope="module")
def http_client(application):
"""Provide an HttpxClient instance using HTTP 1.1."""
client = HttpxClient(False, application)
client.auth = None # No default authentication
yield client
client.close()

Then request made with appropriate Basic auth made has to pass as expected"""

@pytest.fixture(scope="module")
def valid_auth_headers(application):
"""Generate valid Basic Auth headers."""
creds = application.authobj().credentials
expected_authorization = basic_auth_string(creds["app_id"], creds["app_key"])

response = api_client().get("/get")
authorization = basic_auth_string(creds["app_id"], creds["app_key"])
return {"Authorization": authorization}

assert response.status_code == 200
assert response.request.headers["Authorization"] == expected_authorization

@pytest.fixture(scope="module")
def malformed_request(http_client):
"""Create a function to make requests with malformed auth headers."""

def test_basic_auth_app_id_403_with_query(application, api_client):
"Forbid access if credentials passed wrong way"
client = api_client()
def prepare_request():
headers = {"Authorization": "Basic test123?"} # Malformed authorization header
return http_client.get("/get", headers=headers)

client.auth = application.authobj(location="query")
return prepare_request

response = client.get("/get")

assert response.status_code == 403
@pytest.fixture(
scope="module",
params=[
SystemApicast,
pytest.param(SelfManagedApicast, marks=pytest.mark.required_capabilities(Capability.CUSTOM_ENVIRONMENT)),
],
)
def gateway_kind(request):
"""Gateway class to use for tests"""
return request.param


def test_basic_auth_app_id_403_without_auth(api_client):
"Forbid access if no credentials"
@pytest.mark.smoke
def test_basic_auth_success(http_client, valid_auth_headers):
"""Test valid Basic HTTP Auth using app_id and app_key."""
response = http_client.get("/get", headers=valid_auth_headers)
assert response.status_code == 200, "Valid request failed unexpectedly."
assert response.request.headers["Authorization"] == valid_auth_headers["Authorization"]


@pytest.mark.parametrize(
"auth_method, expected_status",
[
("query", 403), # Credentials passed as query parameters
(None, 403), # No credentials
],
)
def test_basic_auth_failure(api_client, application, auth_method, expected_status):
"""Test forbidden access when credentials are passed incorrectly or missing."""
client = api_client()
client.auth = application.authobj(location=auth_method) if auth_method else None
response = client.get("/get")
assert response.status_code == expected_status

client.auth = None

response = client.get("/get")
@pytest.mark.skipif("TESTED_VERSION < Version('2.14')")
@pytest.mark.issue("https://issues.redhat.com/browse/THREESCALE-11435")
# pylint: disable=unused-argument
def test_basic_auth_malformed_secret(http_client, valid_auth_headers, malformed_request, gateway_kind):
"""Test malformed Basic Auth headers."""
# Valid request
response = http_client.get("/get", headers=valid_auth_headers)
assert response.status_code == 200, "Valid request failed unexpectedly."

assert response.status_code == 403
# Malformed request
malformed_status_code = malformed_request().status_code
assert malformed_status_code == 403, "Malformed request did not return 403 as expected."
Loading