@@ -13,6 +13,7 @@ private import semmle.python.frameworks.Stdlib
1313private import semmle.python.ApiGraphs
1414private import semmle.python.frameworks.internal.InstanceTaintStepsHelper
1515private import semmle.python.security.dataflow.PathInjectionCustomizations
16+ private import semmle.python.dataflow.new.FlowSummary
1617
1718/**
1819 * Provides models for the `flask` PyPI package.
@@ -587,4 +588,57 @@ module Flask {
587588 private class FlaskLogger extends Stdlib:: Logger:: InstanceSource {
588589 FlaskLogger ( ) { this = FlaskApp:: instance ( ) .getMember ( "logger" ) .asSource ( ) }
589590 }
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+ }
590644}
0 commit comments