diff --git a/python/ql/lib/semmle/python/frameworks/Fabric.qll b/python/ql/lib/semmle/python/frameworks/Fabric.qll index 4562327a24c..c378c57d132 100644 --- a/python/ql/lib/semmle/python/frameworks/Fabric.qll +++ b/python/ql/lib/semmle/python/frameworks/Fabric.qll @@ -100,7 +100,9 @@ module FabricV2 { * calls, or a special parameter that will be set when functions are called by an external * library. */ - abstract class Instance extends DataFlow::LocalSourceNode { } + abstract class Instance extends API::Node { + override string toString() { result = "a fabric connection instance" } + } /** * A reference to the `fabric.connection.Connection` class. @@ -111,7 +113,7 @@ module FabricV2 { [ fabric().getMember("Connection"), connection().getMember("Connection"), ModelOutput::getATypeNode("fabric.connection.Connection~Subclass").getASubclass*() - ].getACall() + ].getReturn() } } @@ -125,7 +127,7 @@ module FabricV2 { * - https://docs.fabfile.org/en/2.5/api/connection.html#fabric.connection.Connection.local */ API::CallNode instanceRunMethods() { - result = any(Instance is).getAMethodCall(["run", "sudo", "local"]) + result = any(Instance is).getMember(["run", "sudo", "local"]).getACall() } } } @@ -155,7 +157,11 @@ module FabricV2 { */ private class FabricConnectionProxyCommand extends SystemCommandExecution::Range, API::CallNode { FabricConnectionProxyCommand() { - this instanceof Fabric::Connection::ConnectionClass::Instance and + this = + [ + fabric().getMember("Connection"), connection().getMember("Connection"), + ModelOutput::getATypeNode("fabric.connection.Connection~Subclass").getASubclass*() + ].getACall() and // we want to make sure that the connection is established otherwise the command of proxy_command won't run. exists( this.getAMethodCall([ @@ -185,14 +191,10 @@ module FabricV2 { API::Node test() { result in [tasks().getMember("task"), fabric().getMember("task")] } } - class FabricTaskFirstParamConnectionInstance extends Fabric::Connection::ConnectionClass::Instance, - DataFlow::ParameterNode + class FabricTaskFirstParamConnectionInstance extends Fabric::Connection::ConnectionClass::Instance { FabricTaskFirstParamConnectionInstance() { - exists(Function func | - func.getADecorator() = Fabric::Tasks::task().getAValueReachableFromSource().asExpr() and - this.getParameter() = func.getArg(0) - ) + this = Fabric::Tasks::task().getParameter(0).getParameter(0) } } diff --git a/python/ql/src/meta/ClassHierarchy/Find.ql b/python/ql/src/meta/ClassHierarchy/Find.ql index 2c474cb2102..fa822ebd6f7 100644 --- a/python/ql/src/meta/ClassHierarchy/Find.ql +++ b/python/ql/src/meta/ClassHierarchy/Find.ql @@ -328,7 +328,7 @@ class FabricConnection extends FindSubclassesSpec { FabricConnection() { this = "fabric.connection.Connection~Subclass" } override API::Node getAlreadyModeledClass() { - result = FabricV2::Fabric::Connection::ConnectionClass::classRef() + result = any(FabricV2::Fabric::Connection::ConnectionClass::Instance i) } }