Skip to content

Commit dfb0487

Browse files
authored
Merge pull request #1 from adrienpessu/copilot/add-codeql-model-for-useroute-query
Model Vue Router useRoute query as a remote flow source
2 parents 2eb0158 + 7e08178 commit dfb0487

6 files changed

Lines changed: 27 additions & 1 deletion

File tree

change-notes/1.26/analysis-javascript.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
- [styled-components](https://www.npmjs.com/package/styled-components)
4343
- [throttle-debounce](https://www.npmjs.com/package/throttle-debounce)
4444
- [underscore](https://www.npmjs.com/package/underscore)
45+
- [vue-router](https://www.npmjs.com/package/vue-router)
4546

4647
* Analyzing files with the ".cjs" extension is now supported.
4748
* ES2021 features are now supported.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The query parameter of Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/javascript-all
4+
extensible: summaryModel
5+
data:
6+
# ref(x).value === x
7+
- ["vue", "Member[ref]", "Argument[0]", "ReturnValue.Member[value]", "value"]
8+
# shallowRef(x).value === x
9+
- ["vue", "Member[shallowRef]", "Argument[0]", "ReturnValue.Member[value]", "value"]
10+
# customRef / toRef keep the wrapped value reachable via .value
11+
- ["vue", "Member[toRef]", "Argument[0]", "ReturnValue.Member[value]", "taint"]
12+
# reactive(x) returns a proxy that preserves the members of x
13+
- ["vue", "Member[reactive]", "Argument[0]", "ReturnValue", "taint"]
14+
# computed(() => expr).value === return value of the getter
15+
- ["vue", "Member[computed]", "Argument[0].ReturnValue", "ReturnValue.Member[value]", "value"]

javascript/ql/lib/semmle/javascript/frameworks/Vue.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,8 @@ module Vue {
652652
t.start() and
653653
(
654654
exists(API::Node router | router = API::moduleImport("vue-router") |
655+
result = router.getMember("useRoute").getACall()
656+
or
655657
result = router.getInstance().getMember("currentRoute").asSource()
656658
or
657659
result =

javascript/ql/test/library-tests/frameworks/Vue/router.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Router from 'vue-router';
1+
import Router, { useRoute } from 'vue-router';
22

33
export const router = new Router({
44
routes: [
@@ -43,3 +43,5 @@ router.afterEach((to, from) => {
4343
to.query.x;
4444
from.query.x;
4545
});
46+
47+
useRoute().query;

javascript/ql/test/library-tests/frameworks/Vue/tests.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ remoteFlowSource
191191
| router.js:39:5:39:14 | from.query |
192192
| router.js:43:5:43:12 | to.query |
193193
| router.js:44:5:44:14 | from.query |
194+
| router.js:47:1:47:16 | useRoute().query |
194195
parseErrors
195196
attribute
196197
| compont-with-route.vue:2:8:2:21 | v-html=dataA | v-html |
@@ -239,6 +240,7 @@ threatModelSource
239240
| router.js:39:5:39:14 | from.query | remote |
240241
| router.js:43:5:43:12 | to.query | remote |
241242
| router.js:44:5:44:14 | from.query | remote |
243+
| router.js:47:1:47:16 | useRoute().query | remote |
242244
| single-component-file-1.vue:7:45:7:54 | this.input | view-component-input |
243245
| single-file-component-3-script.js:5:42:5:51 | this.input | view-component-input |
244246
| single-file-component-4.vue:21:14:21:23 | this.input | view-component-input |

0 commit comments

Comments
 (0)