Merge pull request #1572 from modoboa/fix/force_lower_case

fixed: force lower case domain names and addresses.
This commit is contained in:
Antoine Nguyen
2018-10-01 13:27:40 +02:00
committed by GitHub
8 changed files with 23 additions and 6 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>