Fixes #1751: Corrected filtering for IPv6 addresses containing letters

This commit is contained in:
Jeremy Stretch 2017-12-05 16:10:45 -05:00
parent cf49891853
commit fed6fc131b
2 changed files with 44 additions and 33 deletions

View File

@ -5,10 +5,7 @@ from django.db import models
from netaddr import IPNetwork from netaddr import IPNetwork
from .formfields import IPFormField from .formfields import IPFormField
from .lookups import ( from . import lookups
EndsWith, IEndsWith, IRegex, IStartsWith, NetContained, NetContainedOrEqual, NetContains, NetContainsOrEquals,
NetHost, NetHostContained, NetMaskLength, Regex, StartsWith,
)
def prefix_validator(prefix): def prefix_validator(prefix):
@ -57,17 +54,18 @@ class IPNetworkField(BaseIPField):
return 'cidr' return 'cidr'
IPNetworkField.register_lookup(EndsWith) IPNetworkField.register_lookup(lookups.IExact)
IPNetworkField.register_lookup(IEndsWith) IPNetworkField.register_lookup(lookups.EndsWith)
IPNetworkField.register_lookup(StartsWith) IPNetworkField.register_lookup(lookups.IEndsWith)
IPNetworkField.register_lookup(IStartsWith) IPNetworkField.register_lookup(lookups.StartsWith)
IPNetworkField.register_lookup(Regex) IPNetworkField.register_lookup(lookups.IStartsWith)
IPNetworkField.register_lookup(IRegex) IPNetworkField.register_lookup(lookups.Regex)
IPNetworkField.register_lookup(NetContained) IPNetworkField.register_lookup(lookups.IRegex)
IPNetworkField.register_lookup(NetContainedOrEqual) IPNetworkField.register_lookup(lookups.NetContained)
IPNetworkField.register_lookup(NetContains) IPNetworkField.register_lookup(lookups.NetContainedOrEqual)
IPNetworkField.register_lookup(NetContainsOrEquals) IPNetworkField.register_lookup(lookups.NetContains)
IPNetworkField.register_lookup(NetMaskLength) IPNetworkField.register_lookup(lookups.NetContainsOrEquals)
IPNetworkField.register_lookup(lookups.NetMaskLength)
class IPAddressField(BaseIPField): class IPAddressField(BaseIPField):
@ -80,16 +78,17 @@ class IPAddressField(BaseIPField):
return 'inet' return 'inet'
IPAddressField.register_lookup(EndsWith) IPAddressField.register_lookup(lookups.IExact)
IPAddressField.register_lookup(IEndsWith) IPAddressField.register_lookup(lookups.EndsWith)
IPAddressField.register_lookup(StartsWith) IPAddressField.register_lookup(lookups.IEndsWith)
IPAddressField.register_lookup(IStartsWith) IPAddressField.register_lookup(lookups.StartsWith)
IPAddressField.register_lookup(Regex) IPAddressField.register_lookup(lookups.IStartsWith)
IPAddressField.register_lookup(IRegex) IPAddressField.register_lookup(lookups.Regex)
IPAddressField.register_lookup(NetContained) IPAddressField.register_lookup(lookups.IRegex)
IPAddressField.register_lookup(NetContainedOrEqual) IPAddressField.register_lookup(lookups.NetContained)
IPAddressField.register_lookup(NetContains) IPAddressField.register_lookup(lookups.NetContainedOrEqual)
IPAddressField.register_lookup(NetContainsOrEquals) IPAddressField.register_lookup(lookups.NetContains)
IPAddressField.register_lookup(NetHost) IPAddressField.register_lookup(lookups.NetContainsOrEquals)
IPAddressField.register_lookup(NetHostContained) IPAddressField.register_lookup(lookups.NetHost)
IPAddressField.register_lookup(NetMaskLength) IPAddressField.register_lookup(lookups.NetHostContained)
IPAddressField.register_lookup(lookups.NetMaskLength)

View File

@ -13,12 +13,21 @@ class NetFieldDecoratorMixin(object):
return lhs_string, lhs_params return lhs_string, lhs_params
class IExact(NetFieldDecoratorMixin, lookups.IExact):
def get_rhs_op(self, connection, rhs):
return '= LOWER(%s)' % rhs
class EndsWith(NetFieldDecoratorMixin, lookups.EndsWith): class EndsWith(NetFieldDecoratorMixin, lookups.EndsWith):
lookup_name = 'endswith' pass
class IEndsWith(NetFieldDecoratorMixin, lookups.IEndsWith): class IEndsWith(NetFieldDecoratorMixin, lookups.IEndsWith):
lookup_name = 'iendswith' pass
def get_rhs_op(self, connection, rhs):
return 'LIKE LOWER(%s)' % rhs
class StartsWith(NetFieldDecoratorMixin, lookups.StartsWith): class StartsWith(NetFieldDecoratorMixin, lookups.StartsWith):
@ -26,15 +35,18 @@ class StartsWith(NetFieldDecoratorMixin, lookups.StartsWith):
class IStartsWith(NetFieldDecoratorMixin, lookups.IStartsWith): class IStartsWith(NetFieldDecoratorMixin, lookups.IStartsWith):
lookup_name = 'istartswith' pass
def get_rhs_op(self, connection, rhs):
return 'LIKE LOWER(%s)' % rhs
class Regex(NetFieldDecoratorMixin, lookups.Regex): class Regex(NetFieldDecoratorMixin, lookups.Regex):
lookup_name = 'regex' pass
class IRegex(NetFieldDecoratorMixin, lookups.IRegex): class IRegex(NetFieldDecoratorMixin, lookups.IRegex):
lookup_name = 'iregex' pass
class NetContainsOrEquals(Lookup): class NetContainsOrEquals(Lookup):