domain editing, shared secret generation, show bind9 configuration
This commit is contained in:
parent
029dc20be0
commit
35c953347c
@ -26,3 +26,9 @@ class CreateDomainForm(forms.ModelForm):
|
|||||||
widgets = {
|
widgets = {
|
||||||
'domain': forms.widgets.TextInput(attrs=dict(autofocus=None)),
|
'domain': forms.widgets.TextInput(attrs=dict(autofocus=None)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class EditDomainForm(forms.ModelForm):
|
||||||
|
class Meta(object):
|
||||||
|
model = Domain
|
||||||
|
fields = ['nameserver_ip', 'public', 'available', 'nameserver_update_algorithm', 'nameserver_update_key']
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import re
|
import re
|
||||||
from django.utils.timezone import now
|
import base64
|
||||||
|
|
||||||
import dns.resolver
|
import dns.resolver
|
||||||
|
|
||||||
@ -10,6 +10,7 @@ from django.core.validators import RegexValidator
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db.models.signals import pre_delete
|
from django.db.models.signals import pre_delete
|
||||||
from django.contrib.auth.hashers import make_password
|
from django.contrib.auth.hashers import make_password
|
||||||
|
from django.utils.timezone import now
|
||||||
|
|
||||||
from . import dnstools
|
from . import dnstools
|
||||||
|
|
||||||
@ -74,6 +75,23 @@ class Domain(models.Model):
|
|||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u"%s" % (self.domain, )
|
return u"%s" % (self.domain, )
|
||||||
|
|
||||||
|
def generate_ns_secret(self):
|
||||||
|
secret = User.objects.make_random_password(length=64) # 512 bits
|
||||||
|
self.nameserver_update_key = key = base64.b64encode(secret)
|
||||||
|
self.nameserver_update_algorithm = 'HMAC_SHA512'
|
||||||
|
self.save()
|
||||||
|
return key
|
||||||
|
|
||||||
|
def get_bind9_algorithm(self):
|
||||||
|
mapping = {
|
||||||
|
'HMAC_SHA512': 'hmac-sha512',
|
||||||
|
'HMAC_SHA384': 'hmac-sha384',
|
||||||
|
'HMAC_SHA256': 'hmac-sha256',
|
||||||
|
'HMAC_SHA224': 'hmac-sha224',
|
||||||
|
'HMAC_SHA1': 'hmac-sha1',
|
||||||
|
'HMAC_MD5': 'hmac-md5',
|
||||||
|
}
|
||||||
|
return mapping.get(self.nameserver_update_algorithm)
|
||||||
|
|
||||||
class Host(models.Model):
|
class Host(models.Model):
|
||||||
subdomain = models.CharField(max_length=256, validators=[
|
subdomain = models.CharField(max_length=256, validators=[
|
||||||
|
@ -13,19 +13,15 @@
|
|||||||
<th>Available?</th>
|
<th>Available?</th>
|
||||||
<th>Nameserver IP</th>
|
<th>Nameserver IP</th>
|
||||||
<th>Algorithm</th>
|
<th>Algorithm</th>
|
||||||
<th>Action</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{% for domain in domains %}
|
{% for domain in domains %}
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="2" style="vertical-align: middle"><b>{{ domain.domain }}</b></td>
|
<td rowspan="2" style="vertical-align: middle"><a href="{% url 'domain_view' domain.pk %}">{{ domain.domain }}</a></td>
|
||||||
<td>{{ domain.public|yesno }}</td>
|
<td>{{ domain.public|yesno }}</td>
|
||||||
<td>{{ domain.available|yesno }}</td>
|
<td>{{ domain.available|yesno }}</td>
|
||||||
<td>{{ domain.nameserver_ip }}</td>
|
<td>{{ domain.nameserver_ip }}</td>
|
||||||
<td>{{ domain.get_nameserver_update_algorithm_display }}</td>
|
<td>{{ domain.get_nameserver_update_algorithm_display }}</td>
|
||||||
<td rowspan="2" style="vertical-align: middle">
|
|
||||||
<a href="{% url 'delete_domain' domain.pk %}"><i class="icon icon-remove"></i> delete</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="4">Key: {{ domain.nameserver_update_key }}</td>
|
<td colspan="4">Key: {{ domain.nameserver_update_key }}</td>
|
||||||
|
@ -2,8 +2,8 @@ from django.conf.urls import patterns, url
|
|||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
|
|
||||||
from .views import (
|
from .views import (
|
||||||
HomeView, OverviewView, HostView, DeleteHostView, AboutView, HelpView, GenerateSecretView,
|
HomeView, OverviewView, HostView, DeleteHostView, AboutView, HelpView, GenerateSecretView, GenerateNSSecretView,
|
||||||
RobotsTxtView, DomainOverwievView, DeleteDomainView, ScreenshotsView)
|
RobotsTxtView, DomainOverwievView, DomainView, DeleteDomainView, ScreenshotsView)
|
||||||
from ..api.views import (
|
from ..api.views import (
|
||||||
MyIpView, DetectIpView, AjaxGetIps, NicUpdateView, AuthorizedNicUpdateView)
|
MyIpView, DetectIpView, AjaxGetIps, NicUpdateView, AuthorizedNicUpdateView)
|
||||||
|
|
||||||
@ -18,7 +18,9 @@ urlpatterns = patterns(
|
|||||||
url(r'^screenshots/$', ScreenshotsView.as_view(), name="screenshots"),
|
url(r'^screenshots/$', ScreenshotsView.as_view(), name="screenshots"),
|
||||||
url(r'^overview/$', OverviewView.as_view(), name='overview'),
|
url(r'^overview/$', OverviewView.as_view(), name='overview'),
|
||||||
url(r'^host/(?P<pk>\d+)/$', HostView.as_view(), name='host_view'),
|
url(r'^host/(?P<pk>\d+)/$', HostView.as_view(), name='host_view'),
|
||||||
|
url(r'^domain/(?P<pk>\d+)/$', DomainView.as_view(), name='domain_view'),
|
||||||
url(r'^generate_secret/(?P<pk>\d+)/$', GenerateSecretView.as_view(), name='generate_secret_view'),
|
url(r'^generate_secret/(?P<pk>\d+)/$', GenerateSecretView.as_view(), name='generate_secret_view'),
|
||||||
|
url(r'^generate_ns_secret/(?P<pk>\d+)/$', GenerateNSSecretView.as_view(), name='generate_ns_secret_view'),
|
||||||
url(r'^host/(?P<pk>\d+)/delete/$',
|
url(r'^host/(?P<pk>\d+)/delete/$',
|
||||||
DeleteHostView.as_view(), name='delete_host'),
|
DeleteHostView.as_view(), name='delete_host'),
|
||||||
url(r'^domain_overview/$',
|
url(r'^domain_overview/$',
|
||||||
|
@ -12,7 +12,7 @@ from django.core.exceptions import PermissionDenied
|
|||||||
|
|
||||||
import dnstools
|
import dnstools
|
||||||
|
|
||||||
from .forms import CreateHostForm, EditHostForm, CreateDomainForm
|
from .forms import CreateHostForm, EditHostForm, CreateDomainForm, EditDomainForm
|
||||||
from .models import Host, Domain
|
from .models import Host, Domain
|
||||||
|
|
||||||
|
|
||||||
@ -40,6 +40,29 @@ class GenerateSecretView(UpdateView):
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class GenerateNSSecretView(UpdateView):
|
||||||
|
model = Domain
|
||||||
|
template_name = "main/generate_ns_secret.html"
|
||||||
|
|
||||||
|
@method_decorator(login_required)
|
||||||
|
def dispatch(self, *args, **kwargs):
|
||||||
|
return super(GenerateNSSecretView, self).dispatch(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_object(self, *args, **kwargs):
|
||||||
|
obj = super(GenerateNSSecretView, self).get_object(*args, **kwargs)
|
||||||
|
if obj.created_by != self.request.user:
|
||||||
|
raise PermissionDenied() # or Http404
|
||||||
|
return obj
|
||||||
|
|
||||||
|
def get_context_data(self, *args, **kwargs):
|
||||||
|
context = super(GenerateNSSecretView, self).get_context_data(*args, **kwargs)
|
||||||
|
context['nav_overview'] = True
|
||||||
|
context['shared_secret'] = self.object.generate_ns_secret()
|
||||||
|
context['domains'] = Domain.objects.filter(created_by=self.request.user)
|
||||||
|
messages.add_message(self.request, messages.SUCCESS, 'Nameserver shared secret created.')
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
class AboutView(TemplateView):
|
class AboutView(TemplateView):
|
||||||
template_name = "main/about.html"
|
template_name = "main/about.html"
|
||||||
|
|
||||||
@ -210,6 +233,37 @@ class DomainOverwievView(CreateView):
|
|||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class DomainView(UpdateView):
|
||||||
|
model = Domain
|
||||||
|
template_name = "main/domain.html"
|
||||||
|
form_class = EditDomainForm
|
||||||
|
|
||||||
|
@method_decorator(login_required)
|
||||||
|
def dispatch(self, *args, **kwargs):
|
||||||
|
return super(DomainView, self).dispatch(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse('domain_overview')
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
self.object = form.save(commit=False)
|
||||||
|
self.object.save()
|
||||||
|
messages.add_message(self.request, messages.SUCCESS, 'Domain updated.')
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
def get_object(self, *args, **kwargs):
|
||||||
|
obj = super(DomainView, self).get_object(*args, **kwargs)
|
||||||
|
if obj.created_by != self.request.user:
|
||||||
|
raise PermissionDenied() # or Http404
|
||||||
|
return obj
|
||||||
|
|
||||||
|
def get_context_data(self, *args, **kwargs):
|
||||||
|
context = super(DomainView, self).get_context_data(*args, **kwargs)
|
||||||
|
context['nav_overview'] = True
|
||||||
|
context['domains'] = Domain.objects.filter(created_by=self.request.user)
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
class DeleteDomainView(DeleteView):
|
class DeleteDomainView(DeleteView):
|
||||||
model = Domain
|
model = Domain
|
||||||
template_name = "main/delete_object.html"
|
template_name = "main/delete_object.html"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user