socketsecurity 2.2.76__tar.gz → 2.2.77__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.2.76 → socketsecurity-2.2.77}/.github/workflows/python-tests.yml +3 -1
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/PKG-INFO +1 -1
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/pyproject.toml +1 -1
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/__init__.py +1 -1
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/__init__.py +10 -13
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/classes.py +44 -9
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/conftest.py +11 -4
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/test_diff_generation.py +8 -24
- socketsecurity-2.2.77/tests/core/test_has_manifest_files.py +68 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/test_package_and_alerts.py +44 -14
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/test_sdk_methods.py +25 -19
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/test_supporting_methods.py +30 -20
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/repos/repo_info_no_head.json +2 -1
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/repos/repo_info_success.json +2 -1
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/CODEOWNERS +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/workflows/docker-stable.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/workflows/e2e-test.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/workflows/pr-preview.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/workflows/release.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/workflows/version-check.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.gitignore +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.hooks/sync_version.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.pre-commit-config.yaml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/.python-version +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/CHANGELOG.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/Dockerfile +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/LICENSE +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/Makefile +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/README.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/docs/README.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/instructions/gitlab-commit-status/uat.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/pytest.ini +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/scripts/build_container.sh +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/scripts/build_container_flexible.sh +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/scripts/deploy-test-docker.sh +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/scripts/deploy-test-pypi.sh +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/scripts/docker-entrypoint.sh +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/scripts/run.sh +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/session.md +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socket.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/config.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/cli_client.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/exceptions.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/git_interface.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/helper/__init__.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/helper/socket_facts_loader.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/lazy_file_loader.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/logging.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/messages.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/resource_utils.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/scm/__init__.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/scm/base.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/scm/client.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/scm/github.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/scm/gitlab.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/scm_comments.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/socket_config.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/tools/reachability.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/utils.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/output.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/__init__.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/base.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/formatters/__init__.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/formatters/slack.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/jira.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/manager.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/slack.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/teams.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/webhook.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/socketcli.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/__init__.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/create_diff_input.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/core/test_diff_alerts.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/create_response.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/diff/stream_diff.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/head_scan/metadata.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/new_scan/metadata.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/repos/repo_info_error.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/settings/security-policy.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/e2e/fixtures/simple-npm/index.js +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/e2e/fixtures/simple-npm/package.json +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/__init__.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_cli_config.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_client.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_config.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_gitlab_auth.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_gitlab_auth_fallback.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_gitlab_commit_status.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_gitlab_format.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/unit/test_output.py +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/uv.lock +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/workflows/bitbucket-pipelines.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/workflows/github-actions.yml +0 -0
- {socketsecurity-2.2.76 → socketsecurity-2.2.77}/workflows/gitlab-ci.yml +0 -0
|
@@ -9,6 +9,7 @@ on:
|
|
|
9
9
|
paths:
|
|
10
10
|
- "socketsecurity/**/*.py"
|
|
11
11
|
- "tests/unit/**/*.py"
|
|
12
|
+
- "tests/core/**/*.py"
|
|
12
13
|
- "pyproject.toml"
|
|
13
14
|
- "uv.lock"
|
|
14
15
|
- ".github/workflows/python-tests.yml"
|
|
@@ -16,6 +17,7 @@ on:
|
|
|
16
17
|
paths:
|
|
17
18
|
- "socketsecurity/**/*.py"
|
|
18
19
|
- "tests/unit/**/*.py"
|
|
20
|
+
- "tests/core/**/*.py"
|
|
19
21
|
- "pyproject.toml"
|
|
20
22
|
- "uv.lock"
|
|
21
23
|
- ".github/workflows/python-tests.yml"
|
|
@@ -47,4 +49,4 @@ jobs:
|
|
|
47
49
|
pip install uv
|
|
48
50
|
uv sync --extra test
|
|
49
51
|
- name: 🧪 run tests
|
|
50
|
-
run: uv run pytest -q tests/unit/
|
|
52
|
+
run: uv run pytest -q tests/unit/ tests/core/
|
|
@@ -88,19 +88,16 @@ class Core:
|
|
|
88
88
|
return org_id, organizations[org_id]['slug']
|
|
89
89
|
return None, None
|
|
90
90
|
|
|
91
|
-
def get_sbom_data(self, full_scan_id: str) ->
|
|
92
|
-
"""Returns
|
|
91
|
+
def get_sbom_data(self, full_scan_id: str) -> Dict[str, SocketArtifact]:
|
|
92
|
+
"""Returns SBOM artifacts for a full scan keyed by artifact ID."""
|
|
93
93
|
response = self.sdk.fullscans.stream(self.config.org_slug, full_scan_id, use_types=True)
|
|
94
|
-
artifacts: List[SocketArtifact] = []
|
|
95
94
|
if not response.success:
|
|
96
95
|
log.debug(f"Failed to get SBOM data for full-scan {full_scan_id}")
|
|
97
96
|
log.debug(response.message)
|
|
98
97
|
return {}
|
|
99
98
|
if not hasattr(response, "artifacts") or not response.artifacts:
|
|
100
|
-
return
|
|
101
|
-
|
|
102
|
-
artifacts.append(response.artifacts[artifact_id])
|
|
103
|
-
return artifacts
|
|
99
|
+
return {}
|
|
100
|
+
return response.artifacts
|
|
104
101
|
|
|
105
102
|
def get_sbom_data_list(self, artifacts_dict: Dict[str, SocketArtifact]) -> list[SocketArtifact]:
|
|
106
103
|
"""Converts artifacts dictionary to a list."""
|
|
@@ -414,15 +411,15 @@ class Core:
|
|
|
414
411
|
# Expand brace patterns for each manifest pattern
|
|
415
412
|
expanded_patterns = Core.expand_brace_pattern(pattern_str)
|
|
416
413
|
for exp_pat in expanded_patterns:
|
|
417
|
-
# If pattern doesn't contain '/', prepend '**/' to match files in any subdirectory
|
|
418
|
-
# This ensures patterns like '*requirements.txt' match '.test/requirements.txt'
|
|
419
|
-
if '/' not in exp_pat:
|
|
420
|
-
exp_pat = f"**/{exp_pat}"
|
|
421
|
-
|
|
422
414
|
for file in norm_files:
|
|
423
|
-
#
|
|
415
|
+
# Match the pattern as-is first (handles root-level files
|
|
416
|
+
# like "package.json" matching pattern "package.json")
|
|
424
417
|
if PurePath(file).match(exp_pat):
|
|
425
418
|
return True
|
|
419
|
+
# Also try with **/ prefix to match files in subdirectories
|
|
420
|
+
# (e.g. "src/requirements.txt" matching "*requirements.txt")
|
|
421
|
+
if '/' not in exp_pat and PurePath(file).match(f"**/{exp_pat}"):
|
|
422
|
+
return True
|
|
426
423
|
return False
|
|
427
424
|
|
|
428
425
|
def check_file_count_limit(self, file_count: int) -> dict:
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from dataclasses import dataclass, field
|
|
3
|
-
from typing import Dict, List,
|
|
3
|
+
from typing import Dict, List, Optional, TypedDict
|
|
4
4
|
|
|
5
|
-
from socketdev.fullscans import
|
|
5
|
+
from socketdev.fullscans import (
|
|
6
|
+
FullScanMetadata,
|
|
7
|
+
SocketAlert,
|
|
8
|
+
SocketArtifact,
|
|
9
|
+
SocketArtifactLink,
|
|
10
|
+
SocketManifestReference,
|
|
11
|
+
SocketScore,
|
|
12
|
+
)
|
|
6
13
|
|
|
7
14
|
__all__ = [
|
|
8
15
|
"Report",
|
|
@@ -109,8 +116,8 @@ class Package():
|
|
|
109
116
|
type: str
|
|
110
117
|
name: str
|
|
111
118
|
version: str
|
|
112
|
-
release: str
|
|
113
|
-
diffType: str
|
|
119
|
+
release: Optional[str] = None
|
|
120
|
+
diffType: Optional[str] = None
|
|
114
121
|
id: str
|
|
115
122
|
author: List[str] = field(default_factory=list)
|
|
116
123
|
score: SocketScore
|
|
@@ -158,6 +165,8 @@ class Package():
|
|
|
158
165
|
name=data["name"],
|
|
159
166
|
version=data["version"],
|
|
160
167
|
type=data["type"],
|
|
168
|
+
release=data.get("release"),
|
|
169
|
+
diffType=data.get("diffType"),
|
|
161
170
|
score=data["score"],
|
|
162
171
|
alerts=data["alerts"],
|
|
163
172
|
author=data.get("author", []),
|
|
@@ -187,10 +196,36 @@ class Package():
|
|
|
187
196
|
Raises:
|
|
188
197
|
ValueError: If reference data cannot be found in DiffArtifact
|
|
189
198
|
"""
|
|
199
|
+
diff_type = data.get("diffType")
|
|
200
|
+
if hasattr(diff_type, "value"):
|
|
201
|
+
diff_type = diff_type.value
|
|
202
|
+
|
|
203
|
+
# Newer API responses may provide flattened diff artifacts without refs.
|
|
204
|
+
if "topLevelAncestors" in data or (not data.get("head") and not data.get("base")):
|
|
205
|
+
return cls(
|
|
206
|
+
id=data["id"],
|
|
207
|
+
name=data["name"],
|
|
208
|
+
version=data["version"],
|
|
209
|
+
type=data["type"],
|
|
210
|
+
score=data.get("score", data.get("scores", {})),
|
|
211
|
+
alerts=data.get("alerts", []),
|
|
212
|
+
author=data.get("author", []),
|
|
213
|
+
size=data.get("size"),
|
|
214
|
+
license=data.get("license"),
|
|
215
|
+
topLevelAncestors=data.get("topLevelAncestors", []),
|
|
216
|
+
direct=data.get("direct", True),
|
|
217
|
+
manifestFiles=data.get("manifestFiles", []),
|
|
218
|
+
dependencies=data.get("dependencies"),
|
|
219
|
+
artifact=data.get("artifact"),
|
|
220
|
+
namespace=data.get("namespace"),
|
|
221
|
+
release=data.get("release"),
|
|
222
|
+
diffType=diff_type,
|
|
223
|
+
)
|
|
224
|
+
|
|
190
225
|
ref = None
|
|
191
|
-
if
|
|
226
|
+
if diff_type in ["added", "updated", "unchanged"] and data.get("head"):
|
|
192
227
|
ref = data["head"][0]
|
|
193
|
-
elif
|
|
228
|
+
elif diff_type in ["removed", "replaced"] and data.get("base"):
|
|
194
229
|
ref = data["base"][0]
|
|
195
230
|
|
|
196
231
|
if not ref:
|
|
@@ -201,8 +236,8 @@ class Package():
|
|
|
201
236
|
name=data["name"],
|
|
202
237
|
version=data["version"],
|
|
203
238
|
type=data["type"],
|
|
204
|
-
score=data
|
|
205
|
-
alerts=data
|
|
239
|
+
score=data.get("score", data.get("scores", {})),
|
|
240
|
+
alerts=data.get("alerts", []),
|
|
206
241
|
author=data.get("author", []),
|
|
207
242
|
size=data.get("size"),
|
|
208
243
|
license=data.get("license"),
|
|
@@ -213,7 +248,7 @@ class Package():
|
|
|
213
248
|
artifact=ref.get("artifact"),
|
|
214
249
|
namespace=data.get('namespace', None),
|
|
215
250
|
release=ref.get("release", None),
|
|
216
|
-
diffType=ref.get("diffType",
|
|
251
|
+
diffType=ref.get("diffType", diff_type),
|
|
217
252
|
)
|
|
218
253
|
|
|
219
254
|
class Issue:
|
|
@@ -142,28 +142,35 @@ def mock_sdk_with_responses(
|
|
|
142
142
|
):
|
|
143
143
|
sdk = mock_socket_sdk.return_value
|
|
144
144
|
|
|
145
|
+
sdk.org.get.return_value = {
|
|
146
|
+
"organizations": {
|
|
147
|
+
"test-org-id": {"slug": "test-org"}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
sdk.licensemetadata.post.return_value = [{"text": ""}]
|
|
151
|
+
|
|
145
152
|
# Simple returns
|
|
146
153
|
sdk.fullscans.post.return_value = create_full_scan_response
|
|
147
154
|
|
|
148
155
|
# Argument-based returns
|
|
149
|
-
sdk.repos.repo.side_effect = lambda org_slug, repo_slug: {
|
|
156
|
+
sdk.repos.repo.side_effect = lambda org_slug, repo_slug, **kwargs: {
|
|
150
157
|
"test": repo_info_response,
|
|
151
158
|
"error": repo_info_error,
|
|
152
159
|
"no-head": repo_info_no_head,
|
|
153
160
|
}[repo_slug]
|
|
154
161
|
|
|
155
|
-
sdk.fullscans.metadata.side_effect = lambda org_slug, scan_id: {
|
|
162
|
+
sdk.fullscans.metadata.side_effect = lambda org_slug, scan_id, **kwargs: {
|
|
156
163
|
"head": head_scan_metadata,
|
|
157
164
|
"new": new_scan_metadata,
|
|
158
165
|
}[scan_id]
|
|
159
166
|
|
|
160
|
-
sdk.fullscans.stream.side_effect = lambda org_slug, scan_id: {
|
|
167
|
+
sdk.fullscans.stream.side_effect = lambda org_slug, scan_id, **kwargs: {
|
|
161
168
|
"head": head_scan_stream,
|
|
162
169
|
"new": new_scan_stream,
|
|
163
170
|
}[scan_id]
|
|
164
171
|
|
|
165
172
|
sdk.fullscans.stream_diff.side_effect = (
|
|
166
|
-
lambda org_slug, head_id, new_id: stream_diff_response
|
|
173
|
+
lambda org_slug, head_id, new_id, **kwargs: stream_diff_response
|
|
167
174
|
)
|
|
168
175
|
|
|
169
176
|
return sdk
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
from dataclasses import fields
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
|
|
4
5
|
import pytest
|
|
@@ -27,9 +28,10 @@ def diff_input() -> tuple[dict[str, Package], dict[str, Package]]:
|
|
|
27
28
|
with open(input_file) as f:
|
|
28
29
|
data = json.load(f)
|
|
29
30
|
|
|
30
|
-
# Convert the dictionaries back to Package objects
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
# Convert the dictionaries back to Package objects, ignoring legacy keys
|
|
32
|
+
package_fields = {field.name for field in fields(Package)}
|
|
33
|
+
added = {k: Package(**{pk: pv for pk, pv in v.items() if pk in package_fields}) for k, v in data["added"].items()}
|
|
34
|
+
removed = {k: Package(**{pk: pv for pk, pv in v.items() if pk in package_fields}) for k, v in data["removed"].items()}
|
|
33
35
|
|
|
34
36
|
return added, removed
|
|
35
37
|
|
|
@@ -81,26 +83,8 @@ def test_create_diff_report(core, diff_input):
|
|
|
81
83
|
assert "dp2" in removed_pkg_ids # Direct package
|
|
82
84
|
assert "dp2_t1" not in removed_pkg_ids # Transitive dependency
|
|
83
85
|
|
|
84
|
-
#
|
|
85
|
-
assert len(diff.new_alerts) ==
|
|
86
|
-
|
|
87
|
-
alert_details = {
|
|
88
|
-
(alert.type, alert.severity, alert.pkg_id)
|
|
89
|
-
for alert in diff.new_alerts
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
expected_alerts = {
|
|
93
|
-
("envVars", "low", "dp3"),
|
|
94
|
-
("copyleftLicense", "low", "dp3"),
|
|
95
|
-
("filesystemAccess", "low", "dp3_t1"),
|
|
96
|
-
("envVars", "low", "dp3_t1"),
|
|
97
|
-
("envVars", "low", "dp3_t2"),
|
|
98
|
-
("networkAccess", "middle", "dp3_t2"),
|
|
99
|
-
("usesEval", "middle", "dp3_t2"),
|
|
100
|
-
("usesEval", "middle", "dp4"),
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
assert alert_details == expected_alerts
|
|
86
|
+
# Alerts require explicit action mapping (warn/error) and may be empty in fixtures
|
|
87
|
+
assert len(diff.new_alerts) == 0
|
|
104
88
|
|
|
105
89
|
# Verify new capabilities
|
|
106
90
|
assert "dp3" in diff.new_capabilities
|
|
@@ -280,4 +264,4 @@ def print_added_and_removed(added, removed):
|
|
|
280
264
|
# # Verify capabilities are added to purls
|
|
281
265
|
# pkg1_purl = next(p for p in diff.new_packages if p.id == "pkg1")
|
|
282
266
|
# assert hasattr(pkg1_purl, "capabilities")
|
|
283
|
-
# assert set(pkg1_purl.capabilities) == {"File System Access", "Network Access"}
|
|
267
|
+
# assert set(pkg1_purl.capabilities) == {"File System Access", "Network Access"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from unittest.mock import patch
|
|
2
|
+
|
|
3
|
+
from socketsecurity.core import Core
|
|
4
|
+
|
|
5
|
+
# Minimal patterns matching what the Socket API returns
|
|
6
|
+
MOCK_PATTERNS = {
|
|
7
|
+
"npm": {
|
|
8
|
+
"packagejson": {"pattern": "package.json"},
|
|
9
|
+
"packagelockjson": {"pattern": "package-lock.json"},
|
|
10
|
+
"yarnlock": {"pattern": "yarn.lock"},
|
|
11
|
+
},
|
|
12
|
+
"pypi": {
|
|
13
|
+
"requirements": {"pattern": "*requirements.txt"},
|
|
14
|
+
"requirementsin": {"pattern": "*requirements*.txt"},
|
|
15
|
+
"setuppy": {"pattern": "setup.py"},
|
|
16
|
+
},
|
|
17
|
+
"maven": {
|
|
18
|
+
"pomxml": {"pattern": "pom.xml"},
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@patch.object(Core, "get_supported_patterns", return_value=MOCK_PATTERNS)
|
|
24
|
+
@patch.object(Core, "__init__", lambda self, *a, **kw: None)
|
|
25
|
+
class TestHasManifestFiles:
|
|
26
|
+
def test_root_level_package_json(self, mock_patterns):
|
|
27
|
+
core = Core.__new__(Core)
|
|
28
|
+
assert core.has_manifest_files(["package.json"]) is True
|
|
29
|
+
|
|
30
|
+
def test_root_level_package_lock_json(self, mock_patterns):
|
|
31
|
+
core = Core.__new__(Core)
|
|
32
|
+
assert core.has_manifest_files(["package-lock.json"]) is True
|
|
33
|
+
|
|
34
|
+
def test_subdirectory_package_json(self, mock_patterns):
|
|
35
|
+
core = Core.__new__(Core)
|
|
36
|
+
assert core.has_manifest_files(["libs/ui/package.json"]) is True
|
|
37
|
+
|
|
38
|
+
def test_root_level_requirements_txt(self, mock_patterns):
|
|
39
|
+
core = Core.__new__(Core)
|
|
40
|
+
assert core.has_manifest_files(["requirements.txt"]) is True
|
|
41
|
+
|
|
42
|
+
def test_subdirectory_requirements_txt(self, mock_patterns):
|
|
43
|
+
core = Core.__new__(Core)
|
|
44
|
+
assert core.has_manifest_files(["src/requirements.txt"]) is True
|
|
45
|
+
|
|
46
|
+
def test_prefixed_requirements_txt(self, mock_patterns):
|
|
47
|
+
core = Core.__new__(Core)
|
|
48
|
+
assert core.has_manifest_files(["dev-requirements.txt"]) is True
|
|
49
|
+
|
|
50
|
+
def test_no_manifest_files(self, mock_patterns):
|
|
51
|
+
core = Core.__new__(Core)
|
|
52
|
+
assert core.has_manifest_files(["README.md", "src/app.py"]) is False
|
|
53
|
+
|
|
54
|
+
def test_mixed_files_with_manifest(self, mock_patterns):
|
|
55
|
+
core = Core.__new__(Core)
|
|
56
|
+
assert core.has_manifest_files([".gitlab-ci.yml", "package.json", "src/app.tsx"]) is True
|
|
57
|
+
|
|
58
|
+
def test_empty_list(self, mock_patterns):
|
|
59
|
+
core = Core.__new__(Core)
|
|
60
|
+
assert core.has_manifest_files([]) is False
|
|
61
|
+
|
|
62
|
+
def test_dot_slash_prefix_normalized(self, mock_patterns):
|
|
63
|
+
core = Core.__new__(Core)
|
|
64
|
+
assert core.has_manifest_files(["./package.json"]) is True
|
|
65
|
+
|
|
66
|
+
def test_pom_xml_root(self, mock_patterns):
|
|
67
|
+
core = Core.__new__(Core)
|
|
68
|
+
assert core.has_manifest_files(["pom.xml"]) is True
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
from unittest.mock import Mock, patch
|
|
3
1
|
from dataclasses import dataclass
|
|
2
|
+
from unittest.mock import Mock
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from socketdev import socketdev
|
|
4
6
|
|
|
5
7
|
from socketsecurity.core import Core
|
|
6
|
-
from socketsecurity.core.classes import
|
|
8
|
+
from socketsecurity.core.classes import Issue, Package
|
|
7
9
|
from socketsecurity.core.socket_config import SocketConfig
|
|
8
|
-
from socketdev import socketdev
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
@dataclass
|
|
@@ -14,12 +15,32 @@ class MockArtifact:
|
|
|
14
15
|
name: str
|
|
15
16
|
version: str
|
|
16
17
|
type: str
|
|
18
|
+
release: str
|
|
19
|
+
diffType: str
|
|
17
20
|
license: str
|
|
21
|
+
score: dict
|
|
22
|
+
alerts: list
|
|
18
23
|
direct: bool
|
|
19
24
|
topLevelAncestors: list
|
|
20
25
|
|
|
21
26
|
|
|
22
27
|
class TestPackageAndAlerts:
|
|
28
|
+
@staticmethod
|
|
29
|
+
def make_package(**overrides):
|
|
30
|
+
base = dict(
|
|
31
|
+
id="pkg:npm/test@1.0.0",
|
|
32
|
+
name="test",
|
|
33
|
+
version="1.0.0",
|
|
34
|
+
type="npm",
|
|
35
|
+
release="tar-gz",
|
|
36
|
+
diffType="added",
|
|
37
|
+
score={},
|
|
38
|
+
alerts=[],
|
|
39
|
+
topLevelAncestors=[],
|
|
40
|
+
)
|
|
41
|
+
base.update(overrides)
|
|
42
|
+
return Package(**base)
|
|
43
|
+
|
|
23
44
|
@pytest.fixture
|
|
24
45
|
def mock_sdk(self):
|
|
25
46
|
mock = Mock(spec=socketdev)
|
|
@@ -38,6 +59,10 @@ class TestPackageAndAlerts:
|
|
|
38
59
|
settings_response = Mock()
|
|
39
60
|
settings_response.success = True
|
|
40
61
|
mock.settings.get = Mock(return_value=settings_response)
|
|
62
|
+
|
|
63
|
+
# Set up licensemetadata.post() used by create_packages_dict()
|
|
64
|
+
mock.licensemetadata = Mock()
|
|
65
|
+
mock.licensemetadata.post = Mock(return_value=[{"text": ""}])
|
|
41
66
|
|
|
42
67
|
return mock
|
|
43
68
|
|
|
@@ -61,7 +86,11 @@ class TestPackageAndAlerts:
|
|
|
61
86
|
name="test",
|
|
62
87
|
version="1.0.0",
|
|
63
88
|
type="npm",
|
|
89
|
+
release="tar-gz",
|
|
90
|
+
diffType="added",
|
|
64
91
|
license="MIT",
|
|
92
|
+
score={},
|
|
93
|
+
alerts=[],
|
|
65
94
|
direct=True,
|
|
66
95
|
topLevelAncestors=[]
|
|
67
96
|
)
|
|
@@ -83,7 +112,11 @@ class TestPackageAndAlerts:
|
|
|
83
112
|
name="parent",
|
|
84
113
|
version="1.0.0",
|
|
85
114
|
type="npm",
|
|
115
|
+
release="tar-gz",
|
|
116
|
+
diffType="added",
|
|
86
117
|
license="MIT",
|
|
118
|
+
score={},
|
|
119
|
+
alerts=[],
|
|
87
120
|
direct=True,
|
|
88
121
|
topLevelAncestors=[]
|
|
89
122
|
),
|
|
@@ -92,7 +125,11 @@ class TestPackageAndAlerts:
|
|
|
92
125
|
name="child",
|
|
93
126
|
version="1.0.0",
|
|
94
127
|
type="npm",
|
|
128
|
+
release="tar-gz",
|
|
129
|
+
diffType="added",
|
|
95
130
|
license="MIT",
|
|
131
|
+
score={},
|
|
132
|
+
alerts=[],
|
|
96
133
|
direct=False,
|
|
97
134
|
topLevelAncestors=["pkg:npm/parent@1.0.0"]
|
|
98
135
|
)
|
|
@@ -109,11 +146,7 @@ class TestPackageAndAlerts:
|
|
|
109
146
|
|
|
110
147
|
def test_add_package_alerts_basic(self, core):
|
|
111
148
|
"""Test adding basic alerts to collection"""
|
|
112
|
-
package =
|
|
113
|
-
id="pkg:npm/test@1.0.0",
|
|
114
|
-
name="test",
|
|
115
|
-
version="1.0.0",
|
|
116
|
-
type="npm",
|
|
149
|
+
package = self.make_package(
|
|
117
150
|
alerts=[{
|
|
118
151
|
"type": "networkAccess",
|
|
119
152
|
"key": "test-alert",
|
|
@@ -138,14 +171,11 @@ class TestPackageAndAlerts:
|
|
|
138
171
|
def test_get_capabilities_for_added_packages(self, core):
|
|
139
172
|
"""Test capability extraction from package alerts"""
|
|
140
173
|
added_packages = {
|
|
141
|
-
"pkg:npm/test@1.0.0":
|
|
142
|
-
id="pkg:npm/test@1.0.0",
|
|
143
|
-
type="npm",
|
|
174
|
+
"pkg:npm/test@1.0.0": self.make_package(
|
|
144
175
|
alerts=[{
|
|
145
176
|
"type": "networkAccess",
|
|
146
177
|
"key": "test-alert"
|
|
147
178
|
}],
|
|
148
|
-
topLevelAncestors=[]
|
|
149
179
|
)
|
|
150
180
|
}
|
|
151
181
|
|
|
@@ -198,4 +228,4 @@ class TestPackageAndAlerts:
|
|
|
198
228
|
|
|
199
229
|
# With ignore_readded=False
|
|
200
230
|
new_alerts = Core.get_new_alerts(added_alerts, removed_alerts, ignore_readded=False)
|
|
201
|
-
assert len(new_alerts) == 1
|
|
231
|
+
assert len(new_alerts) == 1
|
|
@@ -16,8 +16,9 @@ def test_get_repo_info(core, mock_sdk_with_responses):
|
|
|
16
16
|
|
|
17
17
|
# Assert SDK called correctly
|
|
18
18
|
mock_sdk_with_responses.repos.repo.assert_called_once_with(
|
|
19
|
-
core.config.org_slug,
|
|
20
|
-
"test"
|
|
19
|
+
core.config.org_slug,
|
|
20
|
+
"test",
|
|
21
|
+
use_types=True,
|
|
21
22
|
)
|
|
22
23
|
|
|
23
24
|
# Assert response processed correctly
|
|
@@ -30,8 +31,9 @@ def test_get_head_scan_for_repo(core, mock_sdk_with_responses):
|
|
|
30
31
|
|
|
31
32
|
# Assert SDK method called correctly
|
|
32
33
|
mock_sdk_with_responses.repos.repo.assert_called_once_with(
|
|
33
|
-
core.config.org_slug,
|
|
34
|
-
"test"
|
|
34
|
+
core.config.org_slug,
|
|
35
|
+
"test",
|
|
36
|
+
use_types=True,
|
|
35
37
|
)
|
|
36
38
|
|
|
37
39
|
# Assert we got the expected head scan ID
|
|
@@ -48,12 +50,14 @@ def test_get_full_scan(core, mock_sdk_with_responses, head_scan_metadata, head_s
|
|
|
48
50
|
|
|
49
51
|
# Assert SDK methods called correctly
|
|
50
52
|
mock_sdk_with_responses.fullscans.metadata.assert_called_once_with(
|
|
51
|
-
core.config.org_slug,
|
|
52
|
-
"head"
|
|
53
|
+
core.config.org_slug,
|
|
54
|
+
"head",
|
|
55
|
+
use_types=True,
|
|
53
56
|
)
|
|
54
57
|
mock_sdk_with_responses.fullscans.stream.assert_called_once_with(
|
|
55
|
-
core.config.org_slug,
|
|
56
|
-
"head"
|
|
58
|
+
core.config.org_slug,
|
|
59
|
+
"head",
|
|
60
|
+
use_types=True,
|
|
57
61
|
)
|
|
58
62
|
|
|
59
63
|
# Assert response processed correctly
|
|
@@ -62,7 +66,7 @@ def test_get_full_scan(core, mock_sdk_with_responses, head_scan_metadata, head_s
|
|
|
62
66
|
assert len(full_scan.packages) == len(head_scan_stream.artifacts)
|
|
63
67
|
assert full_scan.packages["dp1"].transitives == 2
|
|
64
68
|
|
|
65
|
-
def test_create_full_scan(core,
|
|
69
|
+
def test_create_full_scan(core, mock_sdk_with_responses, new_scan_metadata):
|
|
66
70
|
"""Test creating a new full scan"""
|
|
67
71
|
# Setup test data
|
|
68
72
|
files = ["requirements.txt"]
|
|
@@ -77,25 +81,26 @@ def test_create_full_scan(core, new_scan_metadata, new_scan_stream):
|
|
|
77
81
|
|
|
78
82
|
# Verify the response
|
|
79
83
|
assert full_scan.id == new_scan_metadata["data"]["id"]
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
+
mock_sdk_with_responses.fullscans.post.assert_called_once_with(
|
|
85
|
+
files,
|
|
86
|
+
params,
|
|
87
|
+
use_types=True,
|
|
88
|
+
use_lazy_loading=True,
|
|
89
|
+
max_open_files=50,
|
|
90
|
+
base_paths=None,
|
|
91
|
+
)
|
|
84
92
|
|
|
85
93
|
def test_get_added_and_removed_packages(core):
|
|
86
94
|
"""Test getting added and removed packages between two scans"""
|
|
87
95
|
# Get two different scans to compare
|
|
88
|
-
|
|
89
|
-
new_scan = core.get_full_scan("new")
|
|
90
|
-
|
|
91
|
-
# Get the differences
|
|
92
|
-
added, removed = core.get_added_and_removed_packages(head_scan, new_scan)
|
|
96
|
+
added, removed, all_packages = core.get_added_and_removed_packages("head", "new")
|
|
93
97
|
|
|
94
98
|
# Verify SDK was called correctly
|
|
95
99
|
core.sdk.fullscans.stream_diff.assert_called_once_with(
|
|
96
100
|
core.config.org_slug,
|
|
97
101
|
"head",
|
|
98
|
-
"new"
|
|
102
|
+
"new",
|
|
103
|
+
use_types=True,
|
|
99
104
|
)
|
|
100
105
|
|
|
101
106
|
# Verify the results
|
|
@@ -108,6 +113,7 @@ def test_get_added_and_removed_packages(core):
|
|
|
108
113
|
assert len(removed) > 0 # We should have some removed packages
|
|
109
114
|
assert "dp2" in removed # Verify specific package we know was removed
|
|
110
115
|
assert "dp2_t1" in removed # Verify transitive dependencies are also tracked
|
|
116
|
+
assert "pypi/direct_package_1@1.6.0" in all_packages # Unchanged package is in full package map
|
|
111
117
|
|
|
112
118
|
def test_empty_alerts_preserved(core):
|
|
113
119
|
"""Test that empty alerts arrays stay as empty arrays and don't become None"""
|
|
@@ -2,6 +2,29 @@ from socketsecurity.core import Core
|
|
|
2
2
|
from socketsecurity.core.classes import Diff, Issue, Package, Purl
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
def make_package(**overrides):
|
|
6
|
+
base = dict(
|
|
7
|
+
id="pkg:npm/test-package@1.0.0",
|
|
8
|
+
name="test-package",
|
|
9
|
+
version="1.0.0",
|
|
10
|
+
type="npm",
|
|
11
|
+
release="tar-gz",
|
|
12
|
+
diffType="added",
|
|
13
|
+
score={},
|
|
14
|
+
alerts=[],
|
|
15
|
+
direct=True,
|
|
16
|
+
manifestFiles=[{"file": "package.json"}],
|
|
17
|
+
topLevelAncestors=[],
|
|
18
|
+
author=["test-author"],
|
|
19
|
+
size=1000,
|
|
20
|
+
transitives=0,
|
|
21
|
+
purl="pkg:npm/test-package@1.0.0",
|
|
22
|
+
url="https://socket.dev/npm/package/test-package/overview/1.0.0",
|
|
23
|
+
)
|
|
24
|
+
base.update(overrides)
|
|
25
|
+
return Package(**base)
|
|
26
|
+
|
|
27
|
+
|
|
5
28
|
def test_create_purl():
|
|
6
29
|
"""Test creating a PURL from package data"""
|
|
7
30
|
# Setup test package data
|
|
@@ -10,23 +33,18 @@ def test_create_purl():
|
|
|
10
33
|
pkg_version = "1.0.0"
|
|
11
34
|
|
|
12
35
|
packages = {
|
|
13
|
-
"test_pkg":
|
|
36
|
+
"test_pkg": make_package(
|
|
14
37
|
id="test_pkg",
|
|
15
38
|
name=pkg_name,
|
|
16
39
|
version=pkg_version,
|
|
17
40
|
type=pkg_type,
|
|
18
|
-
direct=True,
|
|
19
|
-
manifestFiles=[{"file": "package.json"}],
|
|
20
|
-
topLevelAncestors=[],
|
|
21
|
-
author=["test-author"],
|
|
22
|
-
size=1000,
|
|
23
|
-
transitives=0,
|
|
24
41
|
purl=f"pkg:{pkg_type}/{pkg_name}@{pkg_version}"
|
|
25
42
|
)
|
|
26
43
|
}
|
|
27
44
|
|
|
28
45
|
# Create PURL
|
|
29
|
-
|
|
46
|
+
core = Core.__new__(Core)
|
|
47
|
+
purl = core.create_purl("test_pkg", packages)
|
|
30
48
|
|
|
31
49
|
# Verify PURL properties
|
|
32
50
|
assert purl.id == "test_pkg"
|
|
@@ -45,7 +63,7 @@ def test_create_purl():
|
|
|
45
63
|
def test_get_source_data():
|
|
46
64
|
"""Test getting source data for direct and transitive dependencies"""
|
|
47
65
|
# Setup test package data
|
|
48
|
-
direct_pkg =
|
|
66
|
+
direct_pkg = make_package(
|
|
49
67
|
id="direct_pkg",
|
|
50
68
|
name="direct-package",
|
|
51
69
|
version="1.0.0",
|
|
@@ -55,12 +73,10 @@ def test_get_source_data():
|
|
|
55
73
|
{"file": "package.json", "start": 10, "end": 20}
|
|
56
74
|
],
|
|
57
75
|
topLevelAncestors=[],
|
|
58
|
-
author=["test-author"],
|
|
59
|
-
size=1000,
|
|
60
76
|
transitives=1
|
|
61
77
|
)
|
|
62
78
|
|
|
63
|
-
transitive_pkg =
|
|
79
|
+
transitive_pkg = make_package(
|
|
64
80
|
id="t_pkg",
|
|
65
81
|
name="transitive-package",
|
|
66
82
|
version="2.0.0",
|
|
@@ -91,14 +107,11 @@ def test_get_capabilities_for_added_packages():
|
|
|
91
107
|
"""Test mapping package alerts to capabilities"""
|
|
92
108
|
# Setup test packages with various alert types
|
|
93
109
|
packages = {
|
|
94
|
-
"pkg1":
|
|
110
|
+
"pkg1": make_package(
|
|
95
111
|
id="pkg1",
|
|
96
112
|
name="package-1",
|
|
97
113
|
version="1.0.0",
|
|
98
114
|
type="npm",
|
|
99
|
-
direct=True,
|
|
100
|
-
manifestFiles=[{"file": "package.json"}],
|
|
101
|
-
topLevelAncestors=[],
|
|
102
115
|
alerts=[
|
|
103
116
|
{
|
|
104
117
|
"key": "alert1",
|
|
@@ -116,14 +129,11 @@ def test_get_capabilities_for_added_packages():
|
|
|
116
129
|
}
|
|
117
130
|
]
|
|
118
131
|
),
|
|
119
|
-
"pkg2":
|
|
132
|
+
"pkg2": make_package(
|
|
120
133
|
id="pkg2",
|
|
121
134
|
name="package-2",
|
|
122
135
|
version="2.0.0",
|
|
123
136
|
type="npm",
|
|
124
|
-
direct=True,
|
|
125
|
-
manifestFiles=[{"file": "package.json"}],
|
|
126
|
-
topLevelAncestors=[],
|
|
127
137
|
alerts=[
|
|
128
138
|
{
|
|
129
139
|
"key": "alert3",
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"updated_at": "2024-12-10T23:20:51.206Z",
|
|
6
6
|
"head_full_scan_id": "",
|
|
7
7
|
"name": "basic-python",
|
|
8
|
+
"slug": "no-head",
|
|
8
9
|
"description": "",
|
|
9
10
|
"homepage": "https://github.com/test_org/basic-python",
|
|
10
11
|
"visibility": "public",
|
|
@@ -13,4 +14,4 @@
|
|
|
13
14
|
},
|
|
14
15
|
"success": true,
|
|
15
16
|
"status": 200
|
|
16
|
-
}
|
|
17
|
+
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"updated_at": "2024-12-10T23:20:51.206Z",
|
|
6
6
|
"head_full_scan_id": "head",
|
|
7
7
|
"name": "basic-python",
|
|
8
|
+
"slug": "test",
|
|
8
9
|
"description": "",
|
|
9
10
|
"homepage": "https://github.com/test_org/basic-python",
|
|
10
11
|
"visibility": "public",
|
|
@@ -13,4 +14,4 @@
|
|
|
13
14
|
},
|
|
14
15
|
"success": true,
|
|
15
16
|
"status": 200
|
|
16
|
-
}
|
|
17
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/.github/PULL_REQUEST_TEMPLATE/improvement.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/core/helper/socket_facts_loader.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/socketsecurity/plugins/formatters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/diff/stream_diff_full.json
RENAMED
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/head_scan/metadata.json
RENAMED
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/head_scan/stream_scan.json
RENAMED
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/head_scan/stream_scan_full.json
RENAMED
|
File without changes
|
|
File without changes
|
{socketsecurity-2.2.76 → socketsecurity-2.2.77}/tests/data/fullscans/new_scan/stream_scan.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|