diff --git a/python/ql/lib/semmle/python/frameworks/Pycurl.qll b/python/ql/lib/semmle/python/frameworks/Pycurl.qll index 4317cfb7eca..10e534821b6 100644 --- a/python/ql/lib/semmle/python/frameworks/Pycurl.qll +++ b/python/ql/lib/semmle/python/frameworks/Pycurl.qll @@ -9,15 +9,18 @@ private import python private import semmle.python.Concepts private import semmle.python.ApiGraphs +private import semmle.python.frameworks.data.ModelsAsData /** + * INTERNAL: Do not use. + * * Provides models for the `pycurl` PyPI package. * * See * - https://pypi.org/project/pycurl/ * - https://pycurl.io/docs/latest/ */ -private module Pycurl { +module Pycurl { /** * Provides models for the `pycurl.Curl` class * @@ -25,7 +28,11 @@ private module Pycurl { */ module Curl { /** Gets a reference to the `pycurl.Curl` class. */ - private API::Node classRef() { result = API::moduleImport("pycurl").getMember("Curl") } + API::Node classRef() { + result = API::moduleImport("pycurl").getMember("Curl") + or + result = ModelOutput::getATypeNode("pycurl.Curl~Subclass").getASubclass*() + } /** Gets a reference to an instance of `pycurl.Curl`. */ private API::Node instance() { result = classRef().getReturn() } diff --git a/python/ql/src/meta/ClassHierarchy/Find.ql b/python/ql/src/meta/ClassHierarchy/Find.ql index 173a111d7fb..4e50176d982 100644 --- a/python/ql/src/meta/ClassHierarchy/Find.ql +++ b/python/ql/src/meta/ClassHierarchy/Find.ql @@ -22,6 +22,7 @@ private import semmle.python.frameworks.Httpx private import semmle.python.frameworks.Invoke private import semmle.python.frameworks.MarkupSafe private import semmle.python.frameworks.Multidict +private import semmle.python.frameworks.Pycurl import semmle.python.frameworks.data.internal.ApiGraphModelsExtensions as Extensions class FlaskViewClasses extends FindSubclassesSpec { @@ -317,6 +318,12 @@ class Multidict extends FindSubclassesSpec { override API::Node getAlreadyModeledClass() { result = Multidict::MultiDictProxy::classRef() } } +class PyCurl extends FindSubclassesSpec { + PyCurl() { this = "pycurl.Curl~Subclass" } + + override API::Node getAlreadyModeledClass() { result = Pycurl::Curl::classRef() } +} + bindingset[fullyQualified] predicate fullyQualifiedToYamlFormat(string fullyQualified, string type2, string path) { exists(int firstDot | firstDot = fullyQualified.indexOf(".", 0, 0) |