aboutsummaryrefslogtreecommitdiff
path: root/modules/dnsbl.py
blob: d2e3135d6a319479ebda2b880a81d556b75283ec (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import ipaddress
from src import ModuleManager, utils
import dns.resolver

DEFAULT_LISTS = [
    "rbl.efnetrbl.org",
    "zen.spamhaus.org"
]

class Module(ModuleManager.BaseModule):
    @utils.hook("received.command.dnsbl")
    def dnsbl(self, event):
        args = event["args_split"]

        lists = []
        for i, arg in reversed(list(enumerate(args))):
            if arg[0] == "@":
                lists.insert(args.pop(i))
        lists = lists or DEFAULT_LISTS

        address = args[0]
        failed = self._check_lists(lists, address)
        if failed:
            event["stderr"].write("%s failed for lists: %s" %
                (address, ", ".join(failed)))
        else:
            event["stdout"].write("%s not found in blacklists" % address)

    def _check_lists(self, lists, address):
        address_obj = ipaddress.ip_address(address)

        if address_obj.version == 6:
            address = reversed(address_obj.exploded.replace(":", ""))
        else:
            address = reversed(address.split("."))
        address = ".".join(address)

        failed = []
        for list in lists:
            if not self._check_list(list, address):
                failed.append(list)
        return failed

    def _check_list(self, list, address):
        list_address = "%s.%s" % (address, list)
        try:
            dns.resolver.query(list_address)
        except dns.resolver.NXDOMAIN:
            return False
        return True