Skip to content

Commit

Permalink
Fixes #11046: Restrict length of indexed search values
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremystretch committed Dec 1, 2022
1 parent d0e0c2f commit 2d49fc2
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
8 changes: 7 additions & 1 deletion netbox/extras/migrations/0083_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import uuid

import django.db.models.deletion
import django.db.models.functions.text
import django.db.models.lookups
from django.core import management
from django.db import migrations, models

Expand Down Expand Up @@ -39,12 +41,16 @@ class Migration(migrations.Migration):
('object_id', models.PositiveBigIntegerField()),
('field', models.CharField(max_length=200)),
('type', models.CharField(max_length=30)),
('value', models.TextField(db_index=True)),
('value', models.TextField()),
('weight', models.PositiveSmallIntegerField(default=1000)),
('object_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='contenttypes.contenttype')),
],
options={
'ordering': ('weight', 'object_type', 'object_id'),
'indexes': (
models.Index(condition=models.Q(django.db.models.lookups.LessThan(django.db.models.functions.text.Length('value'), 1024)), fields=['value'], name='extras_cachedvalue_value'),
models.Index(condition=models.Q(django.db.models.lookups.LessThan(django.db.models.functions.text.Length('value'), 1024)), fields=['value'], name='extras_cachedvalue_value_like', opclasses=['text_pattern_ops']),
)
},
),
migrations.RunPython(
Expand Down
23 changes: 20 additions & 3 deletions netbox/extras/models/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@

from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import Index, Q
from django.db.models.functions import Length
from django.db.models.lookups import LessThan

from utilities.fields import RestrictedGenericForeignKey

__all__ = (
'CachedValue',
)

# Maximum cached value length to index (see #11046)
INDEX_MAX = 1024


class CachedValue(models.Model):
id = models.UUIDField(
Expand Down Expand Up @@ -36,15 +42,26 @@ class CachedValue(models.Model):
type = models.CharField(
max_length=30
)
value = models.TextField(
db_index=True
)
value = models.TextField()
weight = models.PositiveSmallIntegerField(
default=1000
)

class Meta:
ordering = ('weight', 'object_type', 'object_id')
indexes = (
Index(
fields=['value'],
name='extras_cachedvalue_value',
condition=Q(LessThan(Length('value'), 1024))
),
Index(
fields=['value'],
name='extras_cachedvalue_value_like',
opclasses=['text_pattern_ops'],
condition=Q(LessThan(Length('value'), 1024))
),
)

def __str__(self):
return f'{self.object_type} {self.object_id}: {self.field}={self.value}'

0 comments on commit 2d49fc2

Please sign in to comment.