Skip to content
Open
Show file tree
Hide file tree
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
12 changes: 11 additions & 1 deletion deepsecrets/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,13 @@ def _build_argparser(self) -> None:
'Use this flag if you want to render found secrets in plaintext.',
)

parser.add_argument(
'--relative-path',
action='store_true',
help='By default absolute path is used in JSON report.\n'
'Use this flag if you want to use relative path instead.',
)

self.argparser = parser

def parse_arguments(self) -> None:
Expand All @@ -212,6 +219,9 @@ def parse_arguments(self) -> None:
if user_args.disable_masking:
config.set_disable_masking(True)

if user_args.relative_path:
config.set_relative_path(True)

self.say_hello()

config.set_workdir(user_args.target_dir)
Expand Down Expand Up @@ -313,7 +323,7 @@ def start(self) -> int: # pragma: nocover
with open(report_path, 'w+') as f:

if config.output.type == 'json':
json.dump(FindingResponse.from_list(findings, config.disable_masking), f)
json.dump(FindingResponse.from_list(findings, config.disable_masking, config.relative_path), f)

if config.output.type == 'dojo-sarif':
f.write(to_json(FindingResponse.dojo_sarif_from_list(findings, config.disable_masking)))
Expand Down
5 changes: 5 additions & 0 deletions deepsecrets/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@ class Config:
process_count: int
return_code_if_findings: bool
disable_masking: bool
relative_path: bool

def __init__(self) -> None:
self.engines = []
self.rulesets = {}
self.global_exclusion_paths = []
self.return_code_if_findings = False
self.disable_masking = False
self.relative_path = False

# equals to CPU count
self.process_count = FALLBACK_PROCESS_COUNT
Expand All @@ -49,6 +51,9 @@ def set_logging_level(self, level: int):

def set_disable_masking(self, state: bool):
self.disable_masking = state

def set_relative_path(self, state: bool):
self.relative_path = state

def _set_path(self, path: str, field: str) -> None:
if not path_exists(path):
Expand Down
15 changes: 11 additions & 4 deletions deepsecrets/core/model/finding.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,18 @@ def merge(self) -> List[Finding]:

class FindingResponse:
@classmethod
def from_list(cls, list: List[Finding], disable_masking: bool = False) -> Dict[str, List[Dict]]:
def from_list(cls, list: List[Finding], disable_masking: bool = False, relative_path: bool = False) -> Dict[str, List[Dict]]:
resp: Dict[str, List[Dict]] = {}
for finding in list:
if finding.file is None:
continue

if finding.file.path not in resp:
resp[finding.file.path] = []
if not relative_path:
if finding.file.path not in resp:
resp[finding.file.path] = []
else:
if finding.file.relative_path not in resp:
resp[finding.file.relative_path] = []

resp_finding = FindingApiModel.from_finding(finding)

Expand All @@ -133,7 +137,10 @@ def from_list(cls, list: List[Finding], disable_masking: bool = False) -> Dict[s
resp_finding.line = resp_finding.line.replace(resp_finding.string, '*' * len(resp_finding.string))
resp_finding.string = '*' * len(resp_finding.string)

resp[finding.file.path].append(resp_finding.model_dump())
if not relative_path:
resp[finding.file.path].append(resp_finding.model_dump())
else:
resp[finding.file.relative_path].append(resp_finding.model_dump())

return resp

Expand Down