pymisp 2.5.7__py3-none-any.whl → 2.5.7.1__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.
- CHANGELOG.txt +13 -0
- pymisp/data/misp-objects/objects/rmm/definition.json +1 -1
- {pymisp-2.5.7.dist-info → pymisp-2.5.7.1.dist-info}/METADATA +2 -2
- {pymisp-2.5.7.dist-info → pymisp-2.5.7.1.dist-info}/RECORD +6 -72
- tests/57c4445b-c548-4654-af0b-4be3950d210f.json +0 -1
- tests/__init__.py +0 -0
- tests/csv_testfiles/invalid_fieldnames.csv +0 -11
- tests/csv_testfiles/valid_fieldnames.csv +0 -4
- tests/email_testfiles/mail_1.eml.zip +0 -0
- tests/email_testfiles/mail_1.msg +0 -0
- tests/email_testfiles/mail_1_bom.eml +0 -858
- tests/email_testfiles/mail_1_headers_only.eml +0 -28
- tests/email_testfiles/mail_2.eml +0 -32
- tests/email_testfiles/mail_3.eml +0 -170
- tests/email_testfiles/mail_3.msg +0 -0
- tests/email_testfiles/mail_4.msg +0 -0
- tests/email_testfiles/mail_5.msg +0 -0
- tests/email_testfiles/mail_multiple_to.eml +0 -15
- tests/email_testfiles/source +0 -1
- tests/git-vuln-finder-quagga.json +0 -1493
- tests/misp_event.json +0 -76
- tests/mispevent_testfiles/attribute.json +0 -21
- tests/mispevent_testfiles/attribute_del.json +0 -23
- tests/mispevent_testfiles/def_param.json +0 -53
- tests/mispevent_testfiles/event.json +0 -8
- tests/mispevent_testfiles/event_obj_attr_tag.json +0 -57
- tests/mispevent_testfiles/event_obj_def_param.json +0 -62
- tests/mispevent_testfiles/event_obj_tag.json +0 -29
- tests/mispevent_testfiles/event_tags.json +0 -18
- tests/mispevent_testfiles/existing_event.json +0 -4599
- tests/mispevent_testfiles/existing_event_edited.json +0 -4601
- tests/mispevent_testfiles/galaxy.json +0 -25
- tests/mispevent_testfiles/malware.json +0 -19
- tests/mispevent_testfiles/malware_exist.json +0 -163
- tests/mispevent_testfiles/misp_custom_obj.json +0 -38
- tests/mispevent_testfiles/overwrite_file/definition.json +0 -457
- tests/mispevent_testfiles/proposals.json +0 -35
- tests/mispevent_testfiles/shadow.json +0 -148
- tests/mispevent_testfiles/sighting.json +0 -5
- tests/mispevent_testfiles/simple.json +0 -2
- tests/mispevent_testfiles/test_object_template/definition.json +0 -29
- tests/new_misp_event.json +0 -34
- tests/reportlab_testfiles/HTML_event.json +0 -1
- tests/reportlab_testfiles/galaxy_1.json +0 -1250
- tests/reportlab_testfiles/image_event.json +0 -2490
- tests/reportlab_testfiles/japanese_test.json +0 -156
- tests/reportlab_testfiles/japanese_test_heavy.json +0 -318
- tests/reportlab_testfiles/long_event.json +0 -3730
- tests/reportlab_testfiles/mainly_objects_1.json +0 -1092
- tests/reportlab_testfiles/mainly_objects_2.json +0 -977
- tests/reportlab_testfiles/sighting_1.json +0 -305
- tests/reportlab_testfiles/sighting_2.json +0 -221
- tests/reportlab_testfiles/to_delete1.json +0 -804
- tests/reportlab_testfiles/to_delete2.json +0 -1
- tests/reportlab_testfiles/to_delete3.json +0 -1
- tests/reportlab_testfiles/very_long_event.json +0 -1006
- tests/reportlab_testoutputs/to_delete1.json.pdf +0 -391
- tests/reportlab_testoutputs/to_delete2.json.pdf +0 -506
- tests/reportlab_testoutputs/to_delete3.json.pdf +0 -277
- tests/search_index_result.json +0 -69
- tests/sharing_groups.json +0 -98
- tests/stix1.xml-utf8 +0 -110
- tests/stix2.json +0 -1
- tests/test_analyst_data.py +0 -123
- tests/test_emailobject.py +0 -157
- tests/test_fileobject.py +0 -20
- tests/test_mispevent.py +0 -473
- tests/test_reportlab.py +0 -431
- tests/testlive_comprehensive.py +0 -3734
- tests/testlive_sync.py +0 -474
- {pymisp-2.5.7.dist-info → pymisp-2.5.7.1.dist-info}/LICENSE +0 -0
- {pymisp-2.5.7.dist-info → pymisp-2.5.7.1.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
|
|
File without changes
|