Przeglądaj źródła

Fixed #30604 -- Made mail_admins()/mail_managers() raise ValueError if ADMINS/MANAGERS is set incorrectly.

Hasan Ramezani 5 lat temu
rodzic
commit
090ca6512f
3 zmienionych plików z 22 dodań i 1 usunięć
  1. 4 0
      django/core/mail/__init__.py
  2. 17 0
      tests/mail/tests.py
  3. 1 1
      tests/middleware/tests.py

+ 4 - 0
django/core/mail/__init__.py

@@ -91,6 +91,8 @@ def mail_admins(subject, message, fail_silently=False, connection=None,
     """Send a message to the admins, as defined by the ADMINS setting."""
     if not settings.ADMINS:
         return
+    if not all(isinstance(a, (list, tuple)) and len(a) == 2 for a in settings.ADMINS):
+        raise ValueError('The ADMINS setting must be a list of 2-tuples.')
     mail = EmailMultiAlternatives(
         '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), message,
         settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS],
@@ -106,6 +108,8 @@ def mail_managers(subject, message, fail_silently=False, connection=None,
     """Send a message to the managers, as defined by the MANAGERS setting."""
     if not settings.MANAGERS:
         return
+    if not all(isinstance(a, (list, tuple)) and len(a) == 2 for a in settings.MANAGERS):
+        raise ValueError('The MANAGERS setting must be a list of 2-tuples.')
     mail = EmailMultiAlternatives(
         '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), message,
         settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS],

+ 17 - 0
tests/mail/tests.py

@@ -991,6 +991,23 @@ class BaseEmailBackendTests(HeadersCheckMixin):
         mail_managers('hi', 'there')
         self.assertEqual(self.get_mailbox_content(), [])
 
+    def test_wrong_admins_managers(self):
+        tests = (
+            'test@example.com',
+            ('test@example.com',),
+            ['test@example.com', 'other@example.com'],
+            ('test@example.com', 'other@example.com'),
+        )
+        for setting, mail_func in (
+            ('ADMINS', mail_admins),
+            ('MANAGERS', mail_managers),
+        ):
+            msg = 'The %s setting must be a list of 2-tuples.' % setting
+            for value in tests:
+                with self.subTest(setting=setting, value=value), self.settings(**{setting: value}):
+                    with self.assertRaisesMessage(ValueError, msg):
+                        mail_func('subject', 'content')
+
     def test_message_cc_header(self):
         """
         Regression test for #7722

+ 1 - 1
tests/middleware/tests.py

@@ -340,7 +340,7 @@ class CommonMiddlewareTest(SimpleTestCase):
 
 @override_settings(
     IGNORABLE_404_URLS=[re.compile(r'foo')],
-    MANAGERS=['PHB@dilbert.com'],
+    MANAGERS=[('PHD', 'PHB@dilbert.com')],
 )
 class BrokenLinkEmailsMiddlewareTest(SimpleTestCase):