#24319: UUIDField do not properly clean (validate) value in get_db_prep_value
----------------------------------------------+------------------------
     Reporter:  davidfischer-ch               |      Owner:  nobody
         Type:  Bug                           |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:  1.8alpha1
     Severity:  Normal                        |   Keywords:  clean,uuid
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+------------------------
 '''Use case''': Using user's input to retrieve a model from database.

 '''Issue''': The UUIDField doesn't properly *clean* the input value,
 meaning the ORM will query the database even the query values aren't
 cleaned.

 '''System''': Ubuntu 14.04 LTS + PostgresSQL 9.3

 '''Good''': User.objects.get(pk='ssss') -> ValueError
 '''Bad''': Media.objects.get(pk='ssss') -> DataError

 {{{
 class Media(models.Model):
     pk = models.UUIDField()
 }}}

 {{{
 >>> User.objects.get(pk='ssss')
 Traceback (most recent call last):
   File "<input>", line 1, in <module>
   File "venv/src/django/django/db/models/manager.py", line 127, in
 manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "venv/src/django/django/db/models/query.py", line 320, in get
     clone = self.filter(*args, **kwargs)
   File "venv/src/django/django/db/models/query.py", line 671, in filter
     return self._filter_or_exclude(False, *args, **kwargs)
   File "venv/src/django/django/db/models/query.py", line 689, in
 _filter_or_exclude
     clone.query.add_q(Q(*args, **kwargs))
   File "venv/src/django/django/db/models/sql/query.py", line 1284, in
 add_q
     clause, require_inner = self._add_q(where_part, self.used_aliases)
   File "venv/src/django/django/db/models/sql/query.py", line 1311, in
 _add_q
     current_negated=current_negated, connector=connector,
 allow_joins=allow_joins)
   File "venv/src/django/django/db/models/sql/query.py", line 1183, in
 build_filter
     condition = self.build_lookup(lookups, col, value)
   File "venv/src/django/django/db/models/sql/query.py", line 1079, in
 build_lookup
     return final_lookup(lhs, rhs)
   File "venv/src/django/django/db/models/lookups.py", line 96, in __init__
     self.rhs = self.get_prep_lookup()
   File "venv/src/django/django/db/models/lookups.py", line 134, in
 get_prep_lookup
     return self.lhs.output_field.get_prep_lookup(self.lookup_name,
 self.rhs)
   File "venv/src/django/django/db/models/fields/__init__.py", line 716, in
 get_prep_lookup
     return self.get_prep_value(value)
   File "venv/src/django/django/db/models/fields/__init__.py", line 974, in
 get_prep_value
     return int(value)
 ValueError: invalid literal for int() with base 10: 'ssss'

 }}}

 {{{
 >>> Media.objects.get(pk='ssss')
 Traceback (most recent call last):
   File "<input>", line 1, in <module>
   File "venv/src/django/django/db/models/manager.py", line 127, in
 manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "venv/src/django/django/db/models/query.py", line 326, in get
     num = len(clone)
   File "venv/src/django/django/db/models/query.py", line 145, in __len__
     self._fetch_all()
   File "venv/src/django/django/db/models/query.py", line 955, in
 _fetch_all
     self._result_cache = list(self.iterator())
   File "venv/src/django/django/db/models/query.py", line 239, in iterator
     results = compiler.execute_sql()
   File "venv/src/django/django/db/models/sql/compiler.py", line 826, in
 execute_sql
     cursor.execute(sql, params)
   File "venv/src/django/django/db/backends/utils.py", line 80, in execute
     return super(CursorDebugWrapper, self).execute(sql, params)
   File "venv/src/django/django/db/backends/utils.py", line 65, in execute
     return self.cursor.execute(sql, params)
   File "venv/src/django/django/db/utils.py", line 95, in __exit__
     six.reraise(dj_exc_type, dj_exc_value, traceback)
   File "venv/src/django/django/utils/six.py", line 658, in reraise
     raise value.with_traceback(tb)
   File "venv/src/django/django/db/backends/utils.py", line 65, in execute
     return self.cursor.execute(sql, params)
 django.db.utils.DataError: invalid input syntax for uuid: "ssss"
 LINE 1: ...oudncode_media" WHERE "cloudncode_media"."uuid" = 'ssss' LIM...
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/24319>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/058.f83f000767a5593c5be76fc66ef680b5%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to