Skip to content

Commit ee19691

Browse files
authored
Merge pull request #1111 from GitGuardian/amascia/nhi-793/nhi-ggshield-v2
chore(nhi): add vault related fields and modify sca…
2 parents 549b1b2 + 1242510 commit ee19691

13 files changed

+374
-48
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
### Added
2+
3+
- Added an additional section in ggshield's outputs to return vault related fields if the account setting is enabled.

ggshield/verticals/secret/output/schemas.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ class FlattenedPolicyBreak(BaseSchema):
2323
known_secret = fields.Bool(required=True, dump_default=False)
2424
ignore_reason = fields.Nested(IgnoreReasonSchema, dump_default=None)
2525
secret_vaulted = fields.Bool(required=True, dump_default=False)
26+
vault_type = fields.String(required=False, allow_none=True)
27+
vault_name = fields.String(required=False, allow_none=True)
28+
vault_path = fields.String(required=False, allow_none=True)
29+
vault_path_count = fields.Integer(required=False, allow_none=True)
2630

2731

2832
class JSONResultSchema(BaseSchema):

ggshield/verticals/secret/output/secret_json_output_handler.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,14 @@ def serialized_secret(
143143

144144
if secrets[0].is_vaulted:
145145
flattened_dict["secret_vaulted"] = secrets[0].is_vaulted
146+
147+
# Add vault information if available
148+
if secrets[0].vault_path is not None:
149+
flattened_dict["vault_type"] = secrets[0].vault_type
150+
flattened_dict["vault_name"] = secrets[0].vault_name
151+
flattened_dict["vault_path"] = secrets[0].vault_path
152+
flattened_dict["vault_path_count"] = secrets[0].vault_path_count
153+
146154
for secret in secrets:
147155
flattened_dict["occurrences"].extend(self.serialize_secret_matches(secret))
148156

ggshield/verticals/secret/output/secret_sarif_output_handler.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from ggshield import __version__ as ggshield_version
88
from ggshield.core.match_span import MatchSpan
9-
from ggshield.core.text_utils import format_bool
9+
from ggshield.core.text_utils import pluralize
1010

1111
from ..extended_match import ExtendedMatch
1212
from ..secret_scan_collection import Result, Secret, SecretScanCollection
@@ -84,7 +84,19 @@ def _create_sarif_result_dict(
8484
markdown_message = f"Secret detected: [{secret.detector_display_name}]({secret.documentation_url})"
8585
else:
8686
markdown_message = f"Secret detected: {secret.detector_display_name}"
87-
markdown_message += f"\nSecret in Secrets Manager: {format_bool(secret.is_vaulted)}"
87+
88+
if secret.is_vaulted:
89+
if secret.vault_path_count is None:
90+
markdown_message += "\nSecret found in vault: Yes"
91+
else:
92+
vault_count_text = f"({secret.vault_path_count} {pluralize('location', secret.vault_path_count)})"
93+
markdown_message += f"\nSecret found in vault: Yes {vault_count_text}"
94+
markdown_message += f"\nVault Type: {secret.vault_type}"
95+
markdown_message += f"\nVault Name: {secret.vault_name}"
96+
markdown_message += f"\nSecret Path: {secret.vault_path}"
97+
else:
98+
markdown_message += "\nSecret found in vault: No"
99+
88100
markdown_message += f"\nMatches:\n{matches_li}"
89101

90102
# Create dict

ggshield/verticals/secret/output/secret_text_output_handler.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,13 +302,30 @@ def secret_header(
302302
number_occurrences = format_text(str(len(secrets)), STYLE["occurrence_count"])
303303
ignore_sha = format_text(ignore_sha, STYLE["ignore_sha"])
304304

305+
# Build vault status message
306+
vault_status_msg = ""
307+
vault_details_msg = ""
308+
309+
if secret.is_vaulted:
310+
if secret.vault_path_count is None:
311+
vault_status_msg = f"\n{indent}Secret found in vault: Yes"
312+
else:
313+
vault_count_text = f"({secret.vault_path_count} {pluralize('location', secret.vault_path_count)})"
314+
vault_status_msg = (
315+
f"\n{indent}Secret found in vault: Yes {vault_count_text}"
316+
)
317+
vault_details_msg += f"\n{indent}├─ Vault Type: {secret.vault_type}"
318+
vault_details_msg += f"\n{indent}├─ Vault Name: {secret.vault_name}"
319+
vault_details_msg += f"\n{indent}└─ Secret Path: {secret.vault_path}"
320+
else:
321+
vault_status_msg = f"\n{indent}Secret found in vault: No"
322+
305323
message = f"""
306324
{start_line} Secret detected: {secret_type}{validity_msg}
307325
{indent}Occurrences: {number_occurrences}
308326
{indent}Known by GitGuardian dashboard: {format_bool(known_secret)}
309327
{indent}Incident URL: {secret.incident_url if known_secret and secret.incident_url else "N/A"}
310-
{indent}Secret SHA: {ignore_sha}
311-
{indent}Secret in Secrets Manager: {format_bool(secret.is_vaulted)}
328+
{indent}Secret SHA: {ignore_sha}{vault_status_msg}{vault_details_msg}
312329
"""
313330
if secret.documentation_url is not None:
314331
message += f"{indent}Detector documentation: {secret.documentation_url}\n"

ggshield/verticals/secret/secret_scan_collection.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ class Secret:
9494
ignore_reason: Optional[IgnoreReason]
9595
diff_kind: Optional[DiffKind]
9696
is_vaulted: bool
97+
vault_type: Optional[str]
98+
vault_name: Optional[str]
99+
vault_path: Optional[str]
100+
vault_path_count: Optional[int]
97101

98102
@property
99103
def policy(self) -> str:
@@ -201,6 +205,10 @@ def from_scan_result(
201205
ignore_reason=ignore_reason,
202206
diff_kind=policy_break.diff_kind,
203207
is_vaulted=policy_break.is_vaulted,
208+
vault_type=getattr(policy_break, "vault_type", None),
209+
vault_name=getattr(policy_break, "vault_name", None),
210+
vault_path=getattr(policy_break, "vault_path", None),
211+
vault_path_count=getattr(policy_break, "vault_path_count", None),
204212
)
205213
for policy_break, ignore_reason in to_keep
206214
]

pdm.lock

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ dependencies = [
4141
"marshmallow~=3.18.0",
4242
"marshmallow-dataclass~=8.5.8",
4343
"oauthlib~=3.2.1",
44-
"pygitguardian @ git+https://github.com/GitGuardian/py-gitguardian.git",
44+
"pygitguardian @ git+https://github.com/GitGuardian/py-gitguardian.git@007c1098d4e17bf71087453b431beafbaf425825",
4545
"pyjwt~=2.6.0",
4646
"python-dotenv~=0.21.0",
4747
"pyyaml~=6.0.1",

tests/factories.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ class Meta:
7070
is_vaulted = False
7171
exclude_reason = None
7272
diff_kind = None
73+
vault_type = None
74+
vault_name = None
75+
vault_path = None
76+
vault_path_count = None
7377
content = factory.Faker("text")
7478
nb_matches = factory.fuzzy.FuzzyInteger(1, 2)
7579

@@ -111,3 +115,7 @@ class Meta:
111115
ignore_reason = None
112116
diff_kind = None
113117
is_vaulted = False
118+
vault_type = None
119+
vault_name = None
120+
vault_path = None
121+
vault_path_count = None

0 commit comments

Comments
 (0)