From 34da4d3167a82f2e6808bbafaec287024b7c45af Mon Sep 17 00:00:00 2001 From: ziad hany Date: Wed, 22 Apr 2026 03:41:41 +0200 Subject: [PATCH 01/16] feat: create pipeline for symbol reachability and add a test Signed-off-by: ziad hany --- .../pipelines/collect_symbols_reachability.py | 35 ++++++++++++++++ scanpipe/tests/data/reachability/app.py | 35 ++++++++++++++++ .../tests/data/reachability/diff-app.patch | 39 ++++++++++++++++++ scanpipe/tests/data/reachability/fixed-app.py | 41 +++++++++++++++++++ scanpipe/tests/data/reachability/vuln-app.py | 35 ++++++++++++++++ 5 files changed, 185 insertions(+) create mode 100644 scanpipe/pipelines/collect_symbols_reachability.py create mode 100644 scanpipe/tests/data/reachability/app.py create mode 100644 scanpipe/tests/data/reachability/diff-app.patch create mode 100644 scanpipe/tests/data/reachability/fixed-app.py create mode 100644 scanpipe/tests/data/reachability/vuln-app.py diff --git a/scanpipe/pipelines/collect_symbols_reachability.py b/scanpipe/pipelines/collect_symbols_reachability.py new file mode 100644 index 0000000000..15519fc661 --- /dev/null +++ b/scanpipe/pipelines/collect_symbols_reachability.py @@ -0,0 +1,35 @@ +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# VulnerableCode is a trademark of nexB Inc. +# SPDX-License-Identifier: Apache-2.0 +# See http://www.apache.org/licenses/LICENSE-2.0 for the license text. +# See https://github.com/aboutcode-org/vulnerablecode for support or download. +# See https://aboutcode.org for more information about nexB OSS projects. +# + +from scanpipe.pipelines import Pipeline +from scanpipe.pipes import reachability + + +class SymbolReachability(Pipeline): + """ + Patch reachability analysis, for given a vulnerability patches + """ + + download_inputs = False + is_addon = True + results_url = "/project/{slug}/resources/?extra_data=symbol_reachability" + + @classmethod + def steps(cls): + return (cls.analyze_and_store_symbol_reachability,) + + def analyze_and_store_symbol_reachability(self): + """ + Perform symbol-level reachability analysis for each patch. + This step compares the AST of patched/vulnerable files against the codebase resources. + Results are stored directly in the 'extra_data' of each CodebaseResource. + """ + reachability.collect_and_store_symbol_reachability_results( + project=self.project, logger=self.log + ) diff --git a/scanpipe/tests/data/reachability/app.py b/scanpipe/tests/data/reachability/app.py new file mode 100644 index 0000000000..c64ae7d9d1 --- /dev/null +++ b/scanpipe/tests/data/reachability/app.py @@ -0,0 +1,35 @@ +import os + + +class ReportGenerator: + """A dummy class to test AST class method parsing.""" + + def __init__(self, base_dir): + self.base_dir = base_dir + + +def serve_report(request_payload): + """Top-level function handling a request.""" + generator = ReportGenerator("/var/reports") + requested_file = request_payload.get("file") + + # Helper function nested inside serve_report + def build_file_path(filename): + # VULNERABLE: Direct concatenation allows Path Traversal + # An attacker passing "../../etc/passwd" could read system files. + return os.path.join(generator.base_dir, filename) + + if not requested_file: + return "Error: No file specified" + + target_path = build_file_path(requested_file) + + if os.path.exists(target_path): + return f"Serving content of {target_path}" + + return "Error: File not found" + + +def unrelated_top_level_function(): + """An extra function to test AST node boundaries.""" + return "I am just here to add AST complexity." diff --git a/scanpipe/tests/data/reachability/diff-app.patch b/scanpipe/tests/data/reachability/diff-app.patch new file mode 100644 index 0000000000..ccb86953a8 --- /dev/null +++ b/scanpipe/tests/data/reachability/diff-app.patch @@ -0,0 +1,39 @@ +From 8f7b1c3d9a4e2b6f5d8c1a2e3f4b5c6d7e8f9a0b Mon Sep 17 00:00:00 2001 +From: Security Team +Date: Tue, 2 Jun 2026 10:00:00 +0000 +Subject: [PATCH] Fix path traversal vulnerability in report generator + +- Validates that target paths stay within the designated base_dir. +- Catches ValueError on invalid path resolution. +--- + app.py | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/app.py b/app.py +index a1b2c3d..e4f5g6h 100644 +--- a/app.py ++++ b/app.py +@@ -15,13 +15,19 @@ def serve_report(request_payload): + # Helper function nested inside serve_report + def build_file_path(filename): +- # VULNERABLE: Direct concatenation allows Path Traversal +- # An attacker passing "../../etc/passwd" could read system files. +- return os.path.join(generator.base_dir, filename) ++ # FIXED: Validate that the resolved path stays within the base_dir ++ base = os.path.abspath(generator.base_dir) ++ target = os.path.abspath(os.path.join(base, filename)) ++ if not target.startswith(base): ++ raise ValueError("Path Traversal Detected") ++ return target + + if not requested_file: + return "Error: No file specified" + +- target_path = build_file_path(requested_file) ++ try: ++ target_path = build_file_path(requested_file) ++ except ValueError: ++ return "Error: Invalid path" + + if os.path.exists(target_path): + return f"Serving content of {target_path}" \ No newline at end of file diff --git a/scanpipe/tests/data/reachability/fixed-app.py b/scanpipe/tests/data/reachability/fixed-app.py new file mode 100644 index 0000000000..3296bb843e --- /dev/null +++ b/scanpipe/tests/data/reachability/fixed-app.py @@ -0,0 +1,41 @@ +import os + + +class ReportGenerator: + """A dummy class to test AST class method parsing.""" + + def __init__(self, base_dir): + self.base_dir = base_dir + + +def serve_report(request_payload): + """Top-level function handling a request.""" + generator = ReportGenerator("/var/reports") + requested_file = request_payload.get("file") + + # Helper function nested inside serve_report + def build_file_path(filename): + # FIXED: Validate that the resolved path stays within the base_dir + base = os.path.abspath(generator.base_dir) + target = os.path.abspath(os.path.join(base, filename)) + if not target.startswith(base): + raise ValueError("Path Traversal Detected") + return target + + if not requested_file: + return "Error: No file specified" + + try: + target_path = build_file_path(requested_file) + except ValueError: + return "Error: Invalid path" + + if os.path.exists(target_path): + return f"Serving content of {target_path}" + + return "Error: File not found" + + +def unrelated_top_level_function(): + """An extra function to test AST node boundaries.""" + return "I am just here to add AST complexity." diff --git a/scanpipe/tests/data/reachability/vuln-app.py b/scanpipe/tests/data/reachability/vuln-app.py new file mode 100644 index 0000000000..c64ae7d9d1 --- /dev/null +++ b/scanpipe/tests/data/reachability/vuln-app.py @@ -0,0 +1,35 @@ +import os + + +class ReportGenerator: + """A dummy class to test AST class method parsing.""" + + def __init__(self, base_dir): + self.base_dir = base_dir + + +def serve_report(request_payload): + """Top-level function handling a request.""" + generator = ReportGenerator("/var/reports") + requested_file = request_payload.get("file") + + # Helper function nested inside serve_report + def build_file_path(filename): + # VULNERABLE: Direct concatenation allows Path Traversal + # An attacker passing "../../etc/passwd" could read system files. + return os.path.join(generator.base_dir, filename) + + if not requested_file: + return "Error: No file specified" + + target_path = build_file_path(requested_file) + + if os.path.exists(target_path): + return f"Serving content of {target_path}" + + return "Error: File not found" + + +def unrelated_top_level_function(): + """An extra function to test AST node boundaries.""" + return "I am just here to add AST complexity." From 3401e3da929664cb38bacf4d1c94b6f3af926e02 Mon Sep 17 00:00:00 2001 From: ziad hany Date: Wed, 10 Jun 2026 15:08:45 +0300 Subject: [PATCH 02/16] Fix the format bugs and refactor the code Signed-off-by: ziad hany --- scanpipe/pipelines/collect_symbols_reachability.py | 8 +++----- scanpipe/tests/data/reachability/app.py | 2 +- scanpipe/tests/data/reachability/fixed-app.py | 2 +- scanpipe/tests/data/reachability/vuln-app.py | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/scanpipe/pipelines/collect_symbols_reachability.py b/scanpipe/pipelines/collect_symbols_reachability.py index 15519fc661..c1d5fb11c4 100644 --- a/scanpipe/pipelines/collect_symbols_reachability.py +++ b/scanpipe/pipelines/collect_symbols_reachability.py @@ -12,9 +12,7 @@ class SymbolReachability(Pipeline): - """ - Patch reachability analysis, for given a vulnerability patches - """ + """Patch reachability analysis for given vulnerability patches.""" download_inputs = False is_addon = True @@ -26,8 +24,8 @@ def steps(cls): def analyze_and_store_symbol_reachability(self): """ - Perform symbol-level reachability analysis for each patch. - This step compares the AST of patched/vulnerable files against the codebase resources. + Perform symbol-level reachability analysis for each patch. This step compares + the AST of patched/vulnerable files against the codebase resources. Results are stored directly in the 'extra_data' of each CodebaseResource. """ reachability.collect_and_store_symbol_reachability_results( diff --git a/scanpipe/tests/data/reachability/app.py b/scanpipe/tests/data/reachability/app.py index c64ae7d9d1..b8c9eff5e0 100644 --- a/scanpipe/tests/data/reachability/app.py +++ b/scanpipe/tests/data/reachability/app.py @@ -31,5 +31,5 @@ def build_file_path(filename): def unrelated_top_level_function(): - """An extra function to test AST node boundaries.""" + """Test AST node boundaries.""" return "I am just here to add AST complexity." diff --git a/scanpipe/tests/data/reachability/fixed-app.py b/scanpipe/tests/data/reachability/fixed-app.py index 3296bb843e..ca5a6f4c8b 100644 --- a/scanpipe/tests/data/reachability/fixed-app.py +++ b/scanpipe/tests/data/reachability/fixed-app.py @@ -37,5 +37,5 @@ def build_file_path(filename): def unrelated_top_level_function(): - """An extra function to test AST node boundaries.""" + """Test AST node boundaries.""" return "I am just here to add AST complexity." diff --git a/scanpipe/tests/data/reachability/vuln-app.py b/scanpipe/tests/data/reachability/vuln-app.py index c64ae7d9d1..b8c9eff5e0 100644 --- a/scanpipe/tests/data/reachability/vuln-app.py +++ b/scanpipe/tests/data/reachability/vuln-app.py @@ -31,5 +31,5 @@ def build_file_path(filename): def unrelated_top_level_function(): - """An extra function to test AST node boundaries.""" + """Test AST node boundaries.""" return "I am just here to add AST complexity." From 199fab651005b4dc3f23b7fcfbdc9a8e2ddfa9ba Mon Sep 17 00:00:00 2001 From: ziad hany Date: Thu, 16 Jul 2026 02:02:04 +0300 Subject: [PATCH 03/16] Remove dependency and copy only the required file Signed-off-by: ziad hany --- scanpipe/pipes/unidiff/patch.py | 667 ++++++++++++++++++++++++ scanpipe/pipes/unidiff/patch.py.ABOUT | 13 + scanpipe/pipes/unidiff/patch.py.LICENSE | 20 + 3 files changed, 700 insertions(+) create mode 100644 scanpipe/pipes/unidiff/patch.py create mode 100644 scanpipe/pipes/unidiff/patch.py.ABOUT create mode 100644 scanpipe/pipes/unidiff/patch.py.LICENSE diff --git a/scanpipe/pipes/unidiff/patch.py b/scanpipe/pipes/unidiff/patch.py new file mode 100644 index 0000000000..c51bdbef79 --- /dev/null +++ b/scanpipe/pipes/unidiff/patch.py @@ -0,0 +1,667 @@ +# Extracted essential patch code analyzer and modified from the original unidiff library: +# https://github.com/matiasb/python-unidiff/blob/2771a878f7bc6619e625feb4dbad3427f57f5237/unidiff/patch.py + +# -*- coding: utf-8 -*- + +# The MIT License (MIT) +# Copyright (c) 2014-2023 Matias Bordese +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +# OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +import re +from io import StringIO +from typing import Iterable, Optional, Union + +class UnidiffParseError(Exception): ... + +open_file = open +make_str = str +implements_to_string = lambda x: x +unicode = str +basestring = str + +RE_SOURCE_FILENAME = re.compile( + r'^--- (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?') +RE_TARGET_FILENAME = re.compile( + r'^\+\+\+ (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?') + + +# check diff git line for git renamed files support +RE_DIFF_GIT_HEADER = re.compile( + r'^diff --git (?P"?a/[^\t\n]+"?) (?P"?b/[^\t\n]+"?)') +RE_DIFF_GIT_HEADER_URI_LIKE = re.compile( + r'^diff --git (?P.*://[^\t\n]+) (?P.*://[^\t\n]+)') +RE_DIFF_GIT_HEADER_NO_PREFIX = re.compile( + r'^diff --git (?P[^\t\n]+) (?P[^\t\n]+)') + +# check diff git new file marker `deleted file mode 100644` +RE_DIFF_GIT_DELETED_FILE = re.compile(r'^deleted file mode \d+$') + +# check diff git new file marker `new file mode 100644` +RE_DIFF_GIT_NEW_FILE = re.compile(r'^new file mode \d+$') + + +# @@ (source offset, length) (target offset, length) @@ (section header) +RE_HUNK_HEADER = re.compile( + r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))?\ @@[ ]?(.*)") + +# kept line (context) +# \n empty line (treat like context) +# + added line +# - deleted line +# \ No newline case +RE_HUNK_BODY_LINE = re.compile( + r'^(?P[- \+\\])(?P.*)', re.DOTALL) +RE_HUNK_EMPTY_BODY_LINE = re.compile( + r'^(?P[- \+\\]?)(?P[\r\n]{1,2})', re.DOTALL) + +RE_NO_NEWLINE_MARKER = re.compile(r'^\\ No newline at end of file') + +RE_BINARY_DIFF = re.compile( + r'^Binary files? ' + r'(?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?' + r'(?: and (?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?)? (differ|has changed)') + +DEFAULT_ENCODING = 'UTF-8' + +DEV_NULL = '/dev/null' +LINE_TYPE_ADDED = '+' +LINE_TYPE_REMOVED = '-' +LINE_TYPE_CONTEXT = ' ' +LINE_TYPE_EMPTY = '' +LINE_TYPE_NO_NEWLINE = '\\' +LINE_VALUE_NO_NEWLINE = ' No newline at end of file' + +@implements_to_string +class Line(object): + """A diff line.""" + + def __init__(self, value, line_type, + source_line_no=None, target_line_no=None, diff_line_no=None): + # type: (str, str, Optional[int], Optional[int], Optional[int]) -> None + super(Line, self).__init__() + self.source_line_no = source_line_no + self.target_line_no = target_line_no + self.diff_line_no = diff_line_no + self.line_type = line_type + self.value = value + + def __repr__(self): + # type: () -> str + return make_str("") % (self.line_type, self.value) + + def __str__(self): + # type: () -> str + return "%s%s" % (self.line_type, self.value) + + def __eq__(self, other): + # type: (Line) -> bool + return (self.source_line_no == other.source_line_no and + self.target_line_no == other.target_line_no and + self.diff_line_no == other.diff_line_no and + self.line_type == other.line_type and + self.value == other.value) + + @property + def is_added(self): + # type: () -> bool + return self.line_type == LINE_TYPE_ADDED + + @property + def is_removed(self): + # type: () -> bool + return self.line_type == LINE_TYPE_REMOVED + + @property + def is_context(self): + # type: () -> bool + return self.line_type == LINE_TYPE_CONTEXT + + +@implements_to_string +class PatchInfo(list): + """Lines with extended patch info. + + Format of this info is not documented and it very much depends on + patch producer. + + """ + + def __repr__(self): + # type: () -> str + value = "" % self[0].strip() + return make_str(value) + + def __str__(self): + # type: () -> str + return ''.join(unicode(line) for line in self) + + +@implements_to_string +class Hunk(list): + """Each of the modified blocks of a file.""" + + def __init__(self, src_start=0, src_len=0, tgt_start=0, tgt_len=0, + section_header=''): + # type: (int, int, int, int, str) -> None + super(Hunk, self).__init__() + if src_len is None: + src_len = 1 + if tgt_len is None: + tgt_len = 1 + self.source_start = int(src_start) + self.source_length = int(src_len) + self.target_start = int(tgt_start) + self.target_length = int(tgt_len) + self.section_header = section_header + self._added = None # Optional[int] + self._removed = None # Optional[int] + + def __repr__(self): + # type: () -> str + value = "" % (self.source_start, + self.source_length, + self.target_start, + self.target_length, + self.section_header) + return make_str(value) + + def __str__(self): + # type: () -> str + # section header is optional and thus we output it only if it's present + head = "@@ -%d,%d +%d,%d @@%s\n" % ( + self.source_start, self.source_length, + self.target_start, self.target_length, + ' ' + self.section_header if self.section_header else '') + content = ''.join(unicode(line) for line in self) + return head + content + + def append(self, line): + # type: (Line) -> None + """Append the line to hunk, and keep track of source/target lines.""" + # Make sure the line is encoded correctly. This is a no-op except for + # potentially raising a UnicodeDecodeError. + str(line) + super(Hunk, self).append(line) + + @property + def added(self): + # type: () -> Optional[int] + if self._added is not None: + return self._added + # re-calculate each time to allow for hunk modifications + # (which should mean metadata_only switch wasn't used) + return sum(1 for line in self if line.is_added) + + @property + def removed(self): + # type: () -> Optional[int] + if self._removed is not None: + return self._removed + # re-calculate each time to allow for hunk modifications + # (which should mean metadata_only switch wasn't used) + return sum(1 for line in self if line.is_removed) + + def is_valid(self): + # type: () -> bool + """Check hunk header data matches entered lines info.""" + return (len(self.source) == self.source_length and + len(self.target) == self.target_length) + + def source_lines(self): + # type: () -> Iterable[Line] + """Hunk lines from source file (generator).""" + return (l for l in self if l.is_context or l.is_removed) + + @property + def source(self): + # type: () -> Iterable[str] + return [str(l) for l in self.source_lines()] + + def target_lines(self): + # type: () -> Iterable[Line] + """Hunk lines from target file (generator).""" + return (l for l in self if l.is_context or l.is_added) + + @property + def target(self): + # type: () -> Iterable[str] + return [str(l) for l in self.target_lines()] + + +class PatchedFile(list): + """Patch updated file, it is a list of Hunks.""" + + def __init__(self, patch_info=None, source='', target='', + source_timestamp=None, target_timestamp=None, + is_binary_file=False): + # type: (Optional[PatchInfo], str, str, Optional[str], Optional[str], bool, bool) -> None + super(PatchedFile, self).__init__() + self.patch_info = patch_info + self.source_file = source + self.source_timestamp = source_timestamp + self.target_file = target + self.target_timestamp = target_timestamp + self.is_binary_file = is_binary_file + + def __repr__(self): + # type: () -> str + return make_str("") % make_str(self.path) + + def __str__(self): + # type: () -> str + source = '' + target = '' + # patch info is optional + info = '' if self.patch_info is None else str(self.patch_info) + if not self.is_binary_file and self: + source = "--- %s%s\n" % ( + self.source_file, + '\t' + self.source_timestamp if self.source_timestamp else '') + target = "+++ %s%s\n" % ( + self.target_file, + '\t' + self.target_timestamp if self.target_timestamp else '') + hunks = ''.join(unicode(hunk) for hunk in self) + return info + source + target + hunks + + def _parse_hunk(self, header, diff, encoding, metadata_only): + # type: (str, enumerate[str], Optional[str], bool) -> None + """Parse hunk details.""" + header_info = RE_HUNK_HEADER.match(header) + hunk_info = header_info.groups() + hunk = Hunk(*hunk_info) + + source_line_no = hunk.source_start + target_line_no = hunk.target_start + expected_source_end = source_line_no + hunk.source_length + expected_target_end = target_line_no + hunk.target_length + added = 0 + removed = 0 + + for diff_line_no, line in diff: + if encoding is not None: + line = line.decode(encoding) + + if metadata_only: + # quick line type detection, no regex required + line_type = line[0] if line else LINE_TYPE_CONTEXT + if line_type not in (LINE_TYPE_ADDED, + LINE_TYPE_REMOVED, + LINE_TYPE_CONTEXT, + LINE_TYPE_NO_NEWLINE): + raise UnidiffParseError( + 'Hunk diff line expected: %s' % line) + + if line_type == LINE_TYPE_ADDED: + target_line_no += 1 + added += 1 + elif line_type == LINE_TYPE_REMOVED: + source_line_no += 1 + removed += 1 + elif line_type == LINE_TYPE_CONTEXT: + target_line_no += 1 + source_line_no += 1 + + # no file content tracking + original_line = None + + else: + # parse diff line content + valid_line = RE_HUNK_BODY_LINE.match(line) + if not valid_line: + valid_line = RE_HUNK_EMPTY_BODY_LINE.match(line) + + if not valid_line: + raise UnidiffParseError( + 'Hunk diff line expected: %s' % line) + + line_type = valid_line.group('line_type') + if line_type == LINE_TYPE_EMPTY: + line_type = LINE_TYPE_CONTEXT + + value = valid_line.group('value') # type: str + original_line = Line(value, line_type=line_type) + + if line_type == LINE_TYPE_ADDED: + original_line.target_line_no = target_line_no + target_line_no += 1 + elif line_type == LINE_TYPE_REMOVED: + original_line.source_line_no = source_line_no + source_line_no += 1 + elif line_type == LINE_TYPE_CONTEXT: + original_line.target_line_no = target_line_no + original_line.source_line_no = source_line_no + target_line_no += 1 + source_line_no += 1 + elif line_type == LINE_TYPE_NO_NEWLINE: + pass + else: + original_line = None + + # stop parsing if we got past expected number of lines + if (source_line_no > expected_source_end or + target_line_no > expected_target_end): + raise UnidiffParseError('Hunk is longer than expected') + + if original_line: + original_line.diff_line_no = diff_line_no + hunk.append(original_line) + + # if hunk source/target lengths are ok, hunk is complete + if (source_line_no == expected_source_end and + target_line_no == expected_target_end): + break + + # report an error if we haven't got expected number of lines + if (source_line_no < expected_source_end or + target_line_no < expected_target_end): + raise UnidiffParseError('Hunk is shorter than expected') + + if metadata_only: + # HACK: set fixed calculated values when metadata_only is enabled + hunk._added = added + hunk._removed = removed + + self.append(hunk) + + def _add_no_newline_marker_to_last_hunk(self): + # type: () -> None + if not self: + raise UnidiffParseError( + 'Unexpected marker:' + LINE_VALUE_NO_NEWLINE) + last_hunk = self[-1] + last_hunk.append( + Line(LINE_VALUE_NO_NEWLINE + '\n', line_type=LINE_TYPE_NO_NEWLINE)) + + def _append_trailing_empty_line(self): + # type: () -> None + if not self: + raise UnidiffParseError('Unexpected trailing newline character') + last_hunk = self[-1] + last_hunk.append(Line('\n', line_type=LINE_TYPE_EMPTY)) + + @property + def path(self): + # type: () -> str + """Return the file path abstracted from VCS.""" + filepath = self.source_file + if filepath in (None, DEV_NULL) or ( + self.is_rename and self.target_file not in (None, DEV_NULL)): + # if this is a rename, prefer the target filename + filepath = self.target_file + + quoted = filepath.startswith('"') and filepath.endswith('"') + if quoted: + filepath = filepath[1:-1] + + if filepath.startswith('a/') or filepath.startswith('b/'): + filepath = filepath[2:] + + if quoted: + filepath = '"{}"'.format(filepath) + + return filepath + + @property + def added(self): + # type: () -> int + """Return the file total added lines.""" + return sum([hunk.added for hunk in self]) + + @property + def removed(self): + # type: () -> int + """Return the file total removed lines.""" + return sum([hunk.removed for hunk in self]) + + @property + def is_rename(self): + return (self.source_file != DEV_NULL + and self.target_file != DEV_NULL + and self.source_file[2:] != self.target_file[2:]) + + @property + def is_added_file(self): + # type: () -> bool + """Return True if this patch adds the file.""" + if self.source_file == DEV_NULL: + return True + return (len(self) == 1 and self[0].source_start == 0 and + self[0].source_length == 0) + + @property + def is_removed_file(self): + # type: () -> bool + """Return True if this patch removes the file.""" + if self.target_file == DEV_NULL: + return True + return (len(self) == 1 and self[0].target_start == 0 and + self[0].target_length == 0) + + @property + def is_modified_file(self): + # type: () -> bool + """Return True if this patch modifies the file.""" + return not (self.is_added_file or self.is_removed_file) + + +@implements_to_string +class PatchSet(list): + """A list of PatchedFiles.""" + + def __init__(self, f, encoding=None, metadata_only=False): + # type: (Union[StringIO, str], Optional[str], bool) -> None + super(PatchSet, self).__init__() + + # convert string inputs to StringIO objects + if isinstance(f, basestring): + f = self._convert_string(f, encoding) # type: StringIO + + # make sure we pass an iterator object to parse + data = iter(f) + # if encoding is None, assume we are reading unicode data + # when metadata_only is True, only perform a minimal metadata parsing + # (ie. hunks without content) which is around 2.5-6 times faster; + # it will still validate the diff metadata consistency and get counts + self._parse(data, encoding=encoding, metadata_only=metadata_only) + + def __repr__(self): + # type: () -> str + return make_str('') % super(PatchSet, self).__repr__() + + def __str__(self): + # type: () -> str + return ''.join(unicode(patched_file) for patched_file in self) + + def _parse(self, diff, encoding, metadata_only): + # type: (StringIO, Optional[str], bool) -> None + current_file = None + patch_info = None + + diff = enumerate(diff, 1) + for unused_diff_line_no, line in diff: + if encoding is not None: + line = line.decode(encoding) + + # check for a git file rename + is_diff_git_header = RE_DIFF_GIT_HEADER.match(line) or \ + RE_DIFF_GIT_HEADER_URI_LIKE.match(line) or \ + RE_DIFF_GIT_HEADER_NO_PREFIX.match(line) + if is_diff_git_header: + patch_info = PatchInfo() + source_file = is_diff_git_header.group('source') + target_file = is_diff_git_header.group('target') + current_file = PatchedFile( + patch_info, source_file, target_file, None, None) + self.append(current_file) + patch_info.append(line) + continue + + # check for a git new file + is_diff_git_new_file = RE_DIFF_GIT_NEW_FILE.match(line) + if is_diff_git_new_file: + if current_file is None or patch_info is None: + raise UnidiffParseError('Unexpected new file found: %s' % line) + current_file.source_file = DEV_NULL + patch_info.append(line) + continue + + # check for a git deleted file + is_diff_git_deleted_file = RE_DIFF_GIT_DELETED_FILE.match(line) + if is_diff_git_deleted_file: + if current_file is None or patch_info is None: + raise UnidiffParseError('Unexpected deleted file found: %s' % line) + current_file.target_file = DEV_NULL + patch_info.append(line) + continue + + # check for source file header + is_source_filename = RE_SOURCE_FILENAME.match(line) + if is_source_filename: + source_file = is_source_filename.group('filename') + source_timestamp = is_source_filename.group('timestamp') + # reset current file, unless we are processing a rename + # (in that case, source files should match) + if current_file is not None and not ( + current_file.source_file == source_file): + current_file = None + elif current_file is not None: + current_file.source_timestamp = source_timestamp + continue + + # check for target file header + is_target_filename = RE_TARGET_FILENAME.match(line) + if is_target_filename: + target_file = is_target_filename.group('filename') + target_timestamp = is_target_filename.group('timestamp') + if current_file is not None and not (current_file.target_file == target_file): + raise UnidiffParseError('Target without source: %s' % line) + if current_file is None: + # add current file to PatchSet + current_file = PatchedFile( + patch_info, source_file, target_file, + source_timestamp, target_timestamp) + self.append(current_file) + patch_info = None + else: + current_file.target_timestamp = target_timestamp + continue + + # check for hunk header + is_hunk_header = RE_HUNK_HEADER.match(line) + if is_hunk_header: + patch_info = None + if current_file is None: + raise UnidiffParseError('Unexpected hunk found: %s' % line) + current_file._parse_hunk(line, diff, encoding, metadata_only) + continue + + # check for no newline marker + is_no_newline = RE_NO_NEWLINE_MARKER.match(line) + if is_no_newline: + if current_file is None: + raise UnidiffParseError('Unexpected marker: %s' % line) + current_file._add_no_newline_marker_to_last_hunk() + continue + + # sometimes hunks can be followed by empty lines + if line == '\n' and current_file is not None: + current_file._append_trailing_empty_line() + continue + + # if nothing has matched above then this line is a patch info + if patch_info is None: + current_file = None + patch_info = PatchInfo() + + is_binary_diff = RE_BINARY_DIFF.match(line) + if is_binary_diff: + source_file = is_binary_diff.group('source_filename') + target_file = is_binary_diff.group('target_filename') + patch_info.append(line) + if current_file is not None: + current_file.is_binary_file = True + else: + current_file = PatchedFile( + patch_info, source_file, target_file, is_binary_file=True) + self.append(current_file) + patch_info = None + current_file = None + continue + + if line == 'GIT binary patch\n': + current_file.is_binary_file = True + patch_info = None + current_file = None + continue + + patch_info.append(line) + + @classmethod + def from_filename(cls, filename, encoding=DEFAULT_ENCODING, errors=None, newline=None): + # type: (str, str, Optional[str]) -> PatchSet + """Return a PatchSet instance given a diff filename.""" + with open_file(filename, 'r', encoding=encoding, errors=errors, newline=newline) as f: + instance = cls(f) + return instance + + @staticmethod + def _convert_string(data, encoding=None, errors='strict'): + # type: (Union[str, bytes], str, str) -> StringIO + if encoding is not None: + # if encoding is given, assume bytes and decode + data = unicode(data, encoding=encoding, errors=errors) + return StringIO(data) + + @classmethod + def from_string(cls, data, encoding=None, errors='strict'): + # type: (str, str, Optional[str]) -> PatchSet + """Return a PatchSet instance given a diff string.""" + return cls(cls._convert_string(data, encoding, errors)) + + @property + def added_files(self): + # type: () -> list[PatchedFile] + """Return patch added files as a list.""" + return [f for f in self if f.is_added_file] + + @property + def removed_files(self): + # type: () -> list[PatchedFile] + """Return patch removed files as a list.""" + return [f for f in self if f.is_removed_file] + + @property + def modified_files(self): + # type: () -> list[PatchedFile] + """Return patch modified files as a list.""" + return [f for f in self if f.is_modified_file] + + @property + def added(self): + # type: () -> int + """Return the patch total added lines.""" + return sum([f.added for f in self]) + + @property + def removed(self): + # type: () -> int + """Return the patch total removed lines.""" + return sum([f.removed for f in self]) \ No newline at end of file diff --git a/scanpipe/pipes/unidiff/patch.py.ABOUT b/scanpipe/pipes/unidiff/patch.py.ABOUT new file mode 100644 index 0000000000..3118ed9643 --- /dev/null +++ b/scanpipe/pipes/unidiff/patch.py.ABOUT @@ -0,0 +1,13 @@ +about_resource: patch.py constants.py errors.py +name: patch +version: 0.7.5 +download_url: https://github.com/matiasb/python-unidiff/archive/refs/tags/v0.7.5.zip +description: Simple Python library to parse and interact with unified diff data. +homepage_url: https://github.com/matiasb/python-unidiff +license_expression: mit +attribute: yes +package_url: pkg:pypi/unidiff@0.7.5 +licenses: + - key: mit + name: MIT License + file: mit.LICENSE \ No newline at end of file diff --git a/scanpipe/pipes/unidiff/patch.py.LICENSE b/scanpipe/pipes/unidiff/patch.py.LICENSE new file mode 100644 index 0000000000..ca2c04c202 --- /dev/null +++ b/scanpipe/pipes/unidiff/patch.py.LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright (c) 2012 Matias Bordese + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From 5dc1ded5c84b809ec241e9e12570c26f3a7fe670 Mon Sep 17 00:00:00 2001 From: ziad hany Date: Thu, 23 Jul 2026 02:50:28 +0300 Subject: [PATCH 04/16] Update pipeline/functions name Get the dependency file and included in the PR Signed-off-by: ziad hany --- .../pipelines/collect_symbols_reachability.py | 33 -- scanpipe/pipelines/find_vulnerabilities.py | 12 +- scanpipe/pipes/unidiff/patch.py | 309 +++++++++++------- scanpipe/pipes/vulnerablecode.py | 7 +- 4 files changed, 197 insertions(+), 164 deletions(-) delete mode 100644 scanpipe/pipelines/collect_symbols_reachability.py diff --git a/scanpipe/pipelines/collect_symbols_reachability.py b/scanpipe/pipelines/collect_symbols_reachability.py deleted file mode 100644 index c1d5fb11c4..0000000000 --- a/scanpipe/pipelines/collect_symbols_reachability.py +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (c) nexB Inc. and others. All rights reserved. -# VulnerableCode is a trademark of nexB Inc. -# SPDX-License-Identifier: Apache-2.0 -# See http://www.apache.org/licenses/LICENSE-2.0 for the license text. -# See https://github.com/aboutcode-org/vulnerablecode for support or download. -# See https://aboutcode.org for more information about nexB OSS projects. -# - -from scanpipe.pipelines import Pipeline -from scanpipe.pipes import reachability - - -class SymbolReachability(Pipeline): - """Patch reachability analysis for given vulnerability patches.""" - - download_inputs = False - is_addon = True - results_url = "/project/{slug}/resources/?extra_data=symbol_reachability" - - @classmethod - def steps(cls): - return (cls.analyze_and_store_symbol_reachability,) - - def analyze_and_store_symbol_reachability(self): - """ - Perform symbol-level reachability analysis for each patch. This step compares - the AST of patched/vulnerable files against the codebase resources. - Results are stored directly in the 'extra_data' of each CodebaseResource. - """ - reachability.collect_and_store_symbol_reachability_results( - project=self.project, logger=self.log - ) diff --git a/scanpipe/pipelines/find_vulnerabilities.py b/scanpipe/pipelines/find_vulnerabilities.py index b0c8066b9a..1bdf8af6bc 100644 --- a/scanpipe/pipelines/find_vulnerabilities.py +++ b/scanpipe/pipelines/find_vulnerabilities.py @@ -19,7 +19,7 @@ # # ScanCode.io is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/aboutcode-org/scancode.io for support and download. - +from aboutcode.pipeline import optional_step from scanpipe.pipelines import Pipeline from scanpipe.pipes import vulnerablecode @@ -34,11 +34,13 @@ class FindVulnerabilities(Pipeline): download_inputs = False is_addon = True results_url = "/project/{slug}/packages/?is_vulnerable=yes" + reachability = False @classmethod def steps(cls): return ( cls.check_vulnerablecode_service_availability, + cls.enable_reachability_analysis, cls.lookup_packages_vulnerabilities, cls.lookup_dependencies_vulnerabilities, ) @@ -48,6 +50,12 @@ def get_availability(cls): if not vulnerablecode.is_configured(): return "VulnerableCode is not configured." + @optional_step("reachability") + def enable_reachability_analysis(self): + """Enable the reachability flag for vulnerability lookups.""" + self.reachability = True + self.log("Reachability analysis is ENABLED.") + def check_vulnerablecode_service_availability(self): """Check if the VulnerableCode service if configured and available.""" if not vulnerablecode.is_configured(): @@ -62,6 +70,7 @@ def lookup_packages_vulnerabilities(self): vulnerablecode.fetch_vulnerabilities( packages=packages, ignore_set=self.project.ignored_vulnerabilities_set, + reachability=self.reachability, logger=self.log, ) @@ -71,5 +80,6 @@ def lookup_dependencies_vulnerabilities(self): vulnerablecode.fetch_vulnerabilities( packages=dependencies, ignore_set=self.project.ignored_vulnerabilities_set, + reachability=self.reachability, logger=self.log, ) diff --git a/scanpipe/pipes/unidiff/patch.py b/scanpipe/pipes/unidiff/patch.py index c51bdbef79..8075a8cc77 100644 --- a/scanpipe/pipes/unidiff/patch.py +++ b/scanpipe/pipes/unidiff/patch.py @@ -1,4 +1,5 @@ -# Extracted essential patch code analyzer and modified from the original unidiff library: +# Extracted essential patch code analyzer and modified +# from the original unidiff library: # https://github.com/matiasb/python-unidiff/blob/2771a878f7bc6619e625feb4dbad3427f57f5237/unidiff/patch.py # -*- coding: utf-8 -*- @@ -24,13 +25,13 @@ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. -from __future__ import unicode_literals import re from io import StringIO -from typing import Iterable, Optional, Union + class UnidiffParseError(Exception): ... + open_file = open make_str = str implements_to_string = lambda x: x @@ -38,65 +39,77 @@ class UnidiffParseError(Exception): ... basestring = str RE_SOURCE_FILENAME = re.compile( - r'^--- (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?') + r'^--- (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?' +) RE_TARGET_FILENAME = re.compile( - r'^\+\+\+ (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?') + r'^\+\+\+ (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?' +) # check diff git line for git renamed files support RE_DIFF_GIT_HEADER = re.compile( - r'^diff --git (?P"?a/[^\t\n]+"?) (?P"?b/[^\t\n]+"?)') + r'^diff --git (?P"?a/[^\t\n]+"?) (?P"?b/[^\t\n]+"?)' +) RE_DIFF_GIT_HEADER_URI_LIKE = re.compile( - r'^diff --git (?P.*://[^\t\n]+) (?P.*://[^\t\n]+)') + r"^diff --git (?P.*://[^\t\n]+) (?P.*://[^\t\n]+)" +) RE_DIFF_GIT_HEADER_NO_PREFIX = re.compile( - r'^diff --git (?P[^\t\n]+) (?P[^\t\n]+)') + r"^diff --git (?P[^\t\n]+) (?P[^\t\n]+)" +) # check diff git new file marker `deleted file mode 100644` -RE_DIFF_GIT_DELETED_FILE = re.compile(r'^deleted file mode \d+$') +RE_DIFF_GIT_DELETED_FILE = re.compile(r"^deleted file mode \d+$") # check diff git new file marker `new file mode 100644` -RE_DIFF_GIT_NEW_FILE = re.compile(r'^new file mode \d+$') +RE_DIFF_GIT_NEW_FILE = re.compile(r"^new file mode \d+$") # @@ (source offset, length) (target offset, length) @@ (section header) -RE_HUNK_HEADER = re.compile( - r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))?\ @@[ ]?(.*)") +RE_HUNK_HEADER = re.compile(r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))?\ @@[ ]?(.*)") # kept line (context) # \n empty line (treat like context) # + added line # - deleted line # \ No newline case -RE_HUNK_BODY_LINE = re.compile( - r'^(?P[- \+\\])(?P.*)', re.DOTALL) +RE_HUNK_BODY_LINE = re.compile(r"^(?P[- \+\\])(?P.*)", re.DOTALL) RE_HUNK_EMPTY_BODY_LINE = re.compile( - r'^(?P[- \+\\]?)(?P[\r\n]{1,2})', re.DOTALL) + r"^(?P[- \+\\]?)(?P[\r\n]{1,2})", re.DOTALL +) -RE_NO_NEWLINE_MARKER = re.compile(r'^\\ No newline at end of file') +RE_NO_NEWLINE_MARKER = re.compile(r"^\\ No newline at end of file") RE_BINARY_DIFF = re.compile( - r'^Binary files? ' - r'(?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?' - r'(?: and (?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?)? (differ|has changed)') + r"^Binary files? " + r"(?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?" + r"(?: and (?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?)? (differ|has changed)" +) + +DEFAULT_ENCODING = "UTF-8" -DEFAULT_ENCODING = 'UTF-8' +DEV_NULL = "/dev/null" +LINE_TYPE_ADDED = "+" +LINE_TYPE_REMOVED = "-" +LINE_TYPE_CONTEXT = " " +LINE_TYPE_EMPTY = "" +LINE_TYPE_NO_NEWLINE = "\\" +LINE_VALUE_NO_NEWLINE = " No newline at end of file" -DEV_NULL = '/dev/null' -LINE_TYPE_ADDED = '+' -LINE_TYPE_REMOVED = '-' -LINE_TYPE_CONTEXT = ' ' -LINE_TYPE_EMPTY = '' -LINE_TYPE_NO_NEWLINE = '\\' -LINE_VALUE_NO_NEWLINE = ' No newline at end of file' @implements_to_string -class Line(object): +class Line: """A diff line.""" - def __init__(self, value, line_type, - source_line_no=None, target_line_no=None, diff_line_no=None): + def __init__( + self, + value, + line_type, + source_line_no=None, + target_line_no=None, + diff_line_no=None, + ): # type: (str, str, Optional[int], Optional[int], Optional[int]) -> None - super(Line, self).__init__() + super().__init__() self.source_line_no = source_line_no self.target_line_no = target_line_no self.diff_line_no = diff_line_no @@ -113,11 +126,13 @@ def __str__(self): def __eq__(self, other): # type: (Line) -> bool - return (self.source_line_no == other.source_line_no and - self.target_line_no == other.target_line_no and - self.diff_line_no == other.diff_line_no and - self.line_type == other.line_type and - self.value == other.value) + return ( + self.source_line_no == other.source_line_no + and self.target_line_no == other.target_line_no + and self.diff_line_no == other.diff_line_no + and self.line_type == other.line_type + and self.value == other.value + ) @property def is_added(self): @@ -137,7 +152,8 @@ def is_context(self): @implements_to_string class PatchInfo(list): - """Lines with extended patch info. + """ + Lines with extended patch info. Format of this info is not documented and it very much depends on patch producer. @@ -151,17 +167,18 @@ def __repr__(self): def __str__(self): # type: () -> str - return ''.join(unicode(line) for line in self) + return "".join(unicode(line) for line in self) @implements_to_string class Hunk(list): """Each of the modified blocks of a file.""" - def __init__(self, src_start=0, src_len=0, tgt_start=0, tgt_len=0, - section_header=''): + def __init__( + self, src_start=0, src_len=0, tgt_start=0, tgt_len=0, section_header="" + ): # type: (int, int, int, int, str) -> None - super(Hunk, self).__init__() + super().__init__() if src_len is None: src_len = 1 if tgt_len is None: @@ -176,21 +193,26 @@ def __init__(self, src_start=0, src_len=0, tgt_start=0, tgt_len=0, def __repr__(self): # type: () -> str - value = "" % (self.source_start, - self.source_length, - self.target_start, - self.target_length, - self.section_header) + value = "" % ( + self.source_start, + self.source_length, + self.target_start, + self.target_length, + self.section_header, + ) return make_str(value) def __str__(self): # type: () -> str # section header is optional and thus we output it only if it's present head = "@@ -%d,%d +%d,%d @@%s\n" % ( - self.source_start, self.source_length, - self.target_start, self.target_length, - ' ' + self.section_header if self.section_header else '') - content = ''.join(unicode(line) for line in self) + self.source_start, + self.source_length, + self.target_start, + self.target_length, + " " + self.section_header if self.section_header else "", + ) + content = "".join(unicode(line) for line in self) return head + content def append(self, line): @@ -199,7 +221,7 @@ def append(self, line): # Make sure the line is encoded correctly. This is a no-op except for # potentially raising a UnicodeDecodeError. str(line) - super(Hunk, self).append(line) + super().append(line) @property def added(self): @@ -222,8 +244,10 @@ def removed(self): def is_valid(self): # type: () -> bool """Check hunk header data matches entered lines info.""" - return (len(self.source) == self.source_length and - len(self.target) == self.target_length) + return ( + len(self.source) == self.source_length + and len(self.target) == self.target_length + ) def source_lines(self): # type: () -> Iterable[Line] @@ -249,11 +273,17 @@ def target(self): class PatchedFile(list): """Patch updated file, it is a list of Hunks.""" - def __init__(self, patch_info=None, source='', target='', - source_timestamp=None, target_timestamp=None, - is_binary_file=False): + def __init__( + self, + patch_info=None, + source="", + target="", + source_timestamp=None, + target_timestamp=None, + is_binary_file=False, + ): # type: (Optional[PatchInfo], str, str, Optional[str], Optional[str], bool, bool) -> None - super(PatchedFile, self).__init__() + super().__init__() self.patch_info = patch_info self.source_file = source self.source_timestamp = source_timestamp @@ -267,18 +297,20 @@ def __repr__(self): def __str__(self): # type: () -> str - source = '' - target = '' + source = "" + target = "" # patch info is optional - info = '' if self.patch_info is None else str(self.patch_info) + info = "" if self.patch_info is None else str(self.patch_info) if not self.is_binary_file and self: source = "--- %s%s\n" % ( self.source_file, - '\t' + self.source_timestamp if self.source_timestamp else '') + "\t" + self.source_timestamp if self.source_timestamp else "", + ) target = "+++ %s%s\n" % ( self.target_file, - '\t' + self.target_timestamp if self.target_timestamp else '') - hunks = ''.join(unicode(hunk) for hunk in self) + "\t" + self.target_timestamp if self.target_timestamp else "", + ) + hunks = "".join(unicode(hunk) for hunk in self) return info + source + target + hunks def _parse_hunk(self, header, diff, encoding, metadata_only): @@ -302,12 +334,13 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): if metadata_only: # quick line type detection, no regex required line_type = line[0] if line else LINE_TYPE_CONTEXT - if line_type not in (LINE_TYPE_ADDED, - LINE_TYPE_REMOVED, - LINE_TYPE_CONTEXT, - LINE_TYPE_NO_NEWLINE): - raise UnidiffParseError( - 'Hunk diff line expected: %s' % line) + if line_type not in ( + LINE_TYPE_ADDED, + LINE_TYPE_REMOVED, + LINE_TYPE_CONTEXT, + LINE_TYPE_NO_NEWLINE, + ): + raise UnidiffParseError("Hunk diff line expected: %s" % line) if line_type == LINE_TYPE_ADDED: target_line_no += 1 @@ -329,14 +362,13 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): valid_line = RE_HUNK_EMPTY_BODY_LINE.match(line) if not valid_line: - raise UnidiffParseError( - 'Hunk diff line expected: %s' % line) + raise UnidiffParseError("Hunk diff line expected: %s" % line) - line_type = valid_line.group('line_type') + line_type = valid_line.group("line_type") if line_type == LINE_TYPE_EMPTY: line_type = LINE_TYPE_CONTEXT - value = valid_line.group('value') # type: str + value = valid_line.group("value") # type: str original_line = Line(value, line_type=line_type) if line_type == LINE_TYPE_ADDED: @@ -356,23 +388,26 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): original_line = None # stop parsing if we got past expected number of lines - if (source_line_no > expected_source_end or - target_line_no > expected_target_end): - raise UnidiffParseError('Hunk is longer than expected') + if ( + source_line_no > expected_source_end + or target_line_no > expected_target_end + ): + raise UnidiffParseError("Hunk is longer than expected") if original_line: original_line.diff_line_no = diff_line_no hunk.append(original_line) # if hunk source/target lengths are ok, hunk is complete - if (source_line_no == expected_source_end and - target_line_no == expected_target_end): + if ( + source_line_no == expected_source_end + and target_line_no == expected_target_end + ): break # report an error if we haven't got expected number of lines - if (source_line_no < expected_source_end or - target_line_no < expected_target_end): - raise UnidiffParseError('Hunk is shorter than expected') + if source_line_no < expected_source_end or target_line_no < expected_target_end: + raise UnidiffParseError("Hunk is shorter than expected") if metadata_only: # HACK: set fixed calculated values when metadata_only is enabled @@ -384,18 +419,18 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): def _add_no_newline_marker_to_last_hunk(self): # type: () -> None if not self: - raise UnidiffParseError( - 'Unexpected marker:' + LINE_VALUE_NO_NEWLINE) + raise UnidiffParseError("Unexpected marker:" + LINE_VALUE_NO_NEWLINE) last_hunk = self[-1] last_hunk.append( - Line(LINE_VALUE_NO_NEWLINE + '\n', line_type=LINE_TYPE_NO_NEWLINE)) + Line(LINE_VALUE_NO_NEWLINE + "\n", line_type=LINE_TYPE_NO_NEWLINE) + ) def _append_trailing_empty_line(self): # type: () -> None if not self: - raise UnidiffParseError('Unexpected trailing newline character') + raise UnidiffParseError("Unexpected trailing newline character") last_hunk = self[-1] - last_hunk.append(Line('\n', line_type=LINE_TYPE_EMPTY)) + last_hunk.append(Line("\n", line_type=LINE_TYPE_EMPTY)) @property def path(self): @@ -403,7 +438,8 @@ def path(self): """Return the file path abstracted from VCS.""" filepath = self.source_file if filepath in (None, DEV_NULL) or ( - self.is_rename and self.target_file not in (None, DEV_NULL)): + self.is_rename and self.target_file not in (None, DEV_NULL) + ): # if this is a rename, prefer the target filename filepath = self.target_file @@ -411,11 +447,11 @@ def path(self): if quoted: filepath = filepath[1:-1] - if filepath.startswith('a/') or filepath.startswith('b/'): + if filepath.startswith("a/") or filepath.startswith("b/"): filepath = filepath[2:] if quoted: - filepath = '"{}"'.format(filepath) + filepath = f'"{filepath}"' return filepath @@ -433,9 +469,11 @@ def removed(self): @property def is_rename(self): - return (self.source_file != DEV_NULL + return ( + self.source_file != DEV_NULL and self.target_file != DEV_NULL - and self.source_file[2:] != self.target_file[2:]) + and self.source_file[2:] != self.target_file[2:] + ) @property def is_added_file(self): @@ -443,8 +481,9 @@ def is_added_file(self): """Return True if this patch adds the file.""" if self.source_file == DEV_NULL: return True - return (len(self) == 1 and self[0].source_start == 0 and - self[0].source_length == 0) + return ( + len(self) == 1 and self[0].source_start == 0 and self[0].source_length == 0 + ) @property def is_removed_file(self): @@ -452,8 +491,9 @@ def is_removed_file(self): """Return True if this patch removes the file.""" if self.target_file == DEV_NULL: return True - return (len(self) == 1 and self[0].target_start == 0 and - self[0].target_length == 0) + return ( + len(self) == 1 and self[0].target_start == 0 and self[0].target_length == 0 + ) @property def is_modified_file(self): @@ -468,7 +508,7 @@ class PatchSet(list): def __init__(self, f, encoding=None, metadata_only=False): # type: (Union[StringIO, str], Optional[str], bool) -> None - super(PatchSet, self).__init__() + super().__init__() # convert string inputs to StringIO objects if isinstance(f, basestring): @@ -484,11 +524,11 @@ def __init__(self, f, encoding=None, metadata_only=False): def __repr__(self): # type: () -> str - return make_str('') % super(PatchSet, self).__repr__() + return make_str("") % super().__repr__() def __str__(self): # type: () -> str - return ''.join(unicode(patched_file) for patched_file in self) + return "".join(unicode(patched_file) for patched_file in self) def _parse(self, diff, encoding, metadata_only): # type: (StringIO, Optional[str], bool) -> None @@ -501,15 +541,18 @@ def _parse(self, diff, encoding, metadata_only): line = line.decode(encoding) # check for a git file rename - is_diff_git_header = RE_DIFF_GIT_HEADER.match(line) or \ - RE_DIFF_GIT_HEADER_URI_LIKE.match(line) or \ - RE_DIFF_GIT_HEADER_NO_PREFIX.match(line) + is_diff_git_header = ( + RE_DIFF_GIT_HEADER.match(line) + or RE_DIFF_GIT_HEADER_URI_LIKE.match(line) + or RE_DIFF_GIT_HEADER_NO_PREFIX.match(line) + ) if is_diff_git_header: patch_info = PatchInfo() - source_file = is_diff_git_header.group('source') - target_file = is_diff_git_header.group('target') + source_file = is_diff_git_header.group("source") + target_file = is_diff_git_header.group("target") current_file = PatchedFile( - patch_info, source_file, target_file, None, None) + patch_info, source_file, target_file, None, None + ) self.append(current_file) patch_info.append(line) continue @@ -518,7 +561,7 @@ def _parse(self, diff, encoding, metadata_only): is_diff_git_new_file = RE_DIFF_GIT_NEW_FILE.match(line) if is_diff_git_new_file: if current_file is None or patch_info is None: - raise UnidiffParseError('Unexpected new file found: %s' % line) + raise UnidiffParseError("Unexpected new file found: %s" % line) current_file.source_file = DEV_NULL patch_info.append(line) continue @@ -527,7 +570,7 @@ def _parse(self, diff, encoding, metadata_only): is_diff_git_deleted_file = RE_DIFF_GIT_DELETED_FILE.match(line) if is_diff_git_deleted_file: if current_file is None or patch_info is None: - raise UnidiffParseError('Unexpected deleted file found: %s' % line) + raise UnidiffParseError("Unexpected deleted file found: %s" % line) current_file.target_file = DEV_NULL patch_info.append(line) continue @@ -535,12 +578,13 @@ def _parse(self, diff, encoding, metadata_only): # check for source file header is_source_filename = RE_SOURCE_FILENAME.match(line) if is_source_filename: - source_file = is_source_filename.group('filename') - source_timestamp = is_source_filename.group('timestamp') + source_file = is_source_filename.group("filename") + source_timestamp = is_source_filename.group("timestamp") # reset current file, unless we are processing a rename # (in that case, source files should match) if current_file is not None and not ( - current_file.source_file == source_file): + current_file.source_file == source_file + ): current_file = None elif current_file is not None: current_file.source_timestamp = source_timestamp @@ -549,15 +593,21 @@ def _parse(self, diff, encoding, metadata_only): # check for target file header is_target_filename = RE_TARGET_FILENAME.match(line) if is_target_filename: - target_file = is_target_filename.group('filename') - target_timestamp = is_target_filename.group('timestamp') - if current_file is not None and not (current_file.target_file == target_file): - raise UnidiffParseError('Target without source: %s' % line) + target_file = is_target_filename.group("filename") + target_timestamp = is_target_filename.group("timestamp") + if current_file is not None and not ( + current_file.target_file == target_file + ): + raise UnidiffParseError("Target without source: %s" % line) if current_file is None: # add current file to PatchSet current_file = PatchedFile( - patch_info, source_file, target_file, - source_timestamp, target_timestamp) + patch_info, + source_file, + target_file, + source_timestamp, + target_timestamp, + ) self.append(current_file) patch_info = None else: @@ -569,7 +619,7 @@ def _parse(self, diff, encoding, metadata_only): if is_hunk_header: patch_info = None if current_file is None: - raise UnidiffParseError('Unexpected hunk found: %s' % line) + raise UnidiffParseError("Unexpected hunk found: %s" % line) current_file._parse_hunk(line, diff, encoding, metadata_only) continue @@ -577,12 +627,12 @@ def _parse(self, diff, encoding, metadata_only): is_no_newline = RE_NO_NEWLINE_MARKER.match(line) if is_no_newline: if current_file is None: - raise UnidiffParseError('Unexpected marker: %s' % line) + raise UnidiffParseError("Unexpected marker: %s" % line) current_file._add_no_newline_marker_to_last_hunk() continue # sometimes hunks can be followed by empty lines - if line == '\n' and current_file is not None: + if line == "\n" and current_file is not None: current_file._append_trailing_empty_line() continue @@ -593,20 +643,21 @@ def _parse(self, diff, encoding, metadata_only): is_binary_diff = RE_BINARY_DIFF.match(line) if is_binary_diff: - source_file = is_binary_diff.group('source_filename') - target_file = is_binary_diff.group('target_filename') + source_file = is_binary_diff.group("source_filename") + target_file = is_binary_diff.group("target_filename") patch_info.append(line) if current_file is not None: current_file.is_binary_file = True else: current_file = PatchedFile( - patch_info, source_file, target_file, is_binary_file=True) + patch_info, source_file, target_file, is_binary_file=True + ) self.append(current_file) patch_info = None current_file = None continue - if line == 'GIT binary patch\n': + if line == "GIT binary patch\n": current_file.is_binary_file = True patch_info = None current_file = None @@ -615,15 +666,19 @@ def _parse(self, diff, encoding, metadata_only): patch_info.append(line) @classmethod - def from_filename(cls, filename, encoding=DEFAULT_ENCODING, errors=None, newline=None): + def from_filename( + cls, filename, encoding=DEFAULT_ENCODING, errors=None, newline=None + ): # type: (str, str, Optional[str]) -> PatchSet """Return a PatchSet instance given a diff filename.""" - with open_file(filename, 'r', encoding=encoding, errors=errors, newline=newline) as f: + with open_file( + filename, "r", encoding=encoding, errors=errors, newline=newline + ) as f: instance = cls(f) return instance @staticmethod - def _convert_string(data, encoding=None, errors='strict'): + def _convert_string(data, encoding=None, errors="strict"): # type: (Union[str, bytes], str, str) -> StringIO if encoding is not None: # if encoding is given, assume bytes and decode @@ -631,7 +686,7 @@ def _convert_string(data, encoding=None, errors='strict'): return StringIO(data) @classmethod - def from_string(cls, data, encoding=None, errors='strict'): + def from_string(cls, data, encoding=None, errors="strict"): # type: (str, str, Optional[str]) -> PatchSet """Return a PatchSet instance given a diff string.""" return cls(cls._convert_string(data, encoding, errors)) @@ -664,4 +719,4 @@ def added(self): def removed(self): # type: () -> int """Return the patch total removed lines.""" - return sum([f.removed for f in self]) \ No newline at end of file + return sum([f.removed for f in self]) diff --git a/scanpipe/pipes/vulnerablecode.py b/scanpipe/pipes/vulnerablecode.py index 4deaefc704..57924bff70 100644 --- a/scanpipe/pipes/vulnerablecode.py +++ b/scanpipe/pipes/vulnerablecode.py @@ -109,6 +109,7 @@ def request_post( def bulk_search_by_purl( purls, + reachability=False, timeout=None, api_url=VULNERABLECODE_API_URL, ): @@ -118,7 +119,7 @@ def bulk_search_by_purl( data = { "purls": purls, "details": True, - "reachability": True, + "reachability": reachability, } logger.debug(f"VulnerableCode: url={url} purls_count={len(purls)}") @@ -137,7 +138,7 @@ def filter_vulnerabilities(vulnerabilities, ignore_set): def fetch_vulnerabilities( - packages, chunk_size=1000, logger=logger.info, ignore_set=None + packages, chunk_size=1000, logger=logger.info, ignore_set=None, reachability=False ): """ Fetch and store vulnerabilities for each provided `packages`. @@ -147,7 +148,7 @@ def fetch_vulnerabilities( for purls_batch in chunked(get_purls(packages), chunk_size): try: - response_data = bulk_search_by_purl(purls_batch) + response_data = bulk_search_by_purl(purls_batch, reachability=reachability) except (requests.RequestException, ValueError, TypeError) as exception: logger(f"{label} [Exception] {exception}") return From fa8d75f7b21c27515128988f7e2896382d3c50bb Mon Sep 17 00:00:00 2001 From: ziad hany Date: Thu, 23 Jul 2026 03:53:25 +0300 Subject: [PATCH 05/16] Fix CI files format Signed-off-by: ziad hany --- scanpipe/pipes/unidiff/patch.py | 75 ++++++++++++++++----------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/scanpipe/pipes/unidiff/patch.py b/scanpipe/pipes/unidiff/patch.py index 8075a8cc77..e53c7c7d94 100644 --- a/scanpipe/pipes/unidiff/patch.py +++ b/scanpipe/pipes/unidiff/patch.py @@ -34,7 +34,12 @@ class UnidiffParseError(Exception): ... open_file = open make_str = str -implements_to_string = lambda x: x + + +def implements_to_string(x): + return x + + unicode = str basestring = str @@ -82,7 +87,8 @@ class UnidiffParseError(Exception): ... RE_BINARY_DIFF = re.compile( r"^Binary files? " r"(?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?" - r"(?: and (?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?)? (differ|has changed)" + r"(?: and (?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?)?" + r" (differ|has changed)" ) DEFAULT_ENCODING = "UTF-8" @@ -122,7 +128,7 @@ def __repr__(self): def __str__(self): # type: () -> str - return "%s%s" % (self.line_type, self.value) + return f"{self.line_type}{self.value}" def __eq__(self, other): # type: (Line) -> bool @@ -162,7 +168,7 @@ class PatchInfo(list): def __repr__(self): # type: () -> str - value = "" % self[0].strip() + value = f"" return make_str(value) def __str__(self): @@ -193,24 +199,19 @@ def __init__( def __repr__(self): # type: () -> str - value = "" % ( - self.source_start, - self.source_length, - self.target_start, - self.target_length, - self.section_header, + value = ( + f"" ) return make_str(value) def __str__(self): # type: () -> str # section header is optional and thus we output it only if it's present - head = "@@ -%d,%d +%d,%d @@%s\n" % ( - self.source_start, - self.source_length, - self.target_start, - self.target_length, - " " + self.section_header if self.section_header else "", + section_hdr = f" {self.section_header}" if self.section_header else "" + head = ( + f"@@ -{self.source_start},{self.source_length} " + f"+{self.target_start},{self.target_length} @@{section_hdr}\n" ) content = "".join(unicode(line) for line in self) return head + content @@ -252,22 +253,22 @@ def is_valid(self): def source_lines(self): # type: () -> Iterable[Line] """Hunk lines from source file (generator).""" - return (l for l in self if l.is_context or l.is_removed) + return (line for line in self if line.is_context or line.is_removed) @property def source(self): # type: () -> Iterable[str] - return [str(l) for l in self.source_lines()] + return [str(line) for line in self.source_lines()] def target_lines(self): # type: () -> Iterable[Line] """Hunk lines from target file (generator).""" - return (l for l in self if l.is_context or l.is_added) + return (line for line in self if line.is_context or line.is_added) @property def target(self): # type: () -> Iterable[str] - return [str(l) for l in self.target_lines()] + return [str(line) for line in self.target_lines()] class PatchedFile(list): @@ -302,18 +303,16 @@ def __str__(self): # patch info is optional info = "" if self.patch_info is None else str(self.patch_info) if not self.is_binary_file and self: - source = "--- %s%s\n" % ( - self.source_file, - "\t" + self.source_timestamp if self.source_timestamp else "", - ) - target = "+++ %s%s\n" % ( - self.target_file, - "\t" + self.target_timestamp if self.target_timestamp else "", - ) + source_ts = f"\t{self.source_timestamp}" if self.source_timestamp else "" + source = f"--- {self.source_file}{source_ts}\n" + + target_ts = f"\t{self.target_timestamp}" if self.target_timestamp else "" + target = f"+++ {self.target_file}{target_ts}\n" + hunks = "".join(unicode(hunk) for hunk in self) return info + source + target + hunks - def _parse_hunk(self, header, diff, encoding, metadata_only): + def _parse_hunk(self, header, diff, encoding, metadata_only): # noqa: C901 # type: (str, enumerate[str], Optional[str], bool) -> None """Parse hunk details.""" header_info = RE_HUNK_HEADER.match(header) @@ -340,7 +339,7 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): LINE_TYPE_CONTEXT, LINE_TYPE_NO_NEWLINE, ): - raise UnidiffParseError("Hunk diff line expected: %s" % line) + raise UnidiffParseError(f"Hunk diff line expected: {line}") if line_type == LINE_TYPE_ADDED: target_line_no += 1 @@ -362,7 +361,7 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): valid_line = RE_HUNK_EMPTY_BODY_LINE.match(line) if not valid_line: - raise UnidiffParseError("Hunk diff line expected: %s" % line) + raise UnidiffParseError(f"Hunk diff line expected: {line}") line_type = valid_line.group("line_type") if line_type == LINE_TYPE_EMPTY: @@ -410,7 +409,7 @@ def _parse_hunk(self, header, diff, encoding, metadata_only): raise UnidiffParseError("Hunk is shorter than expected") if metadata_only: - # HACK: set fixed calculated values when metadata_only is enabled + # set fixed calculated values when metadata_only is enabled hunk._added = added hunk._removed = removed @@ -530,7 +529,7 @@ def __str__(self): # type: () -> str return "".join(unicode(patched_file) for patched_file in self) - def _parse(self, diff, encoding, metadata_only): + def _parse(self, diff, encoding, metadata_only): # noqa: C901 # type: (StringIO, Optional[str], bool) -> None current_file = None patch_info = None @@ -561,7 +560,7 @@ def _parse(self, diff, encoding, metadata_only): is_diff_git_new_file = RE_DIFF_GIT_NEW_FILE.match(line) if is_diff_git_new_file: if current_file is None or patch_info is None: - raise UnidiffParseError("Unexpected new file found: %s" % line) + raise UnidiffParseError(f"Unexpected new file found: {line}") current_file.source_file = DEV_NULL patch_info.append(line) continue @@ -570,7 +569,7 @@ def _parse(self, diff, encoding, metadata_only): is_diff_git_deleted_file = RE_DIFF_GIT_DELETED_FILE.match(line) if is_diff_git_deleted_file: if current_file is None or patch_info is None: - raise UnidiffParseError("Unexpected deleted file found: %s" % line) + raise UnidiffParseError(f"Unexpected deleted file found: {line}") current_file.target_file = DEV_NULL patch_info.append(line) continue @@ -598,7 +597,7 @@ def _parse(self, diff, encoding, metadata_only): if current_file is not None and not ( current_file.target_file == target_file ): - raise UnidiffParseError("Target without source: %s" % line) + raise UnidiffParseError(f"Target without source: {line}") if current_file is None: # add current file to PatchSet current_file = PatchedFile( @@ -619,7 +618,7 @@ def _parse(self, diff, encoding, metadata_only): if is_hunk_header: patch_info = None if current_file is None: - raise UnidiffParseError("Unexpected hunk found: %s" % line) + raise UnidiffParseError(f"Unexpected hunk found: {line}") current_file._parse_hunk(line, diff, encoding, metadata_only) continue @@ -627,7 +626,7 @@ def _parse(self, diff, encoding, metadata_only): is_no_newline = RE_NO_NEWLINE_MARKER.match(line) if is_no_newline: if current_file is None: - raise UnidiffParseError("Unexpected marker: %s" % line) + raise UnidiffParseError(f"Unexpected marker: {line}") current_file._add_no_newline_marker_to_last_hunk() continue From 08bb93e6f71222ce52816ab6350bb9862260befa Mon Sep 17 00:00:00 2001 From: ziad hany Date: Thu, 23 Jul 2026 04:02:18 +0300 Subject: [PATCH 06/16] Fix a typo in patch.py.ABOUT file Signed-off-by: ziad hany --- scanpipe/pipes/unidiff/patch.py.ABOUT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scanpipe/pipes/unidiff/patch.py.ABOUT b/scanpipe/pipes/unidiff/patch.py.ABOUT index 3118ed9643..75c3bb8ade 100644 --- a/scanpipe/pipes/unidiff/patch.py.ABOUT +++ b/scanpipe/pipes/unidiff/patch.py.ABOUT @@ -10,4 +10,4 @@ package_url: pkg:pypi/unidiff@0.7.5 licenses: - key: mit name: MIT License - file: mit.LICENSE \ No newline at end of file + file: patch.py.LICENSE \ No newline at end of file From 0a3df7886f7b4a870ed1352c79cc622ad8113b8c Mon Sep 17 00:00:00 2001 From: ziad hany Date: Wed, 29 Jul 2026 03:17:06 +0300 Subject: [PATCH 07/16] Allow reachability by default, for vulnerabilities pipeline Signed-off-by: ziad hany --- scanpipe/pipelines/find_vulnerabilities.py | 12 +----------- scanpipe/pipes/vulnerablecode.py | 7 +++---- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/scanpipe/pipelines/find_vulnerabilities.py b/scanpipe/pipelines/find_vulnerabilities.py index 1bdf8af6bc..b0c8066b9a 100644 --- a/scanpipe/pipelines/find_vulnerabilities.py +++ b/scanpipe/pipelines/find_vulnerabilities.py @@ -19,7 +19,7 @@ # # ScanCode.io is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/aboutcode-org/scancode.io for support and download. -from aboutcode.pipeline import optional_step + from scanpipe.pipelines import Pipeline from scanpipe.pipes import vulnerablecode @@ -34,13 +34,11 @@ class FindVulnerabilities(Pipeline): download_inputs = False is_addon = True results_url = "/project/{slug}/packages/?is_vulnerable=yes" - reachability = False @classmethod def steps(cls): return ( cls.check_vulnerablecode_service_availability, - cls.enable_reachability_analysis, cls.lookup_packages_vulnerabilities, cls.lookup_dependencies_vulnerabilities, ) @@ -50,12 +48,6 @@ def get_availability(cls): if not vulnerablecode.is_configured(): return "VulnerableCode is not configured." - @optional_step("reachability") - def enable_reachability_analysis(self): - """Enable the reachability flag for vulnerability lookups.""" - self.reachability = True - self.log("Reachability analysis is ENABLED.") - def check_vulnerablecode_service_availability(self): """Check if the VulnerableCode service if configured and available.""" if not vulnerablecode.is_configured(): @@ -70,7 +62,6 @@ def lookup_packages_vulnerabilities(self): vulnerablecode.fetch_vulnerabilities( packages=packages, ignore_set=self.project.ignored_vulnerabilities_set, - reachability=self.reachability, logger=self.log, ) @@ -80,6 +71,5 @@ def lookup_dependencies_vulnerabilities(self): vulnerablecode.fetch_vulnerabilities( packages=dependencies, ignore_set=self.project.ignored_vulnerabilities_set, - reachability=self.reachability, logger=self.log, ) diff --git a/scanpipe/pipes/vulnerablecode.py b/scanpipe/pipes/vulnerablecode.py index 57924bff70..4deaefc704 100644 --- a/scanpipe/pipes/vulnerablecode.py +++ b/scanpipe/pipes/vulnerablecode.py @@ -109,7 +109,6 @@ def request_post( def bulk_search_by_purl( purls, - reachability=False, timeout=None, api_url=VULNERABLECODE_API_URL, ): @@ -119,7 +118,7 @@ def bulk_search_by_purl( data = { "purls": purls, "details": True, - "reachability": reachability, + "reachability": True, } logger.debug(f"VulnerableCode: url={url} purls_count={len(purls)}") @@ -138,7 +137,7 @@ def filter_vulnerabilities(vulnerabilities, ignore_set): def fetch_vulnerabilities( - packages, chunk_size=1000, logger=logger.info, ignore_set=None, reachability=False + packages, chunk_size=1000, logger=logger.info, ignore_set=None ): """ Fetch and store vulnerabilities for each provided `packages`. @@ -148,7 +147,7 @@ def fetch_vulnerabilities( for purls_batch in chunked(get_purls(packages), chunk_size): try: - response_data = bulk_search_by_purl(purls_batch, reachability=reachability) + response_data = bulk_search_by_purl(purls_batch) except (requests.RequestException, ValueError, TypeError) as exception: logger(f"{label} [Exception] {exception}") return From dd0db740db80c211d28c1daaae4f98c3819bc57a Mon Sep 17 00:00:00 2001 From: ziad hany Date: Thu, 30 Jul 2026 02:23:55 +0300 Subject: [PATCH 08/16] Update the code to difflib instead of unidiff library Fix a bug related to constant detections and add a test Signed-off-by: ziad hany --- scanpipe/pipes/unidiff/patch.py | 721 ------------------ scanpipe/pipes/unidiff/patch.py.ABOUT | 13 - scanpipe/pipes/unidiff/patch.py.LICENSE | 20 - scanpipe/tests/data/reachability/app.py | 2 + .../tests/data/reachability/diff-app.patch | 39 - scanpipe/tests/data/reachability/fixed-app.py | 2 + scanpipe/tests/data/reachability/vuln-app.py | 2 + 7 files changed, 6 insertions(+), 793 deletions(-) delete mode 100644 scanpipe/pipes/unidiff/patch.py delete mode 100644 scanpipe/pipes/unidiff/patch.py.ABOUT delete mode 100644 scanpipe/pipes/unidiff/patch.py.LICENSE delete mode 100644 scanpipe/tests/data/reachability/diff-app.patch diff --git a/scanpipe/pipes/unidiff/patch.py b/scanpipe/pipes/unidiff/patch.py deleted file mode 100644 index e53c7c7d94..0000000000 --- a/scanpipe/pipes/unidiff/patch.py +++ /dev/null @@ -1,721 +0,0 @@ -# Extracted essential patch code analyzer and modified -# from the original unidiff library: -# https://github.com/matiasb/python-unidiff/blob/2771a878f7bc6619e625feb4dbad3427f57f5237/unidiff/patch.py - -# -*- coding: utf-8 -*- - -# The MIT License (MIT) -# Copyright (c) 2014-2023 Matias Bordese -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -# OR OTHER DEALINGS IN THE SOFTWARE. - -import re -from io import StringIO - - -class UnidiffParseError(Exception): ... - - -open_file = open -make_str = str - - -def implements_to_string(x): - return x - - -unicode = str -basestring = str - -RE_SOURCE_FILENAME = re.compile( - r'^--- (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?' -) -RE_TARGET_FILENAME = re.compile( - r'^\+\+\+ (?P"?[^\t\n]+"?)(?:\t(?P[^\n]+))?' -) - - -# check diff git line for git renamed files support -RE_DIFF_GIT_HEADER = re.compile( - r'^diff --git (?P"?a/[^\t\n]+"?) (?P"?b/[^\t\n]+"?)' -) -RE_DIFF_GIT_HEADER_URI_LIKE = re.compile( - r"^diff --git (?P.*://[^\t\n]+) (?P.*://[^\t\n]+)" -) -RE_DIFF_GIT_HEADER_NO_PREFIX = re.compile( - r"^diff --git (?P[^\t\n]+) (?P[^\t\n]+)" -) - -# check diff git new file marker `deleted file mode 100644` -RE_DIFF_GIT_DELETED_FILE = re.compile(r"^deleted file mode \d+$") - -# check diff git new file marker `new file mode 100644` -RE_DIFF_GIT_NEW_FILE = re.compile(r"^new file mode \d+$") - - -# @@ (source offset, length) (target offset, length) @@ (section header) -RE_HUNK_HEADER = re.compile(r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))?\ @@[ ]?(.*)") - -# kept line (context) -# \n empty line (treat like context) -# + added line -# - deleted line -# \ No newline case -RE_HUNK_BODY_LINE = re.compile(r"^(?P[- \+\\])(?P.*)", re.DOTALL) -RE_HUNK_EMPTY_BODY_LINE = re.compile( - r"^(?P[- \+\\]?)(?P[\r\n]{1,2})", re.DOTALL -) - -RE_NO_NEWLINE_MARKER = re.compile(r"^\\ No newline at end of file") - -RE_BINARY_DIFF = re.compile( - r"^Binary files? " - r"(?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?" - r"(?: and (?P[^\t]+?)(?:\t(?P[\s0-9:\+-]+))?)?" - r" (differ|has changed)" -) - -DEFAULT_ENCODING = "UTF-8" - -DEV_NULL = "/dev/null" -LINE_TYPE_ADDED = "+" -LINE_TYPE_REMOVED = "-" -LINE_TYPE_CONTEXT = " " -LINE_TYPE_EMPTY = "" -LINE_TYPE_NO_NEWLINE = "\\" -LINE_VALUE_NO_NEWLINE = " No newline at end of file" - - -@implements_to_string -class Line: - """A diff line.""" - - def __init__( - self, - value, - line_type, - source_line_no=None, - target_line_no=None, - diff_line_no=None, - ): - # type: (str, str, Optional[int], Optional[int], Optional[int]) -> None - super().__init__() - self.source_line_no = source_line_no - self.target_line_no = target_line_no - self.diff_line_no = diff_line_no - self.line_type = line_type - self.value = value - - def __repr__(self): - # type: () -> str - return make_str("") % (self.line_type, self.value) - - def __str__(self): - # type: () -> str - return f"{self.line_type}{self.value}" - - def __eq__(self, other): - # type: (Line) -> bool - return ( - self.source_line_no == other.source_line_no - and self.target_line_no == other.target_line_no - and self.diff_line_no == other.diff_line_no - and self.line_type == other.line_type - and self.value == other.value - ) - - @property - def is_added(self): - # type: () -> bool - return self.line_type == LINE_TYPE_ADDED - - @property - def is_removed(self): - # type: () -> bool - return self.line_type == LINE_TYPE_REMOVED - - @property - def is_context(self): - # type: () -> bool - return self.line_type == LINE_TYPE_CONTEXT - - -@implements_to_string -class PatchInfo(list): - """ - Lines with extended patch info. - - Format of this info is not documented and it very much depends on - patch producer. - - """ - - def __repr__(self): - # type: () -> str - value = f"" - return make_str(value) - - def __str__(self): - # type: () -> str - return "".join(unicode(line) for line in self) - - -@implements_to_string -class Hunk(list): - """Each of the modified blocks of a file.""" - - def __init__( - self, src_start=0, src_len=0, tgt_start=0, tgt_len=0, section_header="" - ): - # type: (int, int, int, int, str) -> None - super().__init__() - if src_len is None: - src_len = 1 - if tgt_len is None: - tgt_len = 1 - self.source_start = int(src_start) - self.source_length = int(src_len) - self.target_start = int(tgt_start) - self.target_length = int(tgt_len) - self.section_header = section_header - self._added = None # Optional[int] - self._removed = None # Optional[int] - - def __repr__(self): - # type: () -> str - value = ( - f"" - ) - return make_str(value) - - def __str__(self): - # type: () -> str - # section header is optional and thus we output it only if it's present - section_hdr = f" {self.section_header}" if self.section_header else "" - head = ( - f"@@ -{self.source_start},{self.source_length} " - f"+{self.target_start},{self.target_length} @@{section_hdr}\n" - ) - content = "".join(unicode(line) for line in self) - return head + content - - def append(self, line): - # type: (Line) -> None - """Append the line to hunk, and keep track of source/target lines.""" - # Make sure the line is encoded correctly. This is a no-op except for - # potentially raising a UnicodeDecodeError. - str(line) - super().append(line) - - @property - def added(self): - # type: () -> Optional[int] - if self._added is not None: - return self._added - # re-calculate each time to allow for hunk modifications - # (which should mean metadata_only switch wasn't used) - return sum(1 for line in self if line.is_added) - - @property - def removed(self): - # type: () -> Optional[int] - if self._removed is not None: - return self._removed - # re-calculate each time to allow for hunk modifications - # (which should mean metadata_only switch wasn't used) - return sum(1 for line in self if line.is_removed) - - def is_valid(self): - # type: () -> bool - """Check hunk header data matches entered lines info.""" - return ( - len(self.source) == self.source_length - and len(self.target) == self.target_length - ) - - def source_lines(self): - # type: () -> Iterable[Line] - """Hunk lines from source file (generator).""" - return (line for line in self if line.is_context or line.is_removed) - - @property - def source(self): - # type: () -> Iterable[str] - return [str(line) for line in self.source_lines()] - - def target_lines(self): - # type: () -> Iterable[Line] - """Hunk lines from target file (generator).""" - return (line for line in self if line.is_context or line.is_added) - - @property - def target(self): - # type: () -> Iterable[str] - return [str(line) for line in self.target_lines()] - - -class PatchedFile(list): - """Patch updated file, it is a list of Hunks.""" - - def __init__( - self, - patch_info=None, - source="", - target="", - source_timestamp=None, - target_timestamp=None, - is_binary_file=False, - ): - # type: (Optional[PatchInfo], str, str, Optional[str], Optional[str], bool, bool) -> None - super().__init__() - self.patch_info = patch_info - self.source_file = source - self.source_timestamp = source_timestamp - self.target_file = target - self.target_timestamp = target_timestamp - self.is_binary_file = is_binary_file - - def __repr__(self): - # type: () -> str - return make_str("") % make_str(self.path) - - def __str__(self): - # type: () -> str - source = "" - target = "" - # patch info is optional - info = "" if self.patch_info is None else str(self.patch_info) - if not self.is_binary_file and self: - source_ts = f"\t{self.source_timestamp}" if self.source_timestamp else "" - source = f"--- {self.source_file}{source_ts}\n" - - target_ts = f"\t{self.target_timestamp}" if self.target_timestamp else "" - target = f"+++ {self.target_file}{target_ts}\n" - - hunks = "".join(unicode(hunk) for hunk in self) - return info + source + target + hunks - - def _parse_hunk(self, header, diff, encoding, metadata_only): # noqa: C901 - # type: (str, enumerate[str], Optional[str], bool) -> None - """Parse hunk details.""" - header_info = RE_HUNK_HEADER.match(header) - hunk_info = header_info.groups() - hunk = Hunk(*hunk_info) - - source_line_no = hunk.source_start - target_line_no = hunk.target_start - expected_source_end = source_line_no + hunk.source_length - expected_target_end = target_line_no + hunk.target_length - added = 0 - removed = 0 - - for diff_line_no, line in diff: - if encoding is not None: - line = line.decode(encoding) - - if metadata_only: - # quick line type detection, no regex required - line_type = line[0] if line else LINE_TYPE_CONTEXT - if line_type not in ( - LINE_TYPE_ADDED, - LINE_TYPE_REMOVED, - LINE_TYPE_CONTEXT, - LINE_TYPE_NO_NEWLINE, - ): - raise UnidiffParseError(f"Hunk diff line expected: {line}") - - if line_type == LINE_TYPE_ADDED: - target_line_no += 1 - added += 1 - elif line_type == LINE_TYPE_REMOVED: - source_line_no += 1 - removed += 1 - elif line_type == LINE_TYPE_CONTEXT: - target_line_no += 1 - source_line_no += 1 - - # no file content tracking - original_line = None - - else: - # parse diff line content - valid_line = RE_HUNK_BODY_LINE.match(line) - if not valid_line: - valid_line = RE_HUNK_EMPTY_BODY_LINE.match(line) - - if not valid_line: - raise UnidiffParseError(f"Hunk diff line expected: {line}") - - line_type = valid_line.group("line_type") - if line_type == LINE_TYPE_EMPTY: - line_type = LINE_TYPE_CONTEXT - - value = valid_line.group("value") # type: str - original_line = Line(value, line_type=line_type) - - if line_type == LINE_TYPE_ADDED: - original_line.target_line_no = target_line_no - target_line_no += 1 - elif line_type == LINE_TYPE_REMOVED: - original_line.source_line_no = source_line_no - source_line_no += 1 - elif line_type == LINE_TYPE_CONTEXT: - original_line.target_line_no = target_line_no - original_line.source_line_no = source_line_no - target_line_no += 1 - source_line_no += 1 - elif line_type == LINE_TYPE_NO_NEWLINE: - pass - else: - original_line = None - - # stop parsing if we got past expected number of lines - if ( - source_line_no > expected_source_end - or target_line_no > expected_target_end - ): - raise UnidiffParseError("Hunk is longer than expected") - - if original_line: - original_line.diff_line_no = diff_line_no - hunk.append(original_line) - - # if hunk source/target lengths are ok, hunk is complete - if ( - source_line_no == expected_source_end - and target_line_no == expected_target_end - ): - break - - # report an error if we haven't got expected number of lines - if source_line_no < expected_source_end or target_line_no < expected_target_end: - raise UnidiffParseError("Hunk is shorter than expected") - - if metadata_only: - # set fixed calculated values when metadata_only is enabled - hunk._added = added - hunk._removed = removed - - self.append(hunk) - - def _add_no_newline_marker_to_last_hunk(self): - # type: () -> None - if not self: - raise UnidiffParseError("Unexpected marker:" + LINE_VALUE_NO_NEWLINE) - last_hunk = self[-1] - last_hunk.append( - Line(LINE_VALUE_NO_NEWLINE + "\n", line_type=LINE_TYPE_NO_NEWLINE) - ) - - def _append_trailing_empty_line(self): - # type: () -> None - if not self: - raise UnidiffParseError("Unexpected trailing newline character") - last_hunk = self[-1] - last_hunk.append(Line("\n", line_type=LINE_TYPE_EMPTY)) - - @property - def path(self): - # type: () -> str - """Return the file path abstracted from VCS.""" - filepath = self.source_file - if filepath in (None, DEV_NULL) or ( - self.is_rename and self.target_file not in (None, DEV_NULL) - ): - # if this is a rename, prefer the target filename - filepath = self.target_file - - quoted = filepath.startswith('"') and filepath.endswith('"') - if quoted: - filepath = filepath[1:-1] - - if filepath.startswith("a/") or filepath.startswith("b/"): - filepath = filepath[2:] - - if quoted: - filepath = f'"{filepath}"' - - return filepath - - @property - def added(self): - # type: () -> int - """Return the file total added lines.""" - return sum([hunk.added for hunk in self]) - - @property - def removed(self): - # type: () -> int - """Return the file total removed lines.""" - return sum([hunk.removed for hunk in self]) - - @property - def is_rename(self): - return ( - self.source_file != DEV_NULL - and self.target_file != DEV_NULL - and self.source_file[2:] != self.target_file[2:] - ) - - @property - def is_added_file(self): - # type: () -> bool - """Return True if this patch adds the file.""" - if self.source_file == DEV_NULL: - return True - return ( - len(self) == 1 and self[0].source_start == 0 and self[0].source_length == 0 - ) - - @property - def is_removed_file(self): - # type: () -> bool - """Return True if this patch removes the file.""" - if self.target_file == DEV_NULL: - return True - return ( - len(self) == 1 and self[0].target_start == 0 and self[0].target_length == 0 - ) - - @property - def is_modified_file(self): - # type: () -> bool - """Return True if this patch modifies the file.""" - return not (self.is_added_file or self.is_removed_file) - - -@implements_to_string -class PatchSet(list): - """A list of PatchedFiles.""" - - def __init__(self, f, encoding=None, metadata_only=False): - # type: (Union[StringIO, str], Optional[str], bool) -> None - super().__init__() - - # convert string inputs to StringIO objects - if isinstance(f, basestring): - f = self._convert_string(f, encoding) # type: StringIO - - # make sure we pass an iterator object to parse - data = iter(f) - # if encoding is None, assume we are reading unicode data - # when metadata_only is True, only perform a minimal metadata parsing - # (ie. hunks without content) which is around 2.5-6 times faster; - # it will still validate the diff metadata consistency and get counts - self._parse(data, encoding=encoding, metadata_only=metadata_only) - - def __repr__(self): - # type: () -> str - return make_str("") % super().__repr__() - - def __str__(self): - # type: () -> str - return "".join(unicode(patched_file) for patched_file in self) - - def _parse(self, diff, encoding, metadata_only): # noqa: C901 - # type: (StringIO, Optional[str], bool) -> None - current_file = None - patch_info = None - - diff = enumerate(diff, 1) - for unused_diff_line_no, line in diff: - if encoding is not None: - line = line.decode(encoding) - - # check for a git file rename - is_diff_git_header = ( - RE_DIFF_GIT_HEADER.match(line) - or RE_DIFF_GIT_HEADER_URI_LIKE.match(line) - or RE_DIFF_GIT_HEADER_NO_PREFIX.match(line) - ) - if is_diff_git_header: - patch_info = PatchInfo() - source_file = is_diff_git_header.group("source") - target_file = is_diff_git_header.group("target") - current_file = PatchedFile( - patch_info, source_file, target_file, None, None - ) - self.append(current_file) - patch_info.append(line) - continue - - # check for a git new file - is_diff_git_new_file = RE_DIFF_GIT_NEW_FILE.match(line) - if is_diff_git_new_file: - if current_file is None or patch_info is None: - raise UnidiffParseError(f"Unexpected new file found: {line}") - current_file.source_file = DEV_NULL - patch_info.append(line) - continue - - # check for a git deleted file - is_diff_git_deleted_file = RE_DIFF_GIT_DELETED_FILE.match(line) - if is_diff_git_deleted_file: - if current_file is None or patch_info is None: - raise UnidiffParseError(f"Unexpected deleted file found: {line}") - current_file.target_file = DEV_NULL - patch_info.append(line) - continue - - # check for source file header - is_source_filename = RE_SOURCE_FILENAME.match(line) - if is_source_filename: - source_file = is_source_filename.group("filename") - source_timestamp = is_source_filename.group("timestamp") - # reset current file, unless we are processing a rename - # (in that case, source files should match) - if current_file is not None and not ( - current_file.source_file == source_file - ): - current_file = None - elif current_file is not None: - current_file.source_timestamp = source_timestamp - continue - - # check for target file header - is_target_filename = RE_TARGET_FILENAME.match(line) - if is_target_filename: - target_file = is_target_filename.group("filename") - target_timestamp = is_target_filename.group("timestamp") - if current_file is not None and not ( - current_file.target_file == target_file - ): - raise UnidiffParseError(f"Target without source: {line}") - if current_file is None: - # add current file to PatchSet - current_file = PatchedFile( - patch_info, - source_file, - target_file, - source_timestamp, - target_timestamp, - ) - self.append(current_file) - patch_info = None - else: - current_file.target_timestamp = target_timestamp - continue - - # check for hunk header - is_hunk_header = RE_HUNK_HEADER.match(line) - if is_hunk_header: - patch_info = None - if current_file is None: - raise UnidiffParseError(f"Unexpected hunk found: {line}") - current_file._parse_hunk(line, diff, encoding, metadata_only) - continue - - # check for no newline marker - is_no_newline = RE_NO_NEWLINE_MARKER.match(line) - if is_no_newline: - if current_file is None: - raise UnidiffParseError(f"Unexpected marker: {line}") - current_file._add_no_newline_marker_to_last_hunk() - continue - - # sometimes hunks can be followed by empty lines - if line == "\n" and current_file is not None: - current_file._append_trailing_empty_line() - continue - - # if nothing has matched above then this line is a patch info - if patch_info is None: - current_file = None - patch_info = PatchInfo() - - is_binary_diff = RE_BINARY_DIFF.match(line) - if is_binary_diff: - source_file = is_binary_diff.group("source_filename") - target_file = is_binary_diff.group("target_filename") - patch_info.append(line) - if current_file is not None: - current_file.is_binary_file = True - else: - current_file = PatchedFile( - patch_info, source_file, target_file, is_binary_file=True - ) - self.append(current_file) - patch_info = None - current_file = None - continue - - if line == "GIT binary patch\n": - current_file.is_binary_file = True - patch_info = None - current_file = None - continue - - patch_info.append(line) - - @classmethod - def from_filename( - cls, filename, encoding=DEFAULT_ENCODING, errors=None, newline=None - ): - # type: (str, str, Optional[str]) -> PatchSet - """Return a PatchSet instance given a diff filename.""" - with open_file( - filename, "r", encoding=encoding, errors=errors, newline=newline - ) as f: - instance = cls(f) - return instance - - @staticmethod - def _convert_string(data, encoding=None, errors="strict"): - # type: (Union[str, bytes], str, str) -> StringIO - if encoding is not None: - # if encoding is given, assume bytes and decode - data = unicode(data, encoding=encoding, errors=errors) - return StringIO(data) - - @classmethod - def from_string(cls, data, encoding=None, errors="strict"): - # type: (str, str, Optional[str]) -> PatchSet - """Return a PatchSet instance given a diff string.""" - return cls(cls._convert_string(data, encoding, errors)) - - @property - def added_files(self): - # type: () -> list[PatchedFile] - """Return patch added files as a list.""" - return [f for f in self if f.is_added_file] - - @property - def removed_files(self): - # type: () -> list[PatchedFile] - """Return patch removed files as a list.""" - return [f for f in self if f.is_removed_file] - - @property - def modified_files(self): - # type: () -> list[PatchedFile] - """Return patch modified files as a list.""" - return [f for f in self if f.is_modified_file] - - @property - def added(self): - # type: () -> int - """Return the patch total added lines.""" - return sum([f.added for f in self]) - - @property - def removed(self): - # type: () -> int - """Return the patch total removed lines.""" - return sum([f.removed for f in self]) diff --git a/scanpipe/pipes/unidiff/patch.py.ABOUT b/scanpipe/pipes/unidiff/patch.py.ABOUT deleted file mode 100644 index 75c3bb8ade..0000000000 --- a/scanpipe/pipes/unidiff/patch.py.ABOUT +++ /dev/null @@ -1,13 +0,0 @@ -about_resource: patch.py constants.py errors.py -name: patch -version: 0.7.5 -download_url: https://github.com/matiasb/python-unidiff/archive/refs/tags/v0.7.5.zip -description: Simple Python library to parse and interact with unified diff data. -homepage_url: https://github.com/matiasb/python-unidiff -license_expression: mit -attribute: yes -package_url: pkg:pypi/unidiff@0.7.5 -licenses: - - key: mit - name: MIT License - file: patch.py.LICENSE \ No newline at end of file diff --git a/scanpipe/pipes/unidiff/patch.py.LICENSE b/scanpipe/pipes/unidiff/patch.py.LICENSE deleted file mode 100644 index ca2c04c202..0000000000 --- a/scanpipe/pipes/unidiff/patch.py.LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2012 Matias Bordese - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/scanpipe/tests/data/reachability/app.py b/scanpipe/tests/data/reachability/app.py index b8c9eff5e0..32eebc2fa1 100644 --- a/scanpipe/tests/data/reachability/app.py +++ b/scanpipe/tests/data/reachability/app.py @@ -1,5 +1,7 @@ import os +debug = False + class ReportGenerator: """A dummy class to test AST class method parsing.""" diff --git a/scanpipe/tests/data/reachability/diff-app.patch b/scanpipe/tests/data/reachability/diff-app.patch deleted file mode 100644 index ccb86953a8..0000000000 --- a/scanpipe/tests/data/reachability/diff-app.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 8f7b1c3d9a4e2b6f5d8c1a2e3f4b5c6d7e8f9a0b Mon Sep 17 00:00:00 2001 -From: Security Team -Date: Tue, 2 Jun 2026 10:00:00 +0000 -Subject: [PATCH] Fix path traversal vulnerability in report generator - -- Validates that target paths stay within the designated base_dir. -- Catches ValueError on invalid path resolution. ---- - app.py | 12 +++++++++--- - 1 file changed, 9 insertions(+), 3 deletions(-) - -diff --git a/app.py b/app.py -index a1b2c3d..e4f5g6h 100644 ---- a/app.py -+++ b/app.py -@@ -15,13 +15,19 @@ def serve_report(request_payload): - # Helper function nested inside serve_report - def build_file_path(filename): -- # VULNERABLE: Direct concatenation allows Path Traversal -- # An attacker passing "../../etc/passwd" could read system files. -- return os.path.join(generator.base_dir, filename) -+ # FIXED: Validate that the resolved path stays within the base_dir -+ base = os.path.abspath(generator.base_dir) -+ target = os.path.abspath(os.path.join(base, filename)) -+ if not target.startswith(base): -+ raise ValueError("Path Traversal Detected") -+ return target - - if not requested_file: - return "Error: No file specified" - -- target_path = build_file_path(requested_file) -+ try: -+ target_path = build_file_path(requested_file) -+ except ValueError: -+ return "Error: Invalid path" - - if os.path.exists(target_path): - return f"Serving content of {target_path}" \ No newline at end of file diff --git a/scanpipe/tests/data/reachability/fixed-app.py b/scanpipe/tests/data/reachability/fixed-app.py index ca5a6f4c8b..30470b6cda 100644 --- a/scanpipe/tests/data/reachability/fixed-app.py +++ b/scanpipe/tests/data/reachability/fixed-app.py @@ -1,5 +1,7 @@ import os +debug = True + class ReportGenerator: """A dummy class to test AST class method parsing.""" diff --git a/scanpipe/tests/data/reachability/vuln-app.py b/scanpipe/tests/data/reachability/vuln-app.py index b8c9eff5e0..32eebc2fa1 100644 --- a/scanpipe/tests/data/reachability/vuln-app.py +++ b/scanpipe/tests/data/reachability/vuln-app.py @@ -1,5 +1,7 @@ import os +debug = False + class ReportGenerator: """A dummy class to test AST class method parsing.""" From ffa196571df0c2b64846802de8ce211617790fa5 Mon Sep 17 00:00:00 2001 From: ziad hany Date: Mon, 10 Aug 2026 13:44:21 +0300 Subject: [PATCH 09/16] Add a test for java Add end-to-end test for Symbol Reachability pipeline Signed-off-by: ziad hany --- scanpipe/tests/data/reachability/app.py | 37 ---------------- scanpipe/tests/data/reachability/fixed-app.py | 43 ------------------- scanpipe/tests/data/reachability/vuln-app.py | 37 ---------------- 3 files changed, 117 deletions(-) delete mode 100644 scanpipe/tests/data/reachability/app.py delete mode 100644 scanpipe/tests/data/reachability/fixed-app.py delete mode 100644 scanpipe/tests/data/reachability/vuln-app.py diff --git a/scanpipe/tests/data/reachability/app.py b/scanpipe/tests/data/reachability/app.py deleted file mode 100644 index 32eebc2fa1..0000000000 --- a/scanpipe/tests/data/reachability/app.py +++ /dev/null @@ -1,37 +0,0 @@ -import os - -debug = False - - -class ReportGenerator: - """A dummy class to test AST class method parsing.""" - - def __init__(self, base_dir): - self.base_dir = base_dir - - -def serve_report(request_payload): - """Top-level function handling a request.""" - generator = ReportGenerator("/var/reports") - requested_file = request_payload.get("file") - - # Helper function nested inside serve_report - def build_file_path(filename): - # VULNERABLE: Direct concatenation allows Path Traversal - # An attacker passing "../../etc/passwd" could read system files. - return os.path.join(generator.base_dir, filename) - - if not requested_file: - return "Error: No file specified" - - target_path = build_file_path(requested_file) - - if os.path.exists(target_path): - return f"Serving content of {target_path}" - - return "Error: File not found" - - -def unrelated_top_level_function(): - """Test AST node boundaries.""" - return "I am just here to add AST complexity." diff --git a/scanpipe/tests/data/reachability/fixed-app.py b/scanpipe/tests/data/reachability/fixed-app.py deleted file mode 100644 index 30470b6cda..0000000000 --- a/scanpipe/tests/data/reachability/fixed-app.py +++ /dev/null @@ -1,43 +0,0 @@ -import os - -debug = True - - -class ReportGenerator: - """A dummy class to test AST class method parsing.""" - - def __init__(self, base_dir): - self.base_dir = base_dir - - -def serve_report(request_payload): - """Top-level function handling a request.""" - generator = ReportGenerator("/var/reports") - requested_file = request_payload.get("file") - - # Helper function nested inside serve_report - def build_file_path(filename): - # FIXED: Validate that the resolved path stays within the base_dir - base = os.path.abspath(generator.base_dir) - target = os.path.abspath(os.path.join(base, filename)) - if not target.startswith(base): - raise ValueError("Path Traversal Detected") - return target - - if not requested_file: - return "Error: No file specified" - - try: - target_path = build_file_path(requested_file) - except ValueError: - return "Error: Invalid path" - - if os.path.exists(target_path): - return f"Serving content of {target_path}" - - return "Error: File not found" - - -def unrelated_top_level_function(): - """Test AST node boundaries.""" - return "I am just here to add AST complexity." diff --git a/scanpipe/tests/data/reachability/vuln-app.py b/scanpipe/tests/data/reachability/vuln-app.py deleted file mode 100644 index 32eebc2fa1..0000000000 --- a/scanpipe/tests/data/reachability/vuln-app.py +++ /dev/null @@ -1,37 +0,0 @@ -import os - -debug = False - - -class ReportGenerator: - """A dummy class to test AST class method parsing.""" - - def __init__(self, base_dir): - self.base_dir = base_dir - - -def serve_report(request_payload): - """Top-level function handling a request.""" - generator = ReportGenerator("/var/reports") - requested_file = request_payload.get("file") - - # Helper function nested inside serve_report - def build_file_path(filename): - # VULNERABLE: Direct concatenation allows Path Traversal - # An attacker passing "../../etc/passwd" could read system files. - return os.path.join(generator.base_dir, filename) - - if not requested_file: - return "Error: No file specified" - - target_path = build_file_path(requested_file) - - if os.path.exists(target_path): - return f"Serving content of {target_path}" - - return "Error: File not found" - - -def unrelated_top_level_function(): - """Test AST node boundaries.""" - return "I am just here to add AST complexity." From d3a7fabe172d59d836bc7993e4b608f07f3b1d55 Mon Sep 17 00:00:00 2001 From: ziad hany Date: Fri, 14 Aug 2026 06:11:00 +0300 Subject: [PATCH 10/16] Remove type hints Signed-off-by: ziad hany --- scanpipe/pipes/reachability.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scanpipe/pipes/reachability.py b/scanpipe/pipes/reachability.py index 844324bb65..471fb566a6 100644 --- a/scanpipe/pipes/reachability.py +++ b/scanpipe/pipes/reachability.py @@ -27,7 +27,6 @@ from enum import Enum from pathlib import Path -from git import Repo from git.diff import NULL_TREE from typecode import get_type From 311daf77cea1b5b9101bd9f3fa32ecd657f9ed98 Mon Sep 17 00:00:00 2001 From: ziad hany Date: Tue, 18 Aug 2026 18:14:47 +0300 Subject: [PATCH 11/16] Add docs for analyze_symbols_reachability pipeline Signed-off-by: ziad hany --- docs/built-in-pipelines.rst | 8 ++ ...ial-web-ui-analyze-symbol-reachability.png | Bin 0 -> 121211 bytes docs/index.rst | 2 + docs/scanpipe-pipes.rst | 5 + .../tutorial_analyze_symbols_reachability.rst | 101 ++++++++++++++++++ 5 files changed, 116 insertions(+) create mode 100644 docs/images/tutorial-web-ui-analyze-symbol-reachability.png create mode 100644 docs/tutorial_analyze_symbols_reachability.rst diff --git a/docs/built-in-pipelines.rst b/docs/built-in-pipelines.rst index 13f8ffda71..644f81ee03 100644 --- a/docs/built-in-pipelines.rst +++ b/docs/built-in-pipelines.rst @@ -48,6 +48,14 @@ Analyze Docker Windows Image .. _pipeline_benchmark_purls: +Analyze Symbol Reachability +---------------------------- +.. autoclass:: scanpipe.pipelines.analyze_symbols_reachability.SymbolReachability() + :members: + :member-order: bysource + +.. _analyze_symbols_reachability: + Benchmark PURLs (addon) ----------------------- diff --git a/docs/images/tutorial-web-ui-analyze-symbol-reachability.png b/docs/images/tutorial-web-ui-analyze-symbol-reachability.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bd0856001da496e8cb401f8f684bcab0679dd3 GIT binary patch literal 121211 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 XK8>fZsTAI^liTz3^_S&$aXOvhd&NjS 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 IA3yW{KWTw-(f|Me literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 7149a5cfe7..4a16a2ebbe 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -47,6 +47,7 @@ Learn via practical step-by-step guides. - :ref:`tutorial_vulnerablecode_integration` - :ref:`tutorial_web_ui_symbol_and_string_collection` - :ref:`tutorial_cli_end_to_end_scanning_to_dejacode` +- :ref:`tutorial_analyze_symbols_reachability` .. rst-class:: column column2 bottom-left @@ -116,6 +117,7 @@ Indices and tables tutorial_vulnerablecode_integration tutorial_web_ui_symbol_and_string_collection tutorial_cli_end_to_end_scanning_to_dejacode + tutorial_analyze_symbols_reachability scanpipe-concepts built-in-pipelines custom-pipelines diff --git a/docs/scanpipe-pipes.rst b/docs/scanpipe-pipes.rst index f7485ab01e..bfb3eb20a3 100644 --- a/docs/scanpipe-pipes.rst +++ b/docs/scanpipe-pipes.rst @@ -134,3 +134,8 @@ Windows ------- .. automodule:: scanpipe.pipes.windows :members: + +Reachability +------------- +.. automodule:: scanpipe.pipes.reachability + :members: \ No newline at end of file diff --git a/docs/tutorial_analyze_symbols_reachability.rst b/docs/tutorial_analyze_symbols_reachability.rst new file mode 100644 index 0000000000..fd7a725c6d --- /dev/null +++ b/docs/tutorial_analyze_symbols_reachability.rst @@ -0,0 +1,101 @@ +.. _tutorial_analyze_symbols_reachability: + +Analyze Symbol Reachability +=========================== + +In this tutorial, we will introduce the add-on pipeline that can be used to +analyze symbols from codebase resources. + +Requirements +------------ + +To successfully complete this tutorial, you first need to: + +- Install **ScanCode.io** locally :ref:`installation`. +- Have an existing project resource that is directly affected by a + vulnerability advisory and has at least one fix commit. +- Run the ``find_vulnerabilities`` pipeline :ref:`tutorial_vulnerablecode_integration`. + +Reachability Status +------------------- + +The reachability status can have one of the following values: + +- ``REACHABLE``: "Yes" + (We found evidence that the vulnerable symbol is reachable and the vulnerable code exists.) +- ``UNKNOWN``: "UNKNOWN" + (We cannot determine reachability with confidence.) +- ``NOT_REACHABLE``: "No" + (We found evidence that the vulnerable symbol is not reachable.) + + +Run the ``analyze_symbols_reachability`` pipeline +------------------------------------------------- + +- Open any existing project containing a few resources. +- Click the **"Add pipeline"** button and select the **"analyze_symbols_reachability"** + pipeline from the dropdown list. +- Select **"Execute pipeline now"** and click **"Add pipeline"** to start the + reachability analysis. +- Once the pipeline run completes successfully, you can reach the **Resources** list view + by clicking the count number under the **"RESOURCES"** header. +- Click on one of the affected code files and navigate to the **Extra** tab to view the ``symbols_reachability``. + +.. image:: images/tutorial-web-ui-analyze-symbol-reachability.png + +- The pipeline output also includes a JSON file containing the reachability status for each advisory and resource, + including the overall reachability status (e.g., ``reachability-2026-08-18-15-12-51.json``). + +.. code-block:: json + :emphasize-lines: 2 + + { + "pypa/b2sdk/PYSEC-2022-33": { + "reachable": "YES", + "details": [ + { + "resource_path": "b2sdk-1.14.0/b2sdk/account_info/sqlite_account_info.py", + "patch": { + "vcs_url": "https://github.com/backblaze/b2-sdk-python", + "commit_hash": "62476638986e5b6d7459aca5ef8ce220760226e0" + }, + "reachability_status": "YES", + "evidence": [ + { + "symbol_name": "SqliteAccountInfo._create_database", + "called": true, + "defined": true, + "imported": false, + "fingerprint": "43b2cc475fd9704759ab9c05a4e96e2b24859f9c63873773db7c35fc4ff09991", + "reachable_from": [ + "SqliteAccountInfo._validate_database" + ] + }, + { + "symbol_name": "SqliteAccountInfo", + "called": false, + "defined": true, + "imported": false, + "fingerprint": "8878c1a51c52f9f13f4e877c072a045ef5104ae4eeebadec92ba28f19a792e9f", + "reachable_from": [] + } + ], + "vulnerable_symbols": [ + "SqliteAccountInfo", + "SqliteAccountInfo._create_database" + ], + "fixed_symbols": [ + "SqliteAccountInfo", + "SqliteAccountInfo._create_database" + ] + }, + // ... more details + ] + } + } + +.. note:: + An advisory is considered ``REACHABLE`` if it is reachable through at least + one resource. If no resource is ``REACHABLE`` and at least one result is + ``UNKNOWN``, the advisory status is ``UNKNOWN``. Otherwise, its status is + ``NOT_REACHABLE``. \ No newline at end of file From d6f77289980907113e3a1d99b34c5ae9d07a48ac Mon Sep 17 00:00:00 2001 From: ziad hany Date: Wed, 19 Aug 2026 17:39:43 +0300 Subject: [PATCH 12/16] Fix a docs formating error Signed-off-by: ziad hany --- docs/scanpipe-pipes.rst | 2 +- docs/tutorial_analyze_symbols_reachability.rst | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/scanpipe-pipes.rst b/docs/scanpipe-pipes.rst index bfb3eb20a3..c090256eb2 100644 --- a/docs/scanpipe-pipes.rst +++ b/docs/scanpipe-pipes.rst @@ -138,4 +138,4 @@ Windows Reachability ------------- .. automodule:: scanpipe.pipes.reachability - :members: \ No newline at end of file + :members: diff --git a/docs/tutorial_analyze_symbols_reachability.rst b/docs/tutorial_analyze_symbols_reachability.rst index fd7a725c6d..a476b343fc 100644 --- a/docs/tutorial_analyze_symbols_reachability.rst +++ b/docs/tutorial_analyze_symbols_reachability.rst @@ -39,12 +39,14 @@ Run the ``analyze_symbols_reachability`` pipeline reachability analysis. - Once the pipeline run completes successfully, you can reach the **Resources** list view by clicking the count number under the **"RESOURCES"** header. -- Click on one of the affected code files and navigate to the **Extra** tab to view the ``symbols_reachability``. +- Click on one of the affected code files and navigate to + the **Extra** tab to view the ``symbols_reachability``. .. image:: images/tutorial-web-ui-analyze-symbol-reachability.png -- The pipeline output also includes a JSON file containing the reachability status for each advisory and resource, - including the overall reachability status (e.g., ``reachability-2026-08-18-15-12-51.json``). +- The pipeline output also includes a JSON file containing the reachability + status for each advisory and resource, including the overall reachability + status (e.g., ``reachability-2026-08-18-15-12-51.json``). .. code-block:: json :emphasize-lines: 2 @@ -98,4 +100,4 @@ Run the ``analyze_symbols_reachability`` pipeline An advisory is considered ``REACHABLE`` if it is reachable through at least one resource. If no resource is ``REACHABLE`` and at least one result is ``UNKNOWN``, the advisory status is ``UNKNOWN``. Otherwise, its status is - ``NOT_REACHABLE``. \ No newline at end of file + ``NOT_REACHABLE``. From 3282ef93d963dc516acc321fc93aead70b9b313c Mon Sep 17 00:00:00 2001 From: ziad hany Date: Tue, 25 Aug 2026 05:22:25 +0300 Subject: [PATCH 13/16] Update the docs Signed-off-by: ziad hany --- ...ial-web-ui-analyze-symbol-reachability.png | Bin 121211 -> 0 bytes ...web-ui-analyze-symbol-reachability.png.png | Bin 0 -> 111195 bytes .../tutorial_analyze_symbols_reachability.rst | 85 +++++++++--------- 3 files changed, 44 insertions(+), 41 deletions(-) delete mode 100644 docs/images/tutorial-web-ui-analyze-symbol-reachability.png create mode 100644 docs/images/tutorial-web-ui-analyze-symbol-reachability.png.png diff --git a/docs/images/tutorial-web-ui-analyze-symbol-reachability.png b/docs/images/tutorial-web-ui-analyze-symbol-reachability.png deleted file mode 100644 index f9bd0856001da496e8cb401f8f684bcab0679dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121211 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 XK8>fZsTAI^liTz3^_S&$aXOvhd&NjS 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 IA3yW{KWTw-(f|Me diff --git a/docs/images/tutorial-web-ui-analyze-symbol-reachability.png.png b/docs/images/tutorial-web-ui-analyze-symbol-reachability.png.png new file mode 100644 index 0000000000000000000000000000000000000000..349abf3bbba44fb6f5a3144e56b83603f8499e78 GIT binary patch literal 111195 zcmd43Rajizwk=u&2<{r(-QC^YA-KD{yL*BLcT2E9a0wpV-QC^&&irewz4yK6KAiJ* zc;I6e^Q$qdk3PDz)_O%LDM%u~;=qDHAOvYCF%=L9A`k@n@BsZ0cm*6Lb_4_>0!fPr zt9k05th(u{Sz$q41UIqQ1 zTpb9~Fde}CsHEH8twVx^4Npmd6l`EL2);ZTg({NGL~V$w+}_>B`1iuZTdfd;pmvwX z$i*1W%|>T&<@TxS%U9ptDE^4Ct)0c=bmk6=tQP@Qc>GR?V%a^((+ac4yHQ@n8rM+< z`15(#Pt&Du-i#<|WBP4z+ZI*bqoZ)qAI-!|MU54X}h3=kO(?^+st&73#16@ZS?j0wwO;xc{xMF!%0;8*^X)- ztcR=6xB_+&&E*d;&IydyQCu#4nvGFGeQ5g(tNly#5nluqHFkz~W5vvcw6K-(U5yF} zHlLBs(pjDfi)0QXRmiWp=K4Pp@(Wx($|p;;Xa3vvky@CPV2PQnSRA&zuvnTN506kA z!)eG1S~|q)u#!7NUtlnXF@;$oijG2}t*X~sNZcw+Yg=}#{xtPbB@6Oqa6YK=W1R*KZR-_wIwV*5(q{m_W#w zQvb7F=*sl&&si1Gwi?2-#bpC@F8!Xaoyx8_?AkWit?w$V5FFN)W+=~ zE(0N-L?2cqrIqjYi&9aR|@J3WBM5W4L$YFwYm=2+Zekw28B!a=g9UD8%$H1-q69V*K zdKqfH*B3BRQKR)mEea)er^+rZZc-J;bemAj_skFGf7N=^mEZ|@qeh`E=jnbkm@#3_ zzn|d7yFzEo$_%k4Gze(&@$atmQQSPn4b+gY$WyEJJ$eoMmsf0AAeVwEJ!7(asuT~N z7Gjw*EJ4G$xX59z9hT~0qUwMtO>3+sQpnTD;qXF8e_bda=!~ESL*@>6WQd?}Z{Rqp zEgfIK^7^ip&vi8aBah%+pBW$I_jD5DCposcQp^i%1lSotF5nL|h2VJ`8_0OPZWxk^ z`r*G)FjPvNdt>Gql;c-R#|6^ajvbQUe=*sw`32utsp4ROMzxxPdMYMEmdY_$(Y58j z)nQ@`p-XJ@bOy9roLnP8_XaA%P1LxH3s6ond)=+;@|&D^W^Qe4qNQ_td_(gp2#$ za7FSUv#}K6&TyvctG=r;NDPBd-TxgDt9orWhfeMDS6UzQnIF0t15?;+RrTm{b;LFE zl!PZM0XX*r0{a!jIP*WgP34<>*RH9DUSEt+x@f$=;O6tag6;5sYs0HiyYyY~c;I_0 zGvopl6zifVhlYja2i%u@Ov7yVJq_;U#1~6hmn{(c(uOBhBxUbQBn*ZO$xR-;CsBMw zUUU5WkgA9E=nJdEBBqv(&eeH-fP)-JOqOgw(IAdzcIa|@w%&6V5plI7?i7)gmG!oX zpoQtWGOw5w{FtKdO#XOd>KJOCEyT%8%?`iwBiyk|CRVz*7 zvfx(b=wUYU$C@f>AE#Ubp4U!~JK-feO&qH+Uv4j_=bO3@>lztFM0*k`)L9TQWHCpd zZ`Ypu-cI7aY?o}_WkXpiHS+LySfY^1cHck>i8T`(dNXKWEZbblIx-;=v_=lkpYk_D3{EoMsikAMuLk{(V(sGjTGzRWtX>upxnDo z;r6FgCePLtmr0fQze1JRN+cE#6qwLuVh`3cC=-XsVkltPJ{JwaDKa{!(W!(TJNKhxJ61kVR_f`UWs3lxNyj61W6)yr19zgJhlZ!8_qA!XH{|4w zn#))51dB&OpG2Nw(rB!~(N?TUv9X~kmFzNAP%^bBPV&5Eylj4oYWNJ_p?15GAY%}1 zA|);(jQ8~%#^O)&4Pwk~{LCknoHf&8IdjL9lDlOhF-*EL?YIkvrUIlP)>`@oktI4)BjP(f?=)usZx@u-a)n_m5sU@McX-z*^lP7iNmD&7q}#&WOIdokm3Jb;)gk&aV1%`7y2G$@20gl9$vDO1V&6)kamkN+xueZdUdec zi?wyn1RHI2&xV8ReNNopAt2`!z{(CPxZd2y`n^B1wuabcAoAc#wK;azPU&>BgRwLA zB`P4TxERs^%gfnZIH+yRH`k_-z-YIn{e|!Fa?-0%50d&1{#@fP@3Xje%zuY{r|k$R zA+he8Xb+XZLzqFo_{)E=2E4)>sw zSe@S|;YJKP5Grvr`>M&ieS9Za(kE3l9GPaSZP2PxC;BE(Yr<$7T-2xkfZ5HMlw4h2 z_FbhM*I2wOrvsV&YFEYyTkVGwn3km)BDQEbsK6REV}qIsB7@Ba;oNkt^}12IkU@=K zJcZq_l|y38R>3!RY_R_Ec%s?O4sq@#zk|vCEC+k78sQ|#e;JmKiV7QifNld8Sr1Gp z+_n7iWy%X@qVSVuOgc>iIFU!fIJTf4#?r5{`0mG^f!_-t%l$W1F5fK{bNQ3Lb_=#u zpNHV;XN5|ePg#7D_u7TK@}m8W{e-)n>IR42r9x?l5t z;N@zi0~L1V2RBrveR2^ci_KdEuG#eI`H5-wm7WJIvEw?Q?zqSXD0>{vV=@jhu(`cH zO%*Ey`LA}g6RO;913v!vNINSw`CnUDOR4~#XO2K~2@xc~T(XN)-@7sMn8|mUM^0W} zABqhdcrbnWB`K}YJY}j(pW4}Esr-75n2Rf&(o$@m%zgIhwaICpxg;)sZwSTXW8omL zdgp{``~fVF>tFA@-W*U|H|(y7=SfTZw$(R0ztCbr7*8M=_xm@|!s1eaVGtjc8WCew zHY=&*-491s=ywQxLQ&%Wc)!x7V6&?~47%S6;p|TN{ocIMsnbJxSRk{eB45AM=RfMQHjg91N-il$G2V%MXz4|J4 zSR<};@~vT9LtPgmoQ@W zv6emXe*;POG2LZOj!KP*@M>o${>NvQ%hR%o5Gqi?QO{F-8!KHK3J-fwhyOE*LUwDH zEX*>;_mZ`Mhu&hK1Vnjl`c;FXbQB4td z65GqslBTYrKHX9oG1(|peOU469}jQ2V#Hvb{W2cYJQPC)8c# zYbHd=xBH=(-5Jz;b3Njw`Hn0KhJ1^Z(dkResa(>*+lfAmo4+pU`tbC)`4q>?x5@AI z6zttLb-v4FEah<9zz{AHyL_MH6bWP(ez(C0ilcoIG+9`~vipR)^oa+(=F312>8C=G zOR42vgVslA+PSmMBQU+zjzhS>GUKhWSBrziTHzuh`@y5^Cb#=??@WT}w$7)DM)pq` zAl#mb1%A($XrK33oC%I@jm;8Bp~hNA?SR|#;3{I+Rc-dF?%}Ebb5-{l90nV7{;abih*@2@>bg*-X8&G}5{)moFeh zbbw*=aJccsm&%i=kx4W#AaTvb5*{{?!Js|Jj`wc6(8u%r(@*zVUsI{~%JDA@fQ{2F z3wOiSvL%e-Q9UPrmI|9-UTSH+vpVN-`*y1!CY4!7h}}Lh-M-ROfak%mYLGe^+k~WO zX1Wvfl)G>~K5?=pU_WIG1SAo{sbfw}Nt#sucXpo!m0dZIe<9V8$jO_g>@HU!i(#`O z4*!tHie-N(=5>?T@C7FxwL(9iCY8Fd#aTSGO8R8tQntxjjIhEt9~N5#tpO^*;Hs$q z?^Zr;?EP(GH-Nk+Wo$8=k0no5SRpa7yZVf@(0-3RX3!R`S-pPAyhKc=GdEK9VgadE zT@WCR$c%1Gl|o^cp|K5c4m)PXjlBtjxJb{@qVfqw26!35SL4aNa5 zXyviosSBOV4p1aT<&0&MTN2F|90=7;jHAJ#yf^uwD_XmMpVzuH+wjUb_NB&`x$!W$ z%tpk+siK|Jp2MYiO?s0dR3_LqHc{A!BG1mE$v|v~3C-R2DE*hjm_n z0SXHZ-I)0X$K|?1X205j^d1Nza43yEY{?1ED(wRkhj9kdYw*P#;HnDCx*S& z=oVTbjC1TXtx?hFmhYJ9{Sn2)fUv)#v(FSHb{+$Cvm4^9th)A;QPrnyR*?zBFcs}=)i?g^+yqyJ1z>AtqBZ3-bc?<<@YdTc3J zmP>Z|K7kWK(y!(Zu78W+yp)~vMR8w`8d~;X&}utz$ZB;AOB>!9%?8I9dXF|1hrQaF zo7kQT~*m<@Yln~-T!27Z3eq)GQuZO z`>M?4cC$`P0V(9#e!Av^ZNq6B(HcQ{l0+fAI7O~p;tGR4k{bc8Vsdx{CI&Vi3yJ&S zHF;Zlad|ng;S|$Enc&V;o>y|YB#T<;?T7vRCZVp2+kn4orZYpQom38n+|H=-u-fXf zGb9yu~} zAS|QcV1^&52T1m`uy5=Xy77OmYNa-rRt%IbBy}!5$w1~c~05u%C)vA0wp%6 zvcnn&7BdyvA7|MbO6S77ePc7)f_ox>{C&k>)-rKsRG)o&Abc8I(fhZdyTccV__Xcw zo1-?)TNn5C>64%p2ZLU7kP3NBf#&_4R4#+DTV(l77Aus( z0%R=yN)Tm2N#2F!Mp+n@Y6U14OQaQi(tYXGhfR1d7Uj7XD1^#rVkkOY&(=ELBR5}l zh?@(o5(Xw9(i`$h9m}=yb-l-pA)WeUBj~m#j*jl!ge>fP7;Y??$ zR}D2&FM$v$9oO&ODZe(dw~x2a)+y9ZS(iinQx9ZDOP#x@x;e*Ne0n1_5!9tmKvfuX zu*~iZjfSCDjikD^UiQK2Ahb`{Z>B}Mw*p5MoJjkK$6-+;q&4vI;pw_6axt4VkCh&r zeF94!>(oa1UzjS2hyM^LG8Jt^7XVKJr^w+hrXsMa^&EljbZ79}H_8SX=t2inSwD`l z^^fuk&ZaI~1T<{TUYAe&E%oKN`78%hzb>M%ZmFpC$vE-8Qfw-o>8A$ z>OaSD5Gz*E@#WlT7lDE@eCNL_=lHZEi*8p!)Vk`+ru`Y8$D=PUG(741ey{vdD6M*} z7l5U{&{}ZB;<6)KsYu$E;pshnASz&!u2!w22;maIb%=ECwBbY+vKXTgJJRIe9 zpJXuXU6_xcK6ePkVV&kK!N;_+V9?GGKR2^rT-|bss}rQ0SBS39oa!&)mcgyO}eT zy|rxXjim<2H?ud~q3=hO2yO;hv+u=*;#PS^C=F@G%q!{C-982BjR`V@^cFW+=T%+@43coff2@ufF};8z2N39z7e!2%RmuTG9#3=+8g_j z88ZFyt;jutol=XM)9u22%ku@dVlP$R)!pSb5Hl+a!kn*q^`4on&bf-^VJs|3Wcg+E z+nshnvHpmsm>RqHUsqft(B%CSUVLEY9R$NmOF7S}#M)I@isbu@LVotu1MyCYG4H){ zd3ZmX#w6Cv@`LZo4ZDEmD6U$34Q+NwIuH?-qG|G}lx#IRzj|j)aGmiuW;~Ap{b?_l z&T9rnlc21cy+;A@bX^&WJb#sOL#{8 z=F%Jw>l1nYFsj4?B4w1>N22k*p&`sbxVvLQIpf4v(tio%EgzKVqSzxRq^>_c8+ zA`^j(%eC00y%czeh>@LHe*!HXyyxQ_VU*oSB1N%Vo6iqHR-9$VE~A>CvFr07CpVmU2MT&7(j(73j=u7~ExzISEm?@ZWl7I&m+&}kk|Jii zhQ;U*Ma(=plZn5_uX~)iaeF=S^($nB{rbK~D*9A^bh&V~a|lPL-SUx9ze8d@2Vc2E zms)@T8#^?=kYams+u~rd7@lLhOTUegC8Bt|Ztg&uAj3OO83 zh}6{7qt}1@KJtS*Yyj9q?5-l$%@@$Y^XZBoG8|@g_nkbgp#z~4 z3qfuO`>9P}uNuhIQtoZIjO1ca)}TnrJS=(eM*%;&&Ru6u6)D5P1R0t?ZHfxNeRKe0 zlSyAm8dcUjLD&^nV2o*Zpp2Pn`F#|%3FTPt-`cywvc;Q@BfHZRqet?+&maMRkq~3( zb;!V=-5m}*LVlyV&U7qNec1eZo{WtRolsYhL{A&$cR*-5c7W*qJUUoV(7}=mm41hJ zApz;l!d&&|vNgm>Nz3 zVlwXqy99~Q$G+K4mU(~N8L=*18^CUdiWM=&#g)ru6X7q39BUHrK8wMRSlhgWGk}1K zxcu7YOs<;e-N(iRXHbhpT3-!@stT5v&-}>fb59Hkd2fjzsQkG#UoZ&R5uI%E>*x=K zhRrT{Hu!JeNYb|SOck06w_3K)(9lBJ68IAhW~6L3Dw_NRnLzSY8=NdrHF$V!YoTH7@H`zK++CH>Nl<6@h|7Seg!Se*?tJ$d(z1Enw6|w_`WzYuMMz zUIr>E^iqb_o>6{iza{QMG2sDhT$j_q0M}qxJ0NlsejB11e9%_A~pa;G464)5^-?>+nu|s0zfEPJ)GLGtOb$^g`#;0X9Sir zZEye$7;mlaubMzBhd*Cvu~Or`Y_l_%1L0Lixl16gdG6cYV)q&bz($Y98q#1|Ts@t8pJJ z&7Gld@}~$lK)>|2lN}iu>7Wfno7&Mu?Eo zm0faDv?s|I(o-Kx#W#5bntJ7=?T~kvfzgovXaW3xcc2j(+S$d|m;bmtNvW0wo9M&M zS#ZDL7x0EC&;pap>fHNe213VymD7HJ#soNVhF=I(YnLoEpry8Re0M^(u5^LsL{eGL z1vF&rA$1h@s8MDwrJU+}HrwMnKdqh++Qi=3kWpRd8%fT_8)CJrHs~-`x2bq zqc~ILXnKv*4eD;M2eEA?U;gxEV~y0#p2YZ1S*o1 z`-t4_dTIAk9()NB_o8qeAv{On1vw5{|v`<1??Mt zpRt+M$I_dq$tqdv8G6$(!x&<{y6*#j-U9S${pWGz@Dg!9vq-d~X(R~rG!Kj> z!}QFUWF$M$Ym#vLzKULKlp_U)h;sj^P@}-`f1Yi6qlZ##Haw(v0)cRiqH)j`WKzEVuB((W7PHzh+sVhFG`T2^ z+m2U6krXYoJ;5zA)#j`ogU@b|~V~KYa?-(jC_PW~9sf`vA)bf*69tqqx7*3T8#&UMpq+FLR6^zsvlMjupaaFwpNpG21a ziml0B7L`#vuGfS*ZqOFm+KSZy0Y$1lv_qx2hxPU?3N4`39bL0(wKw(j`Ql(w_2KdH zS_^|ZD;Kv)HBj8Ld8#91pyqwUsm=Q})kCE4==+hnzhsCvd&gVR#eSX9v_h4;lgGW- z)lU4wFEyunOKl|TuK_+t`ET+-&AwH=+-Mc8F^cQ^ia1fP&Uv<~TA)QNm&x}vp}D!) zq$gF+^X1`_K#PyFIwF7gOu6b6YQ>)XQFnLu*0Ca!|4U)P`O8}KGsp)Cudi;u`k`&| zx}l*#q9pcExmtl;?WrAaU2*dJy3|VZy;6H+-X-o#XQub_$>VUFYg|TrL|Ay&A~)L6 ze0hBIE&^11XwLaJm$atwL;!FC1QSGFERyK-S%h)8b0Twe-)5dU9Hv9QXQ-4&#nT_B zRSdvD{R4HO@DwB&1CY+DQFcHeCes$sO zmJz9t{*LUh29+mLj{YZ|gW2KI?=clizx{UKOaXv*@gvqv=8dr6&%WY&xunnixzELS zkV6b)JIvUyE)+7{3YNs41J0$~p$85cXp*HmDCyieP^sOx_XsM3PZfIVr@n+5y+adA zFaJ}zknrCtpY2+2d#ST#2pUjT(A(s0*8GhJuy2% z&ojypl^2enFbPZW%Eovp(N`*EYuOpD1#z$1Kb)=H_JQ3rw-+@hH`vh5DqK6In-Hm; z@W>wGja_s32iW|vUT4I+V3=bHgDSse>)lLpjJYbho_wS#&eabt2 zKlr4n_C5XMARe8Ok$t%4`Rm2`W5S;ta_LZg!67$kgrXSh8>~Wq)x+t~2t=8}!w=10 z3k>a{ARxjvM$C{r{oaCuvVY=Y7*3O=QQYIc>xZ&gxpJnhHMj_J!q2Dnj$yVoR%)bO zw)tNpf=4I>eqSD_zK=XPc#C7=ghbWTGhCAsU?XL85ju8{8*Q0 zuPhhpSV?C!$-+5Gbi?&T4Jr; zMYywT+clmN5{0!iULtj5^IRTKSY?c+yHOk5VFAE_QoG&A1Fq=$x^$Z$PE& z`PnHqvXWUKPyl7~s!A-!4VD+hH@=mK__F@)vGett( zL#npNf0j>_1ijUg<2Igj53%FcnoPeNT3|Ihhf!@W?nGQ9VN)v=0u(h+RLKJb z?aMsh2MWQ9@cJ$x1ULkY&Lct=i#^{~oeshooP7~r zFMOu5{6-dLx7N{>&dn!C*Qud-$m+Udnv=zl#rv7Rq*8o2$MgOT{I5s=%#W8eDjQ$( z-qYJ}Pns`3%04Ye^x|RAr9&R9`y6A~k?W`5JlIN;S6V`V14vBJ;q8Y*7bLxr>kzg- zzxydS1QMa(b_bIlPs5J%!!54IjA6d=YsSHvxJSClpQ8W{Qj>63KvoAE@D8e?YWBMa z3vd{_aRP|Wms|Pq+Vzdv7j{Vbo9BadWg;_+Os&-`-_a%d7gp)H5rs14QzR~~1(!(G zA|-!xI^>SFUpCeGo(~7q0rFkQkP7#Nd>SDipBiaXM>d!rb3l>(&0?3`7k77kO9;ys zd#64E3cTHB!*+BW=Y{=GOU|&V1;)?Ht z_Bs2ciAT~PcX(~vo>Y$p7ydX$l)q%+?7e`SxacSdGC**D*R<1yPPqVvn|^UJd1X>& zzgKtNbVjR%qAA0&d~VHzA)T2dx23)h0P?)y=wJ4|iVPJd?JwNydsi#PA9lnDGZIy# z--?_>XH1shgkcxd_}TiXYOEGfG;w?SX*|!bLT?R;1`Vg z(hYt<1UTkspqfr+l*fYw(mXRF?tR_F$svIr(`w4PX(?@g;bCPRB#-- z#z>{5TG0frmu9*ceo>qoLxCQ9(IJ|AU)6D%rMx0!;tlJ6#D4h42qp~UX~tm+B}YFu zky6urB$Hiu9~JXxK*aC!9|sH>lbZ{FgHG@fy_yfa_jp^?CM2M#S#YWAd!$bj`0BI) zHueJUTXb1`egx&J#l0oJVrI7|#Z$QHJHqJ!+*-WnX;Zd=$}w*vh^9b;E(dJ?$Cq_h zORUO|qdb=j)7zh~JGpCW8#Fqr^T?IkpCSZvm)L0w4XPD@CFyiqGM+tADn8I?H~sd2 z6w27H_R?kj6KVYtSNxBQ@^Zc>fHR+Nvz07n_0WDyag# zEi~9|stI^_c#)u&W@d+yHySFx&X81*F}(-Dw-(W5bIZja0-A2Kb~8a~YM6}L(9@-% z3Do2#dZn9q7dBjUW33qmODq#QgBB5J=K&PIqv?md_4MMsuEh?D8QZKQLp+g$s>0l=daZ#~YBZ03(kM*JQ zaRQscIsVz-=6CheTA?U&gCc|J`;ypaRojn39sa}zyqg?=w_xWx$izYlg;ZVttf>0< zfynHugxS;5D=C{e`y>H3>r0aV5qD8s@RwN~1E*ZV3Jsb>+AZ#qH7?gUrOr<+ABQj% zQSwQ8W^4kLKw=2L+S@uWzKU0*GtXz!iyNP$BWruRon+xMiWUY=6PH7FQaGDR7u=Z@ ztWLydyY*BYia#(PIvY!OJVXeg^1&R0EmswO9Ini9jXLjS6wZk&Yk^quvNkT3kO zF3s?IiCniYZ#?-Bt_cb`KRQ*L{Y~uGP^Y*hkwS`@tmcp1>J%jr6fCfby-HwTydK0d zy|=Zre2+_awzmh+TnZqRN}60BdE#^VV&<#Yi4TUc$Xr~1?|$DLmRN4Ej^&`oy_}yt zuHUl8sF=ymlS`9K$aR92r7Fs=k-!?gEQ-#2dF*I^w|t9@Kh1Cv%=?Q%N1)MvCK<(< z7v4vte>^6{0A=&|ftgT@?F=xvZ8;{>DTj8>VU1B$%-MGlE7p=gGHq8+9yy70kwPY- zBjT^M0+pZq`Z+W-yx6F>9oI+!{Xq(o-%)HBm*I++ z+hfHEMc#|aj!OA|VXS26f_xwnwkR4sHf|nvg!dU`VKAuEr=4T0kztPd9zw`doQBii zyoevlsA=ULQ~U|)U2P|JS}m7<3p;8+%Z>lN@T*=URLDW zKLWy8bi7GaLhC;(ohI(t`{? zyyZSVetcC1QyOP(TlC!Gnfgmx3c22t7OO$1F$H7fVGa_+W!KJqZOlDN>m;N_`fQM zWsFDAXjy(r3a-$?;W!>KpdDT^rUAji!iuD5Z;ppl1eC!>zLWv{N+YqsfK7M0@XAEy z0h~qTUUObv<_8CP)_sP)wO7fV0Jy!D-=dBJA*pKiRMFSoR4<}s=5Q8mCYsW@e3VjFB zt!G2b-%;e3k^)9yh{FWXHzvl^^)imDgPF-V!1KPao^SVMMhYi$Xt&JikMGPVp;<1S zMy8&M%|f(@&VvDTFufuUe3W$ozxNzC5sGJ2ZVCIc{`Ptd;bbScdhtP(?c~lLL1_Dc z9v3pT4&O`LH*W-FGZ?M7^{I<{Rf@X)vNi6wCGWKb=KNi$N0+6-QjI1i|20u9oo@l( zK}$~=nWEKM8e-?DY}zG%p+QNiu?m-sGpPO!GNI5<^`w;2wXFXAm*5YPW$Z#D6dkShWxd+4Jdtrov z+^LT0xs;6}(Q5U_eQPu)CDh@vK)u>~oP(pK_>gB+hq?JXAFZt|+CO{>PC}R%A&lMh zuD+H^_drMV?VupL%re$;fI*vKrqP0u%S*m(c(M|=c2*C-Cvg>pZebTh@ogrc{4uBdxafCBM~m&3MDJc`qo&q9?H8i z9qK(`Ii2$YkReF^dS~Kj=Ec<2)W)p9sik0IQUfr70XgD@!1%?D#2J=udzB?iEA&$c zasFgB{D*mrd#|8XV8D&%9H1uy&__a$1E9{C@c#|C* zvBLQ<^hmmInnq*|9IS^pL>cmV)LL0TA5eZ;H1teVaT``ye8OaQmrLFiZOJgUff9Px zcidk+>%SQc!{bT)gjykk%XG+qGcPqhym6E7l(#Sb8d|T+dItV3aRSEX+wZqP&XM5y zevS|bz<`bhCI7%@)UU$@1qH_*INqb*a6t5{7pQ4BH=q`$b2M|hfM@}rViHkA%3Jk8 zG8qfTSZK3{xesOOi%F}Vta1r>Yxy^>zP6Xq&`L3yIU`znH~MH(Knt4s5t^@;X?agk zz(|xQKr^El_CtrA@Q|Ix_|I*o$3(yd*PC`Ll(MTbxVd$&oF$xx_LBq~VWBx_ruCi5 z9#MWY`2B5NH@me$8SStoZs}Tu>7yiUVLJ<`t*a2 zzKOb?A+36SKhU|m#(^KG#)0D8UqX-#^t6LNlC-+9p)@kFARW=*RBAWMo>q_^>~33N z9YGz^llnJA#t|tWCaAMOs8Q5x}lD_p3wU>U$;=%kP_(#6OAZ9VA=;RNIwU zcfZ8_w&nqjCMqgw_+xb|E%E+4g!yd1j(o8GNR%4y)QMcA@v%vb?xM@Ane|PRvA&lG_K{ zKL91;1)~BmziqhFg_Pq=HfJnv`aRz46NNT9IZB*%i*esg%6N*b3VHryQbIu?0j<_< z1#|&~P=-3)=Q>l7MukdGN*X_~t}iB~OkPXAZy6OvR9SgUyVH~o0Bo8`*>&0q|9e<- zlYfE=y!C(l$2z%$MOqZSHth3fx9pD2SKtKAz9w!(#oyKVJpzC*c_gDp@s<`A# z?YPFB2Aepn!(#S+fq%V$!6;ErV%C!rkbR&%9W^U>0sm#=?+5gpnstT z_^lW3gh-Ym*(hKxhBSa+RaW?4s0${5x+te_XDuS8?wLPaFoQ}NeH&0P#jsMC-F+Q&UhfY^TU_Gk8?r z6MVT(jqI#GRs(F86@vT?0zlZQiv`W#Vg;PlZdp1E4#XK*vUqR3NLINPOqg5|tqR9f z!Pu(-#NNz%Xb$TsgL<3L!%l7vqn*p?Ax5aou8PYqs8b&C;hwT1(RF8%sRmU+)4`Ko zw9GQ9Z5d+K+7I!6Sq#NB1INu4%C#1Vi=7OLMcCqUX7xHH14_F=eEQjqAa`pSTa&SE zDHpaS_m@9boIAtc)DSe~nm+TJwWHthNfL?GyikR%U)TBlVY+E?5A%^t>BN z8&`G(C;I973YXQq6%<{pa>ZRTAe`b;qPBGSlpU_`0)TX;(;XfQE;C_iM3_U{zrm>6 zCHMp&jSL4)e6tTl+GTM#&STg3c`nFS5(5JRFTxvL^R4q`(!{SRzN2lRQH~pRCv)Q| z927zbp}Q)LXWTPvb|tcWna4s_`aM%3YS7f;x3dfjtKjaS*Jm(|c@q*YzcJX%FijD+ zkvNDxglPO^2|U8pj2D;lOTD+wG(eO$1+j%OzkZDCs@vZb4yAxyocod9W1w1$q5g9M z(RPU{vhav-^dhJt+>+LL>5EL-IZR;ervQ@!-cDe84`pd1{+GM-19e6rojYC^_y4lyCK9gIeJfg$V`^&f_TtF%+V$;Vs{Z zT;&}L3m8EKLc4Ehgs~?ntRj71=JyS47vEFU>Xi&PvIY_3Y)qN3-zJKpy;m(2tl{&m zDYa$pcfuG~_&z+|FOW9~HHg?78gdO(ho_WR#7g>k*=pJw8P^Vkgstu><-Mbz8_HHh<1`lM$l;5*yRI{oSQng{PtN3n@(hmZnrPHTKCM z>F>BhaNl=N;|#iQXXM7Pu(YWR?@*0rD-qu_c}0Rlyqt3c4Hy6-h>+Vw%y&HB&}g+E z-}7bXQ-p-ts;D{@`WP}fh-9WIJp+GwoZ<5i==x=1&C~#pgTgIa6m`r3~nb0<@5GBbMyIgwAd``vinI-l6Z!7K={W6##`UcKd&`puYva&EOU>|OlPn!1+!D-(KGM+HS$=9`f>JDc{DZMHNTy)k}eMuFwz^kB1JWEWB0 zUcg-ckhknXP?jK1SfM+dtLU+5@gFUK*+2q8q_dg7a>9GsV0tf}b}9yHMQ3MRa4NEd zOWKK+Bro?QOO73G+Vxaw6LRhcqET|GaHXCN6DW@I#xVbk;YN6?^%83B!^JxR0TvEW z0lDcf+=gw6DOhc9N#3?%MXa^+e@UURDZmn$KFQm9obvbbla)P|Br-=y*MsBVE=3I` zcX@3lk6kF(2+B0B^%w#JeXMV=>&AQxQlR9T*LiRv2M0p?j@P4G9YjR9o#D8uY;C7^ z+J7WwMtCrRp~#o8?9GVq(QUY?9Q$&>sD;x%@)E$d6aNNA{!wH7-z+}+-;%|N1)~68 zzM#lR=;`U#pT^h)v**=EE-MQMsHKo3BZ{PwsTcz4kV!bCL4Pqv;4@1h0}_FYt5GNb z5GQFiQCV18B8%L|nD>4CuyME>mzT!~s3|^T?(I3fB8MW^3jIf^Cl(A0v-)r?EE9XN zJVRXi`qw9%A_Di1dQ~n*Hw*$b$S8T9?;ILcqA5|I z%$;En;HM)NW0U&N(>xsV`&`EN5Zc%b=e{-fQr6?06b?|Dj-^xlFE_3R+@J#Ek8g*$ zlD=rDIMI~jYb2WPr4M%#p~w_p|ML|Sm(xigs=Gf6uwR(|$0E{FC_bjPVN%%tLjQrs ze7PYjisWZ$5Fvv{1;PCFn@GYvU@{mm4l)i-cuft{trM9{GPJpQl%bIkm@J&jZ4>g7 z)c^N=oT7ts0FynS;u+tZ7bE`}8u}VSOziq4k>vmV3|n%*6w`+f!3D3+wzfYEjTkV5 zNmyX0jT2%kkzqn0g#Ixbi2{Tl%-&G$xp<0@Mk?l!9dTqRdaY!?Mr7z_DRiJflYj3e znuX)$6+55b(^p9WU@Y&U*c9bOxt30)Smq1Um;@alW9WIlulkciALC6Y5OuzPKb*#R zaeEz67~I5Ft$?=_Jo|1dv8)j{YeI52$osR zJKJzod3<^CV$-ZChz zt?d?VAO^wRJwOQV5-hj{?Lg4r?(T#j2@b*CT|$CGLvYt%fdIiRxNG0Zo4w!fRNa5~ z)ID|9k6pV$*Xmw#uKDN~VvvBdS67?WsWGbNqvgKa`q79){tYa4cwW zM4G3NOgb-67m3kiso9?yM0EtJ$5FOD{$!H zQrgWl(CApMBzk%&q?SoMdH4N$i|*tc{26F`b^pfteBS}iQ%YPf^xd|#-J5CIft-=^ zp-@mPJ{fr?i!C@&qKACC^G3QKw{LRg5SaCEF^ndmncHxA++d)@(RqP6OIN!jHFh|3 zPwZW9XMXS?__1C>0)CN3?n}S|!!E>d8BGc@pKBI4TI;{kZ9Ts%J=d%^BndvV2#R}7 zILzTklELe~Ph3RKN$W#Q!d01$6?9DZ2jelfq?>gR=AnEun*SzF!yYVn z>2hFNDnc_u=O??})PsfR?SxJQW#5N|LMG-=t~&R>@6~MYQdrEENt&y-(tS1kbb-8h z=r^(q7*>RWj{cs5(HDe}uCq(%g9i`Z9oNG6T$fQ7n!H8F^JJClMTG%2kXKbQuI2EK z2tFE#j^cg-diaKxPq;wu`@!SKM*V>X+w6*dm2>?YW<#O;-mTfW1zB%%1sL8`XL)AA z8BGQgSyP6mcRHk%#%iXOh0laG@*IauFOHsR!pdzXzO-Dx42e$9{Q3a9!hZF_Li6q0 zY^UpW@Y1W~y^cq$u-)VHJ7i3#)afyr{-TF=vN=1ImwkAA+>>R1b8xlmb#ZysHav_^ zG+ww?lG9jI(mpkHqO^Gmv-7DO(6C!ROTRW>EGYI2Z+5?Y^lgK+BWdY2=4C^!=Z%>o zaQD_fTL=nAbR=ZVi`qhLZB2tw)_f&bf@`7y$p5sS>OM1Fd%=6~bB?4s8w&PZx&EDS zwe^Dkh?~L%5xiAG?8)v4-VabAWPI(I1Z-r51rWS=@zl6KI-%6w z+xzyCil+#QD~L z!IZqTyF2u`36N|JSEGd)^ef^#{d`t#Iq$N`$htuk7WaK=^YF(@+4%;K{9$C<4e}2v zCB|biIEq+a8-WYg?Jc%73YFpl(rWY(7gxIXxF6cr*0~FJmG|A5;P5n5Cnu*0`@VJ3 zON{yd^kAe{>a3Tz^dhaxlrn{LZCB6gKhq$~EJni1`TtDkqR5|sq{t-YTYlMKzQjMOEa6`rD?bZ?_wJFE;FooXg1Sllyd z-90^=l$ST713!ERtWQJ0{ryt?<$GRCIvPvgZ1oD^LW8$Nu0U(suR+qijLZu+oq9(C zAweF|J<^!P)Dw1Yh=B7AHu+26Pr|w{pOcZ}Pe7WGS zT{LfSwX~Dl#un=H--8~a7|RB2k@n^FqIeEXqtT1NkNN;rE0M`IPN7_ovmG4)XL=R7 zszSel3-NIGH278Y9%vHL72JJ^vO~aBbQf@*)P+@B{S1RVir|GAqWIlbk2Y3#aV&nM)v=0IP1 z5@bxe%ajp_+&+Knl6zw5TF}utGwD-zb)XD!eJU|9T%e%;eW3KN&X}%DvB-4vyyX-| z3kfYVK5WMdQ1#i|Pn_ju%+*V`+-64+Z9E|jxbbk3y!!oIz_%98+NHi?<^!~)JU&5n zj*c-poAb2~ws#*ZpTz+sn|i>D5ti=z{L=`?{(Mm+t%{nsS(~eGFYvm)>dln)qZCIN zrMJ^}w$;@ZlA5x92?0U`n~Shdo=l9`5F%-P$ZA?2{u87O*qK_C1;;bURjxCmI!mIQ zkSXJRn8Z${_ek^@{|-aYl|r2&PqTH8s7$rx0tEC5x&b`!0>{!3zJ#M!`}=H+41XP;;Z$BFBTg9u2>`@Y zGUG49G#oFRDk~{KA?}002Ty9djI^8E8Pm<1@y?HOoyCk21V$tKAsDvivyFnL3Pkx% z&#@HiwcIv426W>3aeP)3{mg-o*2&|S5e^*E(i7#-pu`vpPryIHXL=i6wW0;NL`AS#VG>D-FGwGB_1^N1|o>u@)pK~?}u2BTJ$cG+-KfQO`>|gKm zsadZl@UpZ*^3ugTnn$Pm1uggtqB)26^o3WiUNu|_>MmBNMI~HJmQ6nbtvLyhxwYIq z$TDftyGbcM@!~(#gtx66fS!!`co9$L0Q20LVb31Y!O2ypyr8F>9Z>Pg$rlFbk#>O5 zUa+lq8IUrcs*eOh3Ye)I5(W&A&}|=uMZ%!g*7?A&Fp@#$!5CgQ^lF>=Kz*c%AG@Fm zYO6O_sX@OwxHKrTBi+gx1As9OYrjLgIGx|X8OUFH2iU?ws6MNCmc3;MuzCPe#LV7l zb_lE3oX-_v)F}Dh6W;I|IH;JSVTx>WK4&yP9Ond2);f0(3 zI$ibFuf`SPe6cCZq+5j#5>=@buHu}VCjZe#sJNzjO}?qT0y68H{=XW&I%(ROk=$i} z%0A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 b3w(t|%xVSYMY+QR0bkE0 Date: Tue, 25 Aug 2026 05:27:40 +0300 Subject: [PATCH 14/16] Fix docs format error Signed-off-by: ziad hany --- .../tutorial_analyze_symbols_reachability.rst | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/docs/tutorial_analyze_symbols_reachability.rst b/docs/tutorial_analyze_symbols_reachability.rst index cf7b623ef0..41f7b891d9 100644 --- a/docs/tutorial_analyze_symbols_reachability.rst +++ b/docs/tutorial_analyze_symbols_reachability.rst @@ -51,53 +51,53 @@ Run the ``analyze_symbols_reachability`` pipeline .. code-block:: json :emphasize-lines: 2 -{ - "purl": "pkg:pypi/b2sdk@1.14.0", - "advisories": [ { - "advisory_uid": "pypa/b2sdk/PYSEC-2022-33", - "is_reachable": "yes", - "details": [ + "purl": "pkg:pypi/b2sdk@1.14.0", + "advisories": [ { - "resource_path": "b2sdk-1.14.0/b2sdk/account_info/sqlite_account_info.py", - "patch": { - "vcs_url": "https://github.com/backblaze/b2-sdk-python", - "commit_hash": "62476638986e5b6d7459aca5ef8ce220760226e0" - }, + "advisory_uid": "pypa/b2sdk/PYSEC-2022-33", "is_reachable": "yes", - "tool_details": [ + "details": [ { - "symbol_name": "SqliteAccountInfo._create_database", - "is_called": true, - "is_defined": true, - "is_imported": false, - "is_exact": true, - "reachable_from": [ - "SqliteAccountInfo._validate_database" + "resource_path": "b2sdk-1.14.0/b2sdk/account_info/sqlite_account_info.py", + "patch": { + "vcs_url": "https://github.com/backblaze/b2-sdk-python", + "commit_hash": "62476638986e5b6d7459aca5ef8ce220760226e0" + }, + "is_reachable": "yes", + "tool_details": [ + { + "symbol_name": "SqliteAccountInfo._create_database", + "is_called": true, + "is_defined": true, + "is_imported": false, + "is_exact": true, + "reachable_from": [ + "SqliteAccountInfo._validate_database" + ] + }, + { + "symbol_name": "SqliteAccountInfo", + "is_called": false, + "is_defined": true, + "is_imported": false, + "is_exact": true, + "reachable_from": [] + } + ], + "vulnerable_symbols": [ + "SqliteAccountInfo", + "SqliteAccountInfo._create_database" + ], + "fixed_symbols": [ + "SqliteAccountInfo", + "SqliteAccountInfo._create_database" ] }, - { - "symbol_name": "SqliteAccountInfo", - "is_called": false, - "is_defined": true, - "is_imported": false, - "is_exact": true, - "reachable_from": [] - } - ], - "vulnerable_symbols": [ - "SqliteAccountInfo", - "SqliteAccountInfo._create_database" - ], - "fixed_symbols": [ - "SqliteAccountInfo", - "SqliteAccountInfo._create_database" - ] - }, - // ... more details - ] - } - } + // ... more details + ] + } + } .. note:: An advisory is considered ``REACHABLE`` if it is reachable through at least From 1ffc848a33fdaa6c31aef557573022b6a23c6878 Mon Sep 17 00:00:00 2001 From: ziad hany Date: Mon, 31 Aug 2026 11:05:13 +0300 Subject: [PATCH 15/16] Fix typos and improve clarity in docs Signed-off-by: ziad hany --- ...tutorial-web-ui-analyze-symbol-reachability.png} | Bin docs/tutorial_analyze_symbols_reachability.rst | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename docs/images/{tutorial-web-ui-analyze-symbol-reachability.png.png => tutorial-web-ui-analyze-symbol-reachability.png} (100%) diff --git a/docs/images/tutorial-web-ui-analyze-symbol-reachability.png.png b/docs/images/tutorial-web-ui-analyze-symbol-reachability.png similarity index 100% rename from docs/images/tutorial-web-ui-analyze-symbol-reachability.png.png rename to docs/images/tutorial-web-ui-analyze-symbol-reachability.png diff --git a/docs/tutorial_analyze_symbols_reachability.rst b/docs/tutorial_analyze_symbols_reachability.rst index 41f7b891d9..a972c2aea5 100644 --- a/docs/tutorial_analyze_symbols_reachability.rst +++ b/docs/tutorial_analyze_symbols_reachability.rst @@ -4,7 +4,7 @@ Analyze Symbol Reachability =========================== In this tutorial, we will introduce the add-on pipeline that can be used to -analyze symbols from codebase resources. +analyze symbols reachability from codebase resources. Requirements ------------ @@ -12,8 +12,8 @@ Requirements To successfully complete this tutorial, you first need to: - Install **ScanCode.io** locally :ref:`installation`. -- Have an existing project resource that is directly affected by a - vulnerability advisory and has at least one fix commit. +- Have an existing project resource affected + by a vulnerability advisory that has a corresponding fix commit. - Run the ``find_vulnerabilities`` pipeline :ref:`tutorial_vulnerablecode_integration`. Reachability Status From 5c5afce4929fb5486ac90209f158a6bdaddf007c Mon Sep 17 00:00:00 2001 From: ziadhany Date: Tue, 1 Sep 2026 11:12:04 +0300 Subject: [PATCH 16/16] Fix typo while resolving merge conflict Signed-off-by: ziad hany --- scanpipe/pipes/reachability.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scanpipe/pipes/reachability.py b/scanpipe/pipes/reachability.py index 471fb566a6..844324bb65 100644 --- a/scanpipe/pipes/reachability.py +++ b/scanpipe/pipes/reachability.py @@ -27,6 +27,7 @@ from enum import Enum from pathlib import Path +from git import Repo from git.diff import NULL_TREE from typecode import get_type