Return a list of Affected Packages for each Patched package.
(
vulnerable_packages: List[PackageURL], resolved_packages: List[PackageURL]
)
| 174 | |
| 175 | |
| 176 | def nearest_patched_package( |
| 177 | vulnerable_packages: List[PackageURL], resolved_packages: List[PackageURL] |
| 178 | ) -> List[AffectedPackage]: |
| 179 | """ |
| 180 | Return a list of Affected Packages for each Patched package. |
| 181 | """ |
| 182 | |
| 183 | vulnerable_packages = sorted([VersionedPackage(package) for package in vulnerable_packages]) |
| 184 | resolved_packages = sorted([VersionedPackage(package) for package in resolved_packages]) |
| 185 | |
| 186 | resolved_package_count = len(resolved_packages) |
| 187 | affected_package_with_patched_package_objects = [] |
| 188 | |
| 189 | for vulnerable_package in vulnerable_packages: |
| 190 | patched_package_index = bisect.bisect_right(resolved_packages, vulnerable_package) |
| 191 | patched_package = None |
| 192 | if patched_package_index < resolved_package_count: |
| 193 | patched_package = resolved_packages[patched_package_index] |
| 194 | |
| 195 | affected_package_with_patched_package_objects.append( |
| 196 | AffectedPackage( |
| 197 | vulnerable_package=vulnerable_package.purl, |
| 198 | patched_package=patched_package.purl if patched_package else None, |
| 199 | ) |
| 200 | ) |
| 201 | |
| 202 | return affected_package_with_patched_package_objects |
| 203 | |
| 204 | |
| 205 | # TODO: Replace this with combination of @classmethod and @property after upgrading to python 3.9 |