{"title":"Django 3.0.1 release notes","version":"dev","locale":"en","docname":"releases/3.0.1","url":"/en/dev/releases/3.0.1/","canonical":"https://djangodocs.dev/en/dev/releases/3.0.1/","summary":"Django 3.0.1 fixes a security issue and several bugs in 3.0. By submitting a suitably crafted email address making use of Unicode characters, that compared…","html":"<h1>Django 3.0.1 release notes<a class=\"heading-anchor\" href=\"#django-3-0-1-release-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><em>December 18, 2019</em></p>\n<p>Django 3.0.1 fixes a security issue and several bugs in 3.0.</p>\n<section id=\"cve-2019-19844-potential-account-hijack-via-password-reset-form\">\n<h2>CVE-2019-19844: Potential account hijack via password reset form<a class=\"heading-anchor\" href=\"#cve-2019-19844-potential-account-hijack-via-password-reset-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>By submitting a suitably crafted email address making use of Unicode\ncharacters, that compared equal to an existing user email when lower-cased for\ncomparison, an attacker could be sent a password reset token for the matched\naccount.</p>\n<p>In order to avoid this vulnerability, password reset requests now compare the\nsubmitted email using the stricter, recommended algorithm for case-insensitive\ncomparison of two identifiers from <a class=\"reference external\" href=\"https://www.unicode.org/reports/tr36/#Recommendations_General\">Unicode Technical Report 36, section\n2.11.2(B)(2)</a>. Upon a match, the email containing the reset token will be\nsent to the email address on record rather than the submitted address.</p>\n</section>\n<section id=\"bugfixes\">\n<h2>Bugfixes<a class=\"heading-anchor\" href=\"#bugfixes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>Fixed a regression in Django 3.0 by restoring the ability to use Django\ninside Jupyter and other environments that force an async context, by adding\nan option to disable <a class=\"reference internal\" href=\"/en/dev/topics/async/#async-safety\"><span class=\"std std-ref\">Async safety</span></a> mechanism with\n<span class=\"target\" id=\"index-0\"></span><a class=\"reference internal\" href=\"/en/dev/topics/async/#envvar-DJANGO_ALLOW_ASYNC_UNSAFE\"><code class=\"xref std std-envvar docutils literal notranslate\">DJANGO_ALLOW_ASYNC_UNSAFE</code></a> environment variable (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/31056\">#31056</a>).</p></li>\n<li><p>Fixed a regression in Django 3.0 where <code class=\"docutils literal notranslate\">RegexPattern</code>, used by\n<a class=\"reference internal\" href=\"/en/dev/ref/urls/#django.urls.re_path\" title=\"django.urls.re_path\"><code class=\"xref py py-func docutils literal notranslate\">re_path()</code></a>, returned positional arguments to be passed to\nthe view when all optional named groups were missing (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/31061\">#31061</a>).</p></li>\n<li><p>Reallowed, following a regression in Django 3.0,\n<a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a> expressions to be used in\nconditions outside of queryset filters, e.g. in\n<a class=\"reference internal\" href=\"/en/dev/ref/models/conditional-expressions/#django.db.models.expressions.When\" title=\"django.db.models.expressions.When\"><code class=\"xref py py-class docutils literal notranslate\">When</code></a> conditions (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/31060\">#31060</a>).</p></li>\n<li><p>Fixed a data loss possibility in\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/forms/#django.contrib.postgres.forms.SplitArrayField\" title=\"django.contrib.postgres.forms.SplitArrayField\"><code class=\"xref py py-class docutils literal notranslate\">SplitArrayField</code></a>. When using with\n<code class=\"docutils literal notranslate\">ArrayField(BooleanField())</code>, all values after the first <code class=\"docutils literal notranslate\">True</code> value\nwere marked as checked instead of preserving passed values (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/31073\">#31073</a>).</p></li>\n</ul>\n</section>","rootId":"django-3-0-1-release-notes","toc":[{"title":"CVE-2019-19844: Potential account hijack via password reset form","anchor":"cve-2019-19844-potential-account-hijack-via-password-reset-form","children":[]},{"title":"Bugfixes","anchor":"bugfixes","children":[]}],"breadcrumbs":[{"docname":"releases/index","title":"Release notes","url":"/en/dev/releases/"}],"prev":{"docname":"releases/3.0.2","title":"Django 3.0.2 release notes","url":"/en/dev/releases/3.0.2/"},"next":{"docname":"releases/3.0","title":"Django 3.0 release notes","url":"/en/dev/releases/3.0/"},"formats":{"html":"/en/dev/releases/3.0.1/","markdown":"/en/dev/releases/3.0.1.md","json":"/en/dev/releases/3.0.1.json"},"source":"https://github.com/django/django/blob/main/docs/releases/3.0.1.txt","official":"https://docs.djangoproject.com/en/dev/releases/3.0.1/","inVersions":["dev","6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0"],"inLocales":["en"]}