Compare commits

...

2 commits

Author SHA1 Message Date
89462cb100 prepare for deployment 2020-11-08 14:28:14 +01:00
0889937ea3 clean up and catch some errors 2020-11-07 20:58:15 +01:00
11 changed files with 94 additions and 86 deletions

1
.gitignore vendored
View file

@ -202,3 +202,4 @@ dmypy.json
# Pyre type checker
.pyre/
backend/config/

View file

@ -96,26 +96,23 @@ WSGI_APPLICATION = 'backend.wsgi.application'
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'mail': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'mail.sqlite3',
},
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# },
'ldap': {
'ENGINE': 'ldapdb.backends.ldap',
'NAME': config.ldap.uri,
'USER': config.ldap.bind_dn,
'PASSWORD': config.ldap.bind_pass,
},
#'mysql': {
# 'NAME': 'user_data',
# 'ENGINE': 'django.db.backends.mysql',
# 'USER': 'mysql_user',
# 'PASSWORD': 'priv4te'
#}
'default': {
'HOST': config.sql.host,
'NAME': config.sql.database,
'ENGINE': 'django.db.backends.mysql',
'USER': config.sql.user,
'PASSWORD': config.sql.password
}
}
# Password validation

View file

@ -1,7 +1,9 @@
from django.contrib.auth.decorators import login_required
from django.forms import ModelForm
from django.forms.utils import ErrorList
from django.http import HttpResponseRedirect, Http404
from django.shortcuts import render
from django.db import IntegrityError
from multimail.models import Domain, Mailbox, Alias
from multimail.owner import user_from_request
@ -11,7 +13,7 @@ class DomainForm(ModelForm):
class Meta:
model = Domain
fields = '__all__'
#fields = ['domain']
# fields = ['domain']
class MailboxForm(ModelForm):
@ -35,14 +37,18 @@ def edit_domain(request, domain_id):
raise Http404
if request.method == 'POST':
form = DomainForm(request.POST, instance=domain)
if form.is_valid():
form.save()
return HttpResponseRedirect('/domains/')
try:
if form.is_valid():
form.save()
return HttpResponseRedirect('/domains/')
except IntegrityError as e:
form.add_error(None, e)
else:
form = DomainForm(instance=domain)
return render(request, 'multimail/edit_domain.html', {'form': form})
return render(request, 'multimail/edit.html', {'form': form})
@login_required(login_url='/login/')
@ -50,15 +56,19 @@ def new_domain(request):
user = user_from_request(request)
if request.method == 'POST':
form = DomainForm(request.POST)
if form.is_valid():
domain = form.save()
domain.admin.create(admin=user['name'], source=user['source'])
return HttpResponseRedirect('/domains/')
try:
if form.is_valid():
domain = form.save()
domain.admin.create(admin=user['name'], source=user['source'])
return HttpResponseRedirect('/domains/')
except IntegrityError as e:
form.add_error(None, e)
else:
form = DomainForm()
return render(request, 'multimail/edit_domain.html', {'form': form})
return render(request, 'multimail/edit.html', {'form': form})
@login_required(login_url='/login/')
@ -71,14 +81,18 @@ def edit_mailbox(request, mailbox_id):
raise Http404
if request.method == 'POST':
form = MailboxForm(request.POST, instance=mailbox)
if form.is_valid():
form.save()
return HttpResponseRedirect('/mailboxes/')
try:
if form.is_valid():
form.save()
return HttpResponseRedirect('/mailboxes/')
except IntegrityError as e:
form.add_error(None, e)
else:
form = MailboxForm(instance=mailbox)
return render(request, 'multimail/edit_mailbox.html', {'form': form})
return render(request, 'multimail/edit.html', {'form': form})
@login_required(login_url='/login/')
@ -87,14 +101,18 @@ def new_mailbox(request):
user = user_from_request(request)
domains = [o.domain for o in Domain.objects.filter(admin__admin=user['name'], admin__source=user['source'])]
form = MailboxForm(request.POST)
if form.is_valid() and form.domain in domains:
form.save()
return HttpResponseRedirect('/mailboxes/')
try:
if form.is_valid() and form.domain in domains:
form.save()
return HttpResponseRedirect('/mailboxes/')
except IntegrityError as e:
form.add_error(None, e)
else:
form = MailboxForm()
return render(request, 'multimail/edit_mailbox.html', {'form': form})
return render(request, 'multimail/edit.html', {'form': form})
@login_required(login_url='/login/')
@ -107,14 +125,18 @@ def edit_alias(request, alias_id):
raise Http404
if request.method == 'POST':
form = AliasForm(request.POST, instance=alias)
if form.is_valid():
form.save()
return HttpResponseRedirect('/aliases/')
try:
if form.is_valid():
form.save()
return HttpResponseRedirect('/aliases/')
except IntegrityError as e:
form.add_error(None, e)
else:
form = AliasForm(instance=alias)
return render(request, 'multimail/edit_alias.html', {'form': form})
return render(request, 'multimail/edit.html', {'form': form})
@login_required(login_url='/login/')
@ -123,11 +145,15 @@ def new_alias(request):
user = user_from_request(request)
domains = [o.domain for o in Domain.objects.filter(admin__admin=user['name'], admin__source=user['source'])]
form = AliasForm(request.POST)
if form.is_valid() and form.source_domain in domains:
form.save()
return HttpResponseRedirect('/aliases/')
try:
if form.is_valid() and form.source_domain in domains:
form.save()
return HttpResponseRedirect('/aliases/')
except IntegrityError as e:
form.add_error(None, e)
else:
form = AliasForm()
return render(request, 'multimail/edit_alias.html', {'form': form})
return render(request, 'multimail/edit.html', {'form': form})

