4
4
5
5
private import codeql.ruby.AST
6
6
private import codeql.ruby.ApiGraphs
7
+ private import codeql.ruby.DataFlow
7
8
private import codeql.ruby.frameworks.internal.Rails
8
9
9
10
/**
10
11
* Provides modeling for the `ActionMailer` library.
11
12
*/
12
13
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
+
13
27
/**
14
28
* A `ClassDeclaration` for a class that extends `ActionMailer::Base`.
15
29
* For example,
@@ -21,33 +35,11 @@ module ActionMailer {
21
35
* ```
22
36
*/
23
37
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 ( ) }
47
39
}
48
40
49
41
/** 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 ( ) }
52
44
}
53
45
}
0 commit comments