intelmq-extensions 1.10.0__tar.gz → 1.11.0__tar.gz

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.
Files changed (127) hide show
  1. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/PKG-INFO +8 -7
  2. intelmq_extensions-1.11.0/intelmq_extensions/bots/experts/iban_extractor/expert.py +75 -0
  3. intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers/generic_json/parser.py +86 -0
  4. intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/iban_extractor/test_expert.py +74 -0
  5. intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers/generic_json/test_parser.py +171 -0
  6. intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers/malwaredomains/__init__.py +0 -0
  7. intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers/modat/__init__.py +0 -0
  8. intelmq_extensions-1.11.0/intelmq_extensions/tests/cli/__init__.py +0 -0
  9. intelmq_extensions-1.11.0/intelmq_extensions/tests/lib/__init__.py +0 -0
  10. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions.egg-info/PKG-INFO +8 -7
  11. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions.egg-info/SOURCES.txt +8 -0
  12. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions.egg-info/entry_points.txt +4 -0
  13. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions.egg-info/requires.txt +6 -5
  14. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/pyproject.toml +1 -1
  15. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/LICENSE +0 -0
  16. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/README.md +0 -0
  17. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/__init__.py +0 -0
  18. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/__init__.py +0 -0
  19. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/blackkite/__init__.py +0 -0
  20. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/blackkite/_client.py +0 -0
  21. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/blackkite/collector.py +0 -0
  22. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/disp/__init__.py +0 -0
  23. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/disp/_client.py +0 -0
  24. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/disp/collector.py +0 -0
  25. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/modat/__init__.py +0 -0
  26. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/modat/collector.py +0 -0
  27. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/xmpp/__init__.py +0 -0
  28. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/collectors/xmpp/collector.py +0 -0
  29. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/__init__.py +0 -0
  30. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/certat_contact_intern/__init__.py +0 -0
  31. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/certat_contact_intern/expert.py +0 -0
  32. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/copy_extra/__init__.py +0 -0
  33. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/copy_extra/expert.py +0 -0
  34. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/event_group_splitter/__init__.py +0 -0
  35. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/event_group_splitter/expert.py +0 -0
  36. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/event_splitter/__init__.py +0 -0
  37. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/event_splitter/expert.py +0 -0
  38. {intelmq_extensions-1.10.0/intelmq_extensions/bots/experts/replace_in_dict → intelmq_extensions-1.11.0/intelmq_extensions/bots/experts/iban_extractor}/__init__.py +0 -0
  39. {intelmq_extensions-1.10.0/intelmq_extensions/bots/experts/squelcher → intelmq_extensions-1.11.0/intelmq_extensions/bots/experts/replace_in_dict}/__init__.py +0 -0
  40. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/replace_in_dict/expert.py +0 -0
  41. {intelmq_extensions-1.10.0/intelmq_extensions/bots/experts/vulnerability_lookup → intelmq_extensions-1.11.0/intelmq_extensions/bots/experts/squelcher}/__init__.py +0 -0
  42. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/squelcher/expert.py +0 -0
  43. {intelmq_extensions-1.10.0/intelmq_extensions/bots/outputs → intelmq_extensions-1.11.0/intelmq_extensions/bots/experts/vulnerability_lookup}/__init__.py +0 -0
  44. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/experts/vulnerability_lookup/expert.py +0 -0
  45. {intelmq_extensions-1.10.0/intelmq_extensions/bots/outputs/mattermost → intelmq_extensions-1.11.0/intelmq_extensions/bots/outputs}/__init__.py +0 -0
  46. {intelmq_extensions-1.10.0/intelmq_extensions/bots/outputs/to_logs → intelmq_extensions-1.11.0/intelmq_extensions/bots/outputs/mattermost}/__init__.py +0 -0
  47. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/outputs/mattermost/output.py +0 -0
  48. {intelmq_extensions-1.10.0/intelmq_extensions/bots/outputs/xmpp → intelmq_extensions-1.11.0/intelmq_extensions/bots/outputs/to_logs}/__init__.py +0 -0
  49. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/outputs/to_logs/output.py +0 -0
  50. {intelmq_extensions-1.10.0/intelmq_extensions/bots/parsers → intelmq_extensions-1.11.0/intelmq_extensions/bots/outputs/xmpp}/__init__.py +0 -0
  51. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/outputs/xmpp/output.py +0 -0
  52. {intelmq_extensions-1.10.0/intelmq_extensions/bots/parsers/blackkite → intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers}/__init__.py +0 -0
  53. {intelmq_extensions-1.10.0/intelmq_extensions/bots/parsers/disp → intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers/blackkite}/__init__.py +0 -0
  54. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/parsers/blackkite/_transformers.py +0 -0
  55. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/parsers/blackkite/parser.py +0 -0
  56. {intelmq_extensions-1.10.0/intelmq_extensions/bots/parsers/malwaredomains → intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers/disp}/__init__.py +0 -0
  57. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/parsers/disp/parser.py +0 -0
  58. {intelmq_extensions-1.10.0/intelmq_extensions/bots/parsers/modat → intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers/generic_json}/__init__.py +0 -0
  59. {intelmq_extensions-1.10.0/intelmq_extensions/cli → intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers/malwaredomains}/__init__.py +0 -0
  60. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/parsers/malwaredomains/parser.py +0 -0
  61. {intelmq_extensions-1.10.0/intelmq_extensions/lib → intelmq_extensions-1.11.0/intelmq_extensions/bots/parsers/modat}/__init__.py +0 -0
  62. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/bots/parsers/modat/parser.py +0 -0
  63. {intelmq_extensions-1.10.0/intelmq_extensions/tests → intelmq_extensions-1.11.0/intelmq_extensions/cli}/__init__.py +0 -0
  64. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/cli/create_reports.py +0 -0
  65. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/cli/intelmqcli.py +0 -0
  66. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/cli/lib.py +0 -0
  67. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/cli/utils.py +0 -0
  68. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/etc/harmonization.conf +0 -0
  69. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/etc/squelcher.conf +0 -0
  70. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots → intelmq_extensions-1.11.0/intelmq_extensions/lib}/__init__.py +0 -0
  71. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/lib/api_helpers.py +0 -0
  72. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/lib/blackkite.py +0 -0
  73. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/collectors → intelmq_extensions-1.11.0/intelmq_extensions/tests}/__init__.py +0 -0
  74. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/base.py +0 -0
  75. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/collectors/blackkite → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots}/__init__.py +0 -0
  76. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/collectors/disp → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/collectors}/__init__.py +0 -0
  77. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/collectors/modat → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/collectors/blackkite}/__init__.py +0 -0
  78. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/blackkite/base.py +0 -0
  79. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/blackkite/test_client.py +0 -0
  80. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/blackkite/test_collector.py +0 -0
  81. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/collectors/xmpp → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/collectors/disp}/__init__.py +0 -0
  82. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/disp/base.py +0 -0
  83. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/disp/test_client.py +0 -0
  84. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/disp/test_collector.py +0 -0
  85. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/collectors/modat}/__init__.py +0 -0
  86. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/modat/test_collector.py +0 -0
  87. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/certat_contact_intern → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/collectors/xmpp}/__init__.py +0 -0
  88. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/collectors/xmpp/test_collector.py +0 -0
  89. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/copy_extra → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts}/__init__.py +0 -0
  90. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/event_group_splitter → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/certat_contact_intern}/__init__.py +0 -0
  91. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/certat_contact_intern/test_expert.py +0 -0
  92. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/event_splitter → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/copy_extra}/__init__.py +0 -0
  93. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/copy_extra/test_expert.py +0 -0
  94. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/replace_in_dict → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/event_group_splitter}/__init__.py +0 -0
  95. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/event_group_splitter/test_expert.py +0 -0
  96. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/squelcher → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/event_splitter}/__init__.py +0 -0
  97. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/event_splitter/test_expert.py +0 -0
  98. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/experts/vulnerability_lookup → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/iban_extractor}/__init__.py +0 -0
  99. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/outputs → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/replace_in_dict}/__init__.py +0 -0
  100. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/replace_in_dict/test_expert.py +0 -0
  101. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/outputs/mattermost → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/squelcher}/__init__.py +0 -0
  102. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/squelcher/test_expert.py +0 -0
  103. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/outputs/xmpp → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/experts/vulnerability_lookup}/__init__.py +0 -0
  104. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/experts/vulnerability_lookup/test_expert.py +0 -0
  105. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/parsers → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/outputs}/__init__.py +0 -0
  106. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/parsers/blackkite → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/outputs/mattermost}/__init__.py +0 -0
  107. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/outputs/mattermost/test_output.py +0 -0
  108. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/parsers/disp → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/outputs/xmpp}/__init__.py +0 -0
  109. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/outputs/xmpp/test_output.py +0 -0
  110. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/parsers/malwaredomains → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers}/__init__.py +0 -0
  111. {intelmq_extensions-1.10.0/intelmq_extensions/tests/bots/parsers/modat → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers/blackkite}/__init__.py +0 -0
  112. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/parsers/blackkite/data.py +0 -0
  113. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/parsers/blackkite/test_parser.py +0 -0
  114. {intelmq_extensions-1.10.0/intelmq_extensions/tests/cli → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers/disp}/__init__.py +0 -0
  115. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/parsers/disp/test_parser.py +0 -0
  116. {intelmq_extensions-1.10.0/intelmq_extensions/tests/lib → intelmq_extensions-1.11.0/intelmq_extensions/tests/bots/parsers/generic_json}/__init__.py +0 -0
  117. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/parsers/malwaredomains/test_parser.py +0 -0
  118. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/parsers/modat/data.py +0 -0
  119. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/bots/parsers/modat/test_parser.py +0 -0
  120. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/cli/test_create_reports.py +0 -0
  121. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/cli/test_intelmqcli.py +0 -0
  122. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/lib/base.py +0 -0
  123. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions/tests/lib/test_api_helpers.py +0 -0
  124. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions.egg-info/dependency_links.txt +0 -0
  125. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/intelmq_extensions.egg-info/top_level.txt +0 -0
  126. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/setup.cfg +0 -0
  127. {intelmq_extensions-1.10.0 → intelmq_extensions-1.11.0}/setup.py +0 -0
