Ejemplo n.º 1
0
 def setUp(self):
     raw_message = read_file(
         f"{settings.BASE_DIR}/apps/restricted/fixtures/emails/valid.txt")
     parser = EmailParser(raw_message, "*****@*****.**",
                          ParserMessageType.STRING)
     self.message = parser.parse()
     self.processor = MessageProcessor("*****@*****.**", self.message, {})
Ejemplo n.º 2
0
    def test_send_wrong_addr(self):
        """Sending from wrong addr shouldn't crash and burn"""
        processor = MessageProcessor("*****@*****.**",
                                     self.message, {})
        processor.process_message()

        self.assertEquals(1, len(mail.outbox))
Ejemplo n.º 3
0
    def process_message(self, peer, mailfrom, recipients, data, **kwargs):
        parser = LMTPEmailParser(data, mailfrom, ParserMessageType.BYTES)

        try:
            message = parser.parse()
        except ParseEmailException:
            log.exception("lmtp_email_parse_error")
            return channel.CRLF.join(channel.ERR_451 for _ in recipients)
        except MessageIDNotExistException:
            log.exception("lmtp_message_no_message_id")
            return channel.CRLF.join(channel.ERR_550_MID for _ in recipients)
        except DefectMessageException:
            log.exception("lmtp_message_defect")
            return channel.CRLF.join(channel.ERR_501 for _ in recipients)

        status = []
        for recipient in recipients:

            if recipient not in [
                    settings.RESTRICTED_ADDRESS,
                    f"{settings.RESTRICTED_ADDRESS}@{settings.RESTRICTED_DOMAIN}",
            ]:
                log.warn("restricted_incorrect_destination_address",
                         address=recipient)
                return status.append(channel.ERR_511)

            try:
                message_data = {
                    "original_size": message.original_size,
                    "received_time": timezone.now(),
                }

                message_processor = MessageProcessor(mailfrom, message,
                                                     message_data)
                message_processor.process_message()

                return status.append(channel.OK_250)

            except Exception:
                from raven.contrib.django.raven_compat.models import client

                client.captureException()
                log.exception("lmtp_lookup_failure")
                status.append(channel.ERR_550)

        return channel.CRLF.join(status)
Ejemplo n.º 4
0
    async def handle_DATA(self, server, session, envelope):
        data = envelope.content
        mailfrom = envelope.mail_from
        recipients = envelope.rcpt_tos

        parser = SMTPEmailParser(data, mailfrom, ParserMessageType.BYTES)

        try:
            message = parser.parse()
        except ParseEmailException:
            log.exception("smtp_email_parse_error")
            return CRLF.join(ERR_451 for _ in recipients)
        except MessageIDNotExistException:
            log.exception("smtp_message_no_message_id")
            return CRLF.join(ERR_550_MID for _ in recipients)
        except DefectMessageException:
            log.exception("smtp_message_defect")
            return CRLF.join(ERR_501 for _ in recipients)

        status = []
        for recipient in recipients:

            if recipient not in [
                    settings.RESTRICTED_ADDRESS,
                    f"{settings.RESTRICTED_ADDRESS}@{settings.RESTRICTED_DOMAIN}",
            ]:
                log.warn("restricted_incorrect_destination_address",
                         address=recipient)
                return ERR_511

            try:
                message_data = {
                    "original_size": message.original_size,
                    "received_time": timezone.now(),
                }

                message_processor = MessageProcessor(mailfrom, message,
                                                     message_data)
                await message_processor.process_message()

                return OK_250

            except Exception:

                log.exception("smtp_lookup_failure")
                status.append(ERR_550)

        return CRLF.join(status)
