Skip to content

Commit fbfa319

Browse files
committed
Ruby: use new features in ActionMailer
1 parent 1ae4148 commit fbfa319

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

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

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,26 @@
44

55
private import codeql.ruby.AST
66
private import codeql.ruby.ApiGraphs
7+
private import codeql.ruby.DataFlow
78
private import codeql.ruby.frameworks.internal.Rails
89

910
/**
1011
* Provides modeling for the `ActionMailer` library.
1112
*/
1213
module ActionMailer {
14+
private DataFlow::ClassNode actionMailerClass() {
15+
result =
16+
[
17+
DataFlow::getConstant("ActionMailer").getConstant("Base"),
18+
// In Rails applications `ApplicationMailer` typically extends
19+
// `ActionMailer::Base`, but we treat it separately in case the
20+
// `ApplicationMailer` definition is not in the database.
21+
DataFlow::getConstant("ApplicationMailer")
22+
].getADescendentModule()
23+
}
24+
25+
private API::Node actionMailerInstance() { result = actionMailerClass().trackInstance() }
26+
1327
/**
1428
* A `ClassDeclaration` for a class that extends `ActionMailer::Base`.
1529
* For example,
@@ -21,33 +35,11 @@ module ActionMailer {
2135
* ```
2236
*/
2337
class MailerClass extends ClassDeclaration {
24-
MailerClass() {
25-
this.getSuperclassExpr() =
26-
[
27-
API::getTopLevelMember("ActionMailer").getMember("Base"),
28-
// In Rails applications `ApplicationMailer` typically extends
29-
// `ActionMailer::Base`, but we treat it separately in case the
30-
// `ApplicationMailer` definition is not in the database.
31-
API::getTopLevelMember("ApplicationMailer")
32-
].getASubclass().getAValueReachableFromSource().asExpr().getExpr()
33-
}
34-
}
35-
36-
/** A method call with a `self` receiver from within a mailer class */
37-
private class ContextCall extends MethodCall {
38-
private MailerClass mailerClass;
39-
40-
ContextCall() {
41-
this.getReceiver() instanceof SelfVariableAccess and
42-
this.getEnclosingModule() = mailerClass
43-
}
44-
45-
/** Gets the mailer class containing this method. */
46-
MailerClass getMailerClass() { result = mailerClass }
38+
MailerClass() { this = actionMailerClass().getADeclaration() }
4739
}
4840

4941
/** A call to `params` from within a mailer. */
50-
class ParamsCall extends ContextCall, ParamsCallImpl {
51-
ParamsCall() { this.getMethodName() = "params" }
42+
class ParamsCall extends ParamsCallImpl {
43+
ParamsCall() { this = actionMailerInstance().getAMethodCall("params").asExpr().getExpr() }
5244
}
5345
}

0 commit comments

Comments
 (0)