@@ -21,31 +21,6 @@ private module FlaskMail {
2121 /** Gets a reference to `flask_mail.Message`, `flask_sendmail.Message` and `flask.ext.sendmail.Message`. */
2222 private API:: Node flaskMessageInstance ( ) { result = flaskMail ( ) .getMember ( "Message" ) }
2323
24- /** Gets a call to `flask_mail.Message`, `flask_sendmail.Message` and `flask.ext.sendmail.Message`. */
25- private DataFlow:: CallCfgNode flaskMessageCall ( ) { result = flaskMessageInstance ( ) .getACall ( ) }
26-
27- /**
28- * Gets a reference to an argument from `flask_mail.Message`, `flask_sendmail.Message` and `flask.ext.sendmail.Message`.
29- *
30- * Usage example:
31- *
32- * ```codeql
33- * DataFlow::Node getPlainTextBody() { result = getFlaskMailArgument(2, "body") }
34- * ```
35- */
36- bindingset [ argumentPosition, argumentName]
37- private DataFlow:: Node getFlaskMailArgument ( int argumentPosition , string argumentName ) {
38- result in [
39- flaskMessageCall ( ) .getArg ( argumentPosition ) , flaskMessageCall ( ) .getArgByName ( argumentName )
40- ]
41- or
42- exists ( DataFlow:: AttrWrite write |
43- write .getObject ( ) .getALocalSource ( ) = flaskMessageCall ( ) and
44- write .getAttributeName ( ) = argumentName and
45- result = write .getValue ( )
46- )
47- }
48-
4924 /**
5025 * Gets a call to `mail.send()`.
5126 *
@@ -75,18 +50,35 @@ private module FlaskMail {
7550 .getACall ( )
7651 }
7752
78- override DataFlow:: Node getPlainTextBody ( ) { result = getFlaskMailArgument ( 2 , "body" ) }
53+ private DataFlow:: CallCfgNode getMessage ( ) { result = this .getArg ( 0 ) .getALocalSource ( ) }
54+
55+ bindingset [ argumentPosition]
56+ private DataFlow:: Node getFlaskMailArgument ( int argumentPosition , string argumentName ) {
57+ argumentPosition in [ [ 0 .. 3 ] , 5 ] and
58+ argumentName in [ "body" , "html" , "recipients" , "sender" , "subject" ] and
59+ result in [
60+ this .getMessage ( ) .getArg ( argumentPosition ) , this .getMessage ( ) .getArgByName ( argumentName )
61+ ]
62+ or
63+ exists ( DataFlow:: AttrWrite write |
64+ write .getObject ( ) .getALocalSource ( ) = this .getMessage ( ) and
65+ write .getAttributeName ( ) = argumentName and
66+ result = write .getValue ( )
67+ )
68+ }
69+
70+ override DataFlow:: Node getPlainTextBody ( ) { result = this .getFlaskMailArgument ( 2 , "body" ) }
7971
80- override DataFlow:: Node getHtmlBody ( ) { result = getFlaskMailArgument ( 3 , "html" ) }
72+ override DataFlow:: Node getHtmlBody ( ) { result = this . getFlaskMailArgument ( 3 , "html" ) }
8173
8274 override DataFlow:: Node getTo ( ) {
83- result = getFlaskMailArgument ( 1 , "recipients" )
75+ result = this . getFlaskMailArgument ( 1 , "recipients" )
8476 or
8577 result = flaskMessageInstance ( ) .getMember ( "add_recipient" ) .getACall ( ) .getArg ( 0 )
8678 }
8779
88- override DataFlow:: Node getFrom ( ) { result = getFlaskMailArgument ( 5 , "sender" ) }
80+ override DataFlow:: Node getFrom ( ) { result = this . getFlaskMailArgument ( 5 , "sender" ) }
8981
90- override DataFlow:: Node getSubject ( ) { result = getFlaskMailArgument ( 0 , "subject" ) }
82+ override DataFlow:: Node getSubject ( ) { result = this . getFlaskMailArgument ( 0 , "subject" ) }
9183 }
9284}
0 commit comments