Skip to content

Commit 930fbf7

Browse files
committed
Move getFlaskMailArgument inside FlaskMail and refactor
1 parent 6b04344 commit 930fbf7

1 file changed

Lines changed: 22 additions & 30 deletions

File tree

python/ql/src/experimental/semmle/python/libraries/FlaskMail.qll

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)