JS: use extensible architecture for Electron- and NodeClientRequest

This commit is contained in:
Esben Sparre Andreasen
2018-09-03 14:41:19 +02:00
parent 2dd8e95a51
commit 2306afdebf
5 changed files with 57 additions and 11 deletions

View File

@@ -10,7 +10,7 @@ import javascript
/**
* A call that performs a request to a URL.
*/
class CustomClientRequest extends DataFlow::CallNode {
class CustomClientRequest extends DataFlow::InvokeNode {
/**
* Gets the URL of the request.
@@ -21,7 +21,7 @@ class CustomClientRequest extends DataFlow::CallNode {
/**
* A call that performs a request to a URL.
*/
class ClientRequest extends DataFlow::CallNode {
class ClientRequest extends DataFlow::InvokeNode {
CustomClientRequest custom;

View File

@@ -33,29 +33,51 @@ module Electron {
this = DataFlow::moduleMember("electron", "BrowserView").getAnInstantiation()
}
}
/**
* A Node.js-style HTTP or HTTPS request made using an Electron module.
*/
abstract class ElectronClientRequest extends NodeJSLib::NodeJSClientRequest {}
abstract class CustomElectronClientRequest extends NodeJSLib::CustomNodeJSClientRequest {}
/**
* A Node.js-style HTTP or HTTPS request made using an Electron module.
*/
class ElectronClientRequest extends NodeJSLib::NodeJSClientRequest {
ElectronClientRequest() {
this instanceof CustomElectronClientRequest
}
}
/**
* A Node.js-style HTTP or HTTPS request made using `electron.net`, for example `net.request(url)`.
*/
private class NetRequest extends ElectronClientRequest {
private class NetRequest extends CustomElectronClientRequest {
NetRequest() {
this = DataFlow::moduleMember("electron", "net").getAMemberCall("request")
}
override DataFlow::Node getUrl() {
result = getArgument(0) or
result = getOptionArgument(0, "url")
}
}
/**
* A Node.js-style HTTP or HTTPS request made using `electron.client`, for example `new client(url)`.
*/
private class NewClientRequest extends ElectronClientRequest {
private class NewClientRequest extends CustomElectronClientRequest {
NewClientRequest() {
this = DataFlow::moduleMember("electron", "ClientRequest").getAnInstantiation()
}
override DataFlow::Node getUrl() {
result = getArgument(0) or
result = getOptionArgument(0, "url")
}
}

View File

@@ -504,14 +504,25 @@ module NodeJSLib {
/**
* A data flow node that is an HTTP or HTTPS client request made by a Node.js application, for example `http.request(url)`.
*/
abstract class NodeJSClientRequest extends DataFlow::DefaultSourceNode {
abstract class CustomNodeJSClientRequest extends CustomClientRequest {
}
/**
* A data flow node that is an HTTP or HTTPS client request made by a Node.js application, for example `http.request(url)`.
*/
class NodeJSClientRequest extends ClientRequest {
NodeJSClientRequest() {
this instanceof CustomNodeJSClientRequest
}
}
/**
* A model of a URL request in the Node.js `http` library.
*/
private class NodeHttpUrlRequest extends CustomClientRequest, NodeJSClientRequest {
private class NodeHttpUrlRequest extends CustomNodeJSClientRequest {
DataFlow::Node url;