Ejemplo n.º 5
0
class MessageProcessorTestCase(BaseTestCase):

    fixtures = [
        "test_abakus_groups.yaml",
        "test_users.yaml",
        "test_companies.yaml",
        "test_events.yaml",
        "test_restricted_mails.yaml",
    ]

    def setUp(self):
        raw_message = read_file(
            f"{settings.BASE_DIR}/apps/restricted/fixtures/emails/valid.txt")
        parser = EmailParser(raw_message, "*****@*****.**",
                             ParserMessageType.STRING)
        self.message = parser.parse()
        self.processor = MessageProcessor("*****@*****.**", self.message, {})

    @override_settings(RESTRICTED_ALLOW_ORIGINAL_SENDER=False,
                       RESTRICTED_FROM="*****@*****.**")
    def test_get_sender_settings_override(self):
        """
        Return sender configured in the settings when RESTRICTED_ALLOW_ORIGINAL_SENDER is False
        """
        restricted_mail = RestrictedMail.objects.get(id=1)
        self.assertEquals("*****@*****.**",
                          self.processor.get_sender(restricted_mail))

    @override_settings(RESTRICTED_ALLOW_ORIGINAL_SENDER=True,
                       RESTRICTED_FROM="*****@*****.**")
    def test_get_sender(self):
        """Return the original sender when the settings allow it"""
        restricted_mail = RestrictedMail.objects.get(id=1)
        self.assertEquals("*****@*****.**",
                          self.processor.get_sender(restricted_mail))

    @override_settings(RESTRICTED_ALLOW_ORIGINAL_SENDER=True,
                       RESTRICTED_FROM="*****@*****.**")
    def test_get_sender_hidden(self):
        """Return the sender form the settings when the original sender hides the address"""
        restricted_mail = RestrictedMail.objects.get(id=1)
        restricted_mail.hide_sender = True
        restricted_mail.save()

        self.assertEquals("*****@*****.**",
                          self.processor.get_sender(restricted_mail))

    @mock.patch(
        "lego.apps.restricted.message_processor.RestrictedMail.get_restricted_mail",
        return_value=None,
    )
    def test_lookup_instance(self, mock_instance_lookup):
        """Call the RestrictedMail.get_restricted_mail for instance lookup"""
        self.processor.lookup_instance("sender", "token")
        mock_instance_lookup.assert_called_once_with("sender", "token")

    def test_rewrite_message(self):
        """Remove headers that may cause problems. Only keep a few required headers."""
        raw_message = read_file(
            f"{settings.BASE_DIR}/apps/restricted/fixtures/emails/clean_headers.txt"
        )
        parser = EmailParser(raw_message, "*****@*****.**",
                             ParserMessageType.STRING)
        message = parser.parse()
        new_message = self.processor.rewrite_message(message, "*****@*****.**")

        self.assertCountEqual(
            ["From", "Subject", "Content-Type", "MIME-Version", "Sender"],
            new_message.keys(),
        )

    def test_decorate(self):
        """Simple smoke-test, just make sure the function not raises an error"""
        payloads = len(self.message.get_payload())

        self.processor.decorate(self.message, False, "*****@*****.**")
        self.assertTrue(len(self.message.get_payload()) > payloads)

    def test_send(self):
        """Test the outbox and make sure we have correct headers in the messages."""
        raw_message = read_file(
            f"{settings.BASE_DIR}/apps/restricted/fixtures/emails/clean_headers.txt"
        )
        parser = EmailParser(raw_message, "*****@*****.**",
                             ParserMessageType.STRING)
        message = parser.parse()
        new_message = self.processor.rewrite_message(message, "*****@*****.**")

        messages = self.processor.send(["*****@*****.**", "*****@*****.**"],
                                       "*****@*****.**", new_message)
        self.assertEquals(2, messages)

        outbox = mail.outbox
        first_message = outbox[0].message()
        self.assertSequenceEqual(
            [
                "Subject", "Content-Type", "MIME-Version", "Sender", "From",
                "To"
            ],
            first_message.keys(),
        )

    def test_send_wrong_addr(self):
        """Sending from wrong addr shouldn't crash and burn"""
        processor = MessageProcessor("*****@*****.**",
                                     self.message, {})
        processor.process_message()

        self.assertEquals(1, len(mail.outbox))
