@@ -633,6 +633,7 @@ def from_dict(cls, advisory_data):
633633 "affected_packages" : [
634634 affected_package_cls .from_dict (pkg ) for pkg in affected_packages if pkg is not None
635635 ],
636+ "patches" : [PatchData .from_dict (patch ) for patch in advisory_data .get ("patches" , [])],
636637 "references" : [Reference .from_dict (ref ) for ref in advisory_data ["references" ]],
637638 "date_published" : datetime .datetime .fromisoformat (date_published )
638639 if date_published
@@ -643,77 +644,6 @@ def from_dict(cls, advisory_data):
643644 return cls (** transformed )
644645
645646
646- @dataclasses .dataclass (order = True )
647- class AdvisoryDataV2 :
648- """
649- This data class expresses the contract between data sources and the import runner.
650-
651- If a vulnerability_id is present then:
652- summary or affected_packages or references must be present
653- otherwise
654- either affected_package or references should be present
655-
656- date_published must be aware datetime
657- """
658-
659- advisory_id : str = ""
660- aliases : List [str ] = dataclasses .field (default_factory = list )
661- summary : Optional [str ] = ""
662- affected_packages : List [AffectedPackage ] = dataclasses .field (default_factory = list )
663- references : List [ReferenceV2 ] = dataclasses .field (default_factory = list )
664- patches : List [PatchData ] = dataclasses .field (default_factory = list )
665- date_published : Optional [datetime .datetime ] = None
666- weaknesses : List [int ] = dataclasses .field (default_factory = list )
667- url : Optional [str ] = None
668-
669- def __post_init__ (self ):
670- if self .date_published and not self .date_published .tzinfo :
671- logger .warning (f"AdvisoryData with no tzinfo: { self !r} " )
672- if self .summary :
673- self .summary = self .clean_summary (self .summary )
674-
675- def clean_summary (self , summary ):
676- # https://nvd.nist.gov/vuln/detail/CVE-2013-4314
677- # https://github.com/cms-dev/cms/issues/888#issuecomment-516977572
678- summary = summary .strip ()
679- if summary :
680- summary = summary .replace ("\x00 " , "\uFFFD " )
681- return summary
682-
683- def to_dict (self ):
684- return {
685- "aliases" : self .aliases ,
686- "summary" : self .summary ,
687- "affected_packages" : [pkg .to_dict () for pkg in self .affected_packages ],
688- "references" : [ref .to_dict () for ref in self .references ],
689- "patches" : [ref .to_dict () for ref in self .patches ],
690- "date_published" : self .date_published .isoformat () if self .date_published else None ,
691- "weaknesses" : self .weaknesses ,
692- "url" : self .url if self .url else "" ,
693- }
694-
695- @classmethod
696- def from_dict (cls , advisory_data ):
697- date_published = advisory_data ["date_published" ]
698- transformed = {
699- "aliases" : advisory_data ["aliases" ],
700- "summary" : advisory_data ["summary" ],
701- "affected_packages" : [
702- AffectedPackage .from_dict (pkg )
703- for pkg in advisory_data ["affected_packages" ]
704- if pkg is not None
705- ],
706- "references" : [Reference .from_dict (ref ) for ref in advisory_data ["references" ]],
707- "patches" : [PatchData .from_dict (ref ) for ref in advisory_data ["patches" ]],
708- "date_published" : datetime .datetime .fromisoformat (date_published )
709- if date_published
710- else None ,
711- "weaknesses" : advisory_data ["weaknesses" ],
712- "url" : advisory_data .get ("url" ) or None ,
713- }
714- return cls (** transformed )
715-
716-
717647class NoLicenseError (Exception ):
718648 pass
719649
0 commit comments