1. ==========================
    
  2. Django 3.0.1 release notes
    
  3. ==========================
    
  4. 
    
  5. *December 18, 2019*
    
  6. 
    
  7. Django 3.0.1 fixes a security issue and several bugs in 3.0.
    
  8. 
    
  9. CVE-2019-19844: Potential account hijack via password reset form
    
  10. ================================================================
    
  11. 
    
  12. By submitting a suitably crafted email address making use of Unicode
    
  13. characters, that compared equal to an existing user email when lower-cased for
    
  14. comparison, an attacker could be sent a password reset token for the matched
    
  15. account.
    
  16. 
    
  17. In order to avoid this vulnerability, password reset requests now compare the
    
  18. submitted email using the stricter, recommended algorithm for case-insensitive
    
  19. comparison of two identifiers from `Unicode Technical Report 36, section
    
  20. 2.11.2(B)(2)`__. Upon a match, the email containing the reset token will be
    
  21. sent to the email address on record rather than the submitted address.
    
  22. 
    
  23. .. __: https://www.unicode.org/reports/tr36/#Recommendations_General
    
  24. 
    
  25. Bugfixes
    
  26. ========
    
  27. 
    
  28. * Fixed a regression in Django 3.0 by restoring the ability to use Django
    
  29.   inside Jupyter and other environments that force an async context, by adding
    
  30.   an option to disable :ref:`async-safety` mechanism with
    
  31.   :envvar:`DJANGO_ALLOW_ASYNC_UNSAFE` environment variable (:ticket:`31056`).
    
  32. 
    
  33. * Fixed a regression in Django 3.0 where ``RegexPattern``, used by
    
  34.   :func:`~django.urls.re_path`, returned positional arguments to be passed to
    
  35.   the view when all optional named groups were missing (:ticket:`31061`).
    
  36. 
    
  37. * Reallowed, following a regression in Django 3.0,
    
  38.   :class:`~django.db.models.expressions.Window` expressions to be used in
    
  39.   conditions outside of queryset filters, e.g. in
    
  40.   :class:`~django.db.models.expressions.When` conditions (:ticket:`31060`).
    
  41. 
    
  42. * Fixed a data loss possibility in
    
  43.   :class:`~django.contrib.postgres.forms.SplitArrayField`. When using with
    
  44.   ``ArrayField(BooleanField())``, all values after the first ``True`` value
    
  45.   were marked as checked instead of preserving passed values (:ticket:`31073`).