659 lines
24 KiB
Python
659 lines
24 KiB
Python
from django.contrib.auth.models import User
|
|
from django.http import HttpResponse
|
|
from .models import *
|
|
from .db_create import *
|
|
from .db_read import *
|
|
from .db_delete import *
|
|
from .db_validate import *
|
|
from .user_funcs import *
|
|
from .db_read import (
|
|
get_all_binwalk_raw_data_from_file,
|
|
get_all_strings_raw_data_from_file,
|
|
get_strings_by_type,
|
|
get_all_binwalk_analyzed_data_from_file,
|
|
get_all_strings_analyzed_data_from_file,
|
|
get_critical_strings_by_severity,
|
|
get_raw_data_by_file_extended
|
|
)
|
|
|
|
|
|
import os
|
|
import json
|
|
|
|
|
|
def get_all_files(folder_path):
|
|
try:
|
|
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
|
|
return files
|
|
except Exception as e:
|
|
print(f"An error occurred: {e}")
|
|
return []
|
|
|
|
|
|
|
|
from rest_framework.views import APIView
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
from django.core.serializers import serialize
|
|
from rest_framework import serializers
|
|
from django.http import JsonResponse
|
|
|
|
|
|
class ManufacturerSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Manufacturer
|
|
fields = ['id', 'name', 'created']
|
|
|
|
|
|
class DeviceSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Device
|
|
fields = ['id', 'device_name', 'created']
|
|
|
|
|
|
class DeviceTypeSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = DeviceType
|
|
fields = ['id', 'device_type']
|
|
|
|
|
|
class FileSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = File
|
|
fields = ['file_id', 'filename', 'upload_time', 'status', 'device_id']
|
|
|
|
|
|
class HashSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = File
|
|
fields = ['hash_id', 'hash_value', 'cracked', 'cracked_value', 'executed_at']
|
|
|
|
|
|
class ProductSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Product
|
|
fields = ['id', 'manufacturer', 'device_type', 'product_name', 'created']
|
|
|
|
|
|
class FirmwareSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Firmware
|
|
fields = ['id', 'product', 'version', 'created']
|
|
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['username', 'password', 'role']
|
|
|
|
|
|
class LoginSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['username', 'password']
|
|
|
|
|
|
class IdSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['id']
|
|
|
|
|
|
class ExampleAPI(APIView):
|
|
def get(self, request, pk, py, *args, **kwargs):
|
|
queryset = get_device_type_by_id(pk)
|
|
queryset = get_all_device_types()
|
|
#queryset = get_files_by_device(pk)
|
|
return Response(queryset)
|
|
|
|
def post(self, request, pk, py):
|
|
received_data = request.data
|
|
response_data = {"received": received_data}
|
|
return Response(response_data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class CreateFirmware(APIView):
|
|
def post(self, request):
|
|
serializer = FirmwareSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
product_id = serializer.validated_data.get("product").id
|
|
version = serializer.validated_data.get("version")
|
|
response = create_firmware(product_id, version)
|
|
return response
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class CreateProduct(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
serializer = ProductSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
manufacturer_id = serializer.validated_data.get("manufacturer").id
|
|
device_type_id = serializer.validated_data.get("device_type").id
|
|
product_name = serializer.validated_data.get("product_name")
|
|
response = create_product(manufacturer_id, device_type_id, product_name)
|
|
return response
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class CreateDeviceType(APIView):
|
|
def post(self, request):
|
|
serializer = DeviceTypeSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
device_type = serializer.data.get("device_type")
|
|
respone = create_device_type(device_type)
|
|
return respone
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class CreateManufacturer(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
serializer = ManufacturerSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
name = serializer.data.get("name")
|
|
response = create_manufacturer(name)
|
|
return response
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class CreateDeviceSerializer(serializers.Serializer):
|
|
device_type_id = serializers.IntegerField()
|
|
device_name = serializers.CharField(max_length=255)
|
|
serial = serializers.CharField(max_length=255)
|
|
manufacturer_id = serializers.IntegerField()
|
|
comment = serializers.CharField(max_length=255, required=False, allow_blank=True)
|
|
|
|
def create(self, validated_data):
|
|
return validated_data
|
|
|
|
|
|
class CreateDevice(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
serializer = CreateDeviceSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
device_type_id = serializer.validated_data.get("device_type_id")
|
|
device_name = serializer.validated_data.get("device_name")
|
|
serial = serializer.validated_data.get("serial")
|
|
manufacturer_id = serializer.validated_data.get("manufacturer_id")
|
|
comment = serializer.validated_data.get("comment", None)
|
|
response = create_new_device(manufacturer_id, device_type_id, device_name, serial, comment)
|
|
return response
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class CreateFileWithFirmware(APIView):
|
|
def post(self, request):
|
|
device_id = request.data.get('device_id')
|
|
firmware_version = request.data.get('firmware_version')
|
|
filename = request.data.get('filename')
|
|
ip_address = request.data.get('ip_address')
|
|
file_status = request.data.get('status')
|
|
|
|
response = create_file_with_firmware_version(device_id, firmware_version, filename, ip_address, file_status)
|
|
|
|
return response
|
|
|
|
|
|
class FilesForDevice(APIView):
|
|
def get(self, request, pk, *args, **kwargs):
|
|
device_queryset = Device.objects.prefetch_related('file_set').get(device_id=pk)
|
|
device_serializer = DeviceSerializer(device_queryset)
|
|
file_serializer = FileSerializer(device_queryset.file_set.all(), many=True)
|
|
response_data = {
|
|
'device': device_serializer.data,
|
|
'files': file_serializer.data
|
|
}
|
|
return Response(response_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class HashesFromFile(APIView):
|
|
def get(self, request, pk, *args, **kwargs):
|
|
file_queryset = Device.objects.prefetch_related('file_set').get(file_id=pk)
|
|
file_serializer = FileSerializer(file_queryset)
|
|
hash_serializer = FileSerializer(file_queryset.file_set.all(), many=True)
|
|
response_data = {
|
|
'file': file_serializer.data,
|
|
'hashes': hash_serializer.data
|
|
}
|
|
return Response(response_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetObject(APIView):
|
|
def get(self, request, model_name, *args, **kwargs):
|
|
model_class = globals().get(model_name)
|
|
if not model_class:
|
|
return Response({'status': 'error', 'message': 'Invalid model name'}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
filter_kwargs = request.query_params.dict()
|
|
select_related_fields = request.query_params.getlist('select_related')
|
|
|
|
try:
|
|
data = generic_get_objects(model_class, filter_kwargs, select_related_fields)
|
|
return Response({'status': 'success', 'data': data}, status=status.HTTP_200_OK)
|
|
except ObjectDoesNotExist as e:
|
|
return Response({'status': 'error', 'message': str(e)}, status=status.HTTP_404_NOT_FOUND)
|
|
except Exception as e:
|
|
return Response({'status': 'error', 'message': 'An error occurred'},
|
|
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
|
|
|
|
class GetManufacturers(APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
manufacturers = get_all_manufacturers()
|
|
return Response(manufacturers, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetDeviceTypes(APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
devicetypes = get_all_device_types()
|
|
return Response(devicetypes, status=status.HTTP_200_OK)
|
|
|
|
|
|
class RegisterUser(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
serializer = UserSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
username = serializer.validated_data.get("username")
|
|
password = serializer.validated_data.get("password")
|
|
if serializer.validated_data.get("role") == 'admin':
|
|
is_superuser = True
|
|
is_staff = True
|
|
else:
|
|
is_superuser = False
|
|
is_staff = True
|
|
response = register_user(request, username, password, is_superuser, is_staff)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_201_CREATED)
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class ListUser(APIView):
|
|
def get(self, request,*args, **kwargs):
|
|
return Response(list_users(request), status=status.HTTP_200_OK)
|
|
|
|
|
|
class DeleteUser(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
user_id = request.data.get("id")
|
|
if not user_id:
|
|
return Response({"error": "Missing user_id"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
user_id = int(user_id)
|
|
except ValueError:
|
|
return Response({"error": "Invalid user_id"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
response = delete_user(request, user_id)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_200_OK)
|
|
|
|
|
|
class Login(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
username = request.data.get("username")
|
|
password = request.data.get("password")
|
|
|
|
if not username or not password:
|
|
return Response({"error": "Missing required fields"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
response = login_user(request, username, password)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_200_OK)
|
|
|
|
class SetPassword(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
user_id = request.data.get("user_id")
|
|
new_password = request.data.get("new_password")
|
|
|
|
if not user_id or not new_password:
|
|
return Response({"error": "Missing required fields"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
user_id = int(user_id)
|
|
except ValueError:
|
|
return Response({"error": "Invalid user_id"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
response = set_password(request, user_id, new_password)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_200_OK)
|
|
except ValidationError as e:
|
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
|
except Exception as e:
|
|
return Response({"error": "An error occurred"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
|
|
|
|
class ChangePassword(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
user_id = request.data.get("user_id")
|
|
new_password = request.data.get("new_password")
|
|
|
|
if not user_id or not new_password:
|
|
return Response({"error": "Missing required fields"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
user_id = int(user_id)
|
|
except ValueError:
|
|
return Response({"error": "Invalid user_id"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
response = change_password(request, user_id, new_password)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_200_OK)
|
|
except ValidationError as e:
|
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
|
except Exception as e:
|
|
return Response({"error": "An error occurred"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
|
|
|
|
class RegisterUser(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
username = request.data.get("username")
|
|
password = request.data.get("password")
|
|
role = request.data.get("role")
|
|
|
|
if not username or not password or not role:
|
|
return Response({"error": "Missing required fields"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
if role == 'admin':
|
|
is_superuser = True
|
|
is_staff = True
|
|
else:
|
|
is_superuser = False
|
|
is_staff = True
|
|
|
|
response = register_user(request, username, password, is_superuser, is_staff)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class Logout(APIView):
|
|
def post(self, request, *args, **kwargs):
|
|
user_id = request.data.get("user_id")
|
|
|
|
if not user_id:
|
|
return Response({"error": "Missing user_id"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
user_id = int(user_id)
|
|
except ValueError:
|
|
return Response({"error": "Invalid user_id"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
try:
|
|
response = logout_user(request, user_id)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_200_OK)
|
|
except ValidationError as e:
|
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class DeleteUserView(APIView):
|
|
def delete(self, request, user_id, *args, **kwargs):
|
|
try:
|
|
response = delete_user(request, user_id)
|
|
if isinstance(response, JsonResponse):
|
|
return response
|
|
return Response(response, status=status.HTTP_200_OK)
|
|
except ValidationError as e:
|
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
|
except Exception as e:
|
|
return Response({"error": "An error occurred"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
|
|
|
|
class GetDevices(APIView):
|
|
def get(self, request, *args, **kwargs):
|
|
devices = get_all_devices()
|
|
return Response(devices, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetDeviceById(APIView):
|
|
def get(self, request, device_id, *args, **kwargs):
|
|
device = get_device_by_id(device_id)
|
|
return Response(device, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetFileByDevice(APIView):
|
|
def get(self, request, device_id, *args, **kwargs):
|
|
files = get_files_by_device(device_id)
|
|
return Response(files, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetRawHashesByFile(APIView):
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
hash_data = get_all_hash_raw_data_from_file(file_id)
|
|
if isinstance(hash_data, JsonResponse):
|
|
return hash_data
|
|
return Response(hash_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetRawUrlsByFile(APIView):
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
url_data = get_all_url_raw_data_from_file(file_id)
|
|
if isinstance(url_data, JsonResponse):
|
|
return url_data
|
|
return Response(url_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetAnalyzedUrlsByFile(APIView):
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
url_data = get_all_url_analyzed_data_from_file(file_id)
|
|
if isinstance(url_data, JsonResponse):
|
|
return url_data
|
|
return Response(url_data, status=status.HTTP_200_OK)
|
|
|
|
class GetAnalyzedDataByFile(APIView):
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
url_data = get_analyzed_data_by_file(file_id)
|
|
if isinstance(url_data, JsonResponse):
|
|
return url_data
|
|
return Response(url_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetAnalyzedUrlsByRawUrlId(APIView):
|
|
def get(self, request, raw_url_id, *args, **kwargs):
|
|
url_data = get_all_url_analyzed_by_raw_url_id(raw_url_id)
|
|
if isinstance(url_data, JsonResponse):
|
|
return url_data
|
|
return Response(url_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetAnalyzedHashesByRawUrlId(APIView):
|
|
def get(self, request, raw_hash_id, *args, **kwargs):
|
|
url_data = get_all_hash_analyzed_by_raw_hash_id(raw_hash_id)
|
|
if isinstance(url_data, JsonResponse):
|
|
return url_data
|
|
return Response(url_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class DeleteDevice(APIView):
|
|
def delete(self, request, device_id, *args, **kwargs):
|
|
deleteted = delete_device(device_id)
|
|
return Response(deleteted, status=status.HTTP_200_OK)
|
|
|
|
|
|
class DeleteManufacturer(APIView):
|
|
def delete(self, request, manufacturer_id, *args, **kwargs):
|
|
deleteted = delete_manufacturer(manufacturer_id)
|
|
return Response(deleteted, status=status.HTTP_200_OK)
|
|
|
|
|
|
class DeleteDeviceType(APIView):
|
|
def delete(self, request, device_type_id, *args, **kwargs):
|
|
deleted = delete_device_type(device_type_id)
|
|
return Response(deleted, status=status.HTTP_200_OK)
|
|
|
|
class GetBinwalkRawByFile(APIView):
|
|
"""
|
|
GET /api/get_binwalk_raw_data_from_file/<file_id>
|
|
Returns all Binwalk raw data for a file.
|
|
"""
|
|
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
binwalk_data = get_all_binwalk_raw_data_from_file(file_id)
|
|
if isinstance(binwalk_data, JsonResponse):
|
|
return binwalk_data
|
|
return Response(binwalk_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetStringsRawByFile(APIView):
|
|
"""
|
|
GET /api/get_strings_raw_data_from_file/<file_id>
|
|
Returns all Strings raw data for a file.
|
|
"""
|
|
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
strings_data = get_all_strings_raw_data_from_file(file_id)
|
|
if isinstance(strings_data, JsonResponse):
|
|
return strings_data
|
|
return Response(strings_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetStringsByType(APIView):
|
|
"""
|
|
GET /api/get_strings_by_type/<file_id>/<string_type>
|
|
Returns strings filtered by type (url, ip, path, etc.).
|
|
"""
|
|
|
|
def get(self, request, file_id, string_type, *args, **kwargs):
|
|
strings_data = get_strings_by_type(file_id, string_type)
|
|
if isinstance(strings_data, JsonResponse):
|
|
return strings_data
|
|
return Response(strings_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetBinwalkAnalyzedByFile(APIView):
|
|
"""
|
|
GET /api/get_binwalk_analyzed_data_from_file/<file_id>
|
|
Returns analyzed Binwalk data for a file.
|
|
"""
|
|
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
binwalk_data = get_all_binwalk_analyzed_data_from_file(file_id)
|
|
if isinstance(binwalk_data, JsonResponse):
|
|
return binwalk_data
|
|
return Response(binwalk_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetStringsAnalyzedByFile(APIView):
|
|
"""
|
|
GET /api/get_strings_analyzed_data_from_file/<file_id>
|
|
Returns analyzed Strings data for a file.
|
|
"""
|
|
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
strings_data = get_all_strings_analyzed_data_from_file(file_id)
|
|
if isinstance(strings_data, JsonResponse):
|
|
return strings_data
|
|
return Response(strings_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetCriticalStrings(APIView):
|
|
"""
|
|
GET /api/get_critical_strings/<file_id>?severity=medium
|
|
Returns critical strings filtered by severity.
|
|
"""
|
|
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
min_severity = request.query_params.get('severity', 'medium')
|
|
strings_data = get_critical_strings_by_severity(file_id, min_severity)
|
|
if isinstance(strings_data, JsonResponse):
|
|
return strings_data
|
|
return Response(strings_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class GetRawDataExtended(APIView):
|
|
"""
|
|
GET /api/get_raw_data_extended/<file_id>
|
|
Returns ALL raw data including firmware data.
|
|
"""
|
|
|
|
def get(self, request, file_id, *args, **kwargs):
|
|
raw_data = get_raw_data_by_file_extended(file_id)
|
|
if isinstance(raw_data, JsonResponse):
|
|
return raw_data
|
|
return Response(raw_data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class UploadFirmware(APIView):
|
|
"""
|
|
POST /api/upload_firmware
|
|
Uploads a .bin firmware and starts automatic analysis.
|
|
Body: {
|
|
"device_id": int,
|
|
"firmware_version": str,
|
|
"filename": str,
|
|
"ip_address": str,
|
|
"status": str
|
|
}
|
|
"""
|
|
|
|
def post(self, request):
|
|
device_id = request.data.get('device_id')
|
|
firmware_version = request.data.get('firmware_version')
|
|
filename = request.data.get('filename')
|
|
ip_address = request.data.get('ip_address')
|
|
file_status = request.data.get('status')
|
|
|
|
# Validation
|
|
if not all([device_id, firmware_version, filename, ip_address, file_status]):
|
|
return Response(
|
|
{"error": "Missing required fields"},
|
|
status=status.HTTP_400_BAD_REQUEST
|
|
)
|
|
|
|
# Check whether it is a .bin file
|
|
if not filename.lower().endswith('.bin'):
|
|
return Response(
|
|
{"error": "Only .bin files are supported for firmware analysis"},
|
|
status=status.HTTP_400_BAD_REQUEST
|
|
)
|
|
|
|
# Create file (as with PCAP)
|
|
response = create_file_with_firmware_version(
|
|
device_id,
|
|
firmware_version,
|
|
filename,
|
|
ip_address,
|
|
file_status
|
|
)
|
|
|
|
# If file creation was successful, start firmware analysis
|
|
if isinstance(response, JsonResponse):
|
|
response_data = json.loads(response.content.decode('utf-8'))
|
|
if response_data.get('status') == 'success':
|
|
file_id = response_data['data']['id']
|
|
|
|
# Raw dataset was already created in create_file_with_firmware_version
|
|
# Trigger firmware analysis (analogous to analyze_pcap_file)
|
|
from .analyze.analyze_firmware import analyze_firmware_file
|
|
from .models import RawDataset
|
|
|
|
try:
|
|
raw_dataset = RawDataset.objects.get(file_id=file_id)
|
|
analyze_firmware_file(filename, raw_dataset.id)
|
|
except Exception as e:
|
|
logger.error(f"Firmware analysis failed: {e}")
|
|
|
|
# Convert JsonResponse to Response
|
|
return Response(response_data, status=response.status_code)
|
|
|
|
# If response is not a JsonResponse, return it directly
|
|
return response
|
|
|
|
# Add import statements at the top of views.py:
|
|
# from .db_read import (
|
|
# get_all_binwalk_raw_data_from_file,
|
|
# get_all_strings_raw_data_from_file,
|
|
# get_strings_by_type,
|
|
# get_all_binwalk_analyzed_data_from_file,
|
|
# get_all_strings_analyzed_data_from_file,
|
|
# get_critical_strings_by_severity,
|
|
# get_raw_data_by_file_extended
|
|
# )
|