Skip to content

Commit cdd22e4

Browse files
committed
Add model for event handlers registered to service that is only defined in cds and testcase
1 parent 60d3666 commit cdd22e4

6 files changed

Lines changed: 64 additions & 0 deletions

File tree

javascript/frameworks/cap/lib/advanced_security/javascript/frameworks/cap/RemoteFlowSources.qll

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,26 @@ class HandlerParameter extends ParameterNode, RemoteFlowSource {
2828
result = "Parameter of an event handler belonging to an exposed service"
2929
}
3030
}
31+
32+
/**
33+
* A service may be described only in a CDS file, but event handlers may still be registered in a format such as:
34+
* ```javascript
35+
* module.exports = srv => {
36+
* srv.before('CREATE', 'Media', req => { //service name is used to describe which to register this handler to
37+
* ```
38+
* parameters named `req` are captured in the above example.
39+
*/
40+
class ServiceinCDSHandlerParameter extends RemoteFlowSource {
41+
ServiceinCDSHandlerParameter() {
42+
exists(MethodCallNode m, CdlEntity service, string serviceName |
43+
service.getName().regexpReplaceAll(".*\\.", "") = serviceName and
44+
m.getArgument(1).toString().regexpReplaceAll("'", "") = serviceName and
45+
this = m.getArgument(2) and
46+
m.getMethodName() in ["on", "before", "after"]
47+
)
48+
}
49+
50+
override string getSourceType() {
51+
result = "Parameter of an event handler belonging to an exposed service defined in a cds file"
52+
}
53+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace sap.capire.test;
2+
3+
entity Test {
4+
5+
key id:Integer;
6+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"namespace": "sap.capire.test",
3+
"definitions": {
4+
"sap.capire.test.Test": {
5+
"kind": "entity",
6+
"elements": {
7+
"id": {
8+
"key": true,
9+
"type": "cds.Integer"
10+
}
11+
}
12+
}
13+
},
14+
"meta": {
15+
"creator": "CDS Compiler v4.5.0",
16+
"flavor": "inferred"
17+
},
18+
"$version": "2.0"
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| remoteflowsource.js:6:34:9:5 | req => ... i\\n } |
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const loki = require('lokijs')
2+
const db = new loki('DB')
3+
const testDB = db.addCollection('Test')
4+
5+
module.exports = srv => {
6+
srv.before('CREATE', 'Test', req => { //source
7+
const obj = testDB.insert({ test: '' })
8+
req.data.id = obj.$loki
9+
})
10+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import javascript
2+
import advanced_security.javascript.frameworks.cap.RemoteFlowSources
3+
4+
from RemoteFlowSource source
5+
select source

0 commit comments

Comments
 (0)