Skip to content

Commit

Permalink
fix(output_bucket): Use full path for -o option with output to S3 buc…
Browse files Browse the repository at this point in the history
…ket (#1854)

Co-authored-by: sergargar <[email protected]>
Co-authored-by: Pepe Fagoaga <[email protected]>
  • Loading branch information
3 people authored Feb 7, 2023
1 parent 0298ff9 commit 231bc06
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 9 deletions.
4 changes: 3 additions & 1 deletion prowler/lib/outputs/outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,9 @@ def send_to_s3_bucket(
elif output_mode == "html":
filename = f"{output_filename}{html_file_suffix}"
logger.info(f"Sending outputs to S3 bucket {output_bucket}")
bucket_remote_dir = output_directory.split("/")[-1]
bucket_remote_dir = output_directory
while "prowler/" in bucket_remote_dir: # Check if it is not a custom directory
bucket_remote_dir = bucket_remote_dir.partition("prowler/")[-1]
file_name = output_directory + "/" + filename
bucket_name = output_bucket
object_name = bucket_remote_dir + "/" + output_mode + "/" + filename
Expand Down
4 changes: 2 additions & 2 deletions prowler/providers/common/outputs.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import importlib
import sys
from dataclasses import dataclass
from os import mkdir
from os import makedirs
from os.path import isdir

from prowler.config.config import change_config_var, output_file_timestamp
Expand Down Expand Up @@ -52,7 +52,7 @@ def __init__(self, arguments, allowlist_file, bulk_checks_metadata):
if arguments.output_directory:
if not isdir(arguments.output_directory):
if arguments.output_modes:
mkdir(arguments.output_directory)
makedirs(arguments.output_directory)


class Azure_Output_Options(Provider_Output_Options):
Expand Down
62 changes: 56 additions & 6 deletions tests/lib/outputs/outputs_test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import os
import pathlib
from os import path, remove
from os import getcwd, path, remove
from unittest import mock

import boto3
Expand Down Expand Up @@ -336,10 +335,8 @@ def test_send_to_s3_bucket(self):
client = boto3.client("s3")
client.create_bucket(Bucket=bucket_name)
# Create mock csv output file
fixtures_dir = "fixtures"
output_directory = (
f"{pathlib.Path().absolute()}/tests/lib/outputs/{fixtures_dir}"
)
fixtures_dir = "tests/lib/outputs/fixtures"
output_directory = getcwd() + "/" + fixtures_dir
output_mode = "csv"
filename = f"prowler-output-{input_audit_info.audited_account}"
# Send mock csv file to mock S3 Bucket
Expand All @@ -359,6 +356,59 @@ def test_send_to_s3_bucket(self):
== "binary/octet-stream"
)

@mock_s3
def test_send_to_s3_bucket_custom_directory(self):
# Create mock session
session = boto3.session.Session(
region_name="us-east-1",
)
# Create mock audit_info
input_audit_info = AWS_Audit_Info(
original_session=None,
audit_session=session,
audited_account=AWS_ACCOUNT_ID,
audited_identity_arn="test-arn",
audited_user_id="test",
audited_partition="aws",
profile="default",
profile_region="eu-west-1",
credentials=None,
assumed_role_info=None,
audited_regions=["eu-west-2", "eu-west-1"],
organizations_metadata=None,
audit_resources=None,
)
# Creat mock bucket
bucket_name = "test_bucket"
client = boto3.client("s3")
client.create_bucket(Bucket=bucket_name)
# Create mock csv output file
fixtures_dir = "fixtures"
output_directory = f"tests/lib/outputs/{fixtures_dir}"
output_mode = "csv"
filename = f"prowler-output-{input_audit_info.audited_account}"
# Send mock csv file to mock S3 Bucket
send_to_s3_bucket(
filename,
output_directory,
output_mode,
bucket_name,
input_audit_info.audit_session,
)
# Check if the file has been sent by checking its content type
assert (
client.get_object(
Bucket=bucket_name,
Key=output_directory
+ "/"
+ output_mode
+ "/"
+ filename
+ csv_file_suffix,
)["ContentType"]
== "binary/octet-stream"
)

def test_extract_findings_statistics_different_resources(self):
finding_1 = mock.MagicMock()
finding_1.status = "PASS"
Expand Down

0 comments on commit 231bc06

Please sign in to comment.