Ejemplo n.º 6
0
class MessageProcessorTestCase(BaseTestCase):

    fixtures = [
        'test_abakus_groups.yaml', 'test_users.yaml', 'test_companies.yaml',
        'test_events.yaml', 'test_restricted_mails.yaml'
    ]

    def setUp(self):
        raw_message = read_file(
            f'{settings.BASE_DIR}/apps/restricted/fixtures/emails/valid.txt')
        parser = EmailParser(raw_message, '*****@*****.**',
                             ParserMessageType.STRING)
        self.message = parser.parse()
        self.processor = MessageProcessor('*****@*****.**', self.message, {})

    @override_settings(RESTRICTED_ALLOW_ORIGINAL_SENDER=False,
                       RESTRICTED_FROM='*****@*****.**')
    def test_get_sender_settings_override(self):
        """
        Return sender configured in the settings when RESTRICTED_ALLOW_ORIGINAL_SENDER is False
        """
        restricted_mail = RestrictedMail.objects.get(id=1)
        self.assertEquals('*****@*****.**',
                          self.processor.get_sender(restricted_mail))

    @override_settings(RESTRICTED_ALLOW_ORIGINAL_SENDER=True,
                       RESTRICTED_FROM='*****@*****.**')
    def test_get_sender(self):
        """Return the original sender when the settings allow it"""
        restricted_mail = RestrictedMail.objects.get(id=1)
        self.assertEquals('*****@*****.**',
                          self.processor.get_sender(restricted_mail))

    @override_settings(RESTRICTED_ALLOW_ORIGINAL_SENDER=True,
                       RESTRICTED_FROM='*****@*****.**')
    def test_get_sender_hidden(self):
        """Return the sender form the settings when the original sender hides the address"""
        restricted_mail = RestrictedMail.objects.get(id=1)
        restricted_mail.hide_sender = True
        restricted_mail.save()

        self.assertEquals('*****@*****.**',
                          self.processor.get_sender(restricted_mail))

    @mock.patch(
        'lego.apps.restricted.message_processor.RestrictedMail.get_restricted_mail',
        return_value=None)
    def test_lookup_instance(self, mock_instance_lookup):
        """Call the RestrictedMail.get_restricted_mail for instance lookup"""
        self.processor.lookup_instance('sender', 'token')
        mock_instance_lookup.assert_called_once_with('sender', 'token')

    def test_rewrite_message(self):
        """Remove headers that may cause problems. Only keep a few required headers."""
        raw_message = read_file(
            f'{settings.BASE_DIR}/apps/restricted/fixtures/emails/clean_headers.txt'
        )
        parser = EmailParser(raw_message, '*****@*****.**',
                             ParserMessageType.STRING)
        message = parser.parse()
        new_message = self.processor.rewrite_message(message, '*****@*****.**')

        self.assertCountEqual(
            ['From', 'Subject', 'Content-Type', 'MIME-Version', 'Sender'],
            new_message.keys())

    def test_decorate(self):
        """Simple smoke-test, just make sure the function not raises an error"""
        payloads = len(self.message.get_payload())

        self.processor.decorate(self.message, False, '*****@*****.**')
        self.assertTrue(len(self.message.get_payload()) > payloads)

    def test_send(self):
        """Test the outbox and make sure we have correct headers in the messages."""
        raw_message = read_file(
            f'{settings.BASE_DIR}/apps/restricted/fixtures/emails/clean_headers.txt'
        )
        parser = EmailParser(raw_message, '*****@*****.**',
                             ParserMessageType.STRING)
        message = parser.parse()
        new_message = self.processor.rewrite_message(message, '*****@*****.**')

        messages = self.processor.send(['*****@*****.**', '*****@*****.**'],
                                       '*****@*****.**', new_message)
        self.assertEquals(2, messages)

        outbox = mail.outbox
        first_message = outbox[0].message()
        self.assertSequenceEqual([
            'Subject', 'Content-Type', 'MIME-Version', 'Sender', 'From', 'To'
        ], first_message.keys())