Skip to content

Commit 5b229e9

Browse files
authored
Merge pull request github#6574 from asgerf/js/vue-api-graphs
Approved by erik-krogh
2 parents d793486 + 7149ad8 commit 5b229e9

File tree

10 files changed

+320
-231
lines changed

10 files changed

+320
-231
lines changed

javascript/ql/lib/semmle/javascript/AMD.qll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,19 @@ class AmdModule extends Module {
313313
name = pwn.getPropertyName()
314314
)
315315
}
316+
317+
override DataFlow::Node getABulkExportedNode() {
318+
// Assigned to `module.exports` via the factory's `module` parameter
319+
exists(AbstractModuleObject m, DataFlow::PropWrite write |
320+
m.getModule() = this and
321+
write.getPropertyName() = "exports" and
322+
write.getBase().analyze().getAValue() = m and
323+
result = write.getRhs()
324+
)
325+
or
326+
// Returned from factory function
327+
result = getDefine().getModuleExpr().flow()
328+
}
316329
}
317330

318331
/**

javascript/ql/lib/semmle/javascript/Closure.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ module Closure {
177177
)
178178
)
179179
}
180+
181+
override DataFlow::Node getABulkExportedNode() {
182+
result = getExportsVariable().getAnAssignedExpr().flow()
183+
}
180184
}
181185

182186
/**

javascript/ql/lib/semmle/javascript/Modules.qll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,23 @@ abstract class Module extends TopLevel {
111111
cached
112112
abstract DataFlow::Node getAnExportedValue(string name);
113113

114+
/**
115+
* Gets a value that is exported as the whole exports object of this module.
116+
*/
117+
cached
118+
DataFlow::Node getABulkExportedNode() { none() } // overridden in subclasses
119+
120+
/**
121+
* Gets the ES2015 `default` export from this module, or for other types of modules,
122+
* gets a bulk exported node.
123+
*
124+
* This can be used to determine which value a default-import will likely refer to,
125+
* as the interaction between different module types is not standardized.
126+
*/
127+
DataFlow::Node getDefaultOrBulkExport() {
128+
result = [getAnExportedValue("default"), getABulkExportedNode()]
129+
}
130+
114131
/**
115132
* Gets the root folder relative to which the given import path (which must
116133
* appear in this module) is resolved.

javascript/ql/lib/semmle/javascript/NodeJS.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ class NodeModule extends Module {
9999
)
100100
}
101101

102+
override DataFlow::Node getABulkExportedNode() {
103+
exists(DataFlow::PropWrite write |
104+
write.getBase().asExpr() = getModuleVariable().getAnAccess() and
105+
write.getPropertyName() = "exports" and
106+
result = write.getRhs()
107+
)
108+
}
109+
102110
/** Gets a symbol that the module object inherits from its prototypes. */
103111
private string getAnImplicitlyExportedSymbol() {
104112
exists(ExternalConstructor ec | ec = getPrototypeOfExportedExpr() |

javascript/ql/lib/semmle/javascript/PackageExports.qll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,9 @@ private DataFlow::Node getAValueExportedByPackage() {
164164
* Gets an exported node from the module `mod`.
165165
*/
166166
private DataFlow::Node getAnExportFromModule(Module mod) {
167-
result.analyze().getAValue() = mod.(NodeModule).getAModuleExportsValue()
168-
or
169-
result = mod.(Closure::ClosureModule).getExportsVariable().getAnAssignedExpr().flow()
167+
result = mod.getAnExportedValue(_)
170168
or
171-
result.analyze().getAValue() = mod.(AmdModule).getDefine().getAModuleExportsValue()
169+
result = mod.getABulkExportedNode()
172170
or
173-
result = mod.getAnExportedValue(_)
171+
result.analyze().getAValue() = TAbstractModuleObject(mod)
174172
}

0 commit comments

Comments
 (0)