示例#1
0
    def createConv2TexMessage(self, files):
        msg = MIMEMultipart()
        msgstring = "Enclosed are the files you sent, converted to TeX."
        part1 = MIMEText(msgstring,"plain")
        msg.attach(part1)
        for (name,filename) in files:
            with open(filename,"rb") as fp:
                app = MIMEApplication(fp.read())
                app.replace_header("Content-Type","application/pdf;\r\n\tname=%s" %(name,))
                app.add_header("Content-Disposistion","attachment;\r\n\tname=%s" %(name,))
                print app.values()
                print app.keys()
                msg.attach(app)
            with open(filename+"_tex","rb") as fp:
                f = fp.read()
                f = f.replace(filename.split('/')[-1], name)
                app = MIMEApplication(f)
                app.replace_header("Content-Type","application/x-tex;\r\n\tname=%s" %(name+"_tex",))
                app.add_header("Content-Disposistion","attachment;\r\n\tname=%s" %(name+"_tex",))
                msg.attach(app)

            os.remove(filename)
            os.remove(filename+"_tex")
        msg["Subject"] = "%s converted to TeX." % (",".join(map(lambda (n,f):n,files)),)
        return msg
示例#2
0
class DisclaimerTestCase(TestCase):

    """ Build up different disclaimer scenarios and check if they react right.
    """

    def setUp(self):

        """ A basic setup with a simple disclaimer, no directory servers,
            a basic rule and a basic action
        """

        self.test_text = "Testmail"
        self.test_address = "*****@*****.**"

        self.disclaimer = models.Disclaimer()

        self.disclaimer.name = "Test"
        self.disclaimer.text = "Test-Disclaimer"

        self.disclaimer.save()

        self.rule = models.Rule()
        self.rule.save()

        self.action = models.Action()

        self.action.action = constants.ACTION_ACTION_ADD
        self.action.disclaimer = self.disclaimer
        self.action.rule = self.rule
        self.action.position = 0

        self.action.save()

        requirement = models.Requirement()

        requirement.rule = self.rule
        requirement.action = constants.REQ_ACTION_ACCEPT

        requirement.save()

    def tool_get_helper(self):

        """ Return a configured milter helper

        :return: A Milter helper
        """

        configuration = build_configuration()

        helper = MilterHelper(configuration)

        # The requirement should basically be enabled

        self.assertTrue(
            helper.enabled,
            "Helper wasn't enabled after initialization."
        )

        return helper

    def tool_add_bodies(self, helper, mail):

        if mail.is_multipart():

            for payload in mail.get_payload():

                self.tool_add_bodies(helper, payload)

        else:

            helper.body(mail.as_string(), {})

    def tool_run_real_test(self, header=None, make_mail=True):

        """ Runs the test using the milter helper and returns the
            action dictionary of eob

        :return: the action dictionary of eob()
        """

        helper = self.tool_get_helper()

        helper.connect("", "", "1.1.1.1", "", {})
        helper.mail_from(self.test_address, {})
        helper.rcpt(self.test_address, {})

        if header is not None:

            for key in header.iterkeys():

                helper.header(key, header[key], {})

            helper.eoh({})

        else:

            # Add at least one header for proper mail processing

            helper.header("From", "nobody", {})
            helper.eoh({})

        if make_mail:

            self.test_mail = MIMEText(self.test_text, "plain", "UTF-8")

        helper.body(self.test_mail.as_string(), {})

        return helper.eob({})

    def tool_make_returned_mail(self, returned):

        headers = []

        for key in self.test_mail.keys():

            # Skip deleted headers

            if "delete_header" in returned and key in returned["delete_header"]:

                continue

            value = self.test_mail[key]

            # Change headers

            if "change_header" in returned and key in returned["change_header"]:

                value = returned["change_header"][key]

            headers.append("%s: %s" % (key, value))

        if "add_header" in returned:

            for key in returned["add_header"]:

                headers.append("%s: %s" % (key, returned["add_header"][key]))

        return email.message_from_string(
            "%s\n\n%s" % (
                "\n".join(headers),
                returned["repl_body"]
            )
        )

    def test_basic_add(self):

        """ The disclaimer will simply be added to the testmail.
            Check the returned body
        """

        returned = self.tool_run_real_test()

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s" % (self.test_text, self.disclaimer.text),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_disabled_action(self):

        """ If we disable the only action, we should get an empty action
            dictionary back
        """

        self.action.enabled = False

        self.action.save()

        returned = self.tool_run_real_test()

        self.assertIsNone(
            returned,
            "We got an action dictionary back! %s" % returned
        )

    def test_disabled_secondaction(self):

        """ If we add an disabled action to a working set, it should just
            work fine.
        """

        action2 = models.Action()
        action2.rule = self.rule
        action2.position = 0
        action2.enabled = False
        action2.disclaimer = self.disclaimer

        action2.save()

        self.action.position = 1
        self.action.save()

        returned = self.tool_run_real_test()

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s" % (self.test_text, self.disclaimer.text),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_basic_replace(self):

        """ Set the action to replace the disclaimer and not add it. Check the
            returned body
        """

        self.test_text = "Testmail #DISCLAIMER#"

        self.action.action = constants.ACTION_ACTION_REPLACETAG
        self.action.action_parameters = "#DISCLAIMER#"

        self.action.save()

        returned = self.tool_run_real_test()

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "Testmail %s" % self.disclaimer.text,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1]
            )
        )

    def test_replacements_add(self):

        """ Test the replacement feature of sender, recipient and header
            replacement [add mode]
        """

        self.disclaimer.text = "{sender}|{recipient}|{header[\"Test\"]}"
        self.disclaimer.text_use_template = True

        self.disclaimer.save()

        returned = self.tool_run_real_test({"Test": "Test"})

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s|%s|Test" % (
                self.test_text,
                self.test_address,
                self.test_address
            ),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_replacements_replace(self):

        """ Test the replacement feature of sender, recipient and header
            replacement [add mode]
        """

        self.test_text = "Testmail #DISCLAIMER#"

        self.action.action = constants.ACTION_ACTION_REPLACETAG
        self.action.action_parameters = "#DISCLAIMER#"

        self.action.save()

        self.disclaimer.text = "{sender}|{recipient}|{header[\"Test\"]}"
        self.disclaimer.text_use_template = True

        self.disclaimer.save()

        returned = self.tool_run_real_test({"Test": "Test"})

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "Testmail %s|%s|Test" % (
                self.test_address,
                self.test_address
            ),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_multiple_headers(self):

        """ Test a mail with multiple headers
        """

        returned = self.tool_run_real_test(header={
            "X-TEST1": "TEST",
            "X-TEST2": "TEST"
        })

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s" % (self.test_text, self.disclaimer.text),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_multipart(self):

        """ Test a multipart mail
        """

        test_text = "TestPlain"
        test_html = "<p>TestHTML</p>"

        text_part = MIMEText(test_text, "plain", "UTF-8")
        html_part = MIMEText(test_html, "html", "UTF-8")

        self.test_mail = MIMEMultipart("alternative")
        self.test_mail.attach(text_part)
        self.test_mail.attach(html_part)

        returned = self.tool_run_real_test(make_mail=False)

        returned_mail = self.tool_make_returned_mail(returned)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[0]
            )[1],
            "%s\n%s" % (test_text, self.disclaimer.text),
            "Text-Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[0]
                )[1],
            )
        )

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[1]
            )[1],
            "<html><body>\n%s\n<p>%s</p>\n</body></html>\n" % (
                test_html,
                self.disclaimer.text
            ),
            "HTML-Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[1]
                )[1],
            )
        )

    def test_html(self):

        """ Test a HTML mail with an HTML disclaimer
        """

        test_html = "<p>TestHTML</p>"

        self.test_mail = MIMEText(test_html, "html", "UTF-8")

        returned = self.tool_run_real_test(make_mail=False)

        returned_mail = self.tool_make_returned_mail(returned)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail
            )[1],
            "<html><body>\n%s\n<p>%s</p>\n</body></html>\n" % (
                test_html,
                self.disclaimer.text
            ),
            "HTML-Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail
                )[1]
            )
        )

    def test_unresolvable_tag(self):

        """ Test an unresolvable tag with template_fail=True inside a
            disclaimer, assuming that the mail isn't modified.
        """

        self.disclaimer.text = "{FAIL}"
        self.disclaimer.template_fail = True
        self.disclaimer.save()

        returned = self.tool_run_real_test()
        returned_mail = self.tool_make_returned_mail(returned)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.test_mail
            )[1],
            milter_helper.MilterHelper.decode_mail(
                returned_mail
            )[1],
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail
                )[1],
            )
        )

    def test_unresolvable_tag_nofail(self):

        """ Test an unresolvable tag with template_fail=False inside a
            disclaimer, assuming that the mail is modified and the
            unresolvable tag is removed.
        """

        self.disclaimer.text = "{FAIL}"
        self.disclaimer.template_fail = False
        self.disclaimer.save()

        returned = self.tool_run_real_test()
        returned_mail = self.tool_make_returned_mail(returned)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail
            )[1],
            "%s\n" % self.test_text,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail
                )[1],
            )
        )

    def test_unresolvable_subtag(self):

        """ Test an unresolvable subtag with template_fail=True
            inside a disclaimer assuming it will return an unmodified mail
        """

        self.disclaimer.text = "{FAIL[\"FAIL\"]}"
        self.disclaimer.template_fail = True
        self.disclaimer.save()

        returned = self.tool_run_real_test()
        returned_mail = self.tool_make_returned_mail(returned)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.test_mail
            )[1],
            milter_helper.MilterHelper.decode_mail(
                returned_mail
            )[1],
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail
                )[1],
            )
        )

    def test_quoted_printable(self):

        """ Use a "quoted printable"-encoded mail as a test mail
        """

        self.test_mail = MIMEText(self.test_text, "plain", "iso-8859-1")

        returned = self.tool_run_real_test(make_mail=False)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s" % (self.test_text, self.disclaimer.text),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_html_disclaimer(self):

        """ Test a HTML (not "use text") disclaimer
        """

        self.disclaimer.html_use_text = False
        self.disclaimer.html = "<b>TEST-DISCLAIMER</b>"

        self.disclaimer.save()

        self.test_mail = MIMEText("<p>%s</p>" % self.test_text, "html")

        returned = self.tool_run_real_test(make_mail=False)

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "<html><body>\n<p>%s</p>\n%s\n</body></html>\n" % (
                self.test_text,
                self.disclaimer.html
            ),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_multiple_rules(self):

        """ Add multiple rules assuming that only the first rule will be
        carried out.
        """

        rule2 = models.Rule()
        rule2.position = 1
        rule2.save()

        action2 = models.Action()

        action2.action = constants.ACTION_ACTION_ADD
        action2.disclaimer = self.disclaimer
        action2.rule = rule2
        action2.position = 0

        action2.save()

        requirement2 = models.Requirement()

        requirement2.rule = rule2
        requirement2.action = constants.REQ_ACTION_ACCEPT

        requirement2.save()

        returned = self.tool_run_real_test()

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s" % (self.test_text, self.disclaimer.text),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_multiple_rules_continue(self):

        """ Use the continue flag for multiple rules assuming that all rules
        will be carried out.
        """

        rule2 = models.Rule()
        rule2.position = 1
        rule2.save()

        self.rule.continue_rules = True
        self.rule.save()

        disclaimer2 = models.Disclaimer()

        disclaimer2.name = "Test2"
        disclaimer2.text = "Test-Disclaimer2"

        disclaimer2.save()

        action2 = models.Action()

        action2.action = constants.ACTION_ACTION_ADD
        action2.disclaimer = disclaimer2
        action2.rule = rule2
        action2.position = 0

        action2.save()

        requirement2 = models.Requirement()

        requirement2.rule = rule2
        requirement2.action = constants.REQ_ACTION_ACCEPT

        requirement2.save()

        returned = self.tool_run_real_test()

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                self.tool_make_returned_mail(returned)
            )[1],
            "%s\n%s\nTest-Disclaimer2" % (self.test_text, self.disclaimer.text),
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    self.tool_make_returned_mail(returned)
                )[1],
            )
        )

    def test_disclaimer_add_part(self):

        """ Test an action, that adds a mime part with the disclaimer
        """

        self.action.action = constants.ACTION_ACTION_ADDPART

        self.action.save()

        returned = self.tool_run_real_test()

        returned_mail = self.tool_make_returned_mail(returned)

        # The first part shouldn't have been modified, but added as an
        # rfc-822 attachment

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[0].get_payload()[0]
            )[1],
            self.test_text,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[0]
                )[1],
            )
        )

        # The second part should be our disclaimer

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[1]
            )[1],
            self.disclaimer.text,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[1]
                )[1],
            )
        )

    def test_disclaimer_add_part_html(self):

        """ Test an action, that adds a mime part with a HTML disclaimer
        based on the text disclaimer
        """

        self.action.action = constants.ACTION_ACTION_ADDPART

        self.action.save()

        test_html = "<p>TestHTML</p>"

        self.test_mail = MIMEText(test_html, "html", "UTF-8")

        returned = self.tool_run_real_test(make_mail=False)

        returned_mail = self.tool_make_returned_mail(returned)

        # The first part shouldn't have been modified, but added as an
        # rfc-822 attachment

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[0].get_payload()[0]
            )[1],
            test_html,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[0]
                )[1],
            )
        )

        # The second part should be our disclaimer

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[1]
            )[1],
            self.disclaimer.text,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[1]
                )[1],
            )
        )

    def test_disclaimer_add_part_html_disclaimer(self):

        """ Test an action, that adds a mime part with a pure HTML disclaimer
        """

        self.action.action = constants.ACTION_ACTION_ADDPART

        self.action.save()

        test_html = "<p>TestHTML</p>"

        self.test_mail = MIMEText(test_html, "html", "UTF-8")

        self.disclaimer.html_use_text = False
        self.disclaimer.html = "<b>TEST-DISCLAIMER</b>"

        self.disclaimer.save()

        returned = self.tool_run_real_test(make_mail=False)

        returned_mail = self.tool_make_returned_mail(returned)

        # The first part shouldn't have been modified, but added as an
        # rfc-822 attachment

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[0].get_payload()[0]
            )[1],
            test_html,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[0]
                )[1],
            )
        )

        # The second part should be our disclaimer

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[1]
            )[1],
            self.disclaimer.html,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[1]
                )[1],
            )
        )

    def test_disclaimer_add_part_fallback(self):

        """ Test an action, that adds a mime part with the disclaimer,
        but uses a not-supported original mime-part (not text/plain or
        /html). This should give a text-disclaimer back.
        """

        self.action.action = constants.ACTION_ACTION_ADDPART

        self.action.save()

        self.disclaimer.html_use_text = False
        self.disclaimer.html = "<b>TEST-DISCLAIMER</b>"

        self.disclaimer.save()

        self.test_mail = MIMEApplication("TEST")

        returned = self.tool_run_real_test(make_mail=False)

        returned_mail = self.tool_make_returned_mail(returned)

        # The first part shouldn't have been modified, but added as an
        # rfc-822 attachment

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[0].get_payload()[0]
            )[1],
            "TEST",
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[0]
                )[1],
            )
        )

        # The second part should be the text-part of the disclaimer

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[1]
            )[1],
            self.disclaimer.text,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[1]
                )[1],
            )
        )

    def test_disclaimer_add_part_fallback_html(self):

        """ Test an action, that adds a mime part with the disclaimer,
        but uses a not-supported original mime-part (not text/plain or
        /html). Use the html fallback to generate a html-disclaimer.
        """

        self.action.action = constants.ACTION_ACTION_ADDPART

        self.action.save()

        self.disclaimer.html_use_text = False
        self.disclaimer.html = "<b>TEST-DISCLAIMER</b>"

        self.disclaimer.use_html_fallback = True

        self.disclaimer.save()

        self.test_mail = MIMEApplication("TEST")

        returned = self.tool_run_real_test(make_mail=False)

        returned_mail = self.tool_make_returned_mail(returned)

        # The first part shouldn't have been modified, but added as an
        # rfc-822 attachment

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[0].get_payload()[0]
            )[1],
            "TEST",
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[0]
                )[1],
            )
        )

        # The second part should be the text-part of the disclaimer

        self.assertEqual(
            milter_helper.MilterHelper.decode_mail(
                returned_mail.get_payload()[1]
            )[1],
            self.disclaimer.html,
            "Body was unexpectedly modified to %s" % (
                milter_helper.MilterHelper.decode_mail(
                    returned_mail.get_payload()[1]
                )[1],
            )
        )