Parcourir la source

Fixes #1751: Corrected filtering for IPv6 addresses containing letters

Jeremy Stretch il y a 7 ans
Parent
commit
fed6fc131b
2 fichiers modifiés avec 44 ajouts et 33 suppressions
  1. 27 28
      netbox/ipam/fields.py
  2. 17 5
      netbox/ipam/lookups.py

+ 27 - 28
netbox/ipam/fields.py

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

+ 17 - 5
netbox/ipam/lookups.py

@@ -13,12 +13,21 @@ class NetFieldDecoratorMixin(object):
         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):
-    lookup_name = 'endswith'
+    pass
 
 
 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):
@@ -26,15 +35,18 @@ class StartsWith(NetFieldDecoratorMixin, lookups.StartsWith):
 
 
 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):
-    lookup_name = 'regex'
+    pass
 
 
 class IRegex(NetFieldDecoratorMixin, lookups.IRegex):
-    lookup_name = 'iregex'
+    pass
 
 
 class NetContainsOrEquals(Lookup):