Skip to content

Commit c2a24db

Browse files
committed
feat: enhance reachability analysis with additional CLI parameters and SSL support
- Add --reach-concurrency flag to control parallel analysis execution (must be >= 1) - Add --reach-additional-params flag to pass custom parameters to coana CLI - Fix --allow-unverified flag to properly disable SSL verification for reachability analysis - Update socketdev dependency to version 3.0.19 for latest features - Reorganize argument parser groups for better help organization - Add proper SSL warning suppression when using --allow-unverified - Improve reachability analyzer to support NODE_TLS_REJECT_UNAUTHORIZED environment variable - Bump version to 2.2.28
1 parent 55ebf3d commit c2a24db

File tree

5 files changed

+64
-15
lines changed

5 files changed

+64
-15
lines changed

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
66

77
[project]
88
name = "socketsecurity"
9-
version = "2.2.27"
9+
version = "2.2.28"
1010
requires-python = ">= 3.10"
1111
license = {"file" = "LICENSE"}
1212
dependencies = [
@@ -16,7 +16,7 @@ dependencies = [
1616
'GitPython',
1717
'packaging',
1818
'python-dotenv',
19-
'socketdev>=3.0.17,<4.0.0',
19+
'socketdev>=3.0.19,<4.0.0',
2020
"bs4>=0.0.2",
2121
]
2222
readme = "README.md"

socketsecurity/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
__author__ = 'socket.dev'
2-
__version__ = '2.2.27'
2+
__version__ = '2.2.28'
33
USER_AGENT = f'SocketPythonCLI/{__version__}'

socketsecurity/config.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class CliConfig:
7373
reach_skip_cache: bool = False
7474
reach_min_severity: Optional[str] = None
7575
reach_output_file: Optional[str] = None
76+
reach_concurrency: Optional[int] = None
77+
reach_additional_params: Optional[List[str]] = None
7678
only_facts_file: bool = False
7779

7880
@classmethod
@@ -132,6 +134,8 @@ def from_args(cls, args_list: Optional[List[str]] = None) -> 'CliConfig':
132134
'reach_skip_cache': args.reach_skip_cache,
133135
'reach_min_severity': args.reach_min_severity,
134136
'reach_output_file': args.reach_output_file,
137+
'reach_concurrency': args.reach_concurrency,
138+
'reach_additional_params': args.reach_additional_params,
135139
'only_facts_file': args.only_facts_file,
136140
'version': __version__
137141
}
@@ -169,6 +173,11 @@ def from_args(cls, args_list: Optional[List[str]] = None) -> 'CliConfig':
169173
logging.error("--only-facts-file requires --reach to be specified")
170174
exit(1)
171175

176+
# Validate reach_concurrency is >= 1 if provided
177+
if args.reach_concurrency is not None and args.reach_concurrency < 1:
178+
logging.error("--reach-concurrency must be >= 1")
179+
exit(1)
180+
172181
return cls(**config_args)
173182

174183
def to_dict(self) -> dict:
@@ -429,20 +438,13 @@ def create_argument_parser() -> argparse.ArgumentParser:
429438
help="Exclude license details from the diff report (boosts performance for large repos)"
430439
)
431440

