Files
IoT_PreTester_Demo/V4.5/django_project/IoTAnalyzer/models.py
T
2026-06-24 14:53:14 +02:00

485 lines
16 KiB
Python

from django.db import models
import json
#This class defines the manufacturer
class Manufacturer(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"name": self.name,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_manufacturer'
ordering = ['name']
#This class defines the device type
class DeviceType(models.Model):
id = models.AutoField(primary_key=True)
device_type = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"device_type": self.device_type,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_device_type'
ordering = ['device_type']
#This class defines the product
class Product(models.Model):
id = models.AutoField(primary_key=True)
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.PROTECT)
device_type = models.ForeignKey(DeviceType, on_delete=models.PROTECT)
product_name = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"manufacturer": self.manufacturer.to_json(),
"product_name": self.product_name,
"device_type": self.device_type.to_json(),
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_product'
ordering = ['product_name']
#This class defines the hardware device
class Device(models.Model):
id = models.AutoField(primary_key=True)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
serial = models.CharField(max_length=50)
comment = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)
#firmware = models.ManyToManyField(Firmware, through='FirmwareDevices')
def to_json(self):
return {
"id": self.id,
"product": self.product.to_json(),
"serial": self.serial,
"comment":self.comment,
"created": self.created.isoformat(),
}
class Meta:
db_table = 'iot_device'
unique_together = ('product', 'serial')
#This class defines the software for the hardware device
class Firmware(models.Model):
id = models.AutoField(primary_key=True)
version = models.CharField(max_length=50)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
devices = models.ManyToManyField(Device, through='FirmwareDevices')
def to_json(self):
return {
"id": self.id,
"version": self.version,
"product": self.product.id,
"created": self.created.isoformat(),
}
class Meta:
db_table = 'iot_firmware'
unique_together = ('product', 'version')
class FirmwareDevices(models.Model):
id = models.AutoField(primary_key=True)
firmware = models.ForeignKey(Firmware, on_delete=models.CASCADE)
device = models.ForeignKey(Device, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"firmware_id": self.firmware.id,
"device_id": self.device_id,
"created": self.created.isoformat(),
}
class Meta:
db_table = 'iot_firmware_devices'
# This class represents the Pcap file
class File(models.Model):
id = models.AutoField(primary_key=True)
firmware = models.ForeignKey(Firmware, on_delete=models.CASCADE)
device = models.ForeignKey(Device, on_delete=models.CASCADE)
filename = models.CharField(max_length=50)
ip_address = models.CharField(max_length=50)
status = models.CharField(max_length=50)
upload_time = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"filename": self.filename,
"ip_address": self.ip_address,
"status": self.status,
"upload_time": self.upload_time.isoformat()
}
class Meta:
db_table = 'iot_files'
### Raw data
# This class represents the raw dataset
class RawDataset(models.Model):
id = models.AutoField(primary_key=True)
file = models.ForeignKey(File, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"file": self.file.to_json(),
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_raw_dataset'
# This class represents the raw hash data.
class HashRaw(models.Model):
id = models.AutoField(primary_key=True)
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
hash_value = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"raw_dataset.id": self.raw_dataset.id,
"hash_value": self.hash_value,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_raw_hash'
# This class represents the raw DNS data
class DnsRaw(models.Model):
id = models.AutoField(primary_key=True)
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
dns_hostname = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"raw_dataset_id": self.raw_dataset.id,
"dns_hostname": self.dns_hostname,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_raw_dns'
# This class represents the raw URL data
class UrlRaw(models.Model):
id = models.AutoField(primary_key=True)
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
url = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"raw_dataset.id": self.raw_dataset.id,
"url": self.url,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_raw_url'
# This class represents the tools used
class Tool(models.Model):
id = models.AutoField(primary_key=True)
tool_name = models.CharField(max_length=50)
version = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"tool_name": self.tool_name,
"version": self.version,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_tool'
### Analyzed data
# A class for discovered ports
class Port(models.Model):
id = models.AutoField(primary_key=True)
port = models.IntegerField(unique=True)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"port": self.port,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_ports'
# A class for discovered TLS versions
class TlsVersion(models.Model):
id = models.AutoField(primary_key=True)
tls_version = models.TextField(max_length=50, unique=True)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"tls_version": self.tls_version,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_tls_versions'
def __str__(self):
return self.tls_version
# A class for discovered CipherSuites
class CipherSuite(models.Model):
id = models.AutoField(primary_key=True)
cipher_suite = models.TextField(max_length=50, unique=True)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"cipher_suite": self.cipher_suite,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_cipher_suites'
def __str__(self):
return self.cipher_suite
# A class for hash types
class HashType(models.Model):
id = models.AutoField(primary_key=True)
hash_type = models.TextField(max_length=50, unique=True)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"hash_type": self.hash_type,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_hash_types'
# This class represents an analyzed dataset
class AnalyzedDataset(models.Model):
id = models.AutoField(primary_key=True)
file = models.ForeignKey(File, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"file": self.file.id,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_analyzed_dataset'
# This class represents the analyzed DNS data
class DnsAnalyzed(models.Model):
id = models.AutoField(primary_key=True)
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
dns_hostname = models.TextField(max_length=200)
record_type = models.TextField(max_length=50)
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
ports = models.ManyToManyField(Port)
tls_versions = models.ManyToManyField(TlsVersion)
cipher_suites = models.ManyToManyField(CipherSuite)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"analyzed_dataset_id": self.analyzed_dataset.id,
"dns_hostname": self.dns_hostname,
"record_type": self.record_type,
"tool": self.tool.id,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_analyzed_dns'
# This class represents the analyzed URL data
class UrlAnalyzed(models.Model):
id = models.AutoField(primary_key=True)
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
url = models.TextField(max_length=200)
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
ports = models.ManyToManyField(Port)
tls_versions = models.ManyToManyField(TlsVersion)
cipher_suites = models.ManyToManyField(CipherSuite)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"analyzed_dataset_id": self.analyzed_dataset.id, # _id instead of .id for consistency
"url": self.url,
"tool_id": self.tool.id, # _id added for consistency
"ports": [port.to_json() for port in self.ports.all()], # to_json() instead of only id
"tls_versions": [version.to_json() for version in self.tls_versions.all()], # to_json()
"cipher_suites": [suite.to_json() for suite in self.cipher_suites.all()], # to_json()
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_analyzed_url'
# This class represents the analyzed hash data
class HashAnalyzed(models.Model):
id = models.AutoField(primary_key=True)
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
hash_type = models.ManyToManyField(HashType)
hash_value = models.CharField(max_length=50)
cracked = models.BooleanField(default=False)
cracked_value = models.CharField(max_length=50, blank=True, null=True)
crack_time = models.CharField(max_length=50, blank=True, null=True)
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"analyzed_dataset_id": self.analyzed_dataset.id,
"hash_type": [hash_type.to_json() for hash_type in self.hash_type.all()],
"hash_value": self.hash_value,
"cracked": self.cracked,
"cracked_value": self.cracked_value,
"crack_time": self.crack_time,
"tool": self.tool.id,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_analyzed_hash'
# This class represents Binwalk raw data
class BinwalkRaw(models.Model):
id = models.AutoField(primary_key=True)
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
offset = models.CharField(max_length=20) # Hex offset (e.g. 0x1000)
description = models.TextField(max_length=500) # What was found
file_path = models.TextField(max_length=500, blank=True, null=True) # Extracted file
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"raw_dataset_id": self.raw_dataset.id,
"offset": self.offset,
"description": self.description,
"file_path": self.file_path,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_raw_binwalk'
# This class represents Strings raw data
class StringsRaw(models.Model):
id = models.AutoField(primary_key=True)
raw_dataset = models.ForeignKey(RawDataset, on_delete=models.CASCADE)
string_value = models.TextField(max_length=1000)
string_type = models.CharField(max_length=50, default='generic') # url, ip, path, generic
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"raw_dataset_id": self.raw_dataset.id,
"string_value": self.string_value,
"string_type": self.string_type,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_raw_strings'
# This class represents analyzed Binwalk data
class BinwalkAnalyzed(models.Model):
id = models.AutoField(primary_key=True)
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
component_type = models.CharField(max_length=100) # e.g. "Linux Kernel", "U-Boot"
offset = models.CharField(max_length=20)
size = models.CharField(max_length=20, blank=True, null=True)
entropy = models.FloatField(blank=True, null=True) # Encryption/compression
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"analyzed_dataset_id": self.analyzed_dataset.id,
"component_type": self.component_type,
"offset": self.offset,
"size": self.size,
"entropy": self.entropy,
"tool_id": self.tool.id,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_analyzed_binwalk'
# This class represents analyzed Strings data (critical findings)
class StringsAnalyzed(models.Model):
id = models.AutoField(primary_key=True)
analyzed_dataset = models.ForeignKey(AnalyzedDataset, on_delete=models.CASCADE)
string_value = models.TextField(max_length=1000)
category = models.CharField(max_length=50) # credentials, api_key, url, ip, path
severity = models.CharField(max_length=20, default='info') # critical, high, medium, low, info
tool = models.ForeignKey(Tool, on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
def to_json(self):
return {
"id": self.id,
"analyzed_dataset_id": self.analyzed_dataset.id,
"string_value": self.string_value,
"category": self.category,
"severity": self.severity,
"tool_id": self.tool.id,
"created": self.created.isoformat()
}
class Meta:
db_table = 'iot_analyzed_strings'