Compute a unique content_id for an advisory by normalizing its data and hashing it. :param advisory_data: An AdvisoryData object :return: SHA-256 hash digest as content_id
(advisory_data)
| 644 | |
| 645 | |
| 646 | def compute_content_id(advisory_data): |
| 647 | """ |
| 648 | Compute a unique content_id for an advisory by normalizing its data and hashing it. |
| 649 | |
| 650 | :param advisory_data: An AdvisoryData object |
| 651 | :return: SHA-256 hash digest as content_id |
| 652 | """ |
| 653 | |
| 654 | # Normalize fields |
| 655 | from vulnerabilities.importer import AdvisoryData |
| 656 | from vulnerabilities.models import Advisory |
| 657 | |
| 658 | if isinstance(advisory_data, Advisory): |
| 659 | normalized_data = { |
| 660 | "aliases": normalize_list(advisory_data.aliases), |
| 661 | "summary": normalize_text(advisory_data.summary), |
| 662 | "affected_packages": [ |
| 663 | pkg for pkg in normalize_list(advisory_data.affected_packages) if pkg |
| 664 | ], |
| 665 | "references": [ref for ref in normalize_list(advisory_data.references) if ref], |
| 666 | "weaknesses": normalize_list(advisory_data.weaknesses), |
| 667 | } |
| 668 | normalized_data["url"] = advisory_data.url |
| 669 | |
| 670 | elif isinstance(advisory_data, AdvisoryData): |
| 671 | normalized_data = { |
| 672 | "aliases": normalize_list(advisory_data.aliases), |
| 673 | "summary": normalize_text(advisory_data.summary), |
| 674 | "affected_packages": [ |
| 675 | pkg.to_dict() for pkg in normalize_list(advisory_data.affected_packages) if pkg |
| 676 | ], |
| 677 | "references": [ |
| 678 | ref.to_dict() for ref in normalize_list(advisory_data.references) if ref |
| 679 | ], |
| 680 | "weaknesses": normalize_list(advisory_data.weaknesses), |
| 681 | } |
| 682 | |
| 683 | normalized_data["url"] = advisory_data.url |
| 684 | |
| 685 | else: |
| 686 | raise ValueError("Unsupported advisory data type for content ID computation") |
| 687 | |
| 688 | normalized_json = json.dumps(normalized_data, separators=(",", ":"), sort_keys=True) |
| 689 | content_id = hashlib.sha256(normalized_json.encode("utf-8")).hexdigest() |
| 690 | |
| 691 | return content_id |
| 692 | |
| 693 | |
| 694 | def compute_content_id_v2(advisory_data): |