@@ -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
@@ -9,17 +9,18 @@ Classifier: Programming Language :: Python :: 3
9
9
  Requires-Python: >=3.10
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
- Requires-Dist: slixmpp
13
- Requires-Dist: importlib_metadata; python_version < "3.8"
14
- Requires-Dist: psycopg2-binary
12
+ Requires-Dist: tabulate>=0.7.5
13
+ Requires-Dist: netaddr>=0.7.14
15
14
  Requires-Dist: rt<3.0.0,>=1.0.9
16
15
  Requires-Dist: psycopg2-binary>=2.5.5
16
+ Requires-Dist: slixmpp
17
+ Requires-Dist: schwifty
17
18
  Requires-Dist: mergedeep
18
- Requires-Dist: netaddr>=0.7.14
19
- Requires-Dist: python-termstyle>=0.1.10
20
- Requires-Dist: tabulate>=0.7.5
19
+ Requires-Dist: psycopg2-binary
21
20
  Requires-Dist: netaddr>=0.7.14
22
21
  Requires-Dist: intelmq
22
+ Requires-Dist: importlib_metadata; python_version < "3.8"
23
+ Requires-Dist: python-termstyle>=0.1.10
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: pytest; extra == "dev"
25
26
  Requires-Dist: tox>=4; extra == "dev"
