Skip to content

Commit 0a83c4d

Browse files
authored
Added fixes for missing commit-sha option. Added option to export SBOM file. Added node, npm, and yarn to Dockerfile (#1)
1 parent 4786453 commit 0a83c4d

File tree

6 files changed

+134
-33
lines changed

6 files changed

+134
-33
lines changed

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ FROM python:3-alpine
22
LABEL org.opencontainers.image.authors="socket.dev"
33

44
RUN apk update \
5-
&& apk add --no-cache git
6-
RUN pip install socketsecurity
5+
&& apk add --no-cache git nodejs npm yarn
6+
RUN pip install socketsecurity --upgrade

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "socketsecurity"
7-
version = "0.0.67"
7+
version = "0.0.72"
88
requires-python = ">= 3.9"
99
dependencies = [
1010
'requests',

socketsecurity/core/__init__.py

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626

2727
__author__ = 'socket.dev'
28-
__version__ = '0.0.67'
28+
__version__ = '0.0.72'
2929
__all__ = [
3030
"Core",
3131
"log",
@@ -246,6 +246,55 @@ def get_security_policy() -> dict:
246246
}
247247
return org_rules
248248

249+
# @staticmethod
250+
# def get_supported_file_types() -> dict:
251+
# path = "report/supported"
252+
253+
@staticmethod
254+
def get_manifest_files(package: Package, packages: dict) -> str:
255+
if package.direct:
256+
manifests = []
257+
for manifest_item in package.manifestFiles:
258+
manifest = manifest_item["file"]
259+
manifests.append(manifest)
260+
manifest_files = ";".join(manifests)
261+
else:
262+
manifests = []
263+
for top_id in package.topLevelAncestors:
264+
top_package: Package
265+
top_package = packages[top_id]
266+
for manifest_item in top_package.manifestFiles:
267+
manifest = manifest_item["file"]
268+
new_string = f"{package.name}@{package.version}({manifest})"
269+
manifests.append(new_string)
270+
manifest_files = ";".join(manifests)
271+
return manifest_files
272+
273+
@staticmethod
274+
def create_sbom_output(diff: Diff) -> list:
275+
sbom = []
276+
for package_id in diff.packages:
277+
package: Package
278+
package = diff.packages[package_id]
279+
manifest_files = Core.get_manifest_files(package, diff.packages)
280+
item = {
281+
"id": package.id,
282+
"license": package.license,
283+
"license_text": package.license_text,
284+
"manifestFiles": manifest_files,
285+
"score": package.score,
286+
"size": package.size,
287+
"ecosystem": package.type,
288+
"alerts": package.alerts,
289+
"direct": package.direct,
290+
"name": package.name,
291+
"version": package.version,
292+
"author": package.author,
293+
"url": package.url
294+
}
295+
sbom.append(item)
296+
return sbom
297+
249298
@staticmethod
250299
def find_files(path: str) -> list:
251300
"""
@@ -314,8 +363,8 @@ def find_files(path: str) -> list:
314363
"requirements.frozen": {
315364
"pattern": "requirements.frozen"
316365
},
317-
"setup.py.old": {
318-
"pattern": "setup.py.old"
366+
"setup.py": {
367+
"pattern": "setup.py"
319368
}
320369
},
321370
"golang": {
@@ -325,6 +374,11 @@ def find_files(path: str) -> list:
325374
"go.sum": {
326375
"pattern": "go.sum"
327376
}
377+
},
378+
"java": {
379+
"pom.xml": {
380+
"pattern": "pom.xml"
381+
}
328382
}
329383
}
330384
all_files = []
@@ -469,12 +523,12 @@ def compare_sboms(new_scan: list, head_scan: list) -> Diff:
469523

470524
for package_id in new_packages:
471525
purl, package = Core.create_purl(package_id, new_packages)
472-
if package_id not in head_packages:
526+
if package_id not in head_packages and package.direct:
473527
diff.new_packages.append(purl)
474528
new_scan_alerts = Core.create_issue_alerts(package, new_scan_alerts, new_packages)
475529
for package_id in head_packages:
476530
purl, package = Core.create_purl(package_id, head_packages)
477-
if package_id not in new_packages:
531+
if package_id not in new_packages and package.direct:
478532
diff.removed_packages.append(purl)
479533
head_scan_alerts = Core.create_issue_alerts(package, head_scan_alerts, head_packages)
480534
diff.new_alerts = Core.compare_issue_alerts(new_scan_alerts, head_scan_alerts, diff.new_alerts)

socketsecurity/core/github.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -163,19 +163,27 @@ def check_event_type() -> str:
163163
return event_type
164164

165165
@staticmethod
166-
def add_socket_comments(security_comment: str, overview_comment: str, comments: dict) -> None:
166+
def add_socket_comments(
167+
security_comment: str,
168+
overview_comment: str,
169+
comments: dict,
170+
new_security_comment: bool = True,
171+
new_overview_comment: bool = True
172+
) -> None:
167173
existing_overview_comment = comments.get("overview")
168174
existing_security_comment = comments.get("security")
169-
if existing_overview_comment is not None:
170-
existing_overview_comment: GithubComment
171-
Github.update_comment(overview_comment, str(existing_overview_comment.id))
172-
else:
173-
Github.post_comment(overview_comment)
174-
if existing_security_comment is not None:
175-
existing_security_comment: GithubComment
176-
Github.update_comment(security_comment, str(existing_security_comment.id))
177-
else:
178-
Github.post_comment(security_comment)
175+
if new_overview_comment:
176+
if existing_overview_comment is not None:
177+
existing_overview_comment: GithubComment
178+
Github.update_comment(overview_comment, str(existing_overview_comment.id))
179+
else:
180+
Github.post_comment(overview_comment)
181+
if new_security_comment:
182+
if existing_security_comment is not None:
183+
existing_security_comment: GithubComment
184+
Github.update_comment(security_comment, str(existing_security_comment.id))
185+
else:
186+
Github.post_comment(security_comment)
179187

180188
@staticmethod
181189
def post_comment(body: str) -> None:

socketsecurity/core/gitlab.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def __init__(self):
141141
self.api_token = gitlab_token
142142
self.project_id = ci_merge_request_project_id
143143
if self.api_token is None:
144-
print("Unable to get gitlab API Token from GH_API_TOKEN")
144+
print("Unable to get gitlab API Token from GITLAB_TOKEN")
145145
sys.exit(2)
146146

147147
@staticmethod
@@ -159,19 +159,27 @@ def check_event_type() -> str:
159159
return event_type
160160

161161
@staticmethod
162-
def add_socket_comments(security_comment: str, overview_comment: str, comments: dict) -> None:
162+
def add_socket_comments(
163+
security_comment: str,
164+
overview_comment: str,
165+
comments: dict,
166+
new_security_comment: bool = True,
167+
new_overview_comment: bool = True
168+
) -> None:
163169
existing_overview_comment = comments.get("overview")
164170
existing_security_comment = comments.get("security")
165-
if existing_overview_comment is not None:
166-
existing_overview_comment: GitlabComment
167-
Gitlab.update_comment(overview_comment, str(existing_overview_comment.id))
168-
else:
169-
Gitlab.post_comment(overview_comment)
170-
if existing_security_comment is not None:
171-
existing_security_comment: GitlabComment
172-
Gitlab.update_comment(security_comment, str(existing_security_comment.id))
173-
else:
174-
Gitlab.post_comment(security_comment)
171+
if new_overview_comment:
172+
if existing_overview_comment is not None:
173+
existing_overview_comment: GitlabComment
174+
Gitlab.update_comment(overview_comment, str(existing_overview_comment.id))
175+
else:
176+
Gitlab.post_comment(overview_comment)
177+
if new_security_comment:
178+
if existing_security_comment is not None:
179+
existing_security_comment: GitlabComment
180+
Gitlab.update_comment(security_comment, str(existing_security_comment.id))
181+
else:
182+
Gitlab.post_comment(security_comment)
175183

176184
@staticmethod
177185
def post_comment(body: str) -> None:

socketsecurity/socketcli.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@
6969
required=False
7070
)
7171

72+
parser.add_argument(
73+
'--sbom-file',
74+
default=None,
75+
help='If soecified save the SBOM details to the specified file',
76+
required=False
77+
)
78+
79+
parser.add_argument(
80+
'--commit-sha',
81+
default="",
82+
help='Optional git commit sha',
83+
required=False
84+
)
85+
7286
parser.add_argument(
7387
'--generate-license',
7488
default=False,
@@ -115,6 +129,8 @@ def cli():
115129
pr_number = arguments.pr_number
116130
target_path = arguments.target_path
117131
scm_type = arguments.scm
132+
commit_sha = arguments.commit_sha
133+
sbom_file = arguments.sbom_file
118134
license_mode = arguments.generate_license
119135
license_file = f"{repo}"
120136
if branch is not None:
@@ -137,6 +153,7 @@ def cli():
137153
scm = Gitlab()
138154
if scm is not None:
139155
default_branch = scm.is_default_branch
156+
140157
base_api_url = os.getenv("BASE_API_URL") or None
141158
core = Core(token=api_token, request_timeout=6000, base_api_url=base_api_url)
142159
set_as_pending_head = False
@@ -146,7 +163,7 @@ def cli():
146163
repo=repo,
147164
branch=branch,
148165
commit_message=commit_message,
149-
commit_hash="",
166+
commit_hash=commit_sha,
150167
pull_request=pr_number,
151168
committers=committer,
152169
make_default_branch=default_branch,
@@ -166,7 +183,19 @@ def cli():
166183
diff.new_alerts = scm.remove_alerts(comments, diff.new_alerts)
167184
overview_comment = Messages.dependency_overview_template(diff)
168185
security_comment = Messages.security_comment_template(diff)
169-
scm.add_socket_comments(security_comment, overview_comment, comments)
186+
new_security_comment = True
187+
new_overview_comment = True
188+
if len(diff.new_alerts) == 0:
189+
new_security_comment = False
190+
if len(diff.new_packages) == 0 and diff.removed_packages == 0:
191+
new_overview_comment = False
192+
scm.add_socket_comments(
193+
security_comment,
194+
overview_comment,
195+
comments,
196+
new_security_comment,
197+
new_overview_comment
198+
)
170199
output_console_comments(diff)
171200
else:
172201
log.info("API Mode")
@@ -190,6 +219,8 @@ def cli():
190219
}
191220
all_packages[package_id] = output
192221
core.save_file(license_file, json.dumps(all_packages))
222+
if diff is not None and sbom_file is not None:
223+
core.save_file(sbom_file, json.dumps(core.create_sbom_output(diff)))
193224

194225

195226
if __name__ == '__main__':

0 commit comments

Comments
 (0)