mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-24 12:24:17 +00:00
- Fix shared dict mutation in ImageBaseException (thread-safety) - Handle unexpected status codes in OCI adapter auth flow - Force TLS verification for Docker Hub endpoints - Add credential-safe __repr__ to RegistryAdapter - Rename _next_page_url override to _next_tag_page_url in DockerHubAdapter - Distinguish rate-limit from connection errors in retry logic - Add type hints to all public adapter methods - Remove unused imports in test files (flake8)
211 lines
6.0 KiB
Python
211 lines
6.0 KiB
Python
from argparse import Namespace
|
|
|
|
from prowler.providers.image.lib.arguments.arguments import validate_arguments
|
|
|
|
|
|
class TestValidateArguments:
|
|
def test_no_source_fails(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "--image" in msg
|
|
|
|
def test_image_only_passes(self):
|
|
args = Namespace(
|
|
images=["nginx:latest"],
|
|
image_list_file=None,
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|
|
|
|
def test_image_list_only_passes(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file="images.txt",
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|
|
|
|
def test_registry_only_passes(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry="myregistry.io",
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|
|
|
|
def test_image_filter_without_registry_fails(self):
|
|
args = Namespace(
|
|
images=["nginx:latest"],
|
|
image_list_file=None,
|
|
registry=None,
|
|
image_filter="^prod",
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "--image-filter requires --registry" in msg
|
|
|
|
def test_tag_filter_without_registry_fails(self):
|
|
args = Namespace(
|
|
images=["nginx:latest"],
|
|
image_list_file=None,
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter="^v",
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "--tag-filter requires --registry" in msg
|
|
|
|
def test_max_images_without_registry_fails(self):
|
|
args = Namespace(
|
|
images=["nginx:latest"],
|
|
image_list_file=None,
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=50,
|
|
registry_insecure=False,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "--max-images requires --registry" in msg
|
|
|
|
def test_registry_insecure_without_registry_fails(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file="i.txt",
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=True,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "--registry-insecure requires --registry" in msg
|
|
|
|
def test_docker_hub_no_namespace_fails(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry="docker.io",
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "namespace" in msg.lower()
|
|
|
|
def test_docker_hub_with_namespace_passes(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry="docker.io/myorg",
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|
|
|
|
def test_docker_hub_https_no_namespace_fails(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry="https://docker.io",
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "namespace" in msg.lower()
|
|
|
|
def test_registry_with_filters_passes(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry="myregistry.io",
|
|
image_filter="^prod",
|
|
tag_filter="^v",
|
|
max_images=100,
|
|
registry_insecure=True,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|
|
|
|
def test_registry_list_without_registry_fails(self):
|
|
args = Namespace(
|
|
images=["nginx:latest"],
|
|
image_list_file=None,
|
|
registry=None,
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
registry_list_images=True,
|
|
)
|
|
ok, msg = validate_arguments(args)
|
|
assert not ok
|
|
assert "--registry-list requires --registry" in msg
|
|
|
|
def test_registry_list_with_registry_passes(self):
|
|
args = Namespace(
|
|
images=[],
|
|
image_list_file=None,
|
|
registry="myregistry.io",
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
registry_list_images=True,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|
|
|
|
def test_combined_registry_and_image_passes(self):
|
|
args = Namespace(
|
|
images=["nginx:latest"],
|
|
image_list_file=None,
|
|
registry="myregistry.io",
|
|
image_filter=None,
|
|
tag_filter=None,
|
|
max_images=0,
|
|
registry_insecure=False,
|
|
)
|
|
ok, _ = validate_arguments(args)
|
|
assert ok
|