Merge pull request #819 from erikr/master
Fixed #16302 -- Ensured contrib.comments is IPv6 capable.
This commit is contained in:
commit
7106a1e594
|
@ -60,7 +60,7 @@ class Comment(BaseCommentAbstractModel):
|
||||||
|
|
||||||
# Metadata about the comment
|
# Metadata about the comment
|
||||||
submit_date = models.DateTimeField(_('date/time submitted'), default=None)
|
submit_date = models.DateTimeField(_('date/time submitted'), default=None)
|
||||||
ip_address = models.IPAddressField(_('IP address'), blank=True, null=True)
|
ip_address = models.GenericIPAddressField(_('IP address'), unpack_ipv4=True, blank=True, null=True)
|
||||||
is_public = models.BooleanField(_('is public'), default=True,
|
is_public = models.BooleanField(_('is public'), default=True,
|
||||||
help_text=_('Uncheck this box to make the comment effectively ' \
|
help_text=_('Uncheck this box to make the comment effectively ' \
|
||||||
'disappear from the site.'))
|
'disappear from the site.'))
|
||||||
|
|
|
@ -152,6 +152,30 @@ Backwards incompatible changes in 1.6
|
||||||
{{ title }}{# Translators: Extracted and associated with 'Welcome' below #}
|
{{ title }}{# Translators: Extracted and associated with 'Welcome' below #}
|
||||||
<h1>{% trans "Welcome" %}</h1>
|
<h1>{% trans "Welcome" %}</h1>
|
||||||
|
|
||||||
|
* The :doc:`comments </ref/contrib/comments/index>` app now uses a ``GenericIPAddressField``
|
||||||
|
for storing commenters' IP addresses, to support comments submitted from IPv6 addresses.
|
||||||
|
Until now, it stored them in an ``IPAddressField``, which is only meant to support IPv4.
|
||||||
|
When saving a comment made from an IPv6 address, the address would be silently truncated
|
||||||
|
on MySQL databases, and raise an exception on Oracle.
|
||||||
|
You will need to change the column type in your database to benefit from this change.
|
||||||
|
|
||||||
|
For MySQL, execute this query on your project's database:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
ALTER TABLE django_comments MODIFY ip_address VARCHAR(39);
|
||||||
|
|
||||||
|
For Oracle, execute this query:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
ALTER TABLE DJANGO_COMMENTS MODIFY (ip_address VARCHAR2(39));
|
||||||
|
|
||||||
|
If you do not apply this change, the behaviour is unchanged: on MySQL, IPv6 addresses
|
||||||
|
are silently truncated; on Oracle, an exception is generated. No database
|
||||||
|
change is needed for SQLite or PostgreSQL databases.
|
||||||
|
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
In addition to the changes outlined in this section, be sure to review the
|
In addition to the changes outlined in this section, be sure to review the
|
||||||
|
|
|
@ -101,13 +101,43 @@ class CommentViewTests(CommentTestCase):
|
||||||
settings.DEBUG = olddebug
|
settings.DEBUG = olddebug
|
||||||
|
|
||||||
def testCreateValidComment(self):
|
def testCreateValidComment(self):
|
||||||
|
address = "1.2.3.4"
|
||||||
a = Article.objects.get(pk=1)
|
a = Article.objects.get(pk=1)
|
||||||
data = self.getValidData(a)
|
data = self.getValidData(a)
|
||||||
self.response = self.client.post("/post/", data, REMOTE_ADDR="1.2.3.4")
|
self.response = self.client.post("/post/", data, REMOTE_ADDR=address)
|
||||||
self.assertEqual(self.response.status_code, 302)
|
self.assertEqual(self.response.status_code, 302)
|
||||||
self.assertEqual(Comment.objects.count(), 1)
|
self.assertEqual(Comment.objects.count(), 1)
|
||||||
c = Comment.objects.all()[0]
|
c = Comment.objects.all()[0]
|
||||||
self.assertEqual(c.ip_address, "1.2.3.4")
|
self.assertEqual(c.ip_address, address)
|
||||||
|
self.assertEqual(c.comment, "This is my comment")
|
||||||
|
|
||||||
|
def testCreateValidCommentIPv6(self):
|
||||||
|
"""
|
||||||
|
Test creating a valid comment with a long IPv6 address.
|
||||||
|
Note that this test should fail when Comment.ip_address is an IPAddress instead of a GenericIPAddress,
|
||||||
|
but does not do so on SQLite or PostgreSQL, because they use the TEXT and INET types, which already
|
||||||
|
allow storing an IPv6 address internally.
|
||||||
|
"""
|
||||||
|
address = "2a02::223:6cff:fe8a:2e8a"
|
||||||
|
a = Article.objects.get(pk=1)
|
||||||
|
data = self.getValidData(a)
|
||||||
|
self.response = self.client.post("/post/", data, REMOTE_ADDR=address)
|
||||||
|
self.assertEqual(self.response.status_code, 302)
|
||||||
|
self.assertEqual(Comment.objects.count(), 1)
|
||||||
|
c = Comment.objects.all()[0]
|
||||||
|
self.assertEqual(c.ip_address, address)
|
||||||
|
self.assertEqual(c.comment, "This is my comment")
|
||||||
|
|
||||||
|
def testCreateValidCommentIPv6Unpack(self):
|
||||||
|
address = "::ffff:18.52.18.52"
|
||||||
|
a = Article.objects.get(pk=1)
|
||||||
|
data = self.getValidData(a)
|
||||||
|
self.response = self.client.post("/post/", data, REMOTE_ADDR=address)
|
||||||
|
self.assertEqual(self.response.status_code, 302)
|
||||||
|
self.assertEqual(Comment.objects.count(), 1)
|
||||||
|
c = Comment.objects.all()[0]
|
||||||
|
# We trim the '::ffff:' bit off because it is an IPv4 addr
|
||||||
|
self.assertEqual(c.ip_address, address[7:])
|
||||||
self.assertEqual(c.comment, "This is my comment")
|
self.assertEqual(c.comment, "This is my comment")
|
||||||
|
|
||||||
def testPostAsAuthenticatedUser(self):
|
def testPostAsAuthenticatedUser(self):
|
||||||
|
|
Loading…
Reference in New Issue