432-
# Security Configuration
433-
security_group = parser.add_argument_group('Security Configuration')
434-
security_group.add_argument(
435-
"--allow-unverified",
436-
action="store_true",
437-
help="Allow unverified packages"
438-
)
439-
security_group.add_argument(
441+
output_group.add_argument(
440442
"--disable-security-issue",
441443
dest="disable_security_issue",
442444
action="store_true",
443445
help="Disable security issue checks"
444446
)
445-
security_group.add_argument(
447+
output_group.add_argument(
446448
"--disable_security_issue",
447449
dest="disable_security_issue",
448450
action="store_true",
@@ -494,6 +496,11 @@ def create_argument_parser() -> argparse.ArgumentParser:
494496
help="Timeout in seconds for API requests",
495497
required=False
496498
)
499+
advanced_group.add_argument(
500+
"--allow-unverified",
501+
action="store_true",
502+
help="Disable SSL certificate verification for API requests"
503+
)
497504
config_group.add_argument(
498505
"--include-module-folders",
499506
dest="include_module_folders",
@@ -567,6 +574,20 @@ def create_argument_parser() -> argparse.ArgumentParser:
567574
default=".socket.facts.json",
568575
help="Output file path for reachability analysis results (default: .socket.facts.json)"
569576
)
577+
reachability_group.add_argument(
578+
"--reach-concurrency",
579+
dest="reach_concurrency",
580+
type=int,
581+
metavar="<number>",
582+
help="Concurrency level for reachability analysis (must be >= 1)"
583+
)
584+
reachability_group.add_argument(
585+
"--reach-additional-params",
586+
dest="reach_additional_params",
587+
nargs='+',
588+
metavar="<param>",
589+
help="Additional parameters to pass to the coana CLI (e.g., --reach-additional-params --other-param value --another-param value2)"
590+
)
570591
reachability_group.add_argument(
571592
"--only-facts-file",
572593
dest="only_facts_file",

socketsecurity/core/tools/reachability.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def _ensure_coana_cli_installed(self, version: Optional[str] = None) -> str:
2020
Check if @coana-tech/cli is installed, and install/update it if needed.
2121
2222
Args:
23-
version: Specific version to install (e.g., '1.2.3'). If None, updates to latest.
23+
version: Specific version to install (e.g., '1.2.3'). If None, always updates to latest.
2424
2525
Returns:
2626
str: The package specifier to use with npx
@@ -48,6 +48,7 @@ def _ensure_coana_cli_installed(self, version: Optional[str] = None) -> str:
4848
log.debug(f"Could not check for existing @coana-tech/cli installation: {e}")
4949

5050
# Install or update the package
51+
# When no version is specified, always try to update to latest
5152
if version:
5253
log.info(f"Installing reachability analysis plugin (@coana-tech/cli@{version})...")
5354
else:
@@ -95,6 +96,9 @@ def run_reachability_analysis(
9596
repo_name: Optional[str] = None,
9697
branch_name: Optional[str] = None,
9798
version: Optional[str] = None,
99+
concurrency: Optional[int] = None,
100+
additional_params: Optional[List[str]] = None,
101+
allow_unverified: bool = False,
98102
) -> Dict[str, Any]:
99103
"""
100104
Run reachability analysis.
@@ -114,6 +118,9 @@ def run_reachability_analysis(
114118
repo_name: Repository name
115119
branch_name: Branch name
116120
version: Specific version of @coana-tech/cli to use
121+
concurrency: Concurrency level for analysis (must be >= 1)
122+
additional_params: Additional parameters to pass to coana CLI
123+
allow_unverified: Disable SSL certificate verification (sets NODE_TLS_REJECT_UNAUTHORIZED=0)
117124
118125
Returns:
119126
Dict containing scan_id and report_path
@@ -158,6 +165,13 @@ def run_reachability_analysis(
158165
if skip_cache:
159166
cmd.append("--skip-cache-usage")
160167

168+
if concurrency:
169+
cmd.extend(["--concurrency", str(concurrency)])
170+
171+
# Add any additional parameters provided by the user
172+
if additional_params:
173+
cmd.extend(additional_params)
174+
161175
# Set up environment variables
162176
env = os.environ.copy()
163177

@@ -172,6 +186,10 @@ def run_reachability_analysis(
172186
if branch_name:
173187
env["SOCKET_BRANCH_NAME"] = branch_name
174188

189+
# Set NODE_TLS_REJECT_UNAUTHORIZED=0 if allow_unverified is True
190+
if allow_unverified:
191+
env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0"
192+
175193
# Execute CLI
176194
log.info("Running reachability analysis...")
177195
log.debug(f"Reachability command: {' '.join(cmd)}")

socketsecurity/socketcli.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import traceback
44
import shutil
5+
import warnings
56

67
from dotenv import load_dotenv
78
from git import InvalidGitRepositoryError, NoSuchPathError
@@ -55,7 +56,13 @@ def main_code():
5556
"2. Environment variable: SOCKET_SECURITY_API_KEY")
5657
sys.exit(3)
5758

58-
sdk = socketdev(token=config.api_token)
59+
sdk = socketdev(token=config.api_token, allow_unverified=config.allow_unverified)
60+
61+
# Suppress urllib3 InsecureRequestWarning when using --allow-unverified
62+
if config.allow_unverified:
63+
import urllib3
64+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
65+
5966
output_handler = OutputHandler(config, sdk)
6067
log.debug("sdk loaded")
6168

@@ -277,7 +284,10 @@ def main_code():
277284
disable_analytics=config.reach_disable_analytics or False,
278285
repo_name=config.repo,
279286
branch_name=config.branch,
280-
version=config.reach_version
287+
version=config.reach_version,
288+
concurrency=config.reach_concurrency,
289+
additional_params=config.reach_additional_params,
290+
allow_unverified=config.allow_unverified
281291
)
282292

283293
log.info(f"Reachability analysis completed successfully")

0 commit comments

Comments
 (0)