@@ -1278,7 +1278,6 @@ def get_table(db, klass):
1278
1278
db .close ()
1279
1279
1280
1280
1281
-
1282
1281
class Controls :
1283
1282
"""Controls implemented by/on and Element"""
1284
1283
@@ -2004,52 +2003,75 @@ def to_serializable(val):
2004
2003
2005
2004
@to_serializable .register (TM )
2006
2005
def ts_tm (obj ):
2007
- return serialize (obj , nested = True )
2006
+ result = serialize (obj , nested = True , ignore = (
2007
+ "_sf" , "_duplicate_ignored_attrs" , "_threats" , "_elements" , "assumptions" ))
2008
+ result ["elements" ] = [e for e in obj ._elements if isinstance (e , (Actor , Asset ))]
2009
+ result ["assumptions" ] = list (obj .assumptions )
2010
+ return result
2008
2011
2009
2012
2010
2013
@to_serializable .register (Controls )
2011
2014
@to_serializable .register (Data )
2015
+ @to_serializable .register (Finding )
2016
+ def _ (obj ):
2017
+ return serialize (obj , nested = False )
2018
+
2019
+
2012
2020
@to_serializable .register (Threat )
2013
- @to_serializable .register (Element )
2021
+ def _ (obj ):
2022
+ result = serialize (obj , nested = False , ignore = ["target" ])
2023
+ result ["target" ] = [v .__name__ for v in obj .target ]
2024
+ return result
2025
+
2026
+
2014
2027
@to_serializable .register (Finding )
2028
+ def _ (obj ):
2029
+ return serialize (obj , nested = False , ignore = ["element" ])
2030
+
2031
+
2032
+ @to_serializable .register (Element )
2015
2033
def ts_element (obj ):
2016
- return serialize (obj , nested = False )
2034
+ result = serialize (obj , nested = False , ignore = ("_is_drawn" , "uuid" , "levels" , "sourceFiles" , "assumptions" , "findings" ))
2035
+ result ["levels" ] = list (obj .levels )
2036
+ result ["sourceFiles" ] = list (obj .sourceFiles )
2037
+ result ["assumptions" ] = list (obj .assumptions )
2038
+ result ["findings" ] = [v .id for v in obj .findings ]
2039
+ return result
2017
2040
2018
2041
2019
- def serialize (obj , nested = False ):
2042
+ @to_serializable .register (Actor )
2043
+ @to_serializable .register (Asset )
2044
+ def _ (obj ):
2045
+ # Note that we use the ts_element function defined for the Element class
2046
+ result = ts_element (obj )
2047
+ result ["__class__" ] = obj .__class__ .__name__
2048
+ return result
2049
+
2050
+
2051
+ def serialize (obj , nested = False , ignore = None ):
2020
2052
"""Used if *obj* is an instance of TM, Element, Threat or Finding."""
2021
2053
klass = obj .__class__
2022
2054
result = {}
2023
- if isinstance (obj , (Actor , Asset )):
2024
- result ["__class__" ] = klass .__name__
2055
+ if ignore is None :
2056
+ ignore = []
2057
+
2025
2058
for i in dir (obj ):
2026
2059
if (
2027
2060
i .startswith ("__" )
2028
2061
or callable (getattr (klass , i , {}))
2029
- or (
2030
- isinstance (obj , TM )
2031
- and i in ("_sf" , "_duplicate_ignored_attrs" , "_threats" )
2032
- )
2033
- or (isinstance (obj , Element ) and i in ("_is_drawn" , "uuid" ))
2034
- or (isinstance (obj , Finding ) and i == "element" )
2062
+ or i in ignore
2035
2063
):
2036
2064
continue
2037
2065
value = getattr (obj , i )
2038
- if isinstance (obj , TM ) and i == "_elements" :
2039
- value = [e for e in value if isinstance (e , (Actor , Asset ))]
2040
2066
if value is not None :
2041
2067
if isinstance (value , (Element , Data )):
2042
2068
value = value .name
2043
- elif isinstance (obj , Threat ) and i == "target" :
2044
- value = [v .__name__ for v in value ]
2045
- elif i in ("levels" , "sourceFiles" , "assumptions" ):
2046
- value = list (value )
2047
2069
elif (
2048
2070
not nested
2049
2071
and not isinstance (value , str )
2050
2072
and isinstance (value , Iterable )
2051
2073
):
2052
- value = [v .id if isinstance ( v , Finding ) else v . name for v in value ]
2074
+ value = [v .name for v in value ]
2053
2075
result [i .lstrip ("_" )] = value
2054
2076
return result
2055
2077
0 commit comments