Skip to content

Commit 637f40c

Browse files
authored
webapp: Add new api for custom type definition querying (#2166)
* webapp: Add new api for custom type definition querying Signed-off-by: Arthur Chan <[email protected]> * Fix formatting Signed-off-by: Arthur Chan <[email protected]> --------- Signed-off-by: Arthur Chan <[email protected]>
1 parent 471dc87 commit 637f40c

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

tools/web-fuzzing-introspection/app/static/assets/db/oss_fuzz.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ def get_introspector_report_url_report(project_name, datestr):
4747
datestr) + "fuzz_report.html"
4848

4949

50+
def get_introspector_report_url_typedef(project_name, datestr):
51+
return get_introspector_report_url_base(project_name,
52+
datestr) + "full_type_defs.json"
53+
54+
5055
def get_fuzzer_stats_fuzz_count_url(project_name, date_str):
5156
base_url = 'https://storage.googleapis.com/oss-fuzz-coverage/{0}/fuzzer_stats/{1}/coverage_targets.txt'
5257
coverage_targets = base_url.format(project_name, date_str)
@@ -233,6 +238,17 @@ def extract_local_introspector_report(project_name, oss_fuzz_folder):
233238
return json_dict
234239

235240

241+
def extract_local_introspector_typedef(project_name, oss_fuzz_folder):
242+
summary_json = os.path.join(oss_fuzz_folder, 'build', 'out', project_name,
243+
'inspector', 'full_type_defs.json')
244+
if not os.path.isfile(summary_json):
245+
return {}
246+
247+
with open(summary_json, 'r') as f:
248+
json_list = json.load(f)
249+
return json_list
250+
251+
236252
def get_local_code_coverage_summary(project_name, oss_fuzz_folder):
237253
summary_json = os.path.join(oss_fuzz_folder, 'build', 'out', project_name,
238254
'report', 'linux', 'summary.json')
@@ -366,6 +382,24 @@ def extract_introspector_test_files_xref(project_name, date_str):
366382
return test_files
367383

368384

385+
def extract_introspector_typedef(project_name, date_str):
386+
introspector_test_url = get_introspector_report_url_typedef(
387+
project_name, date_str.replace("-", ""))
388+
389+
# Read the introspector atifact
390+
try:
391+
raw_introspector_json_request = requests.get(introspector_test_url,
392+
timeout=10)
393+
except:
394+
return []
395+
try:
396+
typedef_list = json.loads(raw_introspector_json_request.text)
397+
except:
398+
return []
399+
400+
return typedef_list
401+
402+
369403
def extract_introspector_report(project_name, date_str):
370404
introspector_summary_url = get_introspector_report_url_summary(
371405
project_name, date_str.replace("-", ""))

tools/web-fuzzing-introspection/app/static/assets/db/web_db_creator_from_summary.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,10 @@ def extract_local_project_data(project_name, oss_fuzz_path,
449449
except:
450450
project_repository = 'N/A'
451451

452+
# Extract type definition
453+
typedef_list = oss_fuzz.extract_local_introspector_typedef(
454+
project_name, oss_fuzz_path)
455+
452456
introspector_data_dict = {
453457
"introspector_report_url":
454458
'introspector_url',
@@ -469,7 +473,9 @@ def extract_local_project_data(project_name, oss_fuzz_path,
469473
'annotated_cfg':
470474
annotated_cfg,
471475
'project_name':
472-
project_name
476+
project_name,
477+
'typedef_list':
478+
typedef_list
473479
}
474480

475481
code_coverage_data_dict = prepare_code_coverage_dict(
@@ -721,6 +727,10 @@ def extract_project_data(project_name, date_str, should_include_details,
721727
# Dump things we dont want to accummulate.
722728
save_branch_blockers(branch_pairs, project_name)
723729

730+
# Extract type definition
731+
typedef_list = oss_fuzz.extract_introspector_typedef(
732+
project_name, date_str)
733+
724734
introspector_data_dict = {
725735
"introspector_report_url": introspector_report_url,
726736
"coverage_lines":
@@ -734,7 +744,8 @@ def extract_project_data(project_name, date_str, should_include_details,
734744
'refined_constructor_list': refined_constructor_list,
735745
'annotated_cfg': annotated_cfg,
736746
'optimal_targets': optimal_targets,
737-
'project_name': project_name
747+
'project_name': project_name,
748+
'typedef_list': typedef_list
738749
}
739750

740751
code_coverage_data_dict = prepare_code_coverage_dict(

tools/web-fuzzing-introspection/app/webapp/routes.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,6 +1319,36 @@ def api_annotated_cfg(args):
13191319
return {'result': 'error', 'msg': 'Found no introspector data.'}
13201320

13211321

1322+
@api_blueprint.route('/api/full-type-definition')
1323+
@api_blueprint.arguments(ProjectSchema, location='query')
1324+
def api_full_type_definition(args):
1325+
"""API that returns the full type definition of a project."""
1326+
project_name = args.get('project', '')
1327+
if not project_name:
1328+
return {'result': 'error', 'msg': 'Please provide project name'}
1329+
1330+
target_project = get_project_with_name(project_name)
1331+
if target_project is None:
1332+
return {'result': 'error', 'msg': 'Project not in the database'}
1333+
1334+
if target_project.introspector_data is None:
1335+
return {'result': 'error', 'msg': 'Found no introspector data.'}
1336+
1337+
try:
1338+
return {
1339+
'result': 'success',
1340+
'project': {
1341+
'name': project_name,
1342+
'typedef_list':
1343+
target_project.introspector_data['typedef_list'],
1344+
}
1345+
}
1346+
except KeyError:
1347+
return {'result': 'error', 'msg': 'Found no type definition data.'}
1348+
except TypeError:
1349+
return {'result': 'error', 'msg': 'Found no introspector data.'}
1350+
1351+
13221352
@api_blueprint.route('/api/project-summary')
13231353
@api_blueprint.arguments(ProjectSchema, location='query')
13241354
def api_project_summary(args):

0 commit comments

Comments
 (0)