Exemplo n.º 1
0
 def sieve_is(self, content):
     filtersset = FiltersSet("Testfilterset")
     filtersset.from_parser_result(self.parser)
     target = six.StringIO()
     filtersset.tosieve(target)
     repr_ = target.getvalue()
     target.close()
     self.assertEqual(repr_, content)
Exemplo n.º 2
0
 def sieve_is(self, content):
     filtersset = FiltersSet("Testfilterset")
     filtersset.from_parser_result(self.parser)
     target = six.StringIO()
     filtersset.tosieve(target)
     repr_ = target.getvalue()
     target.close()
     self.assertEqual(repr_, content)
Exemplo n.º 3
0
 def getscript(self, name, format="raw"):
     content = self.msc.getscript(name)
     if content is None:
         raise SieveClientError(self.msc.errmsg)
     if format == "raw":
         return content
     p = Parser()
     if not p.parse(content):
         print "Parse error????"
         return None
     fs = FiltersSet(name)
     fs.from_parser_result(p)
     return fs
Exemplo n.º 4
0
 def getscript(self, name, format="raw"):
     content = self.msc.getscript(name)
     if content is None:
         raise SieveClientError(self.msc.errmsg)
     if format == "raw":
         return content
     p = Parser()
     if not p.parse(content):
         print "Parse error????"
         return None
     fs = FiltersSet(name)
     fs.from_parser_result(p)
     return fs
Exemplo n.º 5
0
    def test_get_filter_conditions_from_parser_result(self):
        res = """require ["fileinto"];

# rule:[test]
if anyof (exists ["Subject"]) {
    fileinto "INBOX";
}
"""
        p = parser.Parser()
        p.parse(res)
        fs = FiltersSet("test", '# rule:')
        fs.from_parser_result(p)
        c = fs.get_filter_conditions('[test]')
        self.assertEqual(c, [("exists", "Subject")])

        res = """require ["date", "fileinto"];

# rule:aaa
if anyof (currentdate :zone "+0100" :is "date" ["2019-03-27"]) {
    fileinto "INBOX";
}
"""
        p = parser.Parser()
        p.parse(res)
        fs = FiltersSet("aaa", "# rule:")
        fs.from_parser_result(p)
        c = fs.get_filter_conditions('aaa')
        self.assertEqual(
            c,
            [('currentdate', ':zone', '+0100', ':is', 'date', '2019-03-27')])

        res = """require ["envelope", "fileinto"];

# rule:[aaa]
if anyof (envelope :contains ["To"] ["*****@*****.**"]) {
    fileinto "INBOX";
}
"""
        p = parser.Parser()
        p.parse(res)
        fs = FiltersSet("aaa", "# rule:")
        fs.from_parser_result(p)
        c = fs.get_filter_conditions('[aaa]')
        self.assertEqual(
            c, [('envelope', ':contains', ['To'], ['*****@*****.**'])])
Exemplo n.º 6
0
def get_filter_vars(data):

    filter_match_types = {
        "match_any_flowing_rules": "anyof",
        "match_all_flowing_rules": "allof",
        "match_all": "all",
    }

    filter_sections = {
        "subject": "subject",
        "from": "from",
        "to": "to",
        "cc": "cc",
        "to_or_cc": "to_or_cc",
        "size": "size",
        "header": "header",
        "body": "body"
    }

    filter_conditions = {
        "is": ":is",
        "contains": ":contains",
        "matches": ":matches",
        "matches_regex": ":regex",
        "is_under": ":over",
        "is_over": ":under",
    }

    filter_negative_conditions = {
        "is_not": ":is",
        "does_not_contain": ":contains",
        "does_not_match": ":matches",
        "does_not_match_regex": ":regex"
    }

    filter_section_conditions = {
        "subject": lambda x: [x],
        "from": lambda x: [x],
        "to": lambda x: [x],
        "cc": lambda x: [x],
        "to_or_cc": lambda x: [x],
        "size": lambda x: [x],
        "header": lambda x: [x],
        "body": lambda x: [":text", x]
    }

    filter_actions = {
        "discard_message": "discard",
        "keep_message": "keep",
        "stop_processing_filter": "stop",
        "forward_message_to": "redirect",
        "send_reject_message": "reject",
        "file_message_in": "fileinto"
    }

    action_value_map = {
        "forward_message_to": "to_email",
        "send_reject_message": "message",
        "file_message_in": "folder"
    }

    filters = data.value

    raw_filter = ""
    fs = FiltersSet("cow")
    filters = sorted(filters, key=lambda f: f['order'])
    for s_filter in filters:  # range(len(filters.keys())):
        # filter= filters[i]
        filter_name = s_filter.get("name")
        enabled = True  # s_filter.get("enabled") TODO ::
        rules = s_filter.get("conditions")
        actions = s_filter.get("actions")
        matchtype = filter_match_types[s_filter.get("incoming_message")]

        builded_conditions = []
        for rule in rules:  # range(len(rules.keys())):
            # rule = rules[rule_number]
            negated = False
            section = filter_sections[rule["selector"]]
            if "not" in rule["condition"]:
                negated = True
                condition = filter_negative_conditions[rule["condition"]]
            else:
                condition = filter_conditions[rule["condition"]]

            condition = filter_section_conditions[section](condition)

            if negated:
                section = "not{}".format(section)

            value = rule["value"]

            builded_conditions.append((section, *condition, value))

        builded_actions = []
        actions = sorted(actions, key=lambda f: f['order'])
        for action in actions:  # range(len(actions.keys())):
            # action = actions[action_number]
            param = ""
            if action["type"] in action_value_map.keys():
                param = action[action_value_map[action["type"]]]
            # if value_map=[]
            builded_actions.append((filter_actions[action["type"]], param))

        if matchtype == "all":
            p = Parser()
            raw = 'require ["reject","fileinto","imap4flags"];'
            for builded_action in builded_actions:
                name = builded_action[0]
                param = builded_action[1]
                if param:
                    raw += "\n{} \"{}\";".format(name, param)
                else:
                    raw += "\n{};".format(name)
            p.parse(raw)
            fs.from_parser_result(p)
        else:
            fs.addfilter(name=filter_name,
                         conditions=builded_conditions,
                         actions=builded_actions,
                         matchtype=matchtype)

    requirements = fs.requires
    io = StringIO()
    fs.tosieve(io)
    raw_sieve = io.getvalue()
    if requirements:
        raw_sieve = '\n'.join(raw_sieve.splitlines()[2:])

    if "not" in raw_sieve:
        for key in filter_sections.keys():
            raw_sieve = raw_sieve.replace("not" + key, key)

    return [raw_sieve, requirements]