|
35 | 35 | from fetchcode.vcs import fetch_via_vcs |
36 | 36 | from packageurl import PackageURL |
37 | 37 | from univers.version_range import RANGE_CLASS_BY_SCHEMES |
38 | | -from univers.version_range import GitLabVersionRange |
39 | 38 | from univers.version_range import VersionRange |
| 39 | +from univers.version_range import from_gitlab_native |
40 | 40 | from univers.versions import Version |
41 | 41 |
|
42 | 42 | from vulnerabilities.helpers import AffectedPackage as LegacyAffectedPackage |
|
58 | 58 | logger = logging.getLogger(__name__) |
59 | 59 |
|
60 | 60 |
|
61 | | -PURL_TYPE_BY_ECOSYSTEM = { |
| 61 | +PURL_TYPE_BY_GITLAB_SCHEME = { |
62 | 62 | "gem": "gem", |
63 | 63 | "go": "golang", |
64 | 64 | "maven": "maven", |
|
69 | 69 | } |
70 | 70 |
|
71 | 71 |
|
| 72 | +GITLAB_SCHEME_BY_PURL_TYPE = {v: k for k, v in PURL_TYPE_BY_GITLAB_SCHEME.items()} |
| 73 | + |
| 74 | + |
72 | 75 | def fork_and_get_dir(url): |
73 | 76 | return fetch_via_vcs(url).dest_dir |
74 | 77 |
|
@@ -113,22 +116,23 @@ def get_purl(package_slug): |
113 | 116 | """ |
114 | 117 | parts = package_slug.split("/") |
115 | 118 | parts = list(filter(not_empty, parts)) |
116 | | - type = parts[0] |
117 | | - if type == "go": |
| 119 | + gitlab_scheme = parts[0] |
| 120 | + purl_type = PURL_TYPE_BY_GITLAB_SCHEME[gitlab_scheme] |
| 121 | + if gitlab_scheme == "go": |
118 | 122 | name = "/".join(parts[1:]) |
119 | | - return PackageURL(type=PURL_TYPE_BY_ECOSYSTEM[type], namespace=None, name=name) |
| 123 | + return PackageURL(type=purl_type, namespace=None, name=name) |
120 | 124 | # if package slug is of the form: |
121 | 125 | # "nuget/NuGet.Core" |
122 | 126 | if len(parts) == 2: |
123 | 127 | name = parts[1] |
124 | | - return PackageURL(type=PURL_TYPE_BY_ECOSYSTEM[type], name=name) |
| 128 | + return PackageURL(type=purl_type, name=name) |
125 | 129 | # if package slug is of the form: |
126 | 130 | # "nuget/github/user/abc/NuGet.Core" |
127 | 131 | if len(parts) >= 3: |
128 | | - type = parts[0] |
| 132 | + gitlab_scheme = parts[0] |
129 | 133 | name = parts[-1] |
130 | 134 | namespace = "/".join(parts[1:-1]) |
131 | | - return PackageURL(type=PURL_TYPE_BY_ECOSYSTEM[type], namespace=namespace, name=name) |
| 135 | + return PackageURL(type=purl_type, namespace=namespace, name=name) |
132 | 136 | logger.error(f"get_purl: package_slug can not be parsed: {package_slug!r}") |
133 | 137 | return None |
134 | 138 |
|
@@ -177,11 +181,12 @@ def parse_yaml_file(file): |
177 | 181 | ) |
178 | 182 | vrc: VersionRange = RANGE_CLASS_BY_SCHEMES[purl.type] |
179 | 183 | version_class = vrc.version_class |
180 | | - gitlab_native_schemes = ["pypi", "gem", "npm"] |
| 184 | + gitlab_native_schemes = ["pypi", "gem", "npm", "go", "packagist"] |
| 185 | + gitlab_scheme = GITLAB_SCHEME_BY_PURL_TYPE[purl.type] |
181 | 186 | try: |
182 | | - if purl.type in gitlab_native_schemes: |
| 187 | + if gitlab_scheme in gitlab_native_schemes: |
183 | 188 | affected_version_range = ( |
184 | | - GitLabVersionRange.from_gitlab_native(purl.type, affected_range) |
| 189 | + from_gitlab_native(gitlab_scheme=gitlab_scheme, string=affected_range) |
185 | 190 | if affected_range |
186 | 191 | else None |
187 | 192 | ) |
|
0 commit comments