64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
import hashlib
|
|
import os
|
|
import re
|
|
|
|
from django.core.validators import ValidationError, EmailValidator
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from orchestra.utils import paths
|
|
from orchestra.utils.system import run
|
|
|
|
from . import settings
|
|
|
|
|
|
def validate_emailname(value):
|
|
msg = _("'%s' is not a correct email name" % value)
|
|
if '@' in value:
|
|
raise ValidationError(msg)
|
|
value += '@localhost'
|
|
try:
|
|
EmailValidator(value)
|
|
except ValidationError:
|
|
raise ValidationError(msg)
|
|
|
|
|
|
#def validate_destination(value):
|
|
# """ space separated mailboxes or emails """
|
|
# for destination in value.split():
|
|
# msg = _("'%s' is not an existent mailbox" % destination)
|
|
# if '@' in destination:
|
|
# if not destination[-1].isalpha():
|
|
# raise ValidationError(msg)
|
|
# EmailValidator(destination)
|
|
# else:
|
|
# from .models import Mailbox
|
|
# if not Mailbox.objects.filter(user__username=destination).exists():
|
|
# raise ValidationError(msg)
|
|
# validate_emailname(destination)
|
|
|
|
|
|
def validate_forward(value):
|
|
""" space separated mailboxes or emails """
|
|
for destination in value.split():
|
|
EmailValidator(destination)
|
|
|
|
|
|
def validate_sieve(value):
|
|
from .models import Mailbox
|
|
sieve_name = '%s.sieve' % hashlib.md5(value).hexdigest()
|
|
path = os.path.join(settings.EMAILS_SIEVETEST_PATH, sieve_name)
|
|
with open(path, 'wb') as f:
|
|
f.write(value)
|
|
context = {
|
|
'orchestra_root': paths.get_orchestra_root()
|
|
}
|
|
sievetest = settings.EMAILS_SIEVETEST_BIN_PATH % context
|
|
test = run(' '.join([sievetest, path, '/dev/null']), display=False)
|
|
if test.return_code:
|
|
errors = []
|
|
for line in test.stderr.splitlines():
|
|
error = re.match(r'^.*(line\s+[0-9]+:.*)', line)
|
|
if error:
|
|
errors += error.groups()
|
|
raise ValidationError(' '.join(errors))
|