socketsecurity 2.7.0__tar.gz → 2.7.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/python-tests.yml +20 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/CHANGELOG.md +16 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/PKG-INFO +1 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/cli-reference.md +2 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/pyproject.toml +1 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/__init__.py +1 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/config.py +7 -5
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/cli_client.py +1 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/helper/__init__.py +2 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/helper/socket_facts_loader.py +3 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/lazy_file_loader.py +1 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/messages.py +1 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/resource_utils.py +0 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/client.py +1 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/gitlab.py +4 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/socket_config.py +3 -4
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/tools/reachability.py +13 -21
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/output.py +9 -6
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/formatters/slack.py +1 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/jira.py +6 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/manager.py +1 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/slack.py +8 -5
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/teams.py +3 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/webhook.py +3 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/socketcli.py +6 -9
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_diff_alerts.py +0 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_cli_config.py +1 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_client.py +7 -5
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_config.py +5 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_disable_ignore.py +0 -2
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_auth.py +2 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_auth_fallback.py +6 -5
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_commit_status.py +1 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_gitlab_format.py +1 -2
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_include_dirs.py +0 -2
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_reachability.py +8 -8
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_socketcli.py +5 -3
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/uv.lock +1 -1
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/CODEOWNERS +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/actions/setup-docker/action.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/actions/setup-hatch/action.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/actions/setup-sfw/action.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/dependabot.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/dependency-review.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/docker-stable.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/e2e-test.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/package-check.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/pr-preview.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/release.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/workflows/version-check.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.github/zizmor.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.gitignore +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.hooks/sync_version.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.pre-commit-config.yaml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/.python-version +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/CONTRIBUTING.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/Dockerfile +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/Dockerfile.preview +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/LICENSE +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/Makefile +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/README.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/benchmarks/manifest_discovery.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/ci-cd.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/development.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/docs/troubleshooting.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-dashboard-parity.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-dashboard-parity.toml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-diff-ci-cd.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-diff-ci-cd.toml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-instance-detail.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/examples/config/sarif-instance-detail.toml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/instructions/gitlab-commit-status/uat.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/pytest.ini +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/build_container.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/build_container_flexible.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/deploy-test-docker.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/deploy-test-pypi.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/docker-entrypoint.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/scripts/run.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/session.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socket.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/__init__.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/alert_selection.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/classes.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/cli_run.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/exceptions.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/git_interface.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/log_uploader.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/logging.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/__init__.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/base.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm/github.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/scm_comments.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/streaming.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/utils.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/fossa_compat.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/__init__.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/base.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/plugins/formatters/__init__.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/__init__.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/conftest.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/create_diff_input.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_diff_generation.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_diff_scan_polling.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_facts_compression.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_has_manifest_files.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_invalid_facts_marker.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_package_and_alerts.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_sdk_methods.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/core/test_supporting_methods.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/create_response.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/diff/stream_diff.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/metadata.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/new_scan/metadata.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/repos/repo_info_error.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/repos/repo_info_no_head.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/repos/repo_info_success.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/data/settings/security-policy.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-npm/index.js +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-npm/package.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/fixtures/simple-pypi/requirements.txt +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/reach-facts-probe.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-gitlab.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-json.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-reachability.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-sarif.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/e2e/validate-scan.sh +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/README.md +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-analyze-empty.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-analyze-populated.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-sbom-empty-deep.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/fixtures/fossa/fossa-sbom-populated.json +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/__init__.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_alert_selection.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_cli_run.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_dependency_overview.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_exclude_paths.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_fossa_compat.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_fossa_parity.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_full_scan_retry.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_git_interface.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_github_buildkite_config.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_ignore_telemetry_filtering.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_log_uploader.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_manifest_discovery.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_output.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_pr_comment_rendering.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_slack_plugin.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_streaming.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/tests/unit/test_tier1_finalize.py +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/bitbucket-pipelines.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/buildkite.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/github-actions.yml +0 -0
- {socketsecurity-2.7.0 → socketsecurity-2.7.2}/workflows/gitlab-ci.yml +0 -0
|
@@ -67,6 +67,26 @@ jobs:
|
|
|
67
67
|
uv export --no-hashes --no-emit-project --format requirements-txt > /tmp/req-audit.txt
|
|
68
68
|
uvx pip-audit --strict --progress-spinner off --disable-pip --no-deps -r /tmp/req-audit.txt
|
|
69
69
|
|
|
70
|
+
ruff:
|
|
71
|
+
runs-on: ubuntu-latest
|
|
72
|
+
timeout-minutes: 10
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
75
|
+
with:
|
|
76
|
+
fetch-depth: 1
|
|
77
|
+
persist-credentials: false
|
|
78
|
+
- name: 🐍 setup python
|
|
79
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
80
|
+
with:
|
|
81
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
82
|
+
- name: 🛠️ install deps
|
|
83
|
+
run: |
|
|
84
|
+
python -m pip install --upgrade pip
|
|
85
|
+
pip install uv
|
|
86
|
+
uv sync --extra dev
|
|
87
|
+
- name: 🧹 run ruff
|
|
88
|
+
run: uv run ruff check
|
|
89
|
+
|
|
70
90
|
unsupported-python-install:
|
|
71
91
|
runs-on: ubuntu-latest
|
|
72
92
|
timeout-minutes: 10
|
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.7.2
|
|
4
|
+
|
|
5
|
+
### Changed: bump pinned @coana-tech/cli to 15.10.39
|
|
6
|
+
|
|
7
|
+
- Bumped the pinned reachability engine (`@coana-tech/cli`) from `15.10.36` to
|
|
8
|
+
`15.10.39`. See the [Coana changelogs](https://docs.coana.tech/changelogs) for
|
|
9
|
+
engine changes.
|
|
10
|
+
|
|
11
|
+
## 2.7.1
|
|
12
|
+
|
|
13
|
+
### Changed: bump pinned @coana-tech/cli to 15.10.36
|
|
14
|
+
|
|
15
|
+
- Bumped the pinned reachability engine (`@coana-tech/cli`) from `15.10.32` to
|
|
16
|
+
`15.10.36`. See the [Coana changelogs](https://docs.coana.tech/changelogs) for
|
|
17
|
+
engine changes.
|
|
18
|
+
|
|
3
19
|
## 2.7.0
|
|
4
20
|
|
|
5
21
|
### Fixed: unreadable reachability facts no longer report a blocking package
|
|
@@ -156,7 +156,7 @@ socketcli [-h] [--api-token API_TOKEN] [--repo REPO] [--workspace WORKSPACE] [--
|
|
|
156
156
|
[--reach] [--reach-version REACH_VERSION] [--reach-analysis-timeout REACH_ANALYSIS_TIMEOUT]
|
|
157
157
|
[--reach-analysis-memory-limit REACH_ANALYSIS_MEMORY_LIMIT] [--reach-concurrency REACH_CONCURRENCY] [--reach-ecosystems REACH_ECOSYSTEMS]
|
|
158
158
|
[--reach-min-severity <level>] [--reach-skip-cache] [--reach-disable-analytics] [--reach-enable-analysis-splitting] [--reach-detailed-analysis-log-file]
|
|
159
|
-
[--reach-
|
|
159
|
+
[--reach-use-only-pregenerated-sboms] [--reach-debug] [--reach-disable-external-tool-checks]
|
|
160
160
|
[--reach-output-file REACH_OUTPUT_FILE] [--only-facts-file] [--version]
|
|
161
161
|
````
|
|
162
162
|
|
|
@@ -275,7 +275,7 @@ If you don't want to provide the Socket API Token every time then you can use th
|
|
|
275
275
|
| Parameter | Required | Default | Description |
|
|
276
276
|
|:---------------------------------|:---------|:--------|:---------------------------------------------------------------------------------------------------------------------------|
|
|
277
277
|
| `--reach` | False | False | Enable reachability analysis to identify which vulnerable functions are actually called by your code. Creates a full application reachability scan (`scan_type=socket_tier1`). |
|
|
278
|
-
| `--reach-version` | False | 15.10.
|
|
278
|
+
| `--reach-version` | False | 15.10.39 | Version of @coana-tech/cli to use. Defaults to the pinned version that ships with this CLI release, so the engine only changes when you upgrade the Socket CLI. Pass `latest` to always use the newest published version (opt-in auto-update), or an explicit version (e.g. `1.2.3`) to pin it. |
|
|
279
279
|
| `--reach-analysis-timeout` | False | 10m | Timeout for each reachability analysis run, e.g. `90s`, `10m` or `1h`. Omitted by default, so coana applies its own default (`10m`). Alias: `--reach-timeout` |
|
|
280
280
|
| `--reach-analysis-memory-limit` | False | 8GB | Memory limit for each reachability analysis run, e.g. `512MB` or `8GB`. Omitted by default, so coana applies its own default (`8GB`). Alias: `--reach-memory-limit` |
|
|
281
281
|
| `--reach-concurrency` | False | 1 | Control parallel analysis execution (must be >= 1). Omitted by default, so coana applies its own default. |
|
|
@@ -286,7 +286,6 @@ If you don't want to provide the Socket API Token every time then you can use th
|
|
|
286
286
|
| `--reach-disable-analytics` | False | False | Disable analytics collection during reachability analysis |
|
|
287
287
|
| `--reach-enable-analysis-splitting` | False | False | Enable analysis splitting/bucketing (a legacy performance feature). Splitting is disabled by default. |
|
|
288
288
|
| `--reach-detailed-analysis-log-file` | False | False | Write a detailed analysis log file; its path is printed to stdout |
|
|
289
|
-
| `--reach-lazy-mode` | False | False | Enable lazy mode (experimental performance feature) |
|
|
290
289
|
| `--reach-use-only-pregenerated-sboms` | False | False | Build the scan only from pre-generated CycloneDX (CDX) and SPDX files in your project (requires --reach) |
|
|
291
290
|
| `--reach-debug` | False | False | Enable coana debug output (`--debug`) for the analysis, independent of the global `--enable-debug` |
|
|
292
291
|
| `--reach-disable-external-tool-checks` | False | False | Disable coana's external tool availability checks (passes `--disable-external-tool-checks`) |
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import argparse
|
|
2
|
+
import json
|
|
2
3
|
import logging
|
|
3
4
|
import os
|
|
5
|
+
import tomllib
|
|
4
6
|
from dataclasses import asdict, dataclass, field
|
|
5
7
|
from typing import List, Optional
|
|
6
|
-
|
|
8
|
+
|
|
7
9
|
from socketdev import INTEGRATION_TYPES, IntegrationType
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
+
|
|
11
|
+
from socketsecurity import __version__
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
def get_plugin_config_from_env(prefix: str) -> dict:
|
|
@@ -176,7 +178,7 @@ class CliConfig:
|
|
|
176
178
|
reach_disable_analysis_splitting: bool = False # Deprecated, kept for backwards compatibility
|
|
177
179
|
reach_enable_analysis_splitting: bool = False
|
|
178
180
|
reach_detailed_analysis_log_file: bool = False
|
|
179
|
-
reach_lazy_mode: bool = False
|
|
181
|
+
reach_lazy_mode: bool = False # Deprecated, kept for backwards compatibility
|
|
180
182
|
reach_ecosystems: Optional[List[str]] = None
|
|
181
183
|
reach_exclude_paths: Optional[List[str]] = None
|
|
182
184
|
reach_skip_cache: bool = False
|
|
@@ -1091,7 +1093,7 @@ def create_argument_parser() -> argparse.ArgumentParser:
|
|
|
1091
1093
|
"--reach-lazy-mode",
|
|
1092
1094
|
dest="reach_lazy_mode",
|
|
1093
1095
|
action="store_true",
|
|
1094
|
-
help=
|
|
1096
|
+
help=argparse.SUPPRESS # Deprecated, kept for backwards compatibility (no-op)
|
|
1095
1097
|
)
|
|
1096
1098
|
reachability_group.add_argument(
|
|
1097
1099
|
"--reach-output-file",
|
{socketsecurity-2.7.0 → socketsecurity-2.7.2}/socketsecurity/core/helper/socket_facts_loader.py
RENAMED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from typing import Dict, Any, Optional, List
|
|
7
5
|
from copy import deepcopy
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any, Dict, List, Optional
|
|
8
8
|
|
|
9
9
|
logger = logging.getLogger(__name__)
|
|
10
10
|
|
|
@@ -65,7 +65,7 @@ def load_socket_facts(file_path: str = ".socket.facts.json") -> Optional[Dict[st
|
|
|
65
65
|
return None
|
|
66
66
|
|
|
67
67
|
if 'components' not in data:
|
|
68
|
-
logger.warning(
|
|
68
|
+
logger.warning("Socket facts file missing 'components' key")
|
|
69
69
|
|
|
70
70
|
return data
|
|
71
71
|
|
|
@@ -2,9 +2,10 @@ import json
|
|
|
2
2
|
import os
|
|
3
3
|
import sys
|
|
4
4
|
from dataclasses import dataclass
|
|
5
|
-
from typing import Optional
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
import requests
|
|
8
|
+
|
|
8
9
|
from socketsecurity import USER_AGENT
|
|
9
10
|
from socketsecurity.core import log
|
|
10
11
|
from socketsecurity.core.classes import Comment
|
|
@@ -140,7 +141,7 @@ class Gitlab:
|
|
|
140
141
|
except requests.exceptions.HTTPError as e:
|
|
141
142
|
# Check if this is an authentication error (401)
|
|
142
143
|
if e.response and e.response.status_code == 401:
|
|
143
|
-
log.debug(
|
|
144
|
+
log.debug("Authentication failed with initial headers, trying fallback method")
|
|
144
145
|
|
|
145
146
|
# Determine the fallback headers
|
|
146
147
|
original_headers = kwargs.get('headers', self.config.headers)
|
|
@@ -153,7 +154,7 @@ class Gitlab:
|
|
|
153
154
|
|
|
154
155
|
# Re-raise the original exception if it's not an auth error or fallback failed
|
|
155
156
|
raise
|
|
156
|
-
except Exception
|
|
157
|
+
except Exception:
|
|
157
158
|
# Handle other types of exceptions that don't have response attribute
|
|
158
159
|
raise
|
|
159
160
|
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from dataclasses import dataclass, field
|
|
2
|
-
from typing import
|
|
3
|
+
from typing import List, Optional, Set
|
|
3
4
|
from urllib.parse import urlparse
|
|
4
|
-
from typing import Set, List
|
|
5
|
-
import os
|
|
6
5
|
|
|
7
6
|
from socketdev.core.issues import AllIssues
|
|
8
|
-
from socketsecurity import __version__
|
|
9
7
|
|
|
8
|
+
from socketsecurity import __version__
|
|
10
9
|
|
|
11
10
|
default_exclude_dirs = {
|
|
12
11
|
"node_modules", "bower_components", "jspm_packages", # JS/TS
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
from socketdev import socketdev
|
|
2
|
-
from typing import List, Optional, Dict, Any, Final
|
|
3
1
|
import atexit
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
4
|
import os
|
|
5
|
+
import pathlib
|
|
5
6
|
import platform
|
|
6
7
|
import shutil
|
|
7
8
|
import subprocess
|
|
8
|
-
import json
|
|
9
|
-
import pathlib
|
|
10
|
-
import logging
|
|
11
9
|
import sys
|
|
12
10
|
import tempfile
|
|
11
|
+
from typing import Any, Dict, Final, List, Optional
|
|
12
|
+
|
|
13
|
+
from socketdev import socketdev
|
|
13
14
|
|
|
14
15
|
from socketsecurity import __version__
|
|
15
16
|
|
|
@@ -18,7 +19,7 @@ log = logging.getLogger(__name__)
|
|
|
18
19
|
# Pinned @coana-tech/cli version. Bumped deliberately per Python CLI release so the
|
|
19
20
|
# reachability engine version only changes through a standard pip upgrade (advance notice).
|
|
20
21
|
# Pass --reach-version latest to opt into the newest published version instead.
|
|
21
|
-
DEFAULT_COANA_CLI_VERSION: Final = "15.10.
|
|
22
|
+
DEFAULT_COANA_CLI_VERSION: Final = "15.10.39"
|
|
22
23
|
|
|
23
24
|
# Resolved @coana-tech/cli script paths from the npm-install fallback, keyed by version.
|
|
24
25
|
# Lives for the process lifetime so repeated fallback invocations install only once
|
|
@@ -55,7 +56,7 @@ class ReachabilityAnalyzer:
|
|
|
55
56
|
|
|
56
57
|
def _resolve_coana_package_spec(self, version: Optional[str] = None) -> str:
|
|
57
58
|
"""
|
|
58
|
-
Resolve the @coana-tech/cli package spec to run (e.g. '@coana-tech/cli@15.10.
|
|
59
|
+
Resolve the @coana-tech/cli package spec to run (e.g. '@coana-tech/cli@15.10.39').
|
|
59
60
|
|
|
60
61
|
Args:
|
|
61
62
|
version: Coana CLI version to use.
|
|
@@ -64,7 +65,7 @@ class ReachabilityAnalyzer:
|
|
|
64
65
|
- '<semver>': that exact version.
|
|
65
66
|
|
|
66
67
|
Returns:
|
|
67
|
-
str: The package specifier to use with npx (e.g. '@coana-tech/cli@15.10.
|
|
68
|
+
str: The package specifier to use with npx (e.g. '@coana-tech/cli@15.10.39').
|
|
68
69
|
"""
|
|
69
70
|
return f"@coana-tech/cli@{self._resolve_coana_version(version)}"
|
|
70
71
|
|
|
@@ -77,7 +78,7 @@ class ReachabilityAnalyzer:
|
|
|
77
78
|
self,
|
|
78
79
|
org_slug: str,
|
|
79
80
|
target_directory: str,
|
|
80
|
-
tar_hash:
|
|
81
|
+
tar_hash: str,
|
|
81
82
|
output_path: str = ".socket.facts.json",
|
|
82
83
|
timeout: Optional[str] = None,
|
|
83
84
|
memory_limit: Optional[str] = None,
|
|
@@ -88,7 +89,6 @@ class ReachabilityAnalyzer:
|
|
|
88
89
|
disable_analytics: bool = False,
|
|
89
90
|
enable_analysis_splitting: bool = False,
|
|
90
91
|
detailed_analysis_log_file: bool = False,
|
|
91
|
-
lazy_mode: bool = False,
|
|
92
92
|
repo_name: Optional[str] = None,
|
|
93
93
|
branch_name: Optional[str] = None,
|
|
94
94
|
version: Optional[str] = None,
|
|
@@ -123,7 +123,6 @@ class ReachabilityAnalyzer:
|
|
|
123
123
|
disable_analytics: Disable analytics sharing
|
|
124
124
|
enable_analysis_splitting: Enable analysis splitting (disabled by default)
|
|
125
125
|
detailed_analysis_log_file: Print detailed analysis log file path
|
|
126
|
-
lazy_mode: Enable lazy mode for analysis
|
|
127
126
|
repo_name: Repository name
|
|
128
127
|
branch_name: Branch name
|
|
129
128
|
version: @coana-tech/cli version to use. None uses the pinned
|
|
@@ -153,9 +152,7 @@ class ReachabilityAnalyzer:
|
|
|
153
152
|
|
|
154
153
|
# Add conditional arguments. timeout/memory_limit are forwarded verbatim; coana owns
|
|
155
154
|
# unit parsing/validation (e.g. '90s', '8GB'). We coerce to str only for subprocess
|
|
156
|
-
# safety — config-file values can arrive as ints via argparse set_defaults
|
|
157
|
-
# `is not None` (not truthiness) so an explicit empty string still reaches coana and
|
|
158
|
-
# triggers coana's own error, rather than being silently dropped.
|
|
155
|
+
# safety — config-file values can arrive as ints via argparse set_defaults.
|
|
159
156
|
if timeout is not None:
|
|
160
157
|
coana_args.extend(["--analysis-timeout", str(timeout)])
|
|
161
158
|
|
|
@@ -172,12 +169,7 @@ class ReachabilityAnalyzer:
|
|
|
172
169
|
if detailed_analysis_log_file:
|
|
173
170
|
coana_args.append("--print-analysis-log-file")
|
|
174
171
|
|
|
175
|
-
|
|
176
|
-
coana_args.append("--lazy-mode")
|
|
177
|
-
|
|
178
|
-
# KEY POINT: Only add manifest tar hash if we have one
|
|
179
|
-
if tar_hash:
|
|
180
|
-
coana_args.extend(["--run-without-docker", "--manifests-tar-hash", tar_hash])
|
|
172
|
+
coana_args.extend(["--run-without-docker", "--manifests-tar-hash", tar_hash])
|
|
181
173
|
|
|
182
174
|
if ecosystems:
|
|
183
175
|
coana_args.extend(["--purl-types"] + ecosystems)
|
|
@@ -267,7 +259,7 @@ class ReachabilityAnalyzer:
|
|
|
267
259
|
# Extract scan ID from output file
|
|
268
260
|
scan_id = self._extract_scan_id(output_path)
|
|
269
261
|
|
|
270
|
-
log.info(
|
|
262
|
+
log.info("Reachability analysis completed successfully")
|
|
271
263
|
if scan_id:
|
|
272
264
|
log.info(f"Scan ID: {scan_id}")
|
|
273
265
|
|
|
@@ -2,18 +2,21 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
from typing import Any, Dict, Optional
|
|
5
|
-
|
|
6
|
-
from
|
|
7
|
-
|
|
8
|
-
from .fossa_compat import build_fossa_report_payload
|
|
9
|
-
from socketsecurity.plugins.manager import PluginManager
|
|
5
|
+
|
|
6
|
+
from socketdev import socketdev
|
|
7
|
+
|
|
10
8
|
from socketsecurity.core.alert_selection import (
|
|
11
9
|
clone_diff_with_selected_alerts,
|
|
12
10
|
filter_alerts_by_reachability,
|
|
13
11
|
load_components_with_alerts,
|
|
14
12
|
select_diff_alerts,
|
|
15
13
|
)
|
|
16
|
-
from
|
|
14
|
+
from socketsecurity.plugins.manager import PluginManager
|
|
15
|
+
|
|
16
|
+
from .config import CliConfig
|
|
17
|
+
from .core.classes import Diff, Issue
|
|
18
|
+
from .core.messages import Messages
|
|
19
|
+
from .fossa_compat import build_fossa_report_payload
|
|
17
20
|
|
|
18
21
|
|
|
19
22
|
class OutputHandler:
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
from .base import Plugin
|
|
2
|
-
import requests
|
|
3
1
|
import base64
|
|
4
|
-
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
|
|
5
5
|
from socketsecurity.config import CliConfig
|
|
6
6
|
from socketsecurity.core import log
|
|
7
|
+
from socketsecurity.core.classes import Diff
|
|
8
|
+
|
|
9
|
+
from .base import Plugin
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
class JiraPlugin(Plugin):
|
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
+
|
|
3
4
|
import requests
|
|
5
|
+
|
|
4
6
|
from socketsecurity.config import CliConfig
|
|
5
|
-
from .base import Plugin
|
|
6
|
-
from socketsecurity.core.classes import Diff
|
|
7
|
-
from socketsecurity.core.messages import Messages
|
|
8
7
|
from socketsecurity.core.alert_selection import (
|
|
9
8
|
clone_diff_with_selected_alerts,
|
|
10
9
|
filter_alerts_by_reachability,
|
|
11
10
|
select_diff_alerts,
|
|
12
11
|
)
|
|
12
|
+
from socketsecurity.core.classes import Diff
|
|
13
13
|
from socketsecurity.core.helper.socket_facts_loader import (
|
|
14
|
-
|
|
14
|
+
convert_to_alerts,
|
|
15
15
|
get_components_with_vulnerabilities,
|
|
16
|
-
|
|
16
|
+
load_socket_facts,
|
|
17
17
|
)
|
|
18
|
+
from socketsecurity.core.messages import Messages
|
|
18
19
|
from socketsecurity.plugins.formatters.slack import format_socket_facts_for_slack
|
|
19
20
|
|
|
21
|
+
from .base import Plugin
|
|
22
|
+
|
|
20
23
|
logger = logging.getLogger(__name__)
|
|
21
24
|
|
|
22
25
|
|
|
@@ -391,14 +391,11 @@ def main_code():
|
|
|
391
391
|
|
|
392
392
|
# Find manifest files in scan paths (excluding .socket.facts.json to avoid circular dependency)
|
|
393
393
|
log.info("Finding manifest files for reachability analysis...")
|
|
394
|
-
manifest_files = [
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
# Filter out .socket.facts.json files from manifest upload
|
|
400
|
-
scan_manifests = [f for f in scan_manifests if not f.endswith('.socket.facts.json')]
|
|
401
|
-
manifest_files.extend(scan_manifests)
|
|
394
|
+
manifest_files = [
|
|
395
|
+
# Always find all manifest files for the tar hash upload
|
|
396
|
+
f for scan_path in scan_paths for f in core.find_files(scan_path)
|
|
397
|
+
if not f.endswith('.socket.facts.json')
|
|
398
|
+
]
|
|
402
399
|
|
|
403
400
|
if not manifest_files:
|
|
404
401
|
log.warning("No manifest files found for reachability analysis")
|
|
@@ -410,6 +407,7 @@ def main_code():
|
|
|
410
407
|
try:
|
|
411
408
|
# Get org_slug early (we'll need it)
|
|
412
409
|
org_slug = core.config.org_slug
|
|
410
|
+
assert org_slug
|
|
413
411
|
|
|
414
412
|
# Upload manifest files
|
|
415
413
|
tar_hash = sdk.uploadmanifests.upload_manifest_files(
|
|
@@ -450,7 +448,6 @@ def main_code():
|
|
|
450
448
|
disable_analytics=config.reach_disable_analytics or False,
|
|
451
449
|
enable_analysis_splitting=config.reach_enable_analysis_splitting or False,
|
|
452
450
|
detailed_analysis_log_file=config.reach_detailed_analysis_log_file or False,
|
|
453
|
-
lazy_mode=config.reach_lazy_mode or False,
|
|
454
451
|
repo_name=None if repo_defaulted else config.repo,
|
|
455
452
|
branch_name=None if branch_defaulted else config.branch,
|
|
456
453
|
version=config.reach_version,
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import pytest
|
|
2
1
|
from unittest.mock import Mock, patch
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
3
4
|
import requests
|
|
5
|
+
|
|
4
6
|
from socketsecurity.core.cli_client import CliClient
|
|
5
|
-
from socketsecurity.core.socket_config import SocketConfig
|
|
6
7
|
from socketsecurity.core.exceptions import APIFailure
|
|
8
|
+
from socketsecurity.core.socket_config import SocketConfig
|
|
9
|
+
|
|
7
10
|
|
|
8
11
|
@pytest.fixture
|
|
9
12
|
def config():
|
|
@@ -100,14 +103,14 @@ def test_request_ssl_verification(client):
|
|
|
100
103
|
client.request("test/path")
|
|
101
104
|
|
|
102
105
|
args, kwargs = mock_request.call_args
|
|
103
|
-
assert kwargs['verify']
|
|
106
|
+
assert kwargs['verify'] # Default is True
|
|
104
107
|
|
|
105
108
|
# Test with SSL verification disabled
|
|
106
109
|
client.config.allow_unverified_ssl = True
|
|
107
110
|
client.request("test/path")
|
|
108
111
|
|
|
109
112
|
args, kwargs = mock_request.call_args
|
|
110
|
-
assert kwargs['verify']
|
|
113
|
+
assert not kwargs['verify']
|
|
111
114
|
|
|
112
115
|
def test_request_with_payload(client):
|
|
113
116
|
"""Test request with payload data"""
|
|
@@ -154,7 +157,6 @@ def test_post_telemetry_events_sends_individually(client):
|
|
|
154
157
|
|
|
155
158
|
def test_post_telemetry_events_continues_on_failure(client):
|
|
156
159
|
"""Test that a failed event does not prevent subsequent events from being sent"""
|
|
157
|
-
import json
|
|
158
160
|
|
|
159
161
|
events = [
|
|
160
162
|
{"event_kind": "user-action", "artifact_purl": "pkg:npm/foo@1.0.0"},
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import tomllib
|
|
1
2
|
from pathlib import Path
|
|
3
|
+
|
|
2
4
|
import pytest
|
|
3
|
-
|
|
4
|
-
import tomllib
|
|
5
|
-
from socketsecurity.core.socket_config import SocketConfig
|
|
5
|
+
|
|
6
6
|
from socketsecurity.config import CliConfig
|
|
7
|
+
from socketsecurity.core.socket_config import SocketConfig
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
def test_config_default_values():
|
|
9
11
|
"""Test that config initializes with correct default values"""
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"""Tests for the --disable-ignore flag."""
|
|
2
2
|
|
|
3
|
-
import pytest
|
|
4
3
|
from dataclasses import dataclass
|
|
5
4
|
|
|
6
5
|
from socketsecurity.config import CliConfig
|
|
@@ -8,7 +7,6 @@ from socketsecurity.core.classes import Comment, Diff, Issue
|
|
|
8
7
|
from socketsecurity.core.messages import Messages
|
|
9
8
|
from socketsecurity.core.scm_comments import Comments
|
|
10
9
|
|
|
11
|
-
|
|
12
10
|
# --- CLI flag parsing tests ---
|
|
13
11
|
|
|
14
12
|
class TestDisableIgnoreFlag:
|