mirror of
https://github.com/prowler-cloud/prowler.git
synced 2025-12-19 05:17:47 +00:00
feat(attack-paths): Update Cartography dependency and its usage (#9593)
This commit is contained in:
@@ -2,9 +2,6 @@ FROM python:3.12.10-slim-bookworm AS build
|
|||||||
|
|
||||||
LABEL maintainer="https://github.com/prowler-cloud/api"
|
LABEL maintainer="https://github.com/prowler-cloud/api"
|
||||||
|
|
||||||
ARG CARTOGRAPHY_VERSION=0.117.0
|
|
||||||
ENV CARTOGRAPHY_VERSION=${CARTOGRAPHY_VERSION}
|
|
||||||
|
|
||||||
ARG POWERSHELL_VERSION=7.5.0
|
ARG POWERSHELL_VERSION=7.5.0
|
||||||
ENV POWERSHELL_VERSION=${POWERSHELL_VERSION}
|
ENV POWERSHELL_VERSION=${POWERSHELL_VERSION}
|
||||||
|
|
||||||
@@ -82,8 +79,6 @@ ENV PATH="/home/prowler/.local/bin:$PATH"
|
|||||||
RUN poetry install --no-root && \
|
RUN poetry install --no-root && \
|
||||||
rm -rf ~/.cache/pip
|
rm -rf ~/.cache/pip
|
||||||
|
|
||||||
RUN poetry run python -m pip install cartography==${CARTOGRAPHY_VERSION}
|
|
||||||
|
|
||||||
RUN poetry run python "$(poetry env info --path)/src/prowler/prowler/providers/m365/lib/powershell/m365_powershell.py"
|
RUN poetry run python "$(poetry env info --path)/src/prowler/prowler/providers/m365/lib/powershell/m365_powershell.py"
|
||||||
|
|
||||||
COPY src/backend/ ./backend/
|
COPY src/backend/ ./backend/
|
||||||
|
|||||||
1012
api/poetry.lock
generated
1012
api/poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -24,7 +24,7 @@ dependencies = [
|
|||||||
"drf-spectacular-jsonapi==0.5.1",
|
"drf-spectacular-jsonapi==0.5.1",
|
||||||
"gunicorn==23.0.0",
|
"gunicorn==23.0.0",
|
||||||
"lxml==5.3.2",
|
"lxml==5.3.2",
|
||||||
"prowler @ git+https://github.com/prowler-cloud/prowler.git@master",
|
"prowler @ git+https://github.com/prowler-cloud/prowler.git@PROWLER-510-update-cartography-dependency",
|
||||||
"psycopg2-binary==2.9.9",
|
"psycopg2-binary==2.9.9",
|
||||||
"pytest-celery[redis] (>=1.0.1,<2.0.0)",
|
"pytest-celery[redis] (>=1.0.1,<2.0.0)",
|
||||||
"sentry-sdk[django] (>=2.20.0,<3.0.0)",
|
"sentry-sdk[django] (>=2.20.0,<3.0.0)",
|
||||||
@@ -37,6 +37,7 @@ dependencies = [
|
|||||||
"matplotlib (>=3.10.6,<4.0.0)",
|
"matplotlib (>=3.10.6,<4.0.0)",
|
||||||
"reportlab (>=4.4.4,<5.0.0)",
|
"reportlab (>=4.4.4,<5.0.0)",
|
||||||
"neo4j (<6.0.0)",
|
"neo4j (<6.0.0)",
|
||||||
|
"cartography @ git+https://github.com/prowler-cloud/cartography@azure-mgmt-sql-3",
|
||||||
]
|
]
|
||||||
description = "Prowler's API (Django/DRF)"
|
description = "Prowler's API (Django/DRF)"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|||||||
@@ -42,10 +42,7 @@ def init_driver() -> neo4j.Driver:
|
|||||||
config = settings.DATABASES["neo4j"]
|
config = settings.DATABASES["neo4j"]
|
||||||
|
|
||||||
_driver = neo4j.GraphDatabase.driver(
|
_driver = neo4j.GraphDatabase.driver(
|
||||||
uri,
|
uri, auth=(config["USER"], config["PASSWORD"])
|
||||||
auth=(config["USER"], config["PASSWORD"]),
|
|
||||||
max_connection_lifetime=604800, # 7 days
|
|
||||||
keep_alive=True, # It's the default value, but let's being explicit
|
|
||||||
)
|
)
|
||||||
_driver.verify_connectivity()
|
_driver.verify_connectivity()
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
import aioboto3
|
||||||
import boto3
|
import boto3
|
||||||
import neo4j
|
import neo4j
|
||||||
|
|
||||||
@@ -28,7 +29,7 @@ def start_aws_ingestion(
|
|||||||
attack_paths_scan: ProwlerAPIAttackPathsScan,
|
attack_paths_scan: ProwlerAPIAttackPathsScan,
|
||||||
) -> dict[str, dict[str, str]]:
|
) -> dict[str, dict[str, str]]:
|
||||||
"""
|
"""
|
||||||
Code based on Cartography version 0.117.0, specifically on `cartography.intel.aws.__init__.py`.
|
Code based on Cartography version 0.122.0, specifically on `cartography.intel.aws.__init__.py`.
|
||||||
|
|
||||||
For the scan progress updates:
|
For the scan progress updates:
|
||||||
- The caller of this function (`tasks.jobs.attack_paths.scan.run`) has set it to 2.
|
- The caller of this function (`tasks.jobs.attack_paths.scan.run`) has set it to 2.
|
||||||
@@ -41,6 +42,7 @@ def start_aws_ingestion(
|
|||||||
"permission_relationships_file": cartography_config.permission_relationships_file,
|
"permission_relationships_file": cartography_config.permission_relationships_file,
|
||||||
"aws_guardduty_severity_threshold": cartography_config.aws_guardduty_severity_threshold,
|
"aws_guardduty_severity_threshold": cartography_config.aws_guardduty_severity_threshold,
|
||||||
"aws_cloudtrail_management_events_lookback_hours": cartography_config.aws_cloudtrail_management_events_lookback_hours,
|
"aws_cloudtrail_management_events_lookback_hours": cartography_config.aws_cloudtrail_management_events_lookback_hours,
|
||||||
|
"experimental_aws_inspector_batch": cartography_config.experimental_aws_inspector_batch,
|
||||||
}
|
}
|
||||||
|
|
||||||
boto3_session = get_boto3_session(prowler_api_provider, prowler_sdk_provider)
|
boto3_session = get_boto3_session(prowler_api_provider, prowler_sdk_provider)
|
||||||
@@ -157,6 +159,10 @@ def get_boto3_session(
|
|||||||
return boto3_session
|
return boto3_session
|
||||||
|
|
||||||
|
|
||||||
|
def get_aioboto3_session(boto3_session: boto3.Session) -> aioboto3.Session:
|
||||||
|
return aioboto3.Session(botocore_session=boto3_session._session)
|
||||||
|
|
||||||
|
|
||||||
def sync_aws_account(
|
def sync_aws_account(
|
||||||
prowler_api_provider: ProwlerAPIProvider,
|
prowler_api_provider: ProwlerAPIProvider,
|
||||||
requested_syncs: list[str],
|
requested_syncs: list[str],
|
||||||
@@ -167,7 +173,7 @@ def sync_aws_account(
|
|||||||
max_progress = (
|
max_progress = (
|
||||||
87 # `cartography_aws.RESOURCE_FUNCTIONS["permission_relationships"]` - 1
|
87 # `cartography_aws.RESOURCE_FUNCTIONS["permission_relationships"]` - 1
|
||||||
)
|
)
|
||||||
n_steps = len(requested_syncs)
|
n_steps = len(requested_syncs) - 2 # Excluding `permission_relationships` and `resourcegroupstaggingapi`
|
||||||
progress_step = (max_progress - current_progress) / n_steps
|
progress_step = (max_progress - current_progress) / n_steps
|
||||||
|
|
||||||
failed_syncs = {}
|
failed_syncs = {}
|
||||||
@@ -185,15 +191,26 @@ def sync_aws_account(
|
|||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# `ecr:image_layers` uses `aioboto3_session` instead of `boto3_session`
|
||||||
|
if func_name == "ecr:image_layers":
|
||||||
|
cartography_aws.RESOURCE_FUNCTIONS[func_name](
|
||||||
|
neo4j_session=sync_args.get("neo4j_session"),
|
||||||
|
aioboto3_session=get_aioboto3_session(sync_args.get("boto3_session")),
|
||||||
|
regions=sync_args.get("regions"),
|
||||||
|
current_aws_account_id=sync_args.get("current_aws_account_id"),
|
||||||
|
update_tag=sync_args.get("update_tag"),
|
||||||
|
common_job_parameters=sync_args.get("common_job_parameters"),
|
||||||
|
)
|
||||||
|
|
||||||
# Skip permission relationships and tags for now because they rely on data already being in the graph
|
# Skip permission relationships and tags for now because they rely on data already being in the graph
|
||||||
if func_name not in [
|
elif func_name in [
|
||||||
"permission_relationships",
|
"permission_relationships",
|
||||||
"resourcegroupstaggingapi",
|
"resourcegroupstaggingapi",
|
||||||
]:
|
]:
|
||||||
cartography_aws.RESOURCE_FUNCTIONS[func_name](**sync_args)
|
continue
|
||||||
|
|
||||||
else:
|
else:
|
||||||
continue
|
cartography_aws.RESOURCE_FUNCTIONS[func_name](**sync_args)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
exception_message = utils.stringify_exception(
|
exception_message = utils.stringify_exception(
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ CLEANUP_STATEMENT = """
|
|||||||
|
|
||||||
def create_indexes(neo4j_session: neo4j.Session) -> None:
|
def create_indexes(neo4j_session: neo4j.Session) -> None:
|
||||||
"""
|
"""
|
||||||
Code based on Cartography version 0.117.0, specifically on `cartography.intel.create_indexes.run`.
|
Code based on Cartography version 0.122.0, specifically on `cartography.intel.create_indexes.run`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logger.info("Creating indexes for Prowler node types.")
|
logger.info("Creating indexes for Prowler node types.")
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from typing import Any, Callable
|
|||||||
from cartography.config import Config as CartographyConfig
|
from cartography.config import Config as CartographyConfig
|
||||||
from cartography.intel import analysis as cartography_analysis
|
from cartography.intel import analysis as cartography_analysis
|
||||||
from cartography.intel import create_indexes as cartography_create_indexes
|
from cartography.intel import create_indexes as cartography_create_indexes
|
||||||
|
from cartography.intel import ontology as cartography_ontology
|
||||||
from celery.utils.log import get_task_logger
|
from celery.utils.log import get_task_logger
|
||||||
|
|
||||||
from api.attack_paths import database as graph_database
|
from api.attack_paths import database as graph_database
|
||||||
@@ -35,7 +36,7 @@ def get_cartography_ingestion_function(provider_type: str) -> Callable | None:
|
|||||||
|
|
||||||
def run(tenant_id: str, scan_id: str, task_id: str) -> dict[str, Any]:
|
def run(tenant_id: str, scan_id: str, task_id: str) -> dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
Code based on Cartography version 0.117.0, specifically on `cartography.cli.main`, `cartography.cli.CLI.main`,
|
Code based on Cartography version 0.122.0, specifically on `cartography.cli.main`, `cartography.cli.CLI.main`,
|
||||||
`cartography.sync.run_with_config` and `cartography.sync.Sync.run`.
|
`cartography.sync.run_with_config` and `cartography.sync.Sync.run`.
|
||||||
"""
|
"""
|
||||||
ingestion_exceptions = {} # This will hold any exceptions raised during ingestion
|
ingestion_exceptions = {} # This will hold any exceptions raised during ingestion
|
||||||
@@ -100,9 +101,12 @@ def run(tenant_id: str, scan_id: str, task_id: str) -> dict[str, Any]:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Post-processing: Just keeping it to be more Cartography compliant
|
# Post-processing: Just keeping it to be more Cartography compliant
|
||||||
cartography_analysis.run(neo4j_session, cartography_config)
|
cartography_ontology.run(neo4j_session, cartography_config)
|
||||||
db_utils.update_attack_paths_scan_progress(attack_paths_scan, 95)
|
db_utils.update_attack_paths_scan_progress(attack_paths_scan, 95)
|
||||||
|
|
||||||
|
cartography_analysis.run(neo4j_session, cartography_config)
|
||||||
|
db_utils.update_attack_paths_scan_progress(attack_paths_scan, 96)
|
||||||
|
|
||||||
# Adding Prowler nodes and relationships
|
# Adding Prowler nodes and relationships
|
||||||
prowler.analysis(
|
prowler.analysis(
|
||||||
neo4j_session, prowler_api_provider, scan_id, cartography_config
|
neo4j_session, prowler_api_provider, scan_id, cartography_config
|
||||||
|
|||||||
45
poetry.lock
generated
45
poetry.lock
generated
@@ -1,4 +1,4 @@
|
|||||||
# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand.
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "about-time"
|
name = "about-time"
|
||||||
@@ -938,34 +938,34 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "boto3"
|
name = "boto3"
|
||||||
version = "1.39.15"
|
version = "1.40.61"
|
||||||
description = "The AWS SDK for Python"
|
description = "The AWS SDK for Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9"
|
python-versions = ">=3.9"
|
||||||
groups = ["main", "dev"]
|
groups = ["main", "dev"]
|
||||||
files = [
|
files = [
|
||||||
{file = "boto3-1.39.15-py3-none-any.whl", hash = "sha256:38fc54576b925af0075636752de9974e172c8a2cf7133400e3e09b150d20fb6a"},
|
{file = "boto3-1.40.61-py3-none-any.whl", hash = "sha256:6b9c57b2a922b5d8c17766e29ed792586a818098efe84def27c8f582b33f898c"},
|
||||||
{file = "boto3-1.39.15.tar.gz", hash = "sha256:b4483625f0d8c35045254dee46cd3c851bbc0450814f20b9b25bee1b5c0d8409"},
|
{file = "boto3-1.40.61.tar.gz", hash = "sha256:d6c56277251adf6c2bdd25249feae625abe4966831676689ff23b4694dea5b12"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
botocore = ">=1.39.15,<1.40.0"
|
botocore = ">=1.40.61,<1.41.0"
|
||||||
jmespath = ">=0.7.1,<2.0.0"
|
jmespath = ">=0.7.1,<2.0.0"
|
||||||
s3transfer = ">=0.13.0,<0.14.0"
|
s3transfer = ">=0.14.0,<0.15.0"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
|
crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "botocore"
|
name = "botocore"
|
||||||
version = "1.39.15"
|
version = "1.40.61"
|
||||||
description = "Low-level, data-driven core of boto 3."
|
description = "Low-level, data-driven core of boto 3."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9"
|
python-versions = ">=3.9"
|
||||||
groups = ["main", "dev"]
|
groups = ["main", "dev"]
|
||||||
files = [
|
files = [
|
||||||
{file = "botocore-1.39.15-py3-none-any.whl", hash = "sha256:eb9cfe918ebfbfb8654e1b153b29f0c129d586d2c0d7fb4032731d49baf04cff"},
|
{file = "botocore-1.40.61-py3-none-any.whl", hash = "sha256:17ebae412692fd4824f99cde0f08d50126dc97954008e5ba2b522eb049238aa7"},
|
||||||
{file = "botocore-1.39.15.tar.gz", hash = "sha256:2aa29a717f14f8c7ca058c2e297aaed0aa10ecea24b91514eee802814d1b7600"},
|
{file = "botocore-1.40.61.tar.gz", hash = "sha256:a2487ad69b090f9cccd64cf07c7021cd80ee9c0655ad974f87045b02f3ef52cd"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@@ -977,7 +977,7 @@ urllib3 = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
crt = ["awscrt (==0.23.8)"]
|
crt = ["awscrt (==0.27.6)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cachetools"
|
name = "cachetools"
|
||||||
@@ -2366,6 +2366,8 @@ python-versions = "*"
|
|||||||
groups = ["dev"]
|
groups = ["dev"]
|
||||||
files = [
|
files = [
|
||||||
{file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"},
|
{file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"},
|
||||||
|
{file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"},
|
||||||
|
{file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@@ -4884,6 +4886,7 @@ files = [
|
|||||||
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"},
|
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"},
|
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"},
|
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"},
|
||||||
|
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"},
|
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"},
|
{file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"},
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"},
|
||||||
@@ -4892,6 +4895,7 @@ files = [
|
|||||||
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"},
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"},
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"},
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"},
|
||||||
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"},
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"},
|
{file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"},
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"},
|
||||||
@@ -4900,6 +4904,7 @@ files = [
|
|||||||
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"},
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"},
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"},
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"},
|
||||||
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"},
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"},
|
{file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"},
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"},
|
||||||
@@ -4908,6 +4913,7 @@ files = [
|
|||||||
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"},
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"},
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"},
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"},
|
||||||
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"},
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"},
|
{file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"},
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"},
|
||||||
@@ -4916,6 +4922,7 @@ files = [
|
|||||||
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"},
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"},
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"},
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"},
|
||||||
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"},
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"},
|
{file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"},
|
||||||
{file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"},
|
{file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"},
|
||||||
@@ -4923,14 +4930,14 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "s3transfer"
|
name = "s3transfer"
|
||||||
version = "0.13.1"
|
version = "0.14.0"
|
||||||
description = "An Amazon S3 Transfer Manager"
|
description = "An Amazon S3 Transfer Manager"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9"
|
python-versions = ">=3.9"
|
||||||
groups = ["main", "dev"]
|
groups = ["main", "dev"]
|
||||||
files = [
|
files = [
|
||||||
{file = "s3transfer-0.13.1-py3-none-any.whl", hash = "sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724"},
|
{file = "s3transfer-0.14.0-py3-none-any.whl", hash = "sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456"},
|
||||||
{file = "s3transfer-0.13.1.tar.gz", hash = "sha256:c3fdba22ba1bd367922f27ec8032d6a1cf5f10c934fb5d68cf60fd5a23d936cf"},
|
{file = "s3transfer-0.14.0.tar.gz", hash = "sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@@ -5075,18 +5082,18 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slack-sdk"
|
name = "slack-sdk"
|
||||||
version = "3.34.0"
|
version = "3.39.0"
|
||||||
description = "The Slack API Platform SDK for Python"
|
description = "The Slack API Platform SDK for Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
groups = ["main"]
|
groups = ["main"]
|
||||||
files = [
|
files = [
|
||||||
{file = "slack_sdk-3.34.0-py2.py3-none-any.whl", hash = "sha256:c61f57f310d85be83466db5a98ab6ae3bb2e5587437b54fa0daa8fae6a0feffa"},
|
{file = "slack_sdk-3.39.0-py2.py3-none-any.whl", hash = "sha256:b1556b2f5b8b12b94e5ea3f56c4f2c7f04462e4e1013d325c5764ff118044fa8"},
|
||||||
{file = "slack_sdk-3.34.0.tar.gz", hash = "sha256:ff61db7012160eed742285ea91f11c72b7a38a6500a7f6c5335662b4bc6b853d"},
|
{file = "slack_sdk-3.39.0.tar.gz", hash = "sha256:6a56be10dc155c436ff658c6b776e1c082e29eae6a771fccf8b0a235822bbcb1"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=9.1,<15)"]
|
optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=9.1,<16)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sniffio"
|
name = "sniffio"
|
||||||
@@ -5688,4 +5695,4 @@ type = ["pytest-mypy"]
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.1"
|
lock-version = "2.1"
|
||||||
python-versions = ">3.9.1,<3.13"
|
python-versions = ">3.9.1,<3.13"
|
||||||
content-hash = "a367e65bc43c0a16495a3d0f6eab8b356cc49b509e329b61c6641cd87f374ff4"
|
content-hash = "82015f7b4b08e419ac5d28eab1a2d4b563b1980c84679e020ed3d42d3b4e9b85"
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ dependencies = [
|
|||||||
"azure-mgmt-loganalytics==12.0.0",
|
"azure-mgmt-loganalytics==12.0.0",
|
||||||
"azure-monitor-query==2.0.0",
|
"azure-monitor-query==2.0.0",
|
||||||
"azure-storage-blob==12.24.1",
|
"azure-storage-blob==12.24.1",
|
||||||
"boto3==1.39.15",
|
"boto3==1.40.61",
|
||||||
"botocore==1.39.15",
|
"botocore==1.40.61",
|
||||||
"colorama==0.4.6",
|
"colorama==0.4.6",
|
||||||
"cryptography==44.0.1",
|
"cryptography==44.0.1",
|
||||||
"dash==3.1.1",
|
"dash==3.1.1",
|
||||||
@@ -64,7 +64,7 @@ dependencies = [
|
|||||||
"pytz==2025.1",
|
"pytz==2025.1",
|
||||||
"schema==0.7.5",
|
"schema==0.7.5",
|
||||||
"shodan==1.31.0",
|
"shodan==1.31.0",
|
||||||
"slack-sdk==3.34.0",
|
"slack-sdk==3.39.0",
|
||||||
"tabulate==0.9.0",
|
"tabulate==0.9.0",
|
||||||
"tzlocal==5.3.1",
|
"tzlocal==5.3.1",
|
||||||
"py-iam-expand==0.1.0",
|
"py-iam-expand==0.1.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user