PenetrationTestingScripts/rainmap-lite/nmaper/models.py

56 lines
1.9 KiB
Python

from __future__ import unicode_literals
import re
from django.db import models
from django.forms import ModelForm
from django.core.exceptions import ValidationError
SCAN_STATUS = ( ('waiting','Waiting'),('running','Running'),('finished','Finished') )
def validate_cmd(str):
valid = re.match('^[\sa-zA-Z0-9_/.,\"\'\=\(\)\*-]*$', str)
if not valid:
raise ValidationError(u'%s is not a valid Nmap command' % str)
class NmapProfile(models.Model):
alias_text = models.CharField(max_length=32)
args_text = models.CharField(max_length=1024, validators=[validate_cmd])
pub_date = models.DateTimeField('date created')
def __str__(self):
return self.alias_text
class NmapScan(models.Model):
target_text = models.CharField(max_length=1024)
cmd_text = models.CharField(max_length=256, validators=[validate_cmd])
email_text = models.EmailField(max_length=254)
status_text = models.CharField(max_length=16, choices = SCAN_STATUS)
start_date = models.DateTimeField('date started')
end_date = models.DateTimeField('date end')
uuid = models.CharField(max_length=32)
def __str__(self):
return "%s - %s" % (self.cmd_text, self.email_text)
def valid_chars(self, str):
valid = re.match('^[\sa-zA-Z0-9_/.,\"\'\=\(\)\*-]*$', str)
if not valid:
return False
return True
def validate_opts(self, cmd):
if not self.valid_chars(cmd):
return False
for arg in cmd.split(" "):
if not self.valid_nmap_arg(arg):
return False
return True
def valid_nmap_arg(self, arg):
#TODO: Add regex to validate Nmap argument
return True
def valid_target(self, target):
if not self.valid_chars(target):
return False
return True
class ScanForm(ModelForm):
class Meta:
model = NmapScan
fields = ['target_text', 'email_text']