intelmq-extensions 1.10.0__py3-none-any.whl → 1.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,75 @@
1
+ """
2
+ IBAN Extractor looks for IBAN in the given field and extracts
3
+ information as extra fields, including a hash of the iban
4
+ """
5
+
6
+ import hashlib
7
+ import re
8
+
9
+ import schwifty
10
+ from intelmq.lib.bot import ExpertBot
11
+
12
+
13
+ class IBANExtractorExpertBot(ExpertBot):
14
+ lookup_field: str = "extra.text"
15
+ default_country: str = "AT"
16
+ # first group has to match potential IBAN
17
+ base_regex: str = r"\b(([A-Z]{2}|)( |)[0-9]{2}[0-9 ]{1,30})\b"
18
+
19
+ def init(self):
20
+ self._possible_iban = re.compile(self.base_regex)
21
+
22
+ def process(self):
23
+ event = self.receive_message()
24
+
25
+ lookup_data = event.get(self.lookup_field)
26
+ if not lookup_data:
27
+ self.logger.info("Lookup data not found in the event.")
28
+ self.send_message(event, path="no_lookup_data", path_permissive=True)
29
+ self.send_message(event, path="not_found", path_permissive=True)
30
+ self.acknowledge_message()
31
+ return
32
+
33
+ iban = None
34
+ for match in self._possible_iban.finditer(lookup_data):
35
+ iban_str = match.group(1).strip()
36
+ if iban_str[0] in "0123456789":
37
+ iban_str = self.default_country + iban_str
38
+ try:
39
+ iban = schwifty.IBAN(iban_str)
40
+ break
41
+ except Exception:
42
+ pass
43
+
44
+ if not iban:
45
+ self.send_message(event, path="not_found", path_permissive=True)
46
+ self.acknowledge_message()
47
+ return
48
+
49
+ event.add("extra.iban", str(iban), overwrite=False)
50
+ event.add(
51
+ "source.geolocation.cc",
52
+ iban.country_code,
53
+ overwrite=False,
54
+ raise_failure=False,
55
+ )
56
+ event.add(
57
+ "extra.bic",
58
+ str(iban.bic) if iban.bic else None,
59
+ overwrite=False,
60
+ raise_failure=False,
61
+ )
62
+ event.add(
63
+ "extra.bank",
64
+ str(iban.bank_short_name) if iban.bank_short_name else None,
65
+ overwrite=False,
66
+ raise_failure=False,
67
+ )
68
+ iban_hash = hashlib.sha256(str(iban).encode()).hexdigest()
69
+ event.add("extra.iban_hash", iban_hash, overwrite=False)
70
+
71
+ self.send_message(event)
72
+ self.acknowledge_message()
73
+
74
+
75
+ BOT = IBANExtractorExpertBot
@@ -0,0 +1,86 @@
1
+ # SPDX-FileCopyrightText: 2016 by Bundesamt für Sicherheit in der Informationstechnik,
2
+ # 2016-2021 nic.at GmbH, 2024 Tim de Boer, 2025 Institute for Common Good Technology
3
+ #
4
+ # SPDX-License-Identifier: AGPL-3.0-or-later
5
+ # TODO: merge with the upstream bot
6
+ # TODO: support nested dicts
7
+ """
8
+ JSON Parser Bot
9
+ Retrieves a base64 encoded JSON-String from raw and converts it into an
10
+ event, adding unknown fields as extra
11
+ """
12
+
13
+ from json import dumps as json_dumps
14
+ from json import loads as json_loads
15
+
16
+ from intelmq.lib.bot import ParserBot
17
+ from intelmq.lib.message import MessageFactory
18
+ from intelmq.lib.utils import base64_decode
19
+
20
+
21
+ class JSONGenericParserBot(ParserBot):
22
+ """Parse IntelMQ-JSON data"""
23
+
24
+ splitlines: bool = False
25
+ multiple_events: bool = False
26
+
27
+ def init(self):
28
+ if self.multiple_events and self.splitlines:
29
+ raise ValueError(
30
+ (
31
+ "Modes 'splitlines' and 'multiple_events' "
32
+ "are not possible at the same time. Please use either one."
33
+ )
34
+ )
35
+
36
+ def process(self):
37
+ report = self.receive_message()
38
+ if self.multiple_events:
39
+ lines = json_loads(base64_decode(report["raw"]))
40
+ elif self.splitlines:
41
+ lines = base64_decode(report["raw"]).splitlines()
42
+ else:
43
+ lines = [base64_decode(report["raw"])]
44
+
45
+ for line in lines:
46
+ event = self.new_event(report)
47
+ if self.multiple_events:
48
+ event.update(
49
+ MessageFactory.from_dict(
50
+ line, harmonization=self.harmonization, default_type="Event"
51
+ )
52
+ )
53
+ event["raw"] = json_dumps(line, sort_keys=True)
54
+ else:
55
+ if not isinstance(line, dict):
56
+ line_dict = json_loads(line)
57
+ else:
58
+ line_dict = line
59
+
60
+ type_harmonization = self.harmonization.get(
61
+ line_dict.get("__type", "Event").lower()
62
+ )
63
+
64
+ for k in list(line_dict.keys()):
65
+ if k == "__type":
66
+ continue
67
+ if k not in type_harmonization and not k.startswith("extra."):
68
+ line_dict[f"extra.{k}"] = line_dict[k]
69
+ del line_dict[k]
70
+
71
+ event.update(
72
+ MessageFactory.from_dict(
73
+ line_dict,
74
+ harmonization=self.harmonization,
75
+ default_type="Event",
76
+ )
77
+ )
78
+ event.add("raw", line, overwrite=False)
79
+ event.add(
80
+ "classification.type", "undetermined", overwrite=False
81
+ ) # set to undetermined if input has no classification
82
+ self.send_message(event)
83
+ self.acknowledge_message()
84
+
85
+
86
+ BOT = JSONGenericParserBot
@@ -0,0 +1,74 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Testing IBANExtractorExpertBot.
4
+ """
5
+
6
+ import copy
7
+ import unittest
8
+
9
+ from intelmq_extensions.bots.experts.iban_extractor.expert import IBANExtractorExpertBot
10
+
11
+ from ....base import BotTestCase
12
+
13
+
14
+ class TestIBANExtractorExpertBot(BotTestCase, unittest.TestCase):
15
+ @classmethod
16
+ def set_bot(cls):
17
+ cls.bot_reference = IBANExtractorExpertBot
18
+ cls.default_input_message = {"__type": "Event"}
19
+
20
+ def test_event_no_lookup(self):
21
+ message = {
22
+ "__type": "Event",
23
+ "time.observation": "2015-01-01T00:00:00+00:00",
24
+ "extra.payload": "foo",
25
+ "extra.name": "bar",
26
+ "extra.firmwarerev": 1,
27
+ }
28
+ self.input_message = copy.deepcopy(message)
29
+ self.prepare_bot(destination_queues=["no_lookup_data", "not_found"])
30
+ self.run_bot(prepare=False)
31
+ self.assertMessageEqual(0, message, path="no_lookup_data")
32
+ self.assertMessageEqual(0, message, path="not_found")
33
+
34
+ def test_event_no_iban(self):
35
+ message = {
36
+ "__type": "Event",
37
+ "time.observation": "2015-01-01T00:00:00+00:00",
38
+ "extra.payload": "foo",
39
+ "extra.name": "bar",
40
+ "extra.firmwarerev": 1,
41
+ "extra.text": "adfssdtfghjlkl",
42
+ }
43
+ self.input_message = copy.deepcopy(message)
44
+ self.prepare_bot(destination_queues=["not_found"])
45
+ self.run_bot(prepare=False)
46
+ self.assertMessageEqual(0, message, path="not_found")
47
+
48
+ def test_iban(self):
49
+ message = {
50
+ "__type": "Event",
51
+ "time.observation": "2015-01-01T00:00:00+00:00",
52
+ "extra.payload": "foo",
53
+ "extra.name": "bar",
54
+ "extra.firmwarerev": 1,
55
+ "extra.text": (
56
+ "This is a message with an \n"
57
+ "artificially generated IBAN number AT 0820111 1532 9734423 \n "
58
+ "but it still should be valid"
59
+ ),
60
+ }
61
+ self.input_message = copy.deepcopy(message)
62
+ self.run_bot()
63
+ message["extra.iban"] = "AT082011115329734423"
64
+ message["extra.bank"] = "Erste Bank der oesterreichischen Sparkassen AG"
65
+ message["extra.bic"] = "GIBAATWWXXX"
66
+ message["extra.iban_hash"] = (
67
+ "942b348fcca86b81f7465308e2b1b3cb6aaad1c218f9110699ab47cb34b6b1b8"
68
+ )
69
+ message["source.geolocation.cc"] = "AT"
70
+ self.assertMessageEqual(0, message)
71
+
72
+
73
+ if __name__ == "__main__":
74
+ unittest.main()
@@ -0,0 +1,171 @@
1
+ # SPDX-FileCopyrightText: 2016 Sebastian Wagner
2
+ #
3
+ # SPDX-License-Identifier: AGPL-3.0-or-later
4
+
5
+ # -*- coding: utf-8 -*-
6
+ import base64
7
+ import os
8
+ import unittest
9
+ from json import dumps as json_dumps
10
+ from json import loads as json_loads
11
+
12
+ import intelmq.lib.test as test
13
+
14
+ from intelmq_extensions.bots.parsers.generic_json.parser import JSONGenericParserBot
15
+
16
+ ONELINE_REPORT = {
17
+ "feed.name": "Test",
18
+ "raw": (
19
+ "eyJmZWVkLm5hbWUiOiAiVGVzdCBmZWVkIiwgInJhdyI6ICJabTl2WW"
20
+ "1GeUNnPT0iLCAiX190eXBlIjogIkV2ZW50IiwgInRpbWUub2JzZXJ2YXRpb24iOiAiMjAxNS0wMS"
21
+ "0wMVQwMDowMDowMCswMDowMCIsICJjbGFzc2lmaWNhdGlvbi50eXBlIjogInVua25vd24ifQ=="
22
+ ),
23
+ "__type": "Report",
24
+ "time.observation": "2016-10-10T00:00:00+00:00",
25
+ }
26
+ EXAMPLE_EVENT = {
27
+ "feed.name": "Test feed",
28
+ "raw": "Zm9vYmFyCg==",
29
+ "__type": "Event",
30
+ "time.observation": "2015-01-01T00:00:00+00:00",
31
+ "classification.type": "undetermined",
32
+ }
33
+ with open(os.path.join(os.path.dirname(__file__), "data.json"), "rb") as fh:
34
+ RAW = base64.b64encode(fh.read()).decode()
35
+
36
+ MULTILINE_REPORT = {
37
+ "feed.name": "Test feed",
38
+ "raw": RAW,
39
+ "__type": "Report",
40
+ }
41
+ MULTILINE_EVENTS = [
42
+ {
43
+ "feed.name": "Test feed",
44
+ "raw": base64.b64encode(
45
+ b'{"__type": "Event", "source.ip": "127.0.0.1", "classification.type": "c2-server"}'
46
+ ).decode(),
47
+ "__type": "Event",
48
+ "classification.type": "c2-server",
49
+ "source.ip": "127.0.0.1",
50
+ },
51
+ {
52
+ "feed.name": "Test feed",
53
+ "raw": base64.b64encode(
54
+ b'{"__type": "Event", "source.ip": "127.0.0.2", "classification.type": "c2-server"}'
55
+ ).decode(),
56
+ "__type": "Event",
57
+ "classification.type": "c2-server",
58
+ "source.ip": "127.0.0.2",
59
+ },
60
+ ]
61
+ with open(os.path.join(os.path.dirname(__file__), "data2.json"), "rb") as fh:
62
+ RAW2 = base64.b64encode(fh.read()).decode()
63
+
64
+ NO_DEFAULT_REPORT = {
65
+ "feed.name": "Test feed",
66
+ "raw": RAW2,
67
+ "__type": "Report",
68
+ }
69
+ NO_DEFAULT_EVENT = MULTILINE_EVENTS[1].copy()
70
+ NO_DEFAULT_EVENT["raw"] = base64.b64encode(
71
+ b'{"source.ip": "127.0.0.2", "classification.type": "c2-server"}\n'
72
+ ).decode()
73
+
74
+ with open(os.path.join(os.path.dirname(__file__), "ncscnl.json"), "rb") as fh:
75
+ NCSCNL_FILE = fh.read()
76
+ NCSCNL_RAW = base64.b64encode(NCSCNL_FILE).decode()
77
+ NCSC_EVENTS = json_loads(NCSCNL_FILE)
78
+ for i, event in enumerate(NCSC_EVENTS):
79
+ NCSC_EVENTS[i]["raw"] = base64.b64encode(
80
+ json_dumps(event, sort_keys=True).encode()
81
+ ).decode()
82
+ NCSC_EVENTS[i]["classification.type"] = "undetermined"
83
+ NCSC_EVENTS[i]["feed.name"] = "NCSC.NL"
84
+ NCSC_EVENTS[i]["__type"] = "Event"
85
+
86
+ NCSCNL_REPORT = {
87
+ "feed.name": "NCSC.NL",
88
+ "raw": NCSCNL_RAW,
89
+ "__type": "Report",
90
+ }
91
+
92
+ with open(os.path.join(os.path.dirname(__file__), "generic_data.json"), "rb") as fh:
93
+ GENERIC_RAW = base64.b64encode(fh.read()).decode()
94
+
95
+ MULTILINE_GENERIC_REPORT = {
96
+ "feed.name": "Test feed",
97
+ "raw": GENERIC_RAW,
98
+ "__type": "Report",
99
+ }
100
+ MULTILINE_GENERIC_EVENTS = [
101
+ {
102
+ "feed.name": "Test feed",
103
+ "raw": base64.b64encode(
104
+ b'{"__type": "Event", "source.ip": "127.0.0.1", "notexists": "generic data"}'
105
+ ).decode(),
106
+ "__type": "Event",
107
+ "extra.notexists": "generic data",
108
+ "source.ip": "127.0.0.1",
109
+ "classification.type": "undetermined",
110
+ },
111
+ {
112
+ "feed.name": "Test feed",
113
+ "raw": base64.b64encode(
114
+ b'{"__type": "Event", "source.ip": "127.0.0.2", "somethingelse": '
115
+ b'"hahaha", "extra.ok": "ok"}'
116
+ ).decode(),
117
+ "__type": "Event",
118
+ "extra.somethingelse": "hahaha",
119
+ "extra.ok": "ok",
120
+ "source.ip": "127.0.0.2",
121
+ "classification.type": "undetermined",
122
+ },
123
+ ]
124
+
125
+
126
+ class TestJSONParserBot(test.BotTestCase, unittest.TestCase):
127
+ """
128
+ A TestCase for a MalwareDomainListParserBot.
129
+ """
130
+
131
+ @classmethod
132
+ def set_bot(cls):
133
+ cls.bot_reference = JSONGenericParserBot
134
+ cls.default_input_message = ONELINE_REPORT
135
+
136
+ def test_oneline_report(self):
137
+ """Test if correct Event has been produced."""
138
+ self.run_bot()
139
+ self.assertMessageEqual(0, EXAMPLE_EVENT)
140
+
141
+ def test_multiline_report(self):
142
+ """Test if correct Event has been produced."""
143
+ self.input_message = MULTILINE_REPORT
144
+ self.run_bot(parameters={"splitlines": True})
145
+ self.assertMessageEqual(0, MULTILINE_EVENTS[0])
146
+ self.assertMessageEqual(1, MULTILINE_EVENTS[1])
147
+
148
+ def test_default_event(self):
149
+ """Test if correct Event has been produced."""
150
+ self.input_message = NO_DEFAULT_REPORT
151
+ self.run_bot()
152
+ self.assertMessageEqual(0, NO_DEFAULT_EVENT)
153
+
154
+ def test_ncscnl(self):
155
+ """A file containing a list of events (not per line)"""
156
+ self.input_message = NCSCNL_REPORT
157
+ self.run_bot(parameters={"multiple_events": True})
158
+ self.assertMessageEqual(0, NCSC_EVENTS[0])
159
+ self.assertMessageEqual(1, NCSC_EVENTS[1])
160
+ self.assertMessageEqual(2, NCSC_EVENTS[2])
161
+
162
+ def test_multiline_generic_report(self):
163
+ """Test if correct Event has been produced."""
164
+ self.input_message = MULTILINE_GENERIC_REPORT
165
+ self.run_bot(parameters={"splitlines": True})
166
+ self.assertMessageEqual(0, MULTILINE_GENERIC_EVENTS[0])
167
+ self.assertMessageEqual(1, MULTILINE_GENERIC_EVENTS[1])
168
+
169
+
170
+ if __name__ == "__main__": # pragma: no cover
171
+ unittest.main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: intelmq_extensions
3
- Version: 1.10.0
3
+ Version: 1.11.0
4
4
  Summary: Additional bots for IntelMQ
5
5
  Author: CERT.at Data & Development Team
6
6
  License: AGPLv3
@@ -10,13 +10,13 @@ Requires-Python: >=3.10
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: intelmq
13
- Requires-Dist: importlib_metadata; python_version < "3.8"
14
- Requires-Dist: psycopg2-binary
15
- Requires-Dist: netaddr>=0.7.14
16
13
  Requires-Dist: rt<3.0.0,>=1.0.9
17
- Requires-Dist: tabulate>=0.7.5
18
- Requires-Dist: python-termstyle>=0.1.10
19
14
  Requires-Dist: mergedeep
15
+ Requires-Dist: psycopg2-binary
16
+ Requires-Dist: python-termstyle>=0.1.10
17
+ Requires-Dist: importlib_metadata; python_version < "3.8"
18
+ Requires-Dist: tabulate>=0.7.5
19
+ Requires-Dist: netaddr>=0.7.14
20
20
  Provides-Extra: dev
21
21
  Requires-Dist: pytest; extra == "dev"
22
22
  Requires-Dist: tox>=4; extra == "dev"
@@ -19,6 +19,8 @@ intelmq_extensions/bots/experts/event_group_splitter/__init__.py,sha256=47DEQpj8
19
19
  intelmq_extensions/bots/experts/event_group_splitter/expert.py,sha256=Jq9v1p94dwbiFKeaulf7pg5XA15hlb967Wwvjp-fZ3g,4095
20
20
  intelmq_extensions/bots/experts/event_splitter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  intelmq_extensions/bots/experts/event_splitter/expert.py,sha256=DcAXwapXMmP-IP7sPwDBWJ9cMu9UCcKh3nJPSDJbGfU,1204
22
+ intelmq_extensions/bots/experts/iban_extractor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ intelmq_extensions/bots/experts/iban_extractor/expert.py,sha256=iyeb5ja8kFNRXjFDs_e9ulZwIXX9OlpC6eEfA5GoCGE,2276
22
24
  intelmq_extensions/bots/experts/replace_in_dict/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
25
  intelmq_extensions/bots/experts/replace_in_dict/expert.py,sha256=GyevseD5n5E5cNO_6PZqnK8gZhILplPvLcwyS6iXNks,1375
24
26
  intelmq_extensions/bots/experts/squelcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -38,6 +40,8 @@ intelmq_extensions/bots/parsers/blackkite/_transformers.py,sha256=msiXw_Ex8baCnF
38
40
  intelmq_extensions/bots/parsers/blackkite/parser.py,sha256=3NxC84xpR3bIPlVZdZEjcNsBvCdGn4fL54sE-F7sCTg,1880
39
41
  intelmq_extensions/bots/parsers/disp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
42
  intelmq_extensions/bots/parsers/disp/parser.py,sha256=co-eOx8aR3-z2BYe50Rlyr9dYWlX1w0ZoBAFZVgCdbg,4401
43
+ intelmq_extensions/bots/parsers/generic_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ intelmq_extensions/bots/parsers/generic_json/parser.py,sha256=UuvsagyYIFvjQ-v4DY1QV9lP4N1xZGtE0gwY-n-Jh5g,2946
41
45
  intelmq_extensions/bots/parsers/malwaredomains/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
46
  intelmq_extensions/bots/parsers/malwaredomains/parser.py,sha256=FEp0YxZ44bD5KoeO162nRols48Xtq_8haAA8zA7BgZg,1996
43
47
  intelmq_extensions/bots/parsers/modat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -77,6 +81,8 @@ intelmq_extensions/tests/bots/experts/event_group_splitter/__init__.py,sha256=47
77
81
  intelmq_extensions/tests/bots/experts/event_group_splitter/test_expert.py,sha256=FcuFOzOGctWQ0whG5e7t9_K2Vf7a_doDEl5WoWhDqq8,9124
78
82
  intelmq_extensions/tests/bots/experts/event_splitter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
83
  intelmq_extensions/tests/bots/experts/event_splitter/test_expert.py,sha256=KGjh86BacNiUcJGg8kxggHoJY3ORZPmPFmVPYJK0J6A,2752
84
+ intelmq_extensions/tests/bots/experts/iban_extractor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ intelmq_extensions/tests/bots/experts/iban_extractor/test_expert.py,sha256=Jl-ROceCt84rCS8mqU46uGwHoMW4Gkc280ZQoEvIhxk,2500
80
86
  intelmq_extensions/tests/bots/experts/replace_in_dict/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
87
  intelmq_extensions/tests/bots/experts/replace_in_dict/test_expert.py,sha256=aGJ0zGjU4qEKP4HLIF4LnFyze7I__DMrMJz6ynf5bko,2630
82
88
  intelmq_extensions/tests/bots/experts/squelcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -94,6 +100,8 @@ intelmq_extensions/tests/bots/parsers/blackkite/data.py,sha256=gwfaErTsUmS04vovH
94
100
  intelmq_extensions/tests/bots/parsers/blackkite/test_parser.py,sha256=VWDj0iwhI96twlWj9ZRU8VtZ-DDIH9YiVlfbiOarj5I,7491
95
101
  intelmq_extensions/tests/bots/parsers/disp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
102
  intelmq_extensions/tests/bots/parsers/disp/test_parser.py,sha256=geUXWaKpOUW_k9-Qb_VAtp99cr6vDTcnSBmT9LfDHec,9714
103
+ intelmq_extensions/tests/bots/parsers/generic_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
+ intelmq_extensions/tests/bots/parsers/generic_json/test_parser.py,sha256=nX_vee7UGRLIokmZCKaCcmxzuFsK4vrdcg3vvE1BCCw,5482
97
105
  intelmq_extensions/tests/bots/parsers/malwaredomains/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
106
  intelmq_extensions/tests/bots/parsers/malwaredomains/test_parser.py,sha256=zkfjcyniiPRcpABVurdRrRpZyZ2zV_PQ84xiU1eUJv0,1882
99
107
  intelmq_extensions/tests/bots/parsers/modat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -105,9 +113,9 @@ intelmq_extensions/tests/cli/test_intelmqcli.py,sha256=Izy0FHVkj44DCgp4Zm8f1vYTd
105
113
  intelmq_extensions/tests/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
114
  intelmq_extensions/tests/lib/base.py,sha256=iD4MuDq0Dh-CqFDgyXf4CfaJgT4AL7XAcNjPGxUlkPM,2560
107
115
  intelmq_extensions/tests/lib/test_api_helpers.py,sha256=cO6KNfVjwpYgevyyxxokOAmk7VXo-8T8OCH8hQhf980,3807
108
- intelmq_extensions-1.10.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
109
- intelmq_extensions-1.10.0.dist-info/METADATA,sha256=mfhiBm-fykPWoGvl9UGMaiuGdVjbpole3WHd9UG4V7c,2843
110
- intelmq_extensions-1.10.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
111
- intelmq_extensions-1.10.0.dist-info/entry_points.txt,sha256=ZnDurNdOqqIbPjKHzsmxrczs5aE9d_KLOlz1mQx2C5I,4141
112
- intelmq_extensions-1.10.0.dist-info/top_level.txt,sha256=YVqZnmAiBfQPNdJPAv64Afvc41p3B24Akx2v2-3BFyc,19
113
- intelmq_extensions-1.10.0.dist-info/RECORD,,
116
+ intelmq_extensions-1.11.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
117
+ intelmq_extensions-1.11.0.dist-info/METADATA,sha256=qDzOhAYwk7v8i7femo3GVeaR-rh36mJKIEx6L3sJrzU,2843
118
+ intelmq_extensions-1.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
119
+ intelmq_extensions-1.11.0.dist-info/entry_points.txt,sha256=jnG6ZRXmmS5fThseMCrqZ29xMsp-S2OVqiydmlLdpko,4597
120
+ intelmq_extensions-1.11.0.dist-info/top_level.txt,sha256=YVqZnmAiBfQPNdJPAv64Afvc41p3B24Akx2v2-3BFyc,19
121
+ intelmq_extensions-1.11.0.dist-info/RECORD,,
@@ -7,6 +7,7 @@ intelmq.bots.experts.certat.certat_contact_intern.expert = intelmq_extensions.bo
7
7
  intelmq.bots.experts.certat.copy_extra.expert = intelmq_extensions.bots.experts.copy_extra.expert:BOT.run
8
8
  intelmq.bots.experts.certat.event_group_splitter.expert = intelmq_extensions.bots.experts.event_group_splitter.expert:BOT.run
9
9
  intelmq.bots.experts.certat.event_splitter.expert = intelmq_extensions.bots.experts.event_splitter.expert:BOT.run
10
+ intelmq.bots.experts.certat.iban_extractor.expert = intelmq_extensions.bots.experts.iban_extractor.expert:BOT.run
10
11
  intelmq.bots.experts.certat.replace_in_dict.expert = intelmq_extensions.bots.experts.replace_in_dict.expert:BOT.run
11
12
  intelmq.bots.experts.certat.squelcher.expert = intelmq_extensions.bots.experts.squelcher.expert:BOT.run
12
13
  intelmq.bots.experts.certat.vulnerability_lookup.expert = intelmq_extensions.bots.experts.vulnerability_lookup.expert:BOT.run
@@ -15,6 +16,7 @@ intelmq.bots.outputs.certat.to_logs.output = intelmq_extensions.bots.outputs.to_
15
16
  intelmq.bots.outputs.certat.xmpp.output = intelmq_extensions.bots.outputs.xmpp.output:BOT.run
16
17
  intelmq.bots.parsers.certat.blackkite.parser = intelmq_extensions.bots.parsers.blackkite.parser:BOT.run
17
18
  intelmq.bots.parsers.certat.disp.parser = intelmq_extensions.bots.parsers.disp.parser:BOT.run
19
+ intelmq.bots.parsers.certat.generic_json.parser = intelmq_extensions.bots.parsers.generic_json.parser:BOT.run
18
20
  intelmq.bots.parsers.certat.malwaredomains.parser = intelmq_extensions.bots.parsers.malwaredomains.parser:BOT.run
19
21
  intelmq.bots.parsers.certat.modat.parser = intelmq_extensions.bots.parsers.modat.parser:BOT.run
20
22
  intelmq_extensions.bots.collectors.blackkite.collector = intelmq_extensions.bots.collectors.blackkite.collector:BOT.run
@@ -25,6 +27,7 @@ intelmq_extensions.bots.experts.certat_contact_intern.expert = intelmq_extension
25
27
  intelmq_extensions.bots.experts.copy_extra.expert = intelmq_extensions.bots.experts.copy_extra.expert:BOT.run
26
28
  intelmq_extensions.bots.experts.event_group_splitter.expert = intelmq_extensions.bots.experts.event_group_splitter.expert:BOT.run
27
29
  intelmq_extensions.bots.experts.event_splitter.expert = intelmq_extensions.bots.experts.event_splitter.expert:BOT.run
30
+ intelmq_extensions.bots.experts.iban_extractor.expert = intelmq_extensions.bots.experts.iban_extractor.expert:BOT.run
28
31
  intelmq_extensions.bots.experts.replace_in_dict.expert = intelmq_extensions.bots.experts.replace_in_dict.expert:BOT.run
29
32
  intelmq_extensions.bots.experts.squelcher.expert = intelmq_extensions.bots.experts.squelcher.expert:BOT.run
30
33
  intelmq_extensions.bots.experts.vulnerability_lookup.expert = intelmq_extensions.bots.experts.vulnerability_lookup.expert:BOT.run
@@ -33,6 +36,7 @@ intelmq_extensions.bots.outputs.to_logs.output = intelmq_extensions.bots.outputs
33
36
  intelmq_extensions.bots.outputs.xmpp.output = intelmq_extensions.bots.outputs.xmpp.output:BOT.run
34
37
  intelmq_extensions.bots.parsers.blackkite.parser = intelmq_extensions.bots.parsers.blackkite.parser:BOT.run
35
38
  intelmq_extensions.bots.parsers.disp.parser = intelmq_extensions.bots.parsers.disp.parser:BOT.run
39
+ intelmq_extensions.bots.parsers.generic_json.parser = intelmq_extensions.bots.parsers.generic_json.parser:BOT.run
36
40
  intelmq_extensions.bots.parsers.malwaredomains.parser = intelmq_extensions.bots.parsers.malwaredomains.parser:BOT.run
37
41
  intelmq_extensions.bots.parsers.modat.parser = intelmq_extensions.bots.parsers.modat.parser:BOT.run
38
42
  intelmqcli = intelmq_extensions.cli.intelmqcli:main