#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.

Reply via email to