88import sys
99import tempfile
1010
11- language = "java"
12-
1311class Generator :
1412 def __init__ (self , language ):
1513 self .language = language
@@ -18,6 +16,7 @@ def __init__ (self, language):
1816 self .generateSummaries = False
1917 self .dryRun = False
2018
19+
2120 def printHelp (self ):
2221 print (f"""Usage:
2322python3 GenerateFlowModel.py <library-database> <outputQll> [--with-sinks] [--with-sources] [--with-summaries] [--dry-run]
@@ -57,6 +56,7 @@ def setenvironment(self, target, database):
5756 self .workDir = tempfile .mkdtemp ()
5857 os .makedirs (self .generatedFrameworks , exist_ok = True )
5958
59+
6060 @staticmethod
6161 def make (language ):
6262 generator = Generator (language )
@@ -90,6 +90,7 @@ def make(language):
9090 generator .setenvironment (sys .argv [2 ], sys .argv [1 ])
9191 return generator
9292
93+
9394 def runQuery (self , infoMessage , query ):
9495 print ("########## Querying " + infoMessage + "..." )
9596 queryFile = os .path .join (os .path .dirname (
@@ -147,50 +148,60 @@ def asCsvModel(self, superclass, kind, rows):
147148 return classTemplate .format (self .shortname [0 ].upper () + self .shortname [1 :], kind .capitalize (), superclass , rows )
148149
149150
150- generator = Generator .make (language )
151+ def makeContent (self ):
152+ if self .generateSummaries :
153+ summaryRows = self .runQuery ("summary models" , "CaptureSummaryModels.ql" )
154+ summaryCsv = self .asCsvModel ("SummaryModelCsv" , "summary" , summaryRows )
155+ else :
156+ summaryCsv = ""
151157
152- if generator . generateSummaries :
153- summaryRows = generator .runQuery ("summary models" , "CaptureSummaryModels .ql" )
154- summaryCsv = generator .asCsvModel ("SummaryModelCsv " , "summary " , summaryRows )
155- else :
156- summaryCsv = ""
158+ if self . generateSinks :
159+ sinkRows = self .runQuery ("sink models" , "CaptureSinkModels .ql" )
160+ sinkCsv = self .asCsvModel ("SinkModelCsv " , "sinks " , sinkRows )
161+ else :
162+ sinkCsv = ""
157163
158- if generator . generateSinks :
159- sinkRows = generator .runQuery ("sink models" , "CaptureSinkModels .ql" )
160- sinkCsv = generator .asCsvModel ("SinkModelCsv " , "sinks " , sinkRows )
161- else :
162- sinkCsv = ""
164+ if self . generateSources :
165+ sourceRows = self .runQuery ("source models" , "CaptureSourceModels .ql" )
166+ sourceCsv = self .asCsvModel ("SourceModelCsv " , "sources " , sourceRows )
167+ else :
168+ sourceCsv = ""
163169
164- if generator .generateSources :
165- sourceRows = generator .runQuery ("source models" , "CaptureSourceModels.ql" )
166- sourceCsv = generator .asCsvModel ("SourceModelCsv" , "sources" , sourceRows )
167- else :
168- sourceCsv = ""
170+ return f"""
171+ /** Definitions of taint steps in the { self .shortname } framework */
169172
170- qllContents = f"""
171- /** Definitions of taint steps in the { generator .shortname } framework */
172-
173- import { generator .language }
174- private import semmle.code.{ generator .language } .dataflow.ExternalFlow
173+ import { self .language }
174+ private import semmle.code.{ self .language } .dataflow.ExternalFlow
175175
176176{ sinkCsv }
177177{ sourceCsv }
178178{ summaryCsv }
179179
180- """
180+ """
181181
182- if generator .dryRun :
183- print ("CSV Models generated, but not written to file." )
184- sys .exit (0 )
185182
186- with open (generator .frameworkTarget , "w" ) as frameworkQll :
187- frameworkQll .write (qllContents )
183+ def save (self , content ):
184+ with open (self .frameworkTarget , "w" ) as frameworkQll :
185+ frameworkQll .write (content )
188186
189- cmd = ['codeql' , 'query' , 'format' , '--in-place' , generator .frameworkTarget ]
190- ret = subprocess .call (cmd )
191- if ret != 0 :
192- print ("Failed to format query. Failed command was: " + shlex .join (cmd ))
193- sys .exit (1 )
187+ cmd = ['codeql' , 'query' , 'format' , '--in-place' , self .frameworkTarget ]
188+ ret = subprocess .call (cmd )
189+ if ret != 0 :
190+ print ("Failed to format query. Failed command was: " + shlex .join (cmd ))
191+ sys .exit (1 )
192+
193+ print ("" )
194+ print ("CSV model written to " + self .frameworkTarget )
195+
196+
197+ def run (self ):
198+ content = self .makeContent ()
194199
195- print ("" )
196- print ("CSV model written to " + generator .frameworkTarget )
200+ if self .dryRun :
201+ print ("CSV Models generated, but not written to file." )
202+ sys .exit (0 )
203+
204+ self .save (content )
205+
206+ language = "java"
207+ Generator .make (language ).run ()
0 commit comments