Files
Mobile-Security-Framework-M…/mobsf/MobSF/views/api/api_static_analysis.py
T
Ajin Abraham cf59941081 HOTFIX: setup.py and directory refactoring
Python setup.py #1585
directory refactoring
2021-01-17 01:47:49 -05:00

187 lines
6.2 KiB
Python
Executable File

# -*- coding: utf_8 -*-
"""MobSF REST API V 1."""
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from mobsf.MobSF.views.helpers import request_method
from mobsf.MobSF.views.home import RecentScans, Upload, delete_scan
from mobsf.MobSF.views.api.api_middleware import make_api_response
from mobsf.StaticAnalyzer.views.android import view_source
from mobsf.StaticAnalyzer.views.android.static_analyzer import static_analyzer
from mobsf.StaticAnalyzer.views.ios import view_source as ios_view_source
from mobsf.StaticAnalyzer.views.ios.static_analyzer import static_analyzer_ios
from mobsf.StaticAnalyzer.views.shared_func import (
compare_apps,
pdf,
)
from mobsf.StaticAnalyzer.views.windows import windows
@request_method(['POST'])
@csrf_exempt
def api_upload(request):
"""POST - Upload API."""
upload = Upload(request)
resp, code = upload.upload_api()
return make_api_response(resp, code)
@request_method(['GET'])
@csrf_exempt
def api_recent_scans(request):
"""GET - get recent scans."""
scans = RecentScans(request)
resp = scans.recent_scans()
if 'error' in resp:
return make_api_response(resp, 500)
else:
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_scan(request):
"""POST - Scan API."""
params = {'scan_type', 'hash', 'file_name'}
if set(request.POST) >= params:
scan_type = request.POST['scan_type']
# APK, Android ZIP and iOS ZIP
if scan_type in {'xapk', 'apk', 'zip'}:
resp = static_analyzer(request, True)
if 'type' in resp:
# For now it's only ios_zip
request.POST._mutable = True
request.POST['scan_type'] = 'ios'
resp = static_analyzer_ios(request, True)
if 'error' in resp:
response = make_api_response(resp, 500)
else:
response = make_api_response(resp, 200)
# IPA
elif scan_type == 'ipa':
resp = static_analyzer_ios(request, True)
if 'error' in resp:
response = make_api_response(resp, 500)
else:
response = make_api_response(resp, 200)
# APPX
elif scan_type == 'appx':
resp = windows.staticanalyzer_windows(request, True)
if 'error' in resp:
response = make_api_response(resp, 500)
else:
response = make_api_response(resp, 200)
else:
response = make_api_response(
{'error': 'Missing Parameters'}, 422)
return response
@request_method(['POST'])
@csrf_exempt
def api_delete_scan(request):
"""POST - Delete a Scan."""
if 'hash' in request.POST:
resp = delete_scan(request, True)
if 'error' in resp:
response = make_api_response(resp, 500)
else:
response = make_api_response(resp, 200)
else:
response = make_api_response(
{'error': 'Missing Parameters'}, 422)
return response
@request_method(['POST'])
@csrf_exempt
def api_pdf_report(request):
"""Generate and Download PDF."""
params = {'hash'}
if set(request.POST) == params:
resp = pdf(request, api=True)
if 'error' in resp:
if resp.get('error') == 'Invalid scan hash':
response = make_api_response(resp, 400)
else:
response = make_api_response(resp, 500)
elif 'pdf_dat' in resp:
response = HttpResponse(
resp['pdf_dat'], content_type='application/pdf')
response['Access-Control-Allow-Origin'] = '*'
elif resp.get('report') == 'Report not Found':
response = make_api_response(resp, 404)
else:
response = make_api_response(
{'error': 'PDF Generation Error'}, 500)
else:
response = make_api_response(
{'error': 'Missing Parameters'}, 422)
return response
@request_method(['POST'])
@csrf_exempt
def api_json_report(request):
"""Generate JSON Report."""
params = {'hash'}
if set(request.POST) == params:
resp = pdf(request, api=True, jsonres=True)
if 'error' in resp:
if resp.get('error') == 'Invalid scan hash':
response = make_api_response(resp, 400)
else:
response = make_api_response(resp, 500)
elif 'report_dat' in resp:
response = make_api_response(resp['report_dat'], 200)
elif resp.get('report') == 'Report not Found':
response = make_api_response(resp, 404)
else:
response = make_api_response(
{'error': 'JSON Generation Error'}, 500)
else:
response = make_api_response(
{'error': 'Missing Parameters'}, 422)
return response
@request_method(['POST'])
@csrf_exempt
def api_view_source(request):
"""View Source for android & ios source file."""
params = {'file', 'type', 'hash'}
if set(request.POST) >= params:
if request.POST['type'] in {'eclipse', 'studio',
'apk', 'java', 'smali'}:
resp = view_source.run(request, api=True)
else:
resp = ios_view_source.run(request, api=True)
if 'error' in resp:
response = make_api_response(resp, 500)
else:
response = make_api_response(resp, 200)
else:
response = make_api_response({'error': 'Missing Parameters'}, 422)
return response
@request_method(['POST'])
@csrf_exempt
def api_compare(request):
"""Compare 2 apps."""
params = {'hash1', 'hash2'}
if set(request.POST) >= params:
resp = compare_apps(
request,
request.POST['hash1'],
request.POST['hash2'],
True)
if 'error' in resp:
response = make_api_response(resp, 500)
else:
response = make_api_response(resp, 200)
else:
response = make_api_response({'error': 'Missing Parameters'}, 422)
return response