pymisp 2.5.7__py3-none-any.whl → 2.5.8__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.

Potentially problematic release.


This version of pymisp might be problematic. Click here for more details.

Files changed (135) hide show
  1. pymisp/api.py +1 -0
  2. pymisp/data/misp-objects/objects/rmm/definition.json +1 -1
  3. {pymisp-2.5.7.dist-info → pymisp-2.5.8.dist-info}/METADATA +4 -4
  4. {pymisp-2.5.7.dist-info → pymisp-2.5.8.dist-info}/RECORD +6 -135
  5. CHANGELOG.txt +0 -5380
  6. examples/__init__.py +0 -0
  7. examples/add_attributes_from_csv.py +0 -74
  8. examples/add_email_object.py +0 -29
  9. examples/add_fail2ban_object.py +0 -86
  10. examples/add_feed.py +0 -25
  11. examples/add_file_object.py +0 -47
  12. examples/add_filetype_object_from_csv.py +0 -53
  13. examples/add_generic_object.py +0 -26
  14. examples/add_github_user.py +0 -65
  15. examples/add_gitlab_user.py +0 -56
  16. examples/add_named_attribute.py +0 -25
  17. examples/add_organisations.py +0 -57
  18. examples/add_ssh_authorized_keys.py +0 -29
  19. examples/add_user.py +0 -22
  20. examples/add_vehicle_object.py +0 -22
  21. examples/addtag2.py +0 -45
  22. examples/asciidoc_generator.py +0 -114
  23. examples/cache_all.py +0 -10
  24. examples/copyTagsFromAttributesToEvent.py +0 -68
  25. examples/copy_list.py +0 -93
  26. examples/create_events.py +0 -26
  27. examples/cytomic_orion.py +0 -549
  28. examples/del.py +0 -22
  29. examples/delete_user.py +0 -16
  30. examples/edit_organisation.py +0 -20
  31. examples/edit_user.py +0 -20
  32. examples/falsepositive_disabletoids.py +0 -136
  33. examples/fetch_events_feed.py +0 -15
  34. examples/fetch_warninglist_hits.py +0 -38
  35. examples/freetext.py +0 -22
  36. examples/generate_file_objects.py +0 -78
  37. examples/generate_meta_feed.py +0 -15
  38. examples/get.py +0 -37
  39. examples/get_csv.py +0 -37
  40. examples/get_network_activity.py +0 -187
  41. examples/last.py +0 -48
  42. examples/load_csv.py +0 -94
  43. examples/lookup.py +0 -28
  44. examples/misp2cef.py +0 -71
  45. examples/misp2clamav.py +0 -52
  46. examples/openioc_to_misp.py +0 -27
  47. examples/proofpoint_tap.py +0 -203
  48. examples/proofpoint_vap.py +0 -65
  49. examples/search.py +0 -48
  50. examples/search_attributes_yara.py +0 -40
  51. examples/search_sighting.py +0 -42
  52. examples/server_sync_check_conn.py +0 -32
  53. examples/sharing_groups.py +0 -15
  54. examples/show_sightings.py +0 -168
  55. examples/stats_report.py +0 -405
  56. examples/sync_sighting.py +0 -171
  57. examples/tags.py +0 -25
  58. examples/test_sign.py +0 -19
  59. examples/trustar_misp.py +0 -59
  60. examples/up.py +0 -21
  61. examples/upload.py +0 -60
  62. examples/users_list.py +0 -15
  63. examples/vmray_automation.py +0 -281
  64. examples/vt_to_misp.py +0 -182
  65. examples/warninglists.py +0 -22
  66. examples/yara.py +0 -38
  67. examples/yara_dump.py +0 -98
  68. tests/57c4445b-c548-4654-af0b-4be3950d210f.json +0 -1
  69. tests/__init__.py +0 -0
  70. tests/csv_testfiles/invalid_fieldnames.csv +0 -11
  71. tests/csv_testfiles/valid_fieldnames.csv +0 -4
  72. tests/email_testfiles/mail_1.eml.zip +0 -0
  73. tests/email_testfiles/mail_1.msg +0 -0
  74. tests/email_testfiles/mail_1_bom.eml +0 -858
  75. tests/email_testfiles/mail_1_headers_only.eml +0 -28
  76. tests/email_testfiles/mail_2.eml +0 -32
  77. tests/email_testfiles/mail_3.eml +0 -170
  78. tests/email_testfiles/mail_3.msg +0 -0
  79. tests/email_testfiles/mail_4.msg +0 -0
  80. tests/email_testfiles/mail_5.msg +0 -0
  81. tests/email_testfiles/mail_multiple_to.eml +0 -15
  82. tests/email_testfiles/source +0 -1
  83. tests/git-vuln-finder-quagga.json +0 -1493
  84. tests/misp_event.json +0 -76
  85. tests/mispevent_testfiles/attribute.json +0 -21
  86. tests/mispevent_testfiles/attribute_del.json +0 -23
  87. tests/mispevent_testfiles/def_param.json +0 -53
  88. tests/mispevent_testfiles/event.json +0 -8
  89. tests/mispevent_testfiles/event_obj_attr_tag.json +0 -57
  90. tests/mispevent_testfiles/event_obj_def_param.json +0 -62
  91. tests/mispevent_testfiles/event_obj_tag.json +0 -29
  92. tests/mispevent_testfiles/event_tags.json +0 -18
  93. tests/mispevent_testfiles/existing_event.json +0 -4599
  94. tests/mispevent_testfiles/existing_event_edited.json +0 -4601
  95. tests/mispevent_testfiles/galaxy.json +0 -25
  96. tests/mispevent_testfiles/malware.json +0 -19
  97. tests/mispevent_testfiles/malware_exist.json +0 -163
  98. tests/mispevent_testfiles/misp_custom_obj.json +0 -38
  99. tests/mispevent_testfiles/overwrite_file/definition.json +0 -457
  100. tests/mispevent_testfiles/proposals.json +0 -35
  101. tests/mispevent_testfiles/shadow.json +0 -148
  102. tests/mispevent_testfiles/sighting.json +0 -5
  103. tests/mispevent_testfiles/simple.json +0 -2
  104. tests/mispevent_testfiles/test_object_template/definition.json +0 -29
  105. tests/new_misp_event.json +0 -34
  106. tests/reportlab_testfiles/HTML_event.json +0 -1
  107. tests/reportlab_testfiles/galaxy_1.json +0 -1250
  108. tests/reportlab_testfiles/image_event.json +0 -2490
  109. tests/reportlab_testfiles/japanese_test.json +0 -156
  110. tests/reportlab_testfiles/japanese_test_heavy.json +0 -318
  111. tests/reportlab_testfiles/long_event.json +0 -3730
  112. tests/reportlab_testfiles/mainly_objects_1.json +0 -1092
  113. tests/reportlab_testfiles/mainly_objects_2.json +0 -977
  114. tests/reportlab_testfiles/sighting_1.json +0 -305
  115. tests/reportlab_testfiles/sighting_2.json +0 -221
  116. tests/reportlab_testfiles/to_delete1.json +0 -804
  117. tests/reportlab_testfiles/to_delete2.json +0 -1
  118. tests/reportlab_testfiles/to_delete3.json +0 -1
  119. tests/reportlab_testfiles/very_long_event.json +0 -1006
  120. tests/reportlab_testoutputs/to_delete1.json.pdf +0 -391
  121. tests/reportlab_testoutputs/to_delete2.json.pdf +0 -506
  122. tests/reportlab_testoutputs/to_delete3.json.pdf +0 -277
  123. tests/search_index_result.json +0 -69
  124. tests/sharing_groups.json +0 -98
  125. tests/stix1.xml-utf8 +0 -110
  126. tests/stix2.json +0 -1
  127. tests/test_analyst_data.py +0 -123
  128. tests/test_emailobject.py +0 -157
  129. tests/test_fileobject.py +0 -20
  130. tests/test_mispevent.py +0 -473
  131. tests/test_reportlab.py +0 -431
  132. tests/testlive_comprehensive.py +0 -3734
  133. tests/testlive_sync.py +0 -474
  134. {pymisp-2.5.7.dist-info → pymisp-2.5.8.dist-info}/LICENSE +0 -0
  135. {pymisp-2.5.7.dist-info → pymisp-2.5.8.dist-info}/WHEEL +0 -0
