2121from  .draw  import  draw_cfgs , draw_lattices 
2222from  .expr_visitor  import  make_cfg 
2323from  .fixed_point  import  analyse 
24+ from  .formatters  import  (
25+     json ,
26+     text 
27+ )
2428from  .framework_adaptor  import  FrameworkAdaptor 
2529from  .framework_helper  import  (
2630    is_django_view_function ,
@@ -93,7 +97,7 @@ def parse_args(args):
9397                        help = 'Input trigger word file.' ,
9498                        type = str ,
9599                        default = default_trigger_word_file )
96-     parser .add_argument ('-b ' , '--blackbox-mapping-file' ,
100+     parser .add_argument ('-m ' , '--blackbox-mapping-file' ,
97101                        help = 'Input blackbox mapping file.' ,
98102                        type = str ,
99103                        default = default_blackbox_mapping_file )
@@ -111,6 +115,10 @@ def parse_args(args):
111115                        ' create a database.' , action = 'store_true' )
112116    parser .add_argument ('-dl' , '--draw-lattice' ,
113117                        nargs = '+' , help = 'Draws a lattice.' )
118+     parser .add_argument ('-j' , '--json' ,
119+                         help = 'Prints JSON instead of report.' ,
120+                         action = 'store_true' ,
121+                         default = False )
114122
115123    analysis_group  =  parser .add_mutually_exclusive_group ()
116124    analysis_group .add_argument ('-li' , '--liveness' ,
@@ -177,7 +185,7 @@ def parse_args(args):
177185    return  parser .parse_args (args )
178186
179187
180- def  analyse_repo (github_repo , analysis_type , ui_mode ):
188+ def  analyse_repo (args ,  github_repo , analysis_type , ui_mode ):
181189    cfg_list  =  list ()
182190    directory  =  os .path .dirname (github_repo .path )
183191    project_modules  =  get_modules (directory )
@@ -193,7 +201,7 @@ def analyse_repo(github_repo, analysis_type, ui_mode):
193201
194202    initialize_constraint_table (cfg_list )
195203    analyse (cfg_list , analysis_type = analysis_type )
196-     vulnerability_log  =  find_vulnerabilities (
204+     vulnerabilities  =  find_vulnerabilities (
197205        cfg_list ,
198206        analysis_type ,
199207        ui_mode ,
@@ -202,7 +210,7 @@ def analyse_repo(github_repo, analysis_type, ui_mode):
202210            args .trigger_word_file 
203211        )
204212    )
205-     return  vulnerability_log 
213+     return  vulnerabilities 
206214
207215
208216def  main (command_line_args = sys .argv [1 :]):
@@ -225,9 +233,12 @@ def main(command_line_args=sys.argv[1:]):
225233        repos  =  get_repos (args .git_repos )
226234        for  repo  in  repos :
227235            repo .clone ()
228-             vulnerability_log  =  analyse_repo (repo , analysis , ui_mode )
229-             vulnerability_log .print_report ()
230-             if  not  vulnerability_log .vulnerabilities :
236+             vulnerabilities  =  analyse_repo (args , repo , analysis , ui_mode )
237+             if  args .json :
238+                 json .report (vulnerabilities , sys .stdout )
239+             else :
240+                 text .report (vulnerabilities , sys .stdout )
241+             if  not  vulnerabilities :
231242                repo .clean_up ()
232243        exit ()
233244
@@ -239,7 +250,8 @@ def main(command_line_args=sys.argv[1:]):
239250            analysis ,
240251            analyse_repo ,
241252            args .csv_path ,
242-             ui_mode 
253+             ui_mode ,
254+             args 
243255        )
244256        exit ()
245257
@@ -278,7 +290,7 @@ def main(command_line_args=sys.argv[1:]):
278290
279291    analyse (cfg_list , analysis_type = analysis )
280292
281-     vulnerability_log  =  find_vulnerabilities (
293+     vulnerabilities  =  find_vulnerabilities (
282294        cfg_list ,
283295        analysis ,
284296        ui_mode ,
@@ -287,17 +299,20 @@ def main(command_line_args=sys.argv[1:]):
287299            args .trigger_word_file 
288300        )
289301    )
290-     vulnerability_log .print_report ()
302+     if  args .json :
303+         json .report (vulnerabilities , sys .stdout )
304+     else :
305+         text .report (vulnerabilities , sys .stdout )
291306
292307    if  args .draw_cfg :
293308        if  args .output_filename :
294309            draw_cfgs (cfg_list , args .output_filename )
295310        else :
296311            draw_cfgs (cfg_list )
297312    if  args .print :
298-         l  =  print_lattice (cfg_list , analysis )
313+         lattice  =  print_lattice (cfg_list , analysis )
299314
300-         print_table (l )
315+         print_table (lattice )
301316        for  i , e  in  enumerate (cfg_list ):
302317            print ('############## CFG number: ' , i )
303318            print (e )
@@ -311,7 +326,7 @@ def main(command_line_args=sys.argv[1:]):
311326        pprint (project_modules )
312327
313328    if  args .create_database :
314-         create_database (cfg_list , vulnerability_log )
329+         create_database (cfg_list , vulnerabilities )
315330    if  args .draw_lattice :
316331        draw_lattices (cfg_list )
317332
@@ -325,7 +340,7 @@ def main(command_line_args=sys.argv[1:]):
325340            cfg_to_file (cfg_list )
326341            verbose_cfg_to_file (cfg_list )
327342            lattice_to_file (cfg_list , analysis )
328-             vulnerabilities_to_file (vulnerability_log )
343+             vulnerabilities_to_file (vulnerabilities )
329344        else :
330345            if  args .def_use_chain :
331346                def_use_chain_to_file (cfg_list )
@@ -338,7 +353,7 @@ def main(command_line_args=sys.argv[1:]):
338353            if  args .lattice :
339354                lattice_to_file (cfg_list , analysis )
340355            if  args .vulnerabilities :
341-                 vulnerabilities_to_file (vulnerability_log )
356+                 vulnerabilities_to_file (vulnerabilities )
342357
343358
344359if  __name__  ==  '__main__' :
0 commit comments