dhscanner-kbgen 1.0.15 → 1.0.16
raw patch · 2 files changed
+124/−32 lines, 2 filesdep ~dhscanner-bitcodePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: dhscanner-bitcode
API changes (from Hackage documentation)
- Kbgen: ClassName :: Class -> ClassName -> ClassName
- Kbgen: ClassNameCtor :: ClassName -> Fact
- Kbgen: ClassResolvedSuper :: Class -> ResolvedSuper -> ClassResolvedSuper
- Kbgen: ClassResolvedSuperCtor :: ClassResolvedSuper -> Fact
- Kbgen: data ClassName
- Kbgen: data ClassResolvedSuper
- Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ClassName
- Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ClassResolvedSuper
- Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ClassName
- Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ClassResolvedSuper
- Kbgen: instance GHC.Classes.Eq Kbgen.ClassName
- Kbgen: instance GHC.Classes.Eq Kbgen.ClassResolvedSuper
- Kbgen: instance GHC.Classes.Ord Kbgen.ClassName
- Kbgen: instance GHC.Classes.Ord Kbgen.ClassResolvedSuper
- Kbgen: instance GHC.Generics.Generic Kbgen.ClassName
- Kbgen: instance GHC.Generics.Generic Kbgen.ClassResolvedSuper
- Kbgen: instance GHC.Show.Show Kbgen.ClassName
- Kbgen: instance GHC.Show.Show Kbgen.ClassResolvedSuper
+ Kbgen: ClassDef :: Class -> ClassName -> ClassDefinedInFile -> ClassDef
+ Kbgen: ClassDefCtor :: ClassDef -> Fact
+ Kbgen: ClassHas1stPartySuper :: Class -> SuperName -> SuperDefinedInFile -> ClassHas1stPartySuper
+ Kbgen: ClassHas1stPartySuperCtor :: ClassHas1stPartySuper -> Fact
+ Kbgen: ClassHas3rdPartySuper :: Class -> SuperName -> SuperQualifiedName -> ClassHas3rdPartySuper
+ Kbgen: ClassHas3rdPartySuperCtor :: ClassHas3rdPartySuper -> Fact
+ Kbgen: data ClassDef
+ Kbgen: data ClassHas1stPartySuper
+ Kbgen: data ClassHas3rdPartySuper
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ClassDef
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ClassDefinedInFile
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ClassHas1stPartySuper
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ClassHas3rdPartySuper
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.SuperDefinedInFile
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.SuperQualifiedName
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ClassDef
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ClassDefinedInFile
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ClassHas1stPartySuper
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ClassHas3rdPartySuper
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.SuperDefinedInFile
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.SuperQualifiedName
+ Kbgen: instance GHC.Classes.Eq Kbgen.ClassDef
+ Kbgen: instance GHC.Classes.Eq Kbgen.ClassDefinedInFile
+ Kbgen: instance GHC.Classes.Eq Kbgen.ClassHas1stPartySuper
+ Kbgen: instance GHC.Classes.Eq Kbgen.ClassHas3rdPartySuper
+ Kbgen: instance GHC.Classes.Eq Kbgen.SuperDefinedInFile
+ Kbgen: instance GHC.Classes.Eq Kbgen.SuperQualifiedName
+ Kbgen: instance GHC.Classes.Ord Kbgen.ClassDef
+ Kbgen: instance GHC.Classes.Ord Kbgen.ClassDefinedInFile
+ Kbgen: instance GHC.Classes.Ord Kbgen.ClassHas1stPartySuper
+ Kbgen: instance GHC.Classes.Ord Kbgen.ClassHas3rdPartySuper
+ Kbgen: instance GHC.Classes.Ord Kbgen.SuperDefinedInFile
+ Kbgen: instance GHC.Classes.Ord Kbgen.SuperQualifiedName
+ Kbgen: instance GHC.Generics.Generic Kbgen.ClassDef
+ Kbgen: instance GHC.Generics.Generic Kbgen.ClassDefinedInFile
+ Kbgen: instance GHC.Generics.Generic Kbgen.ClassHas1stPartySuper
+ Kbgen: instance GHC.Generics.Generic Kbgen.ClassHas3rdPartySuper
+ Kbgen: instance GHC.Generics.Generic Kbgen.SuperDefinedInFile
+ Kbgen: instance GHC.Generics.Generic Kbgen.SuperQualifiedName
+ Kbgen: instance GHC.Show.Show Kbgen.ClassDef
+ Kbgen: instance GHC.Show.Show Kbgen.ClassDefinedInFile
+ Kbgen: instance GHC.Show.Show Kbgen.ClassHas1stPartySuper
+ Kbgen: instance GHC.Show.Show Kbgen.ClassHas3rdPartySuper
+ Kbgen: instance GHC.Show.Show Kbgen.SuperDefinedInFile
+ Kbgen: instance GHC.Show.Show Kbgen.SuperQualifiedName
Files
- dhscanner-kbgen.cabal +2/−2
- src/Kbgen.hs +122/−30
dhscanner-kbgen.cabal view
@@ -33,7 +33,7 @@ * explain in plain English your query's purpose * et voilà ! -version: 1.0.15 +version: 1.0.16 license: GPL-3.0-only license-file: LICENSE author: OrenGitHub @@ -60,7 +60,7 @@ base >= 4.18 && < 4.19, containers < 0.7, dhscanner-ast >= 1.1.4, - dhscanner-bitcode >= 1.0.13 + dhscanner-bitcode >= 1.0.14 hs-source-dirs: src
src/Kbgen.hs view
@@ -54,13 +54,14 @@ module Kbgen ( KeywordArgForCall(..), ParamResolvedType(..), - ClassName(..), + ClassDef(..), ParamName(..), CallMethodOfClass(..), ConstString(..), ArgForCall(..), MethodOfClass(..), - ClassResolvedSuper(..), + ClassHas1stPartySuper(..), + ClassHas3rdPartySuper(..), ClassNamedSuper(..), ArgiForCall(..), ConstBoolTrue(..), @@ -183,7 +184,7 @@ -- This is how the fact will look inside the Prolog file -- -- @ --- kb_class_name( Class, Name ). +-- kb_class_def( Class, Name, DefinedInFile ). -- @ -- -- __When should I use this fact__ ( motivation: [CVE-2024-53995](https://nvd.nist.gov/vuln/detail/CVE-2024-53995) ) @@ -205,19 +206,21 @@ -- -- @ -- skip_level_subclass_of( Subclass, \'tornado.web.RequestHandler\' ) :- --- kb_class_name( Class, ClassName ), --- kb_class_named_super( Subclass, ClassName ), --- kb_class_resolved_super( Class, \'tornado.web.RequestHandler\' ). +-- kb_class_def( Subclass, _, _ ), +-- kb_class_has_1st_party_super( Subclass, ClassName, ClassDefinedInFile ), +-- kb_class_def( Class, ClassName, ClassDefinedInFile ) +-- kb_class_has_3rd_party_super( Class, _, \'tornado.web.RequestHandler\' ). -- @ -- -- Other facts combined in this predicate: -- --- * 'ClassNamedSuper' --- * 'ClassResolvedSuper' +-- * 'ClassHas1stPartySuper' +-- * 'ClassHas3rdPartySuper' -- -data ClassName = ClassName +data ClassDef = ClassDef Class -- ^ Token.ClassName -- ^ + ClassDefinedInFile -- ^ deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) -- | @@ -322,14 +325,14 @@ -- @ -- user_controlled_query_argument( Call ) :- -- kb_call_method_of_class( Call, \'get_query_argument\', Class ), --- kb_class_has_resolved_super( Class, \'tornado.web.RequestHandler\'), +-- kb_class_has_3rd_party_super( Class, \'tornado.web.RequestHandler\'), -- kb_arg_i_for_call( QueryParamName, 0, Call), -- kb_const_string( QueryParamName, _ ). -- @ -- -- Other facts combined in this predicate: -- --- * 'ClassResolvedSuper' +-- * 'ClassHas3rdPartySuper' -- * 'ArgiForCall' -- * 'ConstString' -- @@ -363,21 +366,97 @@ -- | -- --- * usually used with 'ClassNamedSuper' --- * for bounded inheritance of third party classes +-- __Name__ -- --- ==== __Example:__ +-- This is how the fact will look inside the Prolog file -- -- @ --- kb_class_super_name(Class,SuperFqsdfsdfsdfn). +-- kb_class_has_1st_party_super( Class, SuperName, SuperDefinedInFile ). -- @ -- -data ClassResolvedSuper = ClassResolvedSuper +-- __When should I use this fact__ ( motivation: [CVE-2024-53995](https://nvd.nist.gov/vuln/detail/CVE-2024-53995) ) +-- +-- @ +-- # authentication.py +-- class LoginHandler(BaseHandler): ... +-- +-- # index.py +-- from tornado.web import RequestHandler +-- class BaseHandler(RequestHandler): ... +-- @ +-- +-- See complete source example [here](https://github.com/SickChill/sickchill/blob/846adafdfab579281353ea08a27bbb813f9a9872/sickchill/views/authentication.py#L10), +-- [here](https://github.com/SickChill/sickchill/blob/846adafdfab579281353ea08a27bbb813f9a9872/sickchill/views/index.py#L35) +-- and [here](https://github.com/SickChill/sickchill/blob/846adafdfab579281353ea08a27bbb813f9a9872/sickchill/views/index.py#L15) +-- +-- __Writing a predicate with this fact and others__ ( motivation: [CVE-2024-53995](https://nvd.nist.gov/vuln/detail/CVE-2024-53995) ) +-- +-- @ +-- skip_level_subclass_of( Subclass, \'tornado.web.RequestHandler\' ) :- +-- kb_class_def( Subclass, _, _ ), +-- kb_class_has_1st_party_super( Subclass, ClassName, ClassDefinedInFile ), +-- kb_class_def( Class, ClassName, ClassDefinedInFile ) +-- kb_class_has_3rd_party_super( Class, _, \'tornado.web.RequestHandler\' ). +-- @ +-- +-- Other facts combined in this predicate: +-- +-- * 'ClassDef' +-- * 'ClassHas3rdPartySuper' +-- +data ClassHas1stPartySuper = ClassHas1stPartySuper Class -- ^ - ResolvedSuper -- ^ ( 1 fact per super class ) + Token.SuperName -- ^ + SuperDefinedInFile -- ^ deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) -- | +-- +-- __Name__ +-- +-- This is how the fact will look inside the Prolog file +-- +-- @ +-- kb_class_has_3rd_party_super( Class, SuperName, SuperQualifiedName ). +-- @ +-- +-- __When should I use this fact__ ( motivation: [CVE-2024-53995](https://nvd.nist.gov/vuln/detail/CVE-2024-53995) ) +-- +-- @ +-- # authentication.py +-- class LoginHandler(BaseHandler): ... +-- +-- # index.py +-- from tornado.web import RequestHandler +-- class BaseHandler(RequestHandler): ... +-- @ +-- +-- See complete source example [here](https://github.com/SickChill/sickchill/blob/846adafdfab579281353ea08a27bbb813f9a9872/sickchill/views/authentication.py#L10), +-- [here](https://github.com/SickChill/sickchill/blob/846adafdfab579281353ea08a27bbb813f9a9872/sickchill/views/index.py#L35) +-- and [here](https://github.com/SickChill/sickchill/blob/846adafdfab579281353ea08a27bbb813f9a9872/sickchill/views/index.py#L15) +-- +-- __Writing a predicate with this fact and others__ ( motivation: [CVE-2024-53995](https://nvd.nist.gov/vuln/detail/CVE-2024-53995) ) +-- +-- @ +-- skip_level_subclass_of( Subclass, \'tornado.web.RequestHandler\' ) :- +-- kb_class_def( Subclass, _, _ ), +-- kb_class_has_1st_party_super( Subclass, ClassName, ClassDefinedInFile ), +-- kb_class_def( Class, ClassName, ClassDefinedInFile ) +-- kb_class_has_3rd_party_super( Class, _, \'tornado.web.RequestHandler\' ). +-- @ +-- +-- Other facts combined in this predicate: +-- +-- * 'ClassDef' +-- * 'ClassHas1stPartySuper' +-- +data ClassHas3rdPartySuper = ClassHas3rdPartySuper + Class -- ^ + Token.SuperName -- ^ + SuperQualifiedName -- ^ + deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) + +-- | -- capture inheritance from third party classes data ClassAnnotation = ClassAnnotation Class -- ^ @@ -488,7 +567,11 @@ data ParamIndex = ParamIndex Word deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data MethodName = MethodName String deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data ConstStrValue = ConstStrValue String deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) +data SuperQualifiedName = SuperQualifiedName Fqn.Fqn deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) +data ClassDefinedInFile = ClassDefinedInFile FilePath deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) +data SuperDefinedInFile = SuperDefinedInFile FilePath deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) + -- | data ResolvedType = ResolvedType Fqn.Fqn -- ^ @@ -502,8 +585,8 @@ -- * often, a single bitcode instruction will yield /more/ than one fact -- data Fact - = ParamNameCtor ParamName - | ClassNameCtor ClassName + = ClassDefCtor ClassDef + | ParamNameCtor ParamName | ArgForCallCtor ArgForCall | ArgiForCallCtor ArgiForCall | ConstStringCtor ConstString @@ -516,8 +599,9 @@ | KeywordArgForCallCtor KeywordArgForCall | ParamResolvedTypeCtor ParamResolvedType | CallMethodOfClassCtor CallMethodOfClass - | ClassResolvedSuperCtor ClassResolvedSuper | CallableAnnotationCtor CallableAnnotation + | ClassHas1stPartySuperCtor ClassHas1stPartySuper + | ClassHas3rdPartySuperCtor ClassHas3rdPartySuper deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) -- | @@ -531,7 +615,7 @@ -- prologify :: Fact -> String prologify (ParamNameCtor content) = prologify_ParamName content -prologify (ClassNameCtor content) = prologify_ClassName content +prologify (ClassDefCtor content) = prologify_ClassDef content prologify (ArgForCallCtor content) = prologifyArgForCall content prologify (ArgiForCallCtor content) = prologifyArgiForCall content prologify (ConstStringCtor content) = prologify_ConstString content @@ -544,8 +628,9 @@ prologify (ParamResolvedTypeCtor content) = prologify_ParamResolvedType content prologify (CallMethodOfClassCtor content) = prologify_CallMethodOfClass content prologify (KeywordArgForCallCtor content) = prologify_KeywordArgForCall content -prologify (ClassResolvedSuperCtor content) = prologifyClassResolvedSuper content prologify (CallableAnnotationCtor content) = prologify_CallableAnnotation content +prologify (ClassHas1stPartySuperCtor content) = prologify_ClassHas1stPartySuper content +prologify (ClassHas3rdPartySuperCtor content) = prologify_ClassHas3rdPartySuper content prologify_ParamResolvedType' :: Location -> String -> String prologify_ParamResolvedType' l fqn = printf "kb_param_has_type( %s, \'%s\' )." (locationify l) fqn @@ -565,11 +650,11 @@ prologify_ParamName :: ParamName -> String prologify_ParamName (ParamName (Param loc) (Token.ParamName (Token.Named name _))) = prologify_ParamName' loc name -prologify_ClassName' :: Location -> String -> String -prologify_ClassName' l name = printf "kb_class_name( %s, \'%s\' )." (locationify l) name +prologify_ClassDef' :: Location -> String -> FilePath-> String +prologify_ClassDef' l name f = printf "kb_class_def( %s, \'%s\', \'%s\' )." (locationify l) name (show f) -prologify_ClassName :: ClassName -> String -prologify_ClassName (ClassName (Class loc) (Token.ClassName (Token.Named name _))) = prologify_ClassName' loc name +prologify_ClassDef :: ClassDef -> String +prologify_ClassDef (ClassDef (Class loc) (Token.ClassName (Token.Named name _)) (ClassDefinedInFile f)) = prologify_ClassDef' loc name f unquote :: String -> String unquote = filter (/= '\'') @@ -608,11 +693,18 @@ prologify_MethodOfClass :: MethodOfClass -> String prologify_MethodOfClass (MethodOfClass (Method m) (Class c)) = prologify_MethodOfClass' m c -prologifyClassResolvedSuper' :: Location -> String -> String -prologifyClassResolvedSuper' l s = printf "kb_class_has_resolved_super( %s, \'%s\' )." (locationify l) s +prologify_ClassHas1stPartySuper' :: Location -> String -> FilePath -> String +prologify_ClassHas1stPartySuper' c s f = printf "kb_class_has_1st_party_super( %s, \'%s\', \'%s\' )." (locationify c) s (show f) -prologifyClassResolvedSuper :: ClassResolvedSuper -> String -prologifyClassResolvedSuper (ClassResolvedSuper (Class c) (ResolvedSuper fqn)) = prologifyClassResolvedSuper' c (show fqn) +prologify_ClassHas1stPartySuper :: ClassHas1stPartySuper -> String +prologify_ClassHas1stPartySuper (ClassHas1stPartySuper (Class c) (Token.SuperName (Token.Named s _)) (SuperDefinedInFile f)) = prologify_ClassHas1stPartySuper' c s f + +prologify_ClassHas3rdPartySuper' :: Location -> String -> Fqn.Fqn -> String +prologify_ClassHas3rdPartySuper' c s f = printf "kb_class_has_3rd_party_super( %s, \'%s\', \'%s\' )." (locationify c) s (show f) + +prologify_ClassHas3rdPartySuper :: ClassHas3rdPartySuper -> String +prologify_ClassHas3rdPartySuper (ClassHas3rdPartySuper (Class c) (Token.SuperName (Token.Named s _)) (SuperQualifiedName f)) = prologify_ClassHas3rdPartySuper' c s f + prologifyClassNamedSuper' :: Location -> String -> String prologifyClassNamedSuper' l s = printf "kb_class_has_named_super( %s, \'%s\' )." (locationify l) s