tests/testlive_sync.py DELETED
@@ -1,474 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- from __future__ import annotations
4
-
5
- import time
6
- import unittest
7
- import subprocess
8
-
9
- import urllib3
10
- import logging
11
- logging.disable(logging.CRITICAL)
12
-
13
- try:
14
- from pymisp import PyMISP, MISPOrganisation, MISPUser, MISPEvent, MISPObject, MISPSharingGroup, Distribution
15
- except ImportError:
16
- raise
17
-
18
- key = 'eYQdGTEWZJ8C2lm9EpnMqxQGwGiPNyoR75JvLdlE'
19
- verifycert = False
20
-
21
-
22
- urllib3.disable_warnings()
23
-
24
- '''
25
- Static IP config
26
-
27
- auto eth1
28
- iface eth1 inet static
29
- address 192.168.1.XXX
30
- netmask 255.255.255.0
31
- network 192.168.1.0
32
- broadcast 192.168.1.255
33
- '''
34
-
35
- misp_instances = [
36
- {
37
- 'url': 'https://localhost:8643',
38
- 'external_baseurl': 'https://192.168.1.1',
39
- 'key': key,
40
- 'orgname': 'First org',
41
- 'email_site_admin': 'first@site-admin.local',
42
- 'email_admin': 'first@org-admin.local',
43
- 'email_user': 'first@user.local'
44
- },
45
- {
46
- 'url': 'https://localhost:8644',
47
- 'external_baseurl': 'https://192.168.1.2',
48
- 'key': key,
49
- 'orgname': 'Second org',
50
- 'email_site_admin': 'second@site-admin.local',
51
- 'email_admin': 'second@org-admin.local',
52
- 'email_user': 'second@user.local'
53
- },
54
- {
55
- 'url': 'https://localhost:8645',
56
- 'external_baseurl': 'https://192.168.1.3',
57
- 'key': key,
58
- 'orgname': 'Third org',
59
- 'email_site_admin': 'third@site-admin.local',
60
- 'email_admin': 'third@org-admin.local',
61
- 'email_user': 'third@user.local'
62
- },
63
- ]
64
-
65
- # Assumes the VMs are already started, doesn't shut them down
66
- fast_mode = True
67
-
68
-
69
- class MISPInstance():
70
-
71
- def __init__(self, params):
72
- self.initial_user_connector = PyMISP(params['url'], params['key'], ssl=False, debug=False)
73
- # Git pull
74
- self.initial_user_connector.update_misp()
75
- # Set the default role (id 3 on the VM is normal user)
76
- self.initial_user_connector.set_default_role(3)
77
- # Restart workers
78
- self.initial_user_connector.restart_workers()
79
- if not fast_mode:
80
- # Load submodules
81
- self.initial_user_connector.update_object_templates()
82
- self.initial_user_connector.update_galaxies()
83
- self.initial_user_connector.update_noticelists()
84
- self.initial_user_connector.update_warninglists()
85
- self.initial_user_connector.update_taxonomies()
86
-
87
- self.initial_user_connector.toggle_global_pythonify()
88
-
89
- # Create organisation
90
- organisation = MISPOrganisation()
91
- organisation.name = params['orgname']
92
- self.test_org = self.initial_user_connector.add_organisation(organisation)
93
- print(self.test_org.name, self.test_org.uuid)
94
- # Create Site admin in new org
95
- user = MISPUser()
96
- user.email = params['email_site_admin']
97
- user.org_id = self.test_org.id
98
- user.role_id = 1 # Site admin
99
- self.test_site_admin = self.initial_user_connector.add_user(user)
100
- self.site_admin_connector = PyMISP(params['url'], self.test_site_admin.authkey, ssl=False, debug=False)
101
- self.site_admin_connector.toggle_global_pythonify()
102
- # Create org admin
103
- user = MISPUser()
104
- user.email = params['email_admin']
105
- user.org_id = self.test_org.id
106
- user.role_id = 2 # Org admin
107
- self.test_org_admin = self.site_admin_connector.add_user(user)
108
- self.org_admin_connector = PyMISP(params['url'], self.test_org_admin.authkey, ssl=False, debug=False)
109
- self.org_admin_connector.toggle_global_pythonify()
110
- # Create user
111
- user = MISPUser()
112
- user.email = params['email_user']
113
- user.org_id = self.test_org.id
114
- self.test_usr = self.org_admin_connector.add_user(user)
115
- self.user_connector = PyMISP(params['url'], self.test_usr.authkey, ssl=False, debug=False)
116
- self.user_connector.toggle_global_pythonify()
117
-
118
- # Setup external_baseurl
119
- self.site_admin_connector.set_server_setting('MISP.external_baseurl', params['external_baseurl'], force=True)
120
- # Setup baseurl
121
- self.site_admin_connector.set_server_setting('MISP.baseurl', params['url'], force=True)
122
- # Setup host org
123
- self.site_admin_connector.set_server_setting('MISP.host_org_id', self.test_org.id)
124
-
125
- self.external_base_url = params['external_baseurl']
126
- self.sync = []
127
- self.sync_servers = []
128
-
129
- def __repr__(self):
130
- return f'<{self.__class__.__name__}(external={self.external_base_url})'
131
-
132
- def create_sync_user(self, organisation):
133
- sync_org = self.site_admin_connector.add_organisation(organisation)
134
- short_org_name = sync_org.name.lower().replace(' ', '-')
135
- user = MISPUser()
136
- user.email = f"sync_user@{short_org_name}.local"
137
- user.org_id = sync_org.id
138
- user.role_id = 5 # Org admin
139
- sync_user = self.site_admin_connector.add_user(user)
140
- sync_user_connector = PyMISP(self.site_admin_connector.root_url, sync_user.authkey, ssl=False, debug=False)
141
- sync_server_config = sync_user_connector.get_sync_config(pythonify=True)
142
- self.sync.append((sync_org, sync_user, sync_server_config))
143
-
144
- def create_sync_server(self, name, server):
145
- server = self.site_admin_connector.import_server(server)
146
- server.self_signed = True
147
- server.pull = True # Not automatic, but allows to do a pull
148
- server = self.site_admin_connector.update_server(server)
149
- r = self.site_admin_connector.test_server(server)
150
- if r['status'] != 1:
151
- raise Exception(f'Sync test failed: {r}')
152
- self.sync_servers.append(server)
153
-
154
- def cleanup(self):
155
- for org, user, _ in self.sync:
156
- self.site_admin_connector.delete_user(user) # Delete user from other org
157
- self.site_admin_connector.delete_organisation(org)
158
-
159
- # Delete sync servers
160
- for server in self.site_admin_connector.servers():
161
- self.site_admin_connector.delete_server(server)
162
-
163
- # Delete users
164
- self.org_admin_connector.delete_user(self.test_usr.id)
165
- self.site_admin_connector.delete_user(self.test_org_admin.id)
166
- self.initial_user_connector.delete_user(self.test_site_admin.id)
167
- # Delete org
168
- self.initial_user_connector.delete_organisation(self.test_org.id)
169
-
170
- # Make sure the instance is back to a clean state
171
- if self.initial_user_connector.events():
172
- raise Exception(f'Events still on the instance {self.external_base_url}')
173
- if self.initial_user_connector.attributes():
174
- raise Exception(f'Attributes still on the instance {self.external_base_url}')
175
- if self.initial_user_connector.attribute_proposals():
176
- raise Exception(f'AttributeProposals still on the instance {self.external_base_url}')
177
- if self.initial_user_connector.sightings():
178
- raise Exception(f'Sightings still on the instance {self.external_base_url}')
179
- if self.initial_user_connector.servers():
180
- raise Exception(f'Servers still on the instance {self.external_base_url}')
181
- if self.initial_user_connector.sharing_groups():
182
- raise Exception(f'SharingGroups still on the instance {self.external_base_url}')
183
- if len(self.initial_user_connector.organisations()) > 1:
184
- raise Exception(f'Organisations still on the instance {self.external_base_url}')
185
- if len(self.initial_user_connector.users()) > 1:
186
- raise Exception(f'Users still on the instance {self.external_base_url}')
187
-
188
-
189
- class TestSync(unittest.TestCase):
190
-
191
- @classmethod
192
- def setUpClass(cls):
193
- if not fast_mode:
194
- subprocess.Popen(['VBoxHeadless', '-s', 'Test Sync 1'])
195
- subprocess.Popen(['VBoxHeadless', '-s', 'Test Sync 2'])
196
- subprocess.Popen(['VBoxHeadless', '-s', 'Test Sync 3'])
197
- time.sleep(30)
198
- cls.maxDiff = None
199
- cls.instances = []
200
- for misp_instance in misp_instances:
201
- mi = MISPInstance(misp_instance)
202
- cls.instances.append(mi)
203
-
204
- # Create all sync users
205
- test_orgs = [i.test_org for i in cls.instances]
206
-
207
- for instance in cls.instances:
208
- for test_org in test_orgs:
209
- if instance.test_org.name == test_org.name:
210
- continue
211
- instance.create_sync_user(test_org)
212
-
213
- # Create all sync links
214
- sync_identifiers = [i.sync for i in cls.instances]
215
- for instance in cls.instances:
216
- for sync_identifier in sync_identifiers:
217
- for org, user, sync_server_config in sync_identifier:
218
- if org.name != instance.test_org.name:
219
- continue
220
- instance.create_sync_server(name=f'Sync with {sync_server_config.url}',
221
- server=sync_server_config)
222
-
223
- ready = False
224
- while not ready:
225
- ready = True
226
- for i in cls.instances:
227
- settings = i.site_admin_connector.server_settings()
228
- if (not settings['workers']['default']['ok']
229
- or not settings['workers']['prio']['ok']):
230
- print(f'Not ready: {i}')
231
- ready = False
232
- time.sleep(1)
233
-
234
- @classmethod
235
- def tearDownClass(cls):
236
- for i in cls.instances:
237
- i.cleanup()
238
- if not fast_mode:
239
- subprocess.Popen(['VBoxManage', 'controlvm', 'Test Sync 1', 'poweroff'])
240
- subprocess.Popen(['VBoxManage', 'controlvm', 'Test Sync 2', 'poweroff'])
241
- subprocess.Popen(['VBoxManage', 'controlvm', 'Test Sync 3', 'poweroff'])
242
- time.sleep(20)
243
- subprocess.Popen(['VBoxManage', 'snapshot', 'Test Sync 1', 'restore', 'WithRefresh'])
244
- subprocess.Popen(['VBoxManage', 'snapshot', 'Test Sync 2', 'restore', 'WithRefresh'])
245
- subprocess.Popen(['VBoxManage', 'snapshot', 'Test Sync 3', 'restore', 'WithRefresh'])
246
-
247
- def test_simple_sync(self):
248
- '''Test simple event, push to one server'''
249
- event = MISPEvent()
250
- event.info = 'Event created on first instance - test_simple_sync'
251
- event.distribution = Distribution.all_communities
252
- event.add_attribute('ip-src', '1.1.1.1')
253
- try:
254
- source = self.instances[0]
255
- dest = self.instances[1]
256
- event = source.org_admin_connector.add_event(event)
257
- source.org_admin_connector.publish(event)
258
- source.site_admin_connector.server_push(source.sync_servers[0], event)
259
- time.sleep(10)
260
- dest_event = dest.org_admin_connector.get_event(event.uuid)
261
- self.assertEqual(event.attributes[0].value, dest_event.attributes[0].value)
262
-
263
- finally:
264
- source.org_admin_connector.delete_event(event)
265
- dest.site_admin_connector.delete_event(dest_event)
266
-
267
- def test_sync_community(self):
268
- '''Simple event, this community only, pull from member of the community'''
269
- event = MISPEvent()
270
- event.info = 'Event created on first instance - test_sync_community'
271
- event.distribution = Distribution.this_community_only
272
- event.add_attribute('ip-src', '1.1.1.1')
273
- try:
274
- source = self.instances[0]
275
- dest = self.instances[1]
276
- event = source.org_admin_connector.add_event(event)
277
- source.org_admin_connector.publish(event)
278
- dest.site_admin_connector.server_pull(dest.sync_servers[0])
279
- time.sleep(10)
280
- dest_event = dest.org_admin_connector.get_event(event.uuid)
281
- self.assertEqual(dest_event.distribution, 0)
282
- finally:
283
- source.org_admin_connector.delete_event(event)
284
- dest.site_admin_connector.delete_event(dest_event)
285
-
286
- def test_sync_all_communities(self):
287
- '''Simple event, all communities, enable automatic push on two sub-instances'''
288
- event = MISPEvent()
289
- event.info = 'Event created on first instance - test_sync_all_communities'
290
- event.distribution = Distribution.all_communities
291
- event.add_attribute('ip-src', '1.1.1.1')
292
- try:
293
- source = self.instances[0]
294
- server = source.site_admin_connector.update_server({'push': True}, source.sync_servers[0].id)
295
- self.assertTrue(server.push)
296
- middle = self.instances[1]
297
- middle.site_admin_connector.update_server({'push': True}, middle.sync_servers[1].id) # Enable automatic push to 3rd instance
298
- last = self.instances[2]
299
- event = source.user_connector.add_event(event)
300
- source.org_admin_connector.publish(event)
301
- source.site_admin_connector.server_push(source.sync_servers[0])
302
- time.sleep(30)
303
- middle_event = middle.user_connector.get_event(event.uuid)
304
- self.assertEqual(event.attributes[0].value, middle_event.attributes[0].value)
305
- last_event = last.user_connector.get_event(event.uuid)
306
- self.assertEqual(event.attributes[0].value, last_event.attributes[0].value)
307
- finally:
308
- source.org_admin_connector.delete_event(event)
309
- middle.site_admin_connector.delete_event(middle_event)
310
- last.site_admin_connector.delete_event(last_event)
311
- source.site_admin_connector.update_server({'push': False}, source.sync_servers[0].id)
312
- middle.site_admin_connector.update_server({'push': False}, middle.sync_servers[1].id)
313
-
314
- def create_complex_event(self):
315
- event = MISPEvent()
316
- event.info = 'Complex Event'
317
- event.distribution = Distribution.all_communities
318
- event.add_tag('tlp:white')
319
-
320
- event.add_attribute('ip-src', '8.8.8.8')
321
- event.add_attribute('ip-dst', '8.8.8.9')
322
- event.add_attribute('domain', 'google.com')
323
- event.add_attribute('md5', '3c656da41f4645f77e3ec3281b63dd43')
324
-
325
- event.attributes[0].distribution = Distribution.your_organisation_only
326
- event.attributes[1].distribution = Distribution.this_community_only
327
- event.attributes[2].distribution = Distribution.connected_communities
328
-
329
- event.attributes[0].add_tag('tlp:red')
330
- event.attributes[1].add_tag('tlp:amber')
331
- event.attributes[2].add_tag('tlp:green')
332
-
333
- obj = MISPObject('file')
334
-
335
- obj.distribution = Distribution.connected_communities
336
- obj.add_attribute('filename', 'testfile')
337
- obj.add_attribute('md5', '3c656da41f4645f77e3ec3281b63dd44')
338
- obj.attributes[0].distribution = Distribution.your_organisation_only
339
-
340
- event.add_object(obj)
341
-
342
- return event
343
-
344
- def test_complex_event_push_pull(self):
345
- '''Test automatic push'''
346
- event = self.create_complex_event()
347
- try:
348
- source = self.instances[0]
349
- source.site_admin_connector.update_server({'push': True}, source.sync_servers[0].id)
350
- middle = self.instances[1]
351
- middle.site_admin_connector.update_server({'push': True}, middle.sync_servers[1].id) # Enable automatic push to 3rd instance
352
- last = self.instances[2]
353
-
354
- event = source.org_admin_connector.add_event(event)
355
- source.org_admin_connector.publish(event)
356
- time.sleep(15)
357
- event_middle = middle.user_connector.get_event(event.uuid)
358
- event_last = last.user_connector.get_event(event.uuid)
359
- self.assertEqual(len(event_middle.attributes), 2) # attribute 3 and 4
360
- self.assertEqual(len(event_middle.objects[0].attributes), 1) # attribute 2
361
- self.assertEqual(len(event_last.attributes), 1) # attribute 4
362
- self.assertFalse(event_last.objects)
363
- # Test if event is properly sanitized
364
- event_middle_as_site_admin = middle.site_admin_connector.get_event(event.uuid)
365
- self.assertEqual(len(event_middle_as_site_admin.attributes), 2) # attribute 3 and 4
366
- self.assertEqual(len(event_middle_as_site_admin.objects[0].attributes), 1) # attribute 2
367
- # FIXME https://github.com/MISP/MISP/issues/4975
368
- # Force pull from the last one
369
- # last.site_admin_connector.server_pull(last.sync_servers[0])
370
- # time.sleep(6)
371
- # event_last = last.user_connector.get_event(event.uuid)
372
- # self.assertEqual(len(event_last.objects[0].attributes), 1) # attribute 2
373
- # self.assertEqual(len(event_last.attributes), 2) # attribute 3 and 4
374
- # Force pull from the middle one
375
- # middle.site_admin_connector.server_pull(last.sync_servers[0])
376
- # time.sleep(6)
377
- # event_middle = middle.user_connector.get_event(event.uuid)
378
- # self.assertEqual(len(event_middle.attributes), 3) # attribute 2, 3 and 4
379
- # Force pull from the last one
380
- # last.site_admin_connector.server_pull(last.sync_servers[0])
381
- # time.sleep(6)
382
- # event_last = last.user_connector.get_event(event.uuid)
383
- # self.assertEqual(len(event_last.attributes), 2) # attribute 3 and 4
384
- finally:
385
- source.org_admin_connector.delete_event(event)
386
- middle.site_admin_connector.delete_event(event_middle)
387
- last.site_admin_connector.delete_event(event_last)
388
- source.site_admin_connector.update_server({'push': False}, source.sync_servers[0].id)
389
- middle.site_admin_connector.update_server({'push': False}, middle.sync_servers[1].id)
390
-
391
- def test_complex_event_pull(self):
392
- '''Test pull'''
393
- event = self.create_complex_event()
394
- try:
395
- source = self.instances[0]
396
- middle = self.instances[1]
397
- last = self.instances[2]
398
-
399
- event = source.org_admin_connector.add_event(event)
400
- source.org_admin_connector.publish(event)
401
- middle.site_admin_connector.server_pull(middle.sync_servers[0])
402
- time.sleep(6)
403
- last.site_admin_connector.server_pull(last.sync_servers[1])
404
- time.sleep(6)
405
- event_middle = middle.user_connector.get_event(event.uuid)
406
- event_last = last.user_connector.get_event(event.uuid)
407
- self.assertEqual(len(event_middle.attributes), 3) # attribute 2, 3 and 4
408
- self.assertEqual(len(event_middle.objects[0].attributes), 1) # attribute 2
409
- self.assertEqual(len(event_last.attributes), 2) # attribute 3, 4
410
- self.assertEqual(len(event_last.objects[0].attributes), 1)
411
- # Test if event is properly sanitized
412
- event_middle_as_site_admin = middle.site_admin_connector.get_event(event.uuid)
413
- self.assertEqual(len(event_middle_as_site_admin.attributes), 3) # attribute 2, 3 and 4
414
- self.assertEqual(len(event_middle_as_site_admin.objects[0].attributes), 1) # attribute 2
415
- finally:
416
- source.org_admin_connector.delete_event(event)
417
- middle.site_admin_connector.delete_event(event_middle)
418
- last.site_admin_connector.delete_event(event_last)
419
-
420
- def test_sharing_group(self):
421
- '''Test Sharing Group'''
422
- event = self.create_complex_event()
423
- try:
424
- source = self.instances[0]
425
- source.site_admin_connector.update_server({'push': True}, source.sync_servers[0].id)
426
- middle = self.instances[1]
427
- middle.site_admin_connector.update_server({'push': True}, middle.sync_servers[1].id) # Enable automatic push to 3rd instance
428
- last = self.instances[2]
429
-
430
- sg = MISPSharingGroup()
431
- sg.name = 'Testcases SG'
432
- sg.releasability = 'Testing'
433
- sharing_group = source.site_admin_connector.add_sharing_group(sg)
434
- source.site_admin_connector.add_org_to_sharing_group(sharing_group, middle.test_org.uuid)
435
- source.site_admin_connector.add_server_to_sharing_group(sharing_group, 0) # Add local server
436
- # NOTE: the data on that sharing group *won't be synced anywhere*
437
-
438
- a = event.add_attribute('text', 'SG only attr')
439
- a.distribution = Distribution.sharing_group
440
- a.sharing_group_id = sharing_group.id
441
-
442
- event = source.org_admin_connector.add_event(event)
443
- source.org_admin_connector.publish(event)
444
- time.sleep(60)
445
-
446
- event_middle = middle.user_connector.get_event(event)
447
- self.assertTrue(isinstance(event_middle, MISPEvent), event_middle)
448
- self.assertEqual(len(event_middle.attributes), 2, event_middle)
449
- self.assertEqual(len(event_middle.objects), 1, event_middle)
450
- self.assertEqual(len(event_middle.objects[0].attributes), 1, event_middle)
451
-
452
- event_last = last.user_connector.get_event(event)
453
- self.assertTrue(isinstance(event_last, MISPEvent), event_last)
454
- self.assertEqual(len(event_last.attributes), 1)
455
- # Test if event is properly sanitized
456
- event_middle_as_site_admin = middle.site_admin_connector.get_event(event.uuid)
457
- self.assertEqual(len(event_middle_as_site_admin.attributes), 2)
458
- event_last_as_site_admin = last.site_admin_connector.get_event(event.uuid)
459
- self.assertEqual(len(event_last_as_site_admin.attributes), 1)
460
- # Get sharing group from middle instance
461
- sgs = middle.site_admin_connector.sharing_groups()
462
- self.assertEqual(len(sgs), 0)
463
-
464
- # TODO: Update sharing group so the attribute is pushed
465
- # self.assertEqual(sgs[0].name, 'Testcases SG')
466
- # middle.site_admin_connector.delete_sharing_group(sgs[0])
467
- finally:
468
- source.org_admin_connector.delete_event(event)
469
- middle.site_admin_connector.delete_event(event)
470
- last.site_admin_connector.delete_event(event)
471
- source.site_admin_connector.delete_sharing_group(sharing_group.id)
472
- middle.site_admin_connector.delete_sharing_group(sharing_group.id)
473
- source.site_admin_connector.update_server({'push': False}, source.sync_servers[0].id)
474
- middle.site_admin_connector.update_server({'push': False}, middle.sync_servers[1].id)
File without changes