#26378: Incorrect behavior in GenericIPAddressField with protocol='both', unpack_ipv4=False -------------------------------------+------------------------------------- Reporter: bshen | Owner: | AmineYaiche Type: Bug | Status: assigned Component: Database layer | Version: 1.8 (models, ORM) | Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 1 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 1 | UI/UX: 0 -------------------------------------+------------------------------------- Description changed by timgraham:
Old description: > Basically, IPv4-mapped IPv6 addresses in the CIDR block > ::ffff:0.0.0.0/104 are validated as invalid when unpack_ipv4=False, yet > is valid when the first IPv4 octet is non-zero or when unpack_ipv4=True. > > {{{ #!python > # my.app.models > # Django==1.8.6 > from django.db import models > class TestIPNoUnpack(models.Model): > ip = models.GenericIPAddressField(null=False, protocol='both', > unpack_ipv4=False) > > class TestIPUnpack(models.Model): > ip = models.GenericIPAddressField(null=False, protocol='both', > unpack_ipv4=True) > > > > python manage.py shell > Python 2.7.6 (default, Sep 9 2014, 15:04:36) > Type "copyright", "credits" or "license" for more information. > > IPython 4.0.1 -- An enhanced Interactive Python. > ? -> Introduction and overview of IPython's features. > %quickref -> Quick reference. > help -> Python's own help system. > object? -> Details about 'object', use 'object??' for extra details. > > In [1]: from my.app.models import TestIPNoUnpack, TestIPUnpack > > In [2]: testipunpack = TestIPUnpack(ip='::ffff:0.0.0.0') > > In [3]: testipunpack.clean_fields() > > In [4]: testipunpack.ip > Out[4]: '0.0.0.0' > > In [5]: testipnounpack = TestIPNoUnpack(ip='::ffff:0.0.0.0') > > In [6]: testipnounpack.clean_fields() > --------------------------------------------------------------------------- > ValidationError Traceback (most recent call > last) > <ipython-input-6-9a763f56e907> in <module>() > ----> 1 testipnounpack.clean_fields() > > .../lib/python2.7/site-packages/django/db/models/base.pyc in > clean_fields(self, exclude) > 1194 > 1195 if errors: > -> 1196 raise ValidationError(errors) > 1197 > 1198 @classmethod > > ValidationError: {'ip': [u'Enter a valid IPv4 or IPv6 address.']} > > In [7]: testipnounpack2 = TestIPNoUnpack(ip='::ffff:0.255.255.255') > > In [8]: testipnounpack2.clean_fields() > --------------------------------------------------------------------------- > ValidationError Traceback (most recent call > last) > <ipython-input-8-e228d0855286> in <module>() > ----> 1 testipnounpack2.clean_fields() > > .../lib/python2.7/site-packages/django/db/models/base.pyc in > clean_fields(self, exclude) > 1194 > 1195 if errors: > -> 1196 raise ValidationError(errors) > 1197 > 1198 @classmethod > > ValidationError: {'ip': [u'Enter a valid IPv4 or IPv6 address.']} > > In [9]: testipnounpack3 = TestIPNoUnpack(ip='::ffff:1.0.0.0') > > In [10]: testipnounpack3.clean_fields() > > In [11]: testipnounpack3.ip > Out[11]: '::ffff:1.0.0.0' > > }}} New description: Basically, IPv4-mapped IPv6 addresses in the CIDR block ::ffff:0.0.0.0/104 are validated as invalid when unpack_ipv4=False, yet is valid when the first IPv4 octet is non-zero or when unpack_ipv4=True. {{{ #!python # my.app.models # Django==1.8.6 from django.db import models class TestIPNoUnpack(models.Model): ip = models.GenericIPAddressField(null=False, protocol='both', unpack_ipv4=False) class TestIPUnpack(models.Model): ip = models.GenericIPAddressField(null=False, protocol='both', unpack_ipv4=True) > python manage.py shell In [1]: from my.app.models import TestIPNoUnpack, TestIPUnpack In [2]: testipunpack = TestIPUnpack(ip='::ffff:0.0.0.0') In [3]: testipunpack.clean_fields() In [4]: testipunpack.ip Out[4]: '0.0.0.0' In [5]: testipnounpack = TestIPNoUnpack(ip='::ffff:0.0.0.0') In [6]: testipnounpack.clean_fields() ValidationError: {'ip': [u'Enter a valid IPv4 or IPv6 address.']} In [7]: testipnounpack2 = TestIPNoUnpack(ip='::ffff:0.255.255.255') In [8]: testipnounpack2.clean_fields() ValidationError: {'ip': [u'Enter a valid IPv4 or IPv6 address.']} In [9]: testipnounpack3 = TestIPNoUnpack(ip='::ffff:1.0.0.0') In [10]: testipnounpack3.clean_fields() In [11]: testipnounpack3.ip Out[11]: '::ffff:1.0.0.0' }}} -- -- Ticket URL: <https://code.djangoproject.com/ticket/26378#comment:6> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/063.140259141ab2f1440017fcf2b5ebf5d3%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.