From af6c5cceadc02fa69b974e3dbf950d69bc0363f2 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Mon, 18 Sep 2023 13:48:24 +0200 Subject: [PATCH] Python: Enable auto-model BaseHttpRequestHandler --- python/ql/lib/semmle/python/frameworks/Stdlib.qll | 5 ++++- python/ql/src/meta/ClassHierarchy/Find.ql | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index 9f9648e6ecf..083729d3051 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -2014,7 +2014,7 @@ module StdlibPrivate { * - https://docs.python.org/3.9/library/http.server.html#http.server.BaseHTTPRequestHandler * - https://docs.python.org/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler */ - private module HttpRequestHandler { + module BaseHttpRequestHandler { /** Gets a reference to the `BaseHttpRequestHandler` class or any subclass. */ API::Node subclassRef() { result = @@ -2028,6 +2028,9 @@ module StdlibPrivate { API::moduleImport("http").getMember("server").getMember("SimpleHTTPRequestHandler"), API::moduleImport("http").getMember("server").getMember("CGIHTTPRequestHandler"), ].getASubclass*() + or + result = + ModelOutput::getATypeNode("http.server.BaseHTTPRequestHandler~Subclass").getASubclass*() } /** A HttpRequestHandler class definition (most likely in project code). */ diff --git a/python/ql/src/meta/ClassHierarchy/Find.ql b/python/ql/src/meta/ClassHierarchy/Find.ql index 059a710bc6e..29a565940f6 100644 --- a/python/ql/src/meta/ClassHierarchy/Find.ql +++ b/python/ql/src/meta/ClassHierarchy/Find.ql @@ -75,6 +75,14 @@ class WSGIServer extends FindSubclassesSpec { } } +class StdlibBaseHttpRequestHandler extends FindSubclassesSpec { + StdlibBaseHttpRequestHandler() { this = "http.server.BaseHTTPRequestHandler~Subclass" } + + override API::Node getAlreadyModeledClass() { + result = StdlibPrivate::BaseHttpRequestHandler::subclassRef() + } +} + bindingset[fullyQualified] predicate fullyQualifiedToYamlFormat(string fullyQualified, string type2, string path) { exists(int firstDot | firstDot = fullyQualified.indexOf(".", 0, 0) |