@@ -13,6 +13,7 @@ private import semmle.python.frameworks.Stdlib
13
13
private import semmle.python.ApiGraphs
14
14
private import semmle.python.frameworks.internal.InstanceTaintStepsHelper
15
15
private import semmle.python.security.dataflow.PathInjectionCustomizations
16
+ private import semmle.python.dataflow.new.FlowSummary
16
17
17
18
/**
18
19
* Provides models for the `flask` PyPI package.
@@ -587,4 +588,57 @@ module Flask {
587
588
private class FlaskLogger extends Stdlib:: Logger:: InstanceSource {
588
589
FlaskLogger ( ) { this = FlaskApp:: instance ( ) .getMember ( "logger" ) .asSource ( ) }
589
590
}
591
+
592
+ /**
593
+ * A flow summary for `flask.render_template_string`.
594
+ *
595
+ * see https://flask.palletsprojects.com/en/2.3.x/api/#flask.render_template_string
596
+ */
597
+ private class RenderTemplateStringSummary extends SummarizedCallable {
598
+ RenderTemplateStringSummary ( ) { this = "flask.render_template_string" }
599
+
600
+ override DataFlow:: CallCfgNode getACall ( ) {
601
+ result = API:: moduleImport ( "flask" ) .getMember ( "render_template_string" ) .getACall ( )
602
+ }
603
+
604
+ override DataFlow:: ArgumentNode getACallback ( ) {
605
+ result =
606
+ API:: moduleImport ( "flask" )
607
+ .getMember ( "render_template_string" )
608
+ .getAValueReachableFromSource ( )
609
+ }
610
+
611
+ override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
612
+ input = "Argument[0]" and
613
+ output = "ReturnValue" and
614
+ preservesValue = false
615
+ }
616
+ }
617
+
618
+ /**
619
+ * A flow summary for `flask.stream_template_string`.
620
+ *
621
+ * see https://flask.palletsprojects.com/en/2.3.x/api/#flask.stream_template_string
622
+ */
623
+ private class StreamTemplateStringSummary extends SummarizedCallable {
624
+ StreamTemplateStringSummary ( ) { this = "flask.stream_template_string" }
625
+
626
+ override DataFlow:: CallCfgNode getACall ( ) {
627
+ result = API:: moduleImport ( "flask" ) .getMember ( "stream_template_string" ) .getACall ( )
628
+ }
629
+
630
+ override DataFlow:: ArgumentNode getACallback ( ) {
631
+ result =
632
+ API:: moduleImport ( "flask" )
633
+ .getMember ( "stream_template_string" )
634
+ .getAValueReachableFromSource ( )
635
+ }
636
+
637
+ override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
638
+ input = "Argument[0]" and
639
+ // Technically it's `Iterator[str]`, but list will do :)
640
+ output = "ReturnValue.ListElement" and
641
+ preservesValue = false
642
+ }
643
+ }
590
644
}
0 commit comments