View file

@ -1,20 +1,21 @@
import datetime
from django.db import models
from django.utils import timezone
class Alias(models.Model):
id = models.AutoField(primary_key=True)
source_username = models.CharField(max_length=64)
source_username = models.CharField(max_length=64, blank=True)
source_domain = models.CharField(max_length=255)
destination_username = models.CharField(max_length=64)
destination_domain = models.CharField(max_length=255)
enabled = models.IntegerField(blank=True, null=True)
enabled = models.BooleanField(default=True)
class Meta:
managed = False
db_table = 'aliases'
def __str__(self):
return self.source_username + '@' + self.source_domain
class Domain(models.Model):
domain = models.CharField(max_length=255)
@ -23,6 +24,9 @@ class Domain(models.Model):
managed = False
db_table = 'domains'
def __str__(self):
return self.domain
class Mailbox(models.Model):
id = models.AutoField(primary_key=True)
@ -30,13 +34,16 @@ class Mailbox(models.Model):
domain = models.CharField(max_length=255)
password = models.CharField(max_length=255)
quota = models.IntegerField(blank=True, null=True)
enabled = models.IntegerField(blank=True, null=True)
sendonly = models.IntegerField(blank=True, null=True)
enabled = models.BooleanField(default=True)
sendonly = models.BooleanField(default=False)
class Meta:
managed = False
db_table = 'mailboxes'
def __str__(self):
return self.username + '@' + self.domain
class TLSPolicy(models.Model):
domain = models.CharField(max_length=255)
@ -47,11 +54,15 @@ class TLSPolicy(models.Model):
managed = False
db_table = 'tlspolicies'
def __str__(self):
return self.domain
class DomainOwner(models.Model):
domain = models.ForeignKey(Domain, on_delete=models.CASCADE, related_name='admin')
admin = models.CharField(max_length=200)
source = models.CharField(max_length=8, choices=[('system','system'), ('ldap', 'ldap'), ('mail', 'mail')], default=0)
source = models.CharField(max_length=8, choices=[('system', 'system'), ('ldap', 'ldap'), ('mail', 'mail')],
default=0)
def __str__(self):
return self.admin

View file

@ -38,6 +38,7 @@
</table>
{% else %}
<p>You haven't set up any aliases yet.</p>
<a href="{% url 'multimail:new_alias' %}" class="btn btn-primary btn-sm m-0">Add</a>
{% endif %}
{% endblock %}

View file

@ -32,6 +32,7 @@
</table>
{% else %}
<p>You haven't set up any domains yet.</p>
<a href="{% url 'multimail:new_domain' %}" class="btn btn-primary btn-sm m-0">Add</a>
{% endif %}
{% endblock %}

View file

@ -2,10 +2,7 @@
{% load bootstrap4 %}
{% block content %}
<h1 class="mt-4">{{ form.domain.value }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="" method="post" class="form">
{% csrf_token %}
{% bootstrap_form form %}
@ -13,5 +10,4 @@
<button type="submit" class="btn btn-primary">Submit</button>
{% endbuttons %}
</form>
{% endblock %}

View file

@ -1,18 +0,0 @@
{% extends 'multimail/base.html' %}
{% load bootstrap4 %}
{% block content %}
<h1 class="mt-4">{{ form.source_username.value }}@{{ form.source_domain.value }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="" method="post" class="form">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">Submit</button>
{% endbuttons %}
</form>
{% endblock %}

View file

@ -1,17 +0,0 @@
{% extends 'multimail/base.html' %}
{% load bootstrap4 %}
{% block content %}
<h1 class="mt-4">{{ form.username.value }}@{{ form.domain.value }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="" method="post" class="form">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">Submit</button>
{% endbuttons %}
</form>
{% endblock %}

View file

@ -32,6 +32,7 @@
</table>
{% else %}
<p>You haven't set up any mailboxes yet.</p>
<a href="{% url 'multimail:new_mailbox' %}" class="btn btn-primary btn-sm m-0">Add</a>
{% endif %}
{% endblock %}

9
backend/requirements.txt Normal file
View file

@ -0,0 +1,9 @@
Django==3.1.3
django-auth-ldap==2.2.0
django-ldapdb==1.5.1
django-static-fontawesome==5.14.0.0
django-bootstrap4==2.3.1
mysqlclient==2.0.1
passlib==1.7.4
python-ldap==3.3.1
# djangorestframework==3.12.1