diff --git a/CVE-2024-45230.patch b/CVE-2024-45230.patch
deleted file mode 100644
index 6c04676ce1af1876a9b4e4f84b58034812dee5c8..0000000000000000000000000000000000000000
--- a/CVE-2024-45230.patch
+++ /dev/null
@@ -1,179 +0,0 @@
-From 022ab0a75c76ab2ea31dfcc5f2cf5501e378d397 Mon Sep 17 00:00:00 2001
-From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com>
-Date: Mon, 12 Aug 2024 15:17:57 +0200
-Subject: [PATCH] [5.1.x] Fixed CVE-2024-45230 -- Mitigated potential DoS in
- urlize and urlizetrunc template filters.
-
-Thanks MProgrammer (https://hackerone.com/mprogrammer) for the report.
----
- django/utils/html.py                          | 17 ++++++++------
- docs/ref/templates/builtins.txt               | 11 +++++++++
- docs/releases/4.2.16.txt                      | 14 +++++++++++
- docs/releases/5.0.9.txt                       | 14 +++++++++++
- docs/releases/5.1.1.txt                       | 13 +++++++++++
- .../filter_tests/test_urlize.py               | 23 +++++++++++++++++++
- tests/utils_tests/test_html.py                |  1 +
- 7 files changed, 86 insertions(+), 7 deletions(-)
- create mode 100644 docs/releases/4.2.16.txt
- create mode 100644 docs/releases/5.0.9.txt
- create mode 100644 docs/releases/5.1.1.txt
-
-diff --git a/django/utils/html.py b/django/utils/html.py
-index 154c820..0719347 100644
---- a/django/utils/html.py
-+++ b/django/utils/html.py
-@@ -427,14 +427,17 @@ class Urlizer:
-                 potential_entity = middle[amp:]
-                 escaped = html.unescape(potential_entity)
-                 if escaped == potential_entity or escaped.endswith(";"):
--                    rstripped = middle.rstrip(";")
--                    amount_stripped = len(middle) - len(rstripped)
--                    if amp > -1 and amount_stripped > 1:
--                        # Leave a trailing semicolon as might be an entity.
--                        trail = middle[len(rstripped) + 1 :] + trail
--                        middle = rstripped + ";"
-+                    rstripped = middle.rstrip(self.trailing_punctuation_chars)
-+                    trail_start = len(rstripped)
-+                    amount_trailing_semicolons = len(middle) - len(middle.rstrip(";"))
-+                    if amp > -1 and amount_trailing_semicolons > 1:
-+                        # Leave up to most recent semicolon as might be an entity.
-+                        recent_semicolon = middle[trail_start:].index(";")
-+                        middle_semicolon_index = recent_semicolon + trail_start + 1
-+                        trail = middle[middle_semicolon_index:] + trail
-+                        middle = rstripped + middle[trail_start:middle_semicolon_index]
-                     else:
--                        trail = middle[len(rstripped) :] + trail
-+                        trail = middle[trail_start:] + trail
-                         middle = rstripped
-                     trimmed_something = True
- 
-diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt
-index 3e2d638..86841b3 100644
---- a/docs/ref/templates/builtins.txt
-+++ b/docs/ref/templates/builtins.txt
-@@ -2932,6 +2932,17 @@ Django's built-in :tfilter:`escape` filter. The default value for
-     email addresses that contain single quotes (``'``), things won't work as
-     expected. Apply this filter only to plain text.
- 
-+.. warning::
-+
-+    Using ``urlize`` or ``urlizetrunc`` can incur a performance penalty, which
-+    can become severe when applied to user controlled values such as content
-+    stored in a :class:`~django.db.models.TextField`. You can use
-+    :tfilter:`truncatechars` to add a limit to such inputs:
-+
-+    .. code-block:: html+django
-+
-+        {{ value|truncatechars:500|urlize }}
-+
- .. templatefilter:: urlizetrunc
- 
- ``urlizetrunc``
-diff --git a/docs/releases/4.2.16.txt b/docs/releases/4.2.16.txt
-new file mode 100644
-index 0000000..b624d5c
---- /dev/null
-+++ b/docs/releases/4.2.16.txt
-@@ -0,0 +1,14 @@
-+===========================
-+Django 4.2.16 release notes
-+===========================
-+*September 3, 2024*
-+Django 4.2.16 fixes one security issue with severity "moderate" and one
-+security issue with severity "low" in 4.2.15.
-+
-+...
-+CVE-2024-45230: Potential denial-of-service vulnerability in ``django.utils.html.urlize()``
-+===========================================================================================
-+
-+:tfilter:`urlize` and :tfilter:`urlizetrunc` were subject to a potential
-+denial-of-service attack via very large inputs with a specific sequence of
-+characters.
-diff --git a/docs/releases/5.0.9.txt b/docs/releases/5.0.9.txt
-new file mode 100644
-index 0000000..3b372df
---- /dev/null
-+++ b/docs/releases/5.0.9.txt
-@@ -0,0 +1,14 @@
-+===========================
-+Django 5.0.9 release notes
-+===========================
-+*September 3, 2024*
-+Django 5.0.9 fixes one security issue with severity "moderate" and one security
-+issue with severity "low" in 5.0.8.
-+
-+...
-+CVE-2024-45230: Potential denial-of-service vulnerability in ``django.utils.html.urlize()``
-+===========================================================================================
-+
-+:tfilter:`urlize` and :tfilter:`urlizetrunc` were subject to a potential
-+denial-of-service attack via very large inputs with a specific sequence of
-+characters.
-diff --git a/docs/releases/5.1.1.txt b/docs/releases/5.1.1.txt
-new file mode 100644
-index 0000000..6a2827c
---- /dev/null
-+++ b/docs/releases/5.1.1.txt
-@@ -0,0 +1,13 @@
-+==========================
-+Django 5.1.1 release notes
-+==========================
-+*September 3, 2024*
-+Django 5.1.1 fixes one security issue with severity "moderate", one security
-+issue with severity "low", and several bugs in 5.1.
-+
-+CVE-2024-45230: Potential denial-of-service vulnerability in ``django.utils.html.urlize()``
-+===========================================================================================
-+
-+:tfilter:`urlize` and :tfilter:`urlizetrunc` were subject to a potential
-+denial-of-service attack via very large inputs with a specific sequence of
-+characters.
-diff --git a/tests/template_tests/filter_tests/test_urlize.py b/tests/template_tests/filter_tests/test_urlize.py
-index 8f84e62..14908cb 100644
---- a/tests/template_tests/filter_tests/test_urlize.py
-+++ b/tests/template_tests/filter_tests/test_urlize.py
-@@ -305,6 +305,29 @@ class FunctionTests(SimpleTestCase):
-             "http://testing.com/example</a>.,:;)&quot;!",
-         )
- 
-+    def test_trailing_semicolon(self):
-+        self.assertEqual(
-+            urlize("http://example.com?x=&amp;", autoescape=False),
-+            '<a href="http://example.com?x=" rel="nofollow">'
-+            "http://example.com?x=&amp;</a>",
-+        )
-+        self.assertEqual(
-+            urlize("http://example.com?x=&amp;;", autoescape=False),
-+            '<a href="http://example.com?x=" rel="nofollow">'
-+            "http://example.com?x=&amp;</a>;",
-+        )
-+        self.assertEqual(
-+            urlize("http://example.com?x=&amp;;;", autoescape=False),
-+            '<a href="http://example.com?x=" rel="nofollow">'
-+            "http://example.com?x=&amp;</a>;;",
-+        )
-+
-+        self.assertEqual(
-+            urlize("http://example.com?x=&amp.;...;", autoescape=False),
-+            '<a href="http://example.com?x=" rel="nofollow">'
-+            "http://example.com?x=&amp</a>.;...;",
-+        )
-+
-     def test_brackets(self):
-         """
-         #19070 - Check urlize handles brackets properly
-diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py
-index 82dbd58..035585e 100644
---- a/tests/utils_tests/test_html.py
-+++ b/tests/utils_tests/test_html.py
-@@ -374,6 +374,7 @@ class TestUtilsHtml(SimpleTestCase):
-             "&:" + ";" * 100_000,
-             "&.;" * 100_000,
-             ".;" * 100_000,
-+            "&" + ";:" * 100_000,
-         )
-         for value in tests:
-             with self.subTest(value=value):
--- 
-2.43.0
-
diff --git a/CVE-2024-45231.patch b/CVE-2024-45231.patch
deleted file mode 100644
index d46667dbb84287f5d6e3932099db0342fae2440d..0000000000000000000000000000000000000000
--- a/CVE-2024-45231.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-From 3c733c78d6f8e50296d6e248968b6516c92a53ca Mon Sep 17 00:00:00 2001
-From: Natalia <124304+nessita@users.noreply.github.com>
-Date: Mon, 19 Aug 2024 14:47:38 -0300
-Subject: [PATCH] [5.1.x] Fixed CVE-2024-45231 -- Avoided server error on
- password reset when email sending fails.
-
-On successful submission of a password reset request, an email is sent
-to the accounts known to the system. If sending this email fails (due to
-email backend misconfiguration, service provider outage, network issues,
-etc.), an attacker might exploit this by detecting which password reset
-requests succeed and which ones generate a 500 error response.
-
-Thanks to Thibaut Spriet for the report, and to Mariusz Felisiak, Adam
-Johnson, and Sarah Boyce for the reviews.
----
- django/contrib/auth/forms.py   |  9 ++++++++-
- docs/ref/logging.txt           | 12 ++++++++++++
- docs/releases/4.2.16.txt       | 11 +++++++++++
- docs/releases/5.0.9.txt        | 11 +++++++++++
- docs/releases/5.1.1.txt        | 11 +++++++++++
- docs/topics/auth/default.txt   |  4 +++-
- tests/auth_tests/test_forms.py | 21 +++++++++++++++++++++
- tests/mail/custombackend.py    |  6 ++++++
- 8 files changed, 83 insertions(+), 2 deletions(-)
-
-diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py
-index 31e96ff..689014b 100644
---- a/django/contrib/auth/forms.py
-+++ b/django/contrib/auth/forms.py
-@@ -1,3 +1,4 @@
-+import logging
- import unicodedata
- 
- from django import forms
-@@ -16,6 +17,7 @@ from django.utils.translation import gettext
- from django.utils.translation import gettext_lazy as _
- 
- UserModel = get_user_model()
-+logger = logging.getLogger("django.contrib.auth")
- 
- 
- def _unicode_ci_compare(s1, s2):
-@@ -393,7 +395,12 @@ class PasswordResetForm(forms.Form):
-             html_email = loader.render_to_string(html_email_template_name, context)
-             email_message.attach_alternative(html_email, "text/html")
- 
--        email_message.send()
-+        try:
-+            email_message.send()
-+        except Exception:
-+            logger.exception(
-+                "Failed to send password reset email to %s", context["user"].pk
-+            )
- 
-     def get_users(self, email):
-         """Given an email, return matching user(s) who should receive a reset.
-diff --git a/docs/ref/logging.txt b/docs/ref/logging.txt
-index 8a7e589..24ab5d9 100644
---- a/docs/ref/logging.txt
-+++ b/docs/ref/logging.txt
-@@ -209,6 +209,18 @@ Django development server. This logger generates an ``INFO`` message upon
- detecting a modification in a source code file and may produce ``WARNING``
- messages during filesystem inspection and event subscription processes.
- 
-+.. _django-contrib-auth-logger:
-+
-+``django.contrib.auth``
-+~~~~~~~~~~~~~~~~~~~~~~~
-+
-+.. versionadded:: 4.2.16
-+
-+Log messages related to :doc:`contrib/auth`, particularly ``ERROR`` messages
-+are generated when a :class:`~django.contrib.auth.forms.PasswordResetForm` is
-+successfully submitted but the password reset email cannot be delivered due to
-+a mail sending exception.
-+
- .. _django-contrib-gis-logger:
- 
- ``django.contrib.gis``
-diff --git a/docs/releases/4.2.16.txt b/docs/releases/4.2.16.txt
-index b624d5c..f0f82ba 100644
---- a/docs/releases/4.2.16.txt
-+++ b/docs/releases/4.2.16.txt
-@@ -12,3 +12,14 @@ CVE-2024-45230: Potential denial-of-service vulnerability in ``django.utils.html
- :tfilter:`urlize` and :tfilter:`urlizetrunc` were subject to a potential
- denial-of-service attack via very large inputs with a specific sequence of
- characters.
-+
-+CVE-2024-45231: Potential user email enumeration via response status on password reset
-+======================================================================================
-+
-+Due to unhandled email sending failures, the
-+:class:`~django.contrib.auth.forms.PasswordResetForm` class allowed remote
-+attackers to enumerate user emails by issuing password reset requests and
-+observing the outcomes.
-+
-+To mitigate this risk, exceptions occurring during password reset email sending
-+are now handled and logged using the :ref:`django-contrib-auth-logger` logger.
-diff --git a/docs/releases/5.0.9.txt b/docs/releases/5.0.9.txt
-index 3b372df..3faa716 100644
---- a/docs/releases/5.0.9.txt
-+++ b/docs/releases/5.0.9.txt
-@@ -12,3 +12,14 @@ CVE-2024-45230: Potential denial-of-service vulnerability in ``django.utils.html
- :tfilter:`urlize` and :tfilter:`urlizetrunc` were subject to a potential
- denial-of-service attack via very large inputs with a specific sequence of
- characters.
-+
-+CVE-2024-45231: Potential user email enumeration via response status on password reset
-+======================================================================================
-+
-+Due to unhandled email sending failures, the
-+:class:`~django.contrib.auth.forms.PasswordResetForm` class allowed remote
-+attackers to enumerate user emails by issuing password reset requests and
-+observing the outcomes.
-+
-+To mitigate this risk, exceptions occurring during password reset email sending
-+are now handled and logged using the :ref:`django-contrib-auth-logger` logger.
-diff --git a/docs/releases/5.1.1.txt b/docs/releases/5.1.1.txt
-index 6a2827c..d79a961 100644
---- a/docs/releases/5.1.1.txt
-+++ b/docs/releases/5.1.1.txt
-@@ -11,3 +11,14 @@ CVE-2024-45230: Potential denial-of-service vulnerability in ``django.utils.html
- :tfilter:`urlize` and :tfilter:`urlizetrunc` were subject to a potential
- denial-of-service attack via very large inputs with a specific sequence of
- characters.
-+
-+CVE-2024-45231: Potential user email enumeration via response status on password reset
-+======================================================================================
-+
-+Due to unhandled email sending failures, the
-+:class:`~django.contrib.auth.forms.PasswordResetForm` class allowed remote
-+attackers to enumerate user emails by issuing password reset requests and
-+observing the outcomes.
-+
-+To mitigate this risk, exceptions occurring during password reset email sending
-+are now handled and logged using the :ref:`django-contrib-auth-logger` logger.
-diff --git a/docs/topics/auth/default.txt b/docs/topics/auth/default.txt
-index 1d2ea81..7278dca 100644
---- a/docs/topics/auth/default.txt
-+++ b/docs/topics/auth/default.txt
-@@ -1723,7 +1723,9 @@ provides several built-in forms located in :mod:`django.contrib.auth.forms`:
-     .. method:: send_mail(subject_template_name, email_template_name, context, from_email, to_email, html_email_template_name=None)
- 
-         Uses the arguments to send an ``EmailMultiAlternatives``.
--        Can be overridden to customize how the email is sent to the user.
-+        Can be overridden to customize how the email is sent to the user. If
-+        you choose to override this method, be mindful of handling potential
-+        exceptions raised due to email sending failures.
- 
-         :param subject_template_name: the template for the subject.
-         :param email_template_name: the template for the email body.
-diff --git a/tests/auth_tests/test_forms.py b/tests/auth_tests/test_forms.py
-index 3dd9324..f1e8fb9 100644
---- a/tests/auth_tests/test_forms.py
-+++ b/tests/auth_tests/test_forms.py
-@@ -1369,6 +1369,27 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
-             )
-         )
- 
-+    @override_settings(EMAIL_BACKEND="mail.custombackend.FailingEmailBackend")
-+    def test_save_send_email_exceptions_are_catched_and_logged(self):
-+        (user, username, email) = self.create_dummy_user()
-+        form = PasswordResetForm({"email": email})
-+        self.assertTrue(form.is_valid())
-+
-+        with self.assertLogs("django.contrib.auth", level=0) as cm:
-+            form.save()
-+
-+        self.assertEqual(len(mail.outbox), 0)
-+        self.assertEqual(len(cm.output), 1)
-+        errors = cm.output[0].split("\n")
-+        pk = user.pk
-+        self.assertEqual(
-+            errors[0],
-+            f"ERROR:django.contrib.auth:Failed to send password reset email to {pk}",
-+        )
-+        self.assertEqual(
-+            errors[-1], "ValueError: FailingEmailBackend is doomed to fail."
-+        )
-+
-     @override_settings(AUTH_USER_MODEL="auth_tests.CustomEmailField")
-     def test_custom_email_field(self):
-         email = "test@mail.com"
-diff --git a/tests/mail/custombackend.py b/tests/mail/custombackend.py
-index 14e7f07..c63f1c0 100644
---- a/tests/mail/custombackend.py
-+++ b/tests/mail/custombackend.py
-@@ -12,3 +12,9 @@ class EmailBackend(BaseEmailBackend):
-         # Messages are stored in an instance variable for testing.
-         self.test_outbox.extend(email_messages)
-         return len(email_messages)
-+
-+
-+class FailingEmailBackend(BaseEmailBackend):
-+
-+    def send_messages(self, email_messages):
-+        raise ValueError("FailingEmailBackend is doomed to fail.")
--- 
-2.43.0
-
diff --git a/Django-5.1.tar.gz b/Django-5.1.4.tar.gz
similarity index 56%
rename from Django-5.1.tar.gz
rename to Django-5.1.4.tar.gz
index f4fdcd055546c887df016f44802b201fa2c710a1..9696413f8344601cc7e251fd1e68a695e0217513 100644
Binary files a/Django-5.1.tar.gz and b/Django-5.1.4.tar.gz differ
diff --git a/python-django.spec b/python-django.spec
index 5981b901471bce891672176a3010e4958bdffab9..f4d29c3c6a11bebe3e553b1e31c1ef3ee1511cd6 100644
--- a/python-django.spec
+++ b/python-django.spec
@@ -1,13 +1,11 @@
 %global _empty_manifest_terminate_build 0
 Name:		python-django
-Version:	5.1
-Release:	2
+Version:	5.1.4
+Release:	1
 Summary:	A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
 License:	Apache-2.0 and Python-2.0 and BSD-3-Clause
 URL:			https://www.djangoproject.com/
 Source0:	https://files.pythonhosted.org/packages/source/d/Django/Django-%{version}.tar.gz
-Patch0:		CVE-2024-45230.patch
-Patch1:		CVE-2024-45231.patch
 
 BuildArch:	noarch
 %description
@@ -74,6 +72,9 @@ mv %{buildroot}/doclist.lst .
 %{_docdir}/*
 
 %changelog
+* Fri Dec 6 2024 zhangxianjun <zhangxianjun@kylinos.cn> - 5.1.4-1
+- Fix CVE-2024-53907 CVE-2024-53908 CVE-2024-45230 CVE-2024-45231
+
 * Thu Oct 10 2024 zhangxianting <zhangxianting@uniontech.com> - 5.1-2
 - Fix CVE-2024-45230 CVE-2024-45231