44
55private import codeql.ruby.AST
66private import codeql.ruby.ApiGraphs
7+ private import codeql.ruby.DataFlow
78private import codeql.ruby.frameworks.internal.Rails
89
910/**
1011 * Provides modeling for the `ActionMailer` library.
1112 */
1213module 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