@@ -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
@@ -9,17 +9,18 @@ Classifier: Programming Language :: Python :: 3
9
9
  Requires-Python: >=3.10
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
- Requires-Dist: slixmpp
13
- Requires-Dist: importlib_metadata; python_version < "3.8"
14
- Requires-Dist: psycopg2-binary
12
+ Requires-Dist: tabulate>=0.7.5
13
+ Requires-Dist: netaddr>=0.7.14
15
14
  Requires-Dist: rt<3.0.0,>=1.0.9
16
15
  Requires-Dist: psycopg2-binary>=2.5.5
16
+ Requires-Dist: slixmpp
17
+ Requires-Dist: schwifty
17
18
  Requires-Dist: mergedeep
18
- Requires-Dist: netaddr>=0.7.14
19
- Requires-Dist: python-termstyle>=0.1.10
20
- Requires-Dist: tabulate>=0.7.5
19
+ Requires-Dist: psycopg2-binary
21
20
  Requires-Dist: netaddr>=0.7.14
22
21
  Requires-Dist: intelmq
22
+ Requires-Dist: importlib_metadata; python_version < "3.8"
23
+ Requires-Dist: python-termstyle>=0.1.10
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: pytest; extra == "dev"
25
26
  Requires-Dist: tox>=4; extra == "dev"
