Skip to content

Commit def1c95

Browse files
committed
Migrate mattermost
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 74382d6 commit def1c95

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#
2+
# Copyright (c) nexB Inc. and others. All rights reserved.
3+
# VulnerableCode is a trademark of nexB Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
# See http://www.apache.org/licenses/LICENSE-2.0 for the license text.
6+
# See https://github.com/aboutcode-org/vulnerablecode for support or download.
7+
# See https://aboutcode.org for more information about nexB OSS projects.
8+
#
9+
10+
from typing import Iterable
11+
12+
from packageurl import PackageURL
13+
from univers.version_range import GitHubVersionRange
14+
15+
from vulnerabilities import severity_systems
16+
from vulnerabilities.importer import AdvisoryData
17+
from vulnerabilities.importer import AffectedPackageV2
18+
from vulnerabilities.importer import VulnerabilitySeverity
19+
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipelineV2
20+
from vulnerabilities.utils import fetch_response
21+
22+
MM_REPO = {
23+
"Mattermost Mobile Apps": "mattermost-mobile",
24+
"Mattermost Server": "mattermost-server",
25+
"Mattermost Desktop App": "desktop",
26+
}
27+
28+
29+
class MattermostImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
30+
"""
31+
Importer for Xen Security Advisories from xsa.json.
32+
"""
33+
34+
pipeline_id = "mattermost_importer_v2"
35+
url = "https://securityupdates.mattermost.com/security_updates.json"
36+
spdx_license_expression = "LicenseRef-scancode-other-permissive"
37+
38+
_cached_data = None # Class-level cache
39+
40+
@classmethod
41+
def steps(cls):
42+
return (cls.collect_and_store_advisories,)
43+
44+
def get_mattermost_data(self):
45+
if self._cached_data is None:
46+
self._cached_data = fetch_response(self.url).json()
47+
return self._cached_data
48+
49+
def advisories_count(self) -> int:
50+
data = self.get_mattermost_data()
51+
return len(data) if data else 0
52+
53+
def collect_advisories(self) -> Iterable[AdvisoryData]:
54+
data = self.get_mattermost_data()
55+
if not data:
56+
return
57+
58+
for advisory in data:
59+
vuln_id = advisory.get("issue_id")
60+
cve_id = advisory.get("cve_id")
61+
details = advisory.get("details")
62+
63+
platform = advisory.get("platform")
64+
65+
fixed_versions = advisory.get("fix_versions", [])
66+
67+
package_name = MM_REPO.get(platform)
68+
69+
if not package_name:
70+
self.log(f"Unknown platform '{platform}' in advisory '{vuln_id}'. Skipping.")
71+
continue
72+
73+
package = PackageURL(
74+
type="github",
75+
namespace="mattermost",
76+
name=MM_REPO.get(platform),
77+
)
78+
79+
affected_packages = []
80+
81+
severity = advisory.get("severity")
82+
83+
if isinstance(fixed_versions, list):
84+
fixed_versions = [v for v in fixed_versions if v and v.strip()]
85+
fixed_versions = [v.lstrip("v") for v in fixed_versions]
86+
if isinstance(fixed_versions, str):
87+
fixed_versions = [fixed_versions.lstrip("v")]
88+
89+
affected_packages.append(
90+
AffectedPackageV2(
91+
package=package,
92+
fixed_version_range=GitHubVersionRange.from_versions(fixed_versions),
93+
)
94+
)
95+
96+
severities = []
97+
severities.append(
98+
VulnerabilitySeverity(system=severity_systems.CVSS31_QUALITY, value=severity)
99+
)
100+
101+
yield AdvisoryData(
102+
advisory_id=vuln_id,
103+
aliases=[cve_id],
104+
summary=details,
105+
affected_packages=affected_packages,
106+
url="https://mattermost.com/security-updates/",
107+
)

0 commit comments

Comments
 (0)