8
8
import sys
9
9
import tempfile
10
10
11
- language = "java"
12
-
13
11
class Generator :
14
12
def __init__ (self , language ):
15
13
self .language = language
@@ -18,6 +16,7 @@ def __init__ (self, language):
18
16
self .generateSummaries = False
19
17
self .dryRun = False
20
18
19
+
21
20
def printHelp (self ):
22
21
print (f"""Usage:
23
22
python3 GenerateFlowModel.py <library-database> <outputQll> [--with-sinks] [--with-sources] [--with-summaries] [--dry-run]
@@ -57,6 +56,7 @@ def setenvironment(self, target, database):
57
56
self .workDir = tempfile .mkdtemp ()
58
57
os .makedirs (self .generatedFrameworks , exist_ok = True )
59
58
59
+
60
60
@staticmethod
61
61
def make (language ):
62
62
generator = Generator (language )
@@ -90,6 +90,7 @@ def make(language):
90
90
generator .setenvironment (sys .argv [2 ], sys .argv [1 ])
91
91
return generator
92
92
93
+
93
94
def runQuery (self , infoMessage , query ):
94
95
print ("########## Querying " + infoMessage + "..." )
95
96
queryFile = os .path .join (os .path .dirname (
@@ -147,50 +148,60 @@ def asCsvModel(self, superclass, kind, rows):
147
148
return classTemplate .format (self .shortname [0 ].upper () + self .shortname [1 :], kind .capitalize (), superclass , rows )
148
149
149
150
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 = ""
151
157
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 = ""
157
163
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 = ""
163
169
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 */
169
172
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
175
175
176
176
{ sinkCsv }
177
177
{ sourceCsv }
178
178
{ summaryCsv }
179
179
180
- """
180
+ """
181
181
182
- if generator .dryRun :
183
- print ("CSV Models generated, but not written to file." )
184
- sys .exit (0 )
185
182
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 )
188
186
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 ()
194
199
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