diff --git a/core/core/wsgi.py b/core/core/wsgi.py deleted file mode 100644 index f44964d..0000000 --- a/core/core/wsgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for core project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') - -application = get_wsgi_application() diff --git a/core/mail/models.py b/core/mail/models.py index 2215fbb..36cd2b3 100644 --- a/core/mail/models.py +++ b/core/mail/models.py @@ -29,13 +29,13 @@ class Email(SoftDeleteModel): self.save() def train_spam(self): - if ACTIVE_SPAM_TRAINING: + if ACTIVE_SPAM_TRAINING and self.raw_file.path: import subprocess path = self.raw_file.path subprocess.run(["rspamc", "learn_spam", path]) def train_ham(self): - if ACTIVE_SPAM_TRAINING: + if ACTIVE_SPAM_TRAINING and self.raw_file.path: import subprocess path = self.raw_file.path subprocess.run(["rspamc", "learn_ham", path]) diff --git a/core/mail/protocol.py b/core/mail/protocol.py index 926e8c2..c5aaa4a 100644 --- a/core/mail/protocol.py +++ b/core/mail/protocol.py @@ -91,7 +91,7 @@ async def send_smtp(message): await aiosmtplib.send(message, hostname="127.0.0.1", port=25, use_tls=False, start_tls=False) -def find_active_issue_thread(in_reply_to, address, subject): +def find_active_issue_thread(in_reply_to, address, subject, event): from re import match uuid_match = match(r'^ticket\+([a-f0-9-]{36})@', address) if uuid_match: @@ -102,7 +102,7 @@ def find_active_issue_thread(in_reply_to, address, subject): if reply_to.exists(): return reply_to.first().issue_thread, False else: - issue = IssueThread.objects.create(name=subject) + issue = IssueThread.objects.create(name=subject, event=event) return issue, True @@ -202,11 +202,14 @@ def receive_email(envelope, log=None): subject = unescape_and_decode_base64(subject) target_event = find_target_event(recipient) - active_issue_thread, new = find_active_issue_thread(header_in_reply_to, recipient, subject) + active_issue_thread, new = find_active_issue_thread(header_in_reply_to, recipient, subject, target_event) + + from hashlib import sha256 + random_filename = 'mail-' + sha256(envelope.content).hexdigest() email = Email.objects.create( sender=sender, recipient=recipient, body=body, subject=subject, reference=header_message_id, - in_reply_to=header_in_reply_to, raw_file=ContentFile(envelope.content), event=target_event, + in_reply_to=header_in_reply_to, raw_file=ContentFile(envelope.content, name=random_filename), event=target_event, issue_thread=active_issue_thread) for attachment in attachments: email.attachments.add(attachment) diff --git a/core/mail/tests/v2/test_mails.py b/core/mail/tests/v2/test_mails.py index 3df56ca..3b358ca 100644 --- a/core/mail/tests/v2/test_mails.py +++ b/core/mail/tests/v2/test_mails.py @@ -142,6 +142,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test aiosmtplib.send.assert_called_once() self.assertEqual('test ä', Email.objects.all()[0].subject) self.assertEqual('Text mit Quoted-Printable-Kodierung: äöüß', Email.objects.all()[0].body) + self.assertTrue( Email.objects.all()[0].raw_file.path) def test_handle_quoted_printable_2(self): from aiosmtpd.smtp import Envelope @@ -162,6 +163,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test aiosmtplib.send.assert_called_once() self.assertEqual('suche_Mütze', Email.objects.all()[0].subject) self.assertEqual('Text mit Quoted-Printable-Kodierung: äöüß', Email.objects.all()[0].body) + self.assertTrue( Email.objects.all()[0].raw_file.path) def test_handle_base64(self): from aiosmtpd.smtp import Envelope @@ -182,6 +184,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test aiosmtplib.send.assert_called_once() self.assertEqual('test', Email.objects.all()[0].subject) self.assertEqual('Text mit Base64-Kodierung: äöüß', Email.objects.all()[0].body) + self.assertTrue( Email.objects.all()[0].raw_file.path) def test_handle_client_reply(self): issue_thread = IssueThread.objects.create( @@ -229,6 +232,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test self.assertEqual(IssueThread.objects.all()[0].name, 'test') self.assertEqual(IssueThread.objects.all()[0].state, 'pending_new') self.assertEqual(IssueThread.objects.all()[0].assigned_to, None) + self.assertTrue( Email.objects.all()[2].raw_file.path) def test_handle_client_reply_2(self): issue_thread = IssueThread.objects.create( @@ -281,6 +285,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test self.assertEqual(IssueThread.objects.all()[0].name, 'test') self.assertEqual(IssueThread.objects.all()[0].state, 'pending_open') self.assertEqual(IssueThread.objects.all()[0].assigned_to, None) + self.assertTrue( Email.objects.all()[2].raw_file.path) def test_mail_reply(self): issue_thread = IssueThread.objects.create( @@ -384,6 +389,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test states = StateChange.objects.filter(issue_thread=IssueThread.objects.all()[0]) self.assertEqual(1, len(states)) self.assertEqual('pending_new', states[0].state) + self.assertEqual(event, IssueThread.objects.all()[0].event) def test_mail_html_body(self): from aiosmtpd.smtp import Envelope