Added a validation step for SearchablePersonField, to avoid later server 500 errors on bad input.

- Legacy-Id: 16433
This commit is contained in:
Henrik Levkowetz 2019-07-08 18:14:05 +00:00
parent 159dc6990e
commit edc1da3023

View file

@ -1,12 +1,16 @@
# Copyright The IETF Trust 2012-2019, All Rights Reserved
# -*- coding: utf-8 -*-
import json import json
import six import six
from collections import Counter from collections import Counter
from urllib import urlencode from urllib import urlencode
from django.utils.html import escape
from django import forms from django import forms
from django.core.validators import validate_email
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils.html import escape
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -70,6 +74,16 @@ class SearchablePersonsField(forms.CharField):
def parse_select2_value(self, value): def parse_select2_value(self, value):
return [x.strip() for x in value.split(",") if x.strip()] return [x.strip() for x in value.split(",") if x.strip()]
def check_pks(self, pks):
if self.model == Person:
for pk in pks:
if not pk.isdigit():
raise forms.ValidationError("Unexpected value: %s" % pk)
elif self.model == Email:
for pk in pks:
validate_email(pk)
return pks
def prepare_value(self, value): def prepare_value(self, value):
if not value: if not value:
value = "" value = ""
@ -99,7 +113,7 @@ class SearchablePersonsField(forms.CharField):
def clean(self, value): def clean(self, value):
value = super(SearchablePersonsField, self).clean(value) value = super(SearchablePersonsField, self).clean(value)
pks = self.parse_select2_value(value) pks = self.check_pks(self.parse_select2_value(value))
objs = self.model.objects.filter(pk__in=pks) objs = self.model.objects.filter(pk__in=pks)
if self.model == Email: if self.model == Email: