mirror of
https://github.com/django/django.git
synced 2025-01-03 06:55:47 +00:00
Fixed #34818 -- Prevented GenericIPAddressField from mutating error messages.
Co-authored-by: Parth Verma <parth.verma@gmail.com>
This commit is contained in:
parent
a8adb6aa6c
commit
eabfa2d0e3
@ -276,14 +276,18 @@ def validate_ipv4_address(value):
|
|||||||
ipaddress.IPv4Address(value)
|
ipaddress.IPv4Address(value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Enter a valid IPv4 address."), code="invalid", params={"value": value}
|
_("Enter a valid %(protocol)s address."),
|
||||||
|
code="invalid",
|
||||||
|
params={"protocol": _("IPv4"), "value": value},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def validate_ipv6_address(value):
|
def validate_ipv6_address(value):
|
||||||
if not is_valid_ipv6_address(value):
|
if not is_valid_ipv6_address(value):
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Enter a valid IPv6 address."), code="invalid", params={"value": value}
|
_("Enter a valid %(protocol)s address."),
|
||||||
|
code="invalid",
|
||||||
|
params={"protocol": _("IPv6"), "value": value},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -295,16 +299,16 @@ def validate_ipv46_address(value):
|
|||||||
validate_ipv6_address(value)
|
validate_ipv6_address(value)
|
||||||
except ValidationError:
|
except ValidationError:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Enter a valid IPv4 or IPv6 address."),
|
_("Enter a valid %(protocol)s address."),
|
||||||
code="invalid",
|
code="invalid",
|
||||||
params={"value": value},
|
params={"protocol": _("IPv4 or IPv6"), "value": value},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
ip_address_validator_map = {
|
ip_address_validator_map = {
|
||||||
"both": ([validate_ipv46_address], _("Enter a valid IPv4 or IPv6 address.")),
|
"both": [validate_ipv46_address],
|
||||||
"ipv4": ([validate_ipv4_address], _("Enter a valid IPv4 address.")),
|
"ipv4": [validate_ipv4_address],
|
||||||
"ipv6": ([validate_ipv6_address], _("Enter a valid IPv6 address.")),
|
"ipv6": [validate_ipv6_address],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2201,7 +2201,7 @@ class IPAddressField(Field):
|
|||||||
class GenericIPAddressField(Field):
|
class GenericIPAddressField(Field):
|
||||||
empty_strings_allowed = False
|
empty_strings_allowed = False
|
||||||
description = _("IP address")
|
description = _("IP address")
|
||||||
default_error_messages = {}
|
default_error_messages = {"invalid": _("Enter a valid %(protocol)s address.")}
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@ -2214,11 +2214,9 @@ class GenericIPAddressField(Field):
|
|||||||
):
|
):
|
||||||
self.unpack_ipv4 = unpack_ipv4
|
self.unpack_ipv4 = unpack_ipv4
|
||||||
self.protocol = protocol
|
self.protocol = protocol
|
||||||
(
|
self.default_validators = validators.ip_address_validators(
|
||||||
self.default_validators,
|
protocol, unpack_ipv4
|
||||||
invalid_error_message,
|
)
|
||||||
) = validators.ip_address_validators(protocol, unpack_ipv4)
|
|
||||||
self.default_error_messages["invalid"] = invalid_error_message
|
|
||||||
kwargs["max_length"] = 39
|
kwargs["max_length"] = 39
|
||||||
super().__init__(verbose_name, name, *args, **kwargs)
|
super().__init__(verbose_name, name, *args, **kwargs)
|
||||||
|
|
||||||
|
@ -1288,7 +1288,7 @@ class GenericIPAddressField(CharField):
|
|||||||
self.unpack_ipv4 = unpack_ipv4
|
self.unpack_ipv4 = unpack_ipv4
|
||||||
self.default_validators = validators.ip_address_validators(
|
self.default_validators = validators.ip_address_validators(
|
||||||
protocol, unpack_ipv4
|
protocol, unpack_ipv4
|
||||||
)[0]
|
)
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
def to_python(self, value):
|
def to_python(self, value):
|
||||||
|
@ -26,7 +26,9 @@ def clean_ipv6_address(
|
|||||||
try:
|
try:
|
||||||
addr = ipaddress.IPv6Address(int(ipaddress.IPv6Address(ip_str)))
|
addr = ipaddress.IPv6Address(int(ipaddress.IPv6Address(ip_str)))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValidationError(error_message, code="invalid")
|
raise ValidationError(
|
||||||
|
error_message, code="invalid", params={"protocol": _("IPv6")}
|
||||||
|
)
|
||||||
|
|
||||||
if unpack_ipv4 and addr.ipv4_mapped:
|
if unpack_ipv4 and addr.ipv4_mapped:
|
||||||
return str(addr.ipv4_mapped)
|
return str(addr.ipv4_mapped)
|
||||||
|
@ -206,3 +206,17 @@ class GenericIPAddressFieldTests(ValidationAssertions, TestCase):
|
|||||||
self.assertIsNone(giptm.full_clean())
|
self.assertIsNone(giptm.full_clean())
|
||||||
giptm = GenericIPAddressTestModel(generic_ip=None)
|
giptm = GenericIPAddressTestModel(generic_ip=None)
|
||||||
self.assertIsNone(giptm.full_clean())
|
self.assertIsNone(giptm.full_clean())
|
||||||
|
|
||||||
|
def test_multiple_invalid_ip_raises_error(self):
|
||||||
|
giptm = GenericIPAddressTestModel(
|
||||||
|
v6_ip="1.2.3.4", v4_ip="::ffff:10.10.10.10", generic_ip="fsad"
|
||||||
|
)
|
||||||
|
self.assertFieldFailsValidationWithMessage(
|
||||||
|
giptm.full_clean, "v6_ip", ["Enter a valid IPv6 address."]
|
||||||
|
)
|
||||||
|
self.assertFieldFailsValidationWithMessage(
|
||||||
|
giptm.full_clean, "v4_ip", ["Enter a valid IPv4 address."]
|
||||||
|
)
|
||||||
|
self.assertFieldFailsValidationWithMessage(
|
||||||
|
giptm.full_clean, "generic_ip", ["Enter a valid IPv4 or IPv6 address."]
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user