Skip to content

Commit b5d648a

Browse files
committed
Ruby: model ActionView::FileSystemResolver as a FileSystemAccess
1 parent d8b000f commit b5d648a

File tree

5 files changed

+29
-0
lines changed

5 files changed

+29
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Uses of `ActionView::FileSystemResolver` are now recognized as filesystem accesses.

ruby/ql/lib/codeql/ruby/frameworks/ActionView.qll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*/
44

55
private import codeql.ruby.AST
6+
private import codeql.ruby.ApiGraphs
67
private import codeql.ruby.Concepts
78
private import codeql.ruby.controlflow.CfgNodes
89
private import codeql.ruby.DataFlow
@@ -204,4 +205,15 @@ class LinkToCall extends ActionViewContextCall {
204205
not exists(this.getBlock()) and result = this.getArgument(1)
205206
}
206207
}
208+
209+
/**
210+
* An instantiation of `ActionView::FileSystemResolver`, considered as a `FileSystemAccess`.
211+
*/
212+
class FileSystemResolverAccess extends DataFlow::CallNode, FileSystemAccess::Range {
213+
FileSystemResolverAccess() {
214+
this = API::getTopLevelMember("ActionView").getMember("FileSystemResolver").getAnInstantiation()
215+
}
216+
217+
override DataFlow::Node getAPathArgument() { result = this.getArgument(0) }
218+
}
207219
// TODO: model flow in/out of template files properly,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| ActionView.rb:5:39:5:92 | call to new | ActionView.rb:5:74:5:82 | view_path |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import codeql.ruby.Concepts
2+
import codeql.ruby.DataFlow
3+
4+
query predicate fileSystemResolverAccesses(FileSystemAccess a, DataFlow::Node path) {
5+
a.getAPathArgument() = path
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
def setup_view_paths
3+
view_path = Rails.root.join("/path/to/views")
4+
pattern = ":prefix/:action{.:formats,}"
5+
ActionController::Base.view_paths = ActionView::FileSystemResolver.new(view_path, pattern)
6+
end

0 commit comments

Comments
 (0)