@@ -29,6 +29,8 @@ intelmq_extensions/bots/experts/event_group_splitter/__init__.py
29
29
  intelmq_extensions/bots/experts/event_group_splitter/expert.py
30
30
  intelmq_extensions/bots/experts/event_splitter/__init__.py
31
31
  intelmq_extensions/bots/experts/event_splitter/expert.py
32
+ intelmq_extensions/bots/experts/iban_extractor/__init__.py
33
+ intelmq_extensions/bots/experts/iban_extractor/expert.py
32
34
  intelmq_extensions/bots/experts/replace_in_dict/__init__.py
33
35
  intelmq_extensions/bots/experts/replace_in_dict/expert.py
34
36
  intelmq_extensions/bots/experts/squelcher/__init__.py
@@ -48,6 +50,8 @@ intelmq_extensions/bots/parsers/blackkite/_transformers.py
48
50
  intelmq_extensions/bots/parsers/blackkite/parser.py
49
51
  intelmq_extensions/bots/parsers/disp/__init__.py
50
52
  intelmq_extensions/bots/parsers/disp/parser.py
53
+ intelmq_extensions/bots/parsers/generic_json/__init__.py
54
+ intelmq_extensions/bots/parsers/generic_json/parser.py
51
55
  intelmq_extensions/bots/parsers/malwaredomains/__init__.py
52
56
  intelmq_extensions/bots/parsers/malwaredomains/parser.py
53
57
  intelmq_extensions/bots/parsers/modat/__init__.py
@@ -87,6 +91,8 @@ intelmq_extensions/tests/bots/experts/event_group_splitter/__init__.py
87
91
  intelmq_extensions/tests/bots/experts/event_group_splitter/test_expert.py
88
92
  intelmq_extensions/tests/bots/experts/event_splitter/__init__.py
89
93
  intelmq_extensions/tests/bots/experts/event_splitter/test_expert.py
94
+ intelmq_extensions/tests/bots/experts/iban_extractor/__init__.py
95
+ intelmq_extensions/tests/bots/experts/iban_extractor/test_expert.py
90
96
  intelmq_extensions/tests/bots/experts/replace_in_dict/__init__.py
91
97
  intelmq_extensions/tests/bots/experts/replace_in_dict/test_expert.py
92
98
  intelmq_extensions/tests/bots/experts/squelcher/__init__.py
@@ -104,6 +110,8 @@ intelmq_extensions/tests/bots/parsers/blackkite/data.py
104
110
  intelmq_extensions/tests/bots/parsers/blackkite/test_parser.py
105
111
  intelmq_extensions/tests/bots/parsers/disp/__init__.py
106
112
  intelmq_extensions/tests/bots/parsers/disp/test_parser.py
113
+ intelmq_extensions/tests/bots/parsers/generic_json/__init__.py
114
+ intelmq_extensions/tests/bots/parsers/generic_json/test_parser.py
107
115
  intelmq_extensions/tests/bots/parsers/malwaredomains/__init__.py
108
116
  intelmq_extensions/tests/bots/parsers/malwaredomains/test_parser.py
109
117
  intelmq_extensions/tests/bots/parsers/modat/__init__.py
@@ -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
@@ -1,13 +1,14 @@
1
- slixmpp
2
- psycopg2-binary
1
+ tabulate>=0.7.5
2
+ netaddr>=0.7.14
3
3
  rt<3.0.0,>=1.0.9
4
4
  psycopg2-binary>=2.5.5
5
+ slixmpp
6
+ schwifty
5
7
  mergedeep
6
- netaddr>=0.7.14
7
- python-termstyle>=0.1.10
8
- tabulate>=0.7.5
8
+ psycopg2-binary
9
9
  netaddr>=0.7.14
10
10
  intelmq
11
+ python-termstyle>=0.1.10
11
12
 
12
13
  [:python_version < "3.8"]
13
14
  importlib_metadata
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "intelmq_extensions"
7
- version = "1.10.0"
7
+ version = "1.11.0"
8
8
  description = "Additional bots for IntelMQ"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"