Skip to content

Commit 2306afd

Browse files
author
Esben Sparre Andreasen
committed
JS: use extensible architecture for Electron- and NodeClientRequest
1 parent 2dd8e95 commit 2306afd

File tree

5 files changed

+57
-11
lines changed

5 files changed

+57
-11
lines changed

javascript/ql/src/semmle/javascript/frameworks/ClientRequests.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import javascript
1010
/**
1111
* A call that performs a request to a URL.
1212
*/
13-
class CustomClientRequest extends DataFlow::CallNode {
13+
class CustomClientRequest extends DataFlow::InvokeNode {
1414

1515
/**
1616
* Gets the URL of the request.
@@ -21,7 +21,7 @@ class CustomClientRequest extends DataFlow::CallNode {
2121
/**
2222
* A call that performs a request to a URL.
2323
*/
24-
class ClientRequest extends DataFlow::CallNode {
24+
class ClientRequest extends DataFlow::InvokeNode {
2525

2626
CustomClientRequest custom;
2727

javascript/ql/src/semmle/javascript/frameworks/Electron.qll

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,51 @@ module Electron {
3333
this = DataFlow::moduleMember("electron", "BrowserView").getAnInstantiation()
3434
}
3535
}
36-
36+
37+
/**
38+
* A Node.js-style HTTP or HTTPS request made using an Electron module.
39+
*/
40+
abstract class CustomElectronClientRequest extends NodeJSLib::CustomNodeJSClientRequest {}
41+
3742
/**
3843
* A Node.js-style HTTP or HTTPS request made using an Electron module.
3944
*/
40-
abstract class ElectronClientRequest extends NodeJSLib::NodeJSClientRequest {}
45+
class ElectronClientRequest extends NodeJSLib::NodeJSClientRequest {
46+
47+
ElectronClientRequest() {
48+
this instanceof CustomElectronClientRequest
49+
}
50+
51+
}
4152

4253
/**
4354
* A Node.js-style HTTP or HTTPS request made using `electron.net`, for example `net.request(url)`.
4455
*/
45-
private class NetRequest extends ElectronClientRequest {
56+
private class NetRequest extends CustomElectronClientRequest {
4657
NetRequest() {
4758
this = DataFlow::moduleMember("electron", "net").getAMemberCall("request")
4859
}
60+
61+
override DataFlow::Node getUrl() {
62+
result = getArgument(0) or
63+
result = getOptionArgument(0, "url")
64+
}
65+
4966
}
50-
51-
67+
5268
/**
5369
* A Node.js-style HTTP or HTTPS request made using `electron.client`, for example `new client(url)`.
5470
*/
55-
private class NewClientRequest extends ElectronClientRequest {
71+
private class NewClientRequest extends CustomElectronClientRequest {
5672
NewClientRequest() {
5773
this = DataFlow::moduleMember("electron", "ClientRequest").getAnInstantiation()
5874
}
75+
76+
override DataFlow::Node getUrl() {
77+
result = getArgument(0) or
78+
result = getOptionArgument(0, "url")
79+
}
80+
5981
}
6082

6183

javascript/ql/src/semmle/javascript/frameworks/NodeJSLib.qll

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,14 +504,25 @@ module NodeJSLib {
504504
/**
505505
* A data flow node that is an HTTP or HTTPS client request made by a Node.js application, for example `http.request(url)`.
506506
*/
507-
abstract class NodeJSClientRequest extends DataFlow::DefaultSourceNode {
507+
abstract class CustomNodeJSClientRequest extends CustomClientRequest {
508+
509+
}
510+
511+
/**
512+
* A data flow node that is an HTTP or HTTPS client request made by a Node.js application, for example `http.request(url)`.
513+
*/
514+
class NodeJSClientRequest extends ClientRequest {
515+
516+
NodeJSClientRequest() {
517+
this instanceof CustomNodeJSClientRequest
518+
}
508519

509520
}
510521

511522
/**
512523
* A model of a URL request in the Node.js `http` library.
513524
*/
514-
private class NodeHttpUrlRequest extends CustomClientRequest, NodeJSClientRequest {
525+
private class NodeHttpUrlRequest extends CustomNodeJSClientRequest {
515526

516527
DataFlow::Node url;
517528

javascript/ql/test/library-tests/frameworks/ClientRequests/ClientRequest.expected

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,9 @@
1414
| tst.js:33:5:33:19 | got.stream(url) | tst.js:33:16:33:18 | url |
1515
| tst.js:35:5:35:21 | window.fetch(url) | tst.js:35:18:35:20 | url |
1616
| tst.js:37:5:37:18 | nodeFetch(url) | tst.js:37:15:37:17 | url |
17+
| tst.js:39:5:39:20 | net.request(url) | tst.js:39:17:39:19 | url |
18+
| tst.js:41:5:41:29 | net.req ... url }) | tst.js:41:17:41:28 | { url: url } |
19+
| tst.js:41:5:41:29 | net.req ... url }) | tst.js:41:24:41:26 | url |
20+
| tst.js:43:5:43:26 | new Cli ... st(url) | tst.js:43:23:43:25 | url |
21+
| tst.js:45:5:45:35 | new Cli ... url }) | tst.js:45:23:45:34 | { url: url } |
22+
| tst.js:45:5:45:35 | new Cli ... url }) | tst.js:45:30:45:32 | url |

javascript/ql/test/library-tests/frameworks/ClientRequests/tst.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import express from 'express';
66
import axios from 'axios';
77
import got from 'got';
88
import nodeFetch from 'node-fetch';
9-
9+
import {ClientRequest, net} from 'electron';
1010
(function() {
1111
request(url);
1212

@@ -36,4 +36,11 @@ import nodeFetch from 'node-fetch';
3636

3737
nodeFetch(url);
3838

39+
net.request(url);
40+
41+
net.request({ url: url });
42+
43+
new ClientRequest(url);
44+
45+
new ClientRequest({ url: url });
3946
});

0 commit comments

Comments
 (0)