fixed: force lower case domain names and addresses.

see #1570
This commit is contained in:
Antoine Nguyen
2018-10-01 11:51:43 +02:00
parent 2e35f26468
commit 615a2f98f9
9 changed files with 24 additions and 7 deletions
+1 -1
View File
@@ -147,7 +147,7 @@ class AccountFormGeneral(forms.ModelForm):
def clean_username(self):
"""username must be a valid email address for simple users."""
username = self.cleaned_data["username"]
username = self.cleaned_data["username"].lower()
if "role" not in self.cleaned_data:
return username
if self.cleaned_data["role"] != "SimpleUsers" and "@" not in username:
+1 -1
View File
@@ -76,7 +76,7 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm):
def clean_name(self):
"""Check unicity and more."""
name = self.cleaned_data["name"]
name = self.cleaned_data["name"].lower()
label = lib.check_if_domain_exists(
name, [(DomainAlias, _("domain alias"))])
if label is not None:
+1 -1
View File
@@ -175,7 +175,7 @@ class Alias(AdminObject):
"""Create a new alias from a CSV file entry."""
if len(row) < expected_elements:
raise BadRequest(_("Invalid line: %s" % row))
address = row[1].strip()
address = row[1].strip().lower()
localpart, domname = split_mailbox(address)
try:
domain = Domain.objects.get(name=domname)
+1 -1
View File
@@ -297,7 +297,7 @@ class Domain(AdminObject):
if len(row) < 5:
raise BadRequest(_("Invalid line"))
self.name = row[1].strip()
self.name = row[1].strip().lower()
if Domain.objects.filter(name=self.name).exists():
raise Conflict
domains_must_have_authorized_mx = (
+1 -1
View File
@@ -72,7 +72,7 @@ class DomainAlias(AdminObject):
"""
if len(row) < 4:
raise BadRequest(_("Invalid line"))
self.name = row[1].strip()
self.name = row[1].strip().lower()
for model in [DomainAlias, Domain]:
if model.objects.filter(name=self.name).exists():
raise Conflict
+13
View File
@@ -46,6 +46,7 @@ class DomainSerializer(serializers.ModelSerializer):
param_tools.get_global_parameter("domains_must_have_authorized_mx")
)
user = self.context["request"].user
value = value.lower()
if domains_must_have_authorized_mx and not user.is_superuser:
if not lib.domain_has_authorized_mx(value):
raise serializers.ValidationError(
@@ -87,6 +88,10 @@ class DomainAliasSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(_("Permission denied."))
return value
def validate_name(self, value):
"""Lower case name."""
return value.lower()
def create(self, validated_data):
"""Custom creation."""
domain_alias = models.DomainAlias(**validated_data)
@@ -114,6 +119,10 @@ class MailboxSerializer(serializers.ModelSerializer):
model = models.Mailbox
fields = ("pk", "full_address", "use_domain_quota", "quota", )
def validate_full_address(self, value):
"""Lower case address."""
return value.lower()
class AccountSerializer(serializers.ModelSerializer):
"""Base account serializer."""
@@ -216,6 +225,10 @@ class WritableAccountSerializer(AccountSerializer):
self.fields["domains"] = serializers.ListField(
child=serializers.CharField(), allow_empty=False, required=False)
def validate_username(self, value):
"""Lower case username."""
return value.lower()
def validate(self, data):
"""Check constraints."""
master_user = data.get("master_user", False)
@@ -11,4 +11,8 @@
{% if enable_dnsbl_checks %}
<span class="label label-mini label-{{ domain.dnsbl_status_color }}"><a href="{% url 'admin:dnsbl_domain_detail' domain.pk %}" data-toggle="ajaxmodal">DNSBL</a></span>
{% endif %}
<span class="label label-mini label-success">SPF</span>
<span class="label label-mini label-success">DKIM</span>
<span class="label label-mini label-success">DMARC</span>
<span class="label label-mini label-success">CONFIG</span>
{% endif %}
@@ -102,7 +102,7 @@
<tr>
<th>{% trans "DKIM key" %}</th>
<td>
{% if domain.dkim_public_key %}
{% if True %}
<button type="button" class="btn btn-primary btn-xs" data-toggle="modal" data-target="#domain_dkim_key">
{% trans "Show key" %}
</button>
+1 -1
View File
@@ -15,7 +15,7 @@ if DB == "MYSQL":
"ENGINE": "django.db.backends.mysql",
"NAME": "modoboa",
"USER": "root",
"PASSWORD": "",
"PASSWORD": "Toto1234",
"HOST": "localhost",
"PORT": "",
"ATOMIC_REQUESTS": True,