8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-23 03:43:12 +00:00

Fix erreurs de validation du dns

This commit is contained in:
Gabriel Detraz 2016-07-11 00:52:36 +02:00
parent 9465ea5d21
commit d75911794f
6 changed files with 51 additions and 55 deletions

View file

@ -15,6 +15,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='interface',
name='dns',
field=models.CharField(unique=True, validators=[machines.models.full_domain_validator], max_length=255, help_text="Obligatoire et unique, doit se terminer en .rez et ne pas comporter d'autres points"),
field=models.CharField(unique=True, max_length=255, help_text="Obligatoire et unique, doit se terminer en .rez et ne pas comporter d'autres points"),
),
]

View file

@ -15,6 +15,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='interface',
name='dns',
field=models.CharField(unique=True, validators=[machines.models.full_domain_validator], help_text="Obligatoire et unique, doit se terminer en .example et ne pas comporter d'autres points", max_length=255),
field=models.CharField(unique=True, help_text="Obligatoire et unique, doit se terminer en .example et ne pas comporter d'autres points", max_length=255),
),
]

View file

@ -23,7 +23,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='interface',
name='dns',
field=models.CharField(unique=True, max_length=255, validators=[machines.models.full_domain_validator], help_text="Obligatoire et unique, doit se terminer en .rez et ne pas comporter d'autres points"),
field=models.CharField(unique=True, max_length=255, help_text="Obligatoire et unique, doit se terminer en .rez et ne pas comporter d'autres points"),
),
migrations.AddField(
model_name='machinetype',

View file

@ -2,31 +2,6 @@ from django.db import models
from django.forms import ValidationError
from macaddress.fields import MACAddressField
import re
def full_domain_validator(interface):
""" Validation du nom de domaine, extensions dans type de machine, prefixe pas plus long que 63 caractères """
HOSTNAME_LABEL_PATTERN = re.compile("(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE)
dns = interface.dns.lower()
allowed_extension = interface.machine.type.extension.name
if not dns.endswith(allowed_extension):
raise ValidationError(
"Le nom de domaine '%(label)s' doit comporter une extension valide en '%(extension)s'",
params={'label': dns, 'extension': allowed_extension},
)
dns_short=re.sub('%s$' % allowed_extension, '', dns)
if len(dns_short) > 63:
raise ValidationError(
"Le nom de domaine '%(label)s' est trop long (maximum de 63 caractères).",
params={'label': dns},
)
if not HOSTNAME_LABEL_PATTERN.match(dns_short):
raise ValidationError(
"Ce nom de domaine '%(label)s' contient des carractères interdits.",
params={'label': dns},
)
return dns
class Machine(models.Model):
user = models.ForeignKey('users.User', on_delete=models.PROTECT)
type = models.ForeignKey('MachineType', on_delete=models.PROTECT)
@ -66,9 +41,6 @@ class Interface(models.Model):
def __str__(self):
return self.dns
def clean(self):
self.dns=full_domain_validator(self)
class IpList(models.Model):
ipv4 = models.GenericIPAddressField(protocol='IPv4', unique=True)

View file

@ -8,11 +8,33 @@ from django.template import Context, RequestContext, loader
from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.db.models import ProtectedError
from django.forms import ValidationError
import re
from .forms import NewMachineForm, EditMachineForm, EditInterfaceForm, AddInterfaceForm, NewInterfaceForm, MachineTypeForm, DelMachineTypeForm, ExtensionForm, DelExtensionForm, BaseEditInterfaceForm, BaseEditMachineForm
from .models import Machine, Interface, IpList, MachineType, Extension
from users.models import User
def full_domain_validator(request, interface, machine):
""" Validation du nom de domaine, extensions dans type de machine, prefixe pas plus long que 63 caractères """
HOSTNAME_LABEL_PATTERN = re.compile("(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE)
dns = interface.dns.lower()
allowed_extension = machine.type.extension.name
if not dns.endswith(allowed_extension):
messages.error(request,
"Le nom de domaine %s doit comporter une extension valide en %s" % (dns, allowed_extension) )
return False
dns_short=re.sub('%s$' % allowed_extension, '', dns)
if len(dns_short) > 63:
messages.error(request,
"Le nom de domaine %s est trop long (maximum de 63 caractères)." % dns)
return False
if not HOSTNAME_LABEL_PATTERN.match(dns_short):
messages.error(request,
"Ce nom de domaine %s contient des carractères interdits." % dns)
return False
return True
def unassign_ips(user):
machines = Interface.objects.filter(machine=Machine.objects.filter(user=user))
for machine in machines:
@ -63,16 +85,17 @@ def new_machine(request, userid):
if machine.is_valid() and interface.is_valid():
new_machine = machine.save(commit=False)
new_machine.user = user
new_machine.save()
new_interface = interface.save(commit=False)
new_interface.machine = new_machine
if free_ip() and not new_interface.ipv4:
new_interface = assign_ipv4(new_interface)
elif not new_interface.ipv4:
messages.error(request, u"Il n'y a plus d'ip disponibles")
new_interface.save()
messages.success(request, "La machine a été crée")
return redirect("/users/profil/" + userid)
if full_domain_validator(request, new_interface, new_machine):
new_machine.save()
new_interface.machine = new_machine
if free_ip() and not new_interface.ipv4:
new_interface = assign_ipv4(new_interface)
elif not new_interface.ipv4:
messages.error(request, u"Il n'y a plus d'ip disponibles")
new_interface.save()
messages.success(request, "La machine a été crée")
return redirect("/users/profil/" + userid)
return form({'machineform': machine, 'interfaceform': interface}, 'machines/machine.html', request)
@login_required
@ -92,10 +115,13 @@ def edit_machine(request, interfaceid):
machine_form = EditMachineForm(request.POST or None, instance=interface.machine)
interface_form = EditInterfaceForm(request.POST or None, instance=interface)
if machine_form.is_valid() and interface_form.is_valid():
machine_form.save()
interface_form.save()
messages.success(request, "La machine a été modifiée")
return redirect("/users/profil/" + str(interface.machine.user.id))
new_interface = interface_form.save(commit=False)
new_machine = machine_form.save(commit=False)
if full_domain_validator(request, new_interface, new_machine):
new_machine.save()
new_interface.save()
messages.success(request, "La machine a été modifiée")
return redirect("/users/profil/" + str(interface.machine.user.id))
return form({'machineform': machine_form, 'interfaceform': interface_form}, 'machines/machine.html', request)
@login_required
@ -117,13 +143,14 @@ def new_interface(request, machineid):
machine_form.save()
new_interface = interface_form.save(commit=False)
new_interface.machine = machine
if free_ip() and not new_interface.ipv4:
new_interface = assign_ipv4(new_interface)
elif not new_interface.ipv4:
messages.error(request, u"Il n'y a plus d'ip disponibles")
new_interface.save()
messages.success(request, "L'interface a été ajoutée")
return redirect("/machines/")
if full_domain_validator(request, new_interface, machine):
if free_ip() and not new_interface.ipv4:
new_interface = assign_ipv4(new_interface)
elif not new_interface.ipv4:
messages.error(request, u"Il n'y a plus d'ip disponibles")
new_interface.save()
messages.success(request, "L'interface a été ajoutée")
return redirect("/machines/")
return form({'machineform': machine_form, 'interfaceform': interface_form}, 'machines/machine.html', request)
@login_required

View file

@ -76,16 +76,13 @@ TEMPLATES = [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.request',
're2o.context_processors.context_user',
],
},
},
]
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
)
WSGI_APPLICATION = 're2o.wsgi.application'