Merge branch 'master' of github.com:MISP/PyMISP

pull/418/head
Raphaël Vinot 2019-07-04 16:57:15 +02:00
commit b8b384a3c3
3 changed files with 37 additions and 3 deletions

View File

@ -17,7 +17,7 @@ import zipfile
from . import __version__, deprecated from . import __version__, deprecated
from .exceptions import PyMISPError, SearchError, NoURL, NoKey, PyMISPEmptyResponse from .exceptions import PyMISPError, SearchError, NoURL, NoKey, PyMISPEmptyResponse
from .mispevent import MISPEvent, MISPAttribute, MISPUser, MISPOrganisation, MISPSighting, MISPFeed, MISPObject from .mispevent import MISPEvent, MISPAttribute, MISPUser, MISPOrganisation, MISPSighting, MISPFeed, MISPObject, MISPSharingGroup
from .abstract import AbstractMISP, MISPEncode from .abstract import AbstractMISP, MISPEncode
logger = logging.getLogger('pymisp') logger = logging.getLogger('pymisp')
@ -2241,6 +2241,20 @@ class PyMISP(object):
# ###################### # ######################
# ### Sharing Groups ### # ### Sharing Groups ###
# ###################### # ######################
def add_sharing_group(self, name, releasability, description, active=True):
"""Add a new sharing group, which includes the organisation associated
with the API key and the local server
:name: The name of the sharing group to create
:releasability: The releasibility information
:description: The description of the sharing group
:active: Should the sharing group be set to be active?
"""
new_sg = MISPSharingGroup()
new_sg.from_dict(name=name, releasability=releasability,
description=description, active=active)
return self._rest_add('sharing_groups', new_sg)
def sharing_group_org_add(self, sharing_group, organisation, extend=False): def sharing_group_org_add(self, sharing_group, organisation, extend=False):
'''Add an organisation to a sharing group. '''Add an organisation to a sharing group.
@ -2284,6 +2298,12 @@ class PyMISP(object):
response = self._prepare_request('POST', url, json.dumps(to_jsonify)) response = self._prepare_request('POST', url, json.dumps(to_jsonify))
return self._check_response(response) return self._check_response(response)
def delete_sharing_group(self, sharing_group):
"""Delete a sharing group
:sharing_group: Sharing group's local instance ID, or Sharing group's global uuid
"""
return self._rest_delete("sharing_groups", sharing_group)
# ################### # ###################
# ### Objects ### # ### Objects ###
# ################### # ###################

View File

@ -1176,3 +1176,12 @@ class MISPObject(AbstractMISP):
if hasattr(self, 'name'): if hasattr(self, 'name'):
return '<{self.__class__.__name__}(name={self.name})'.format(self=self) return '<{self.__class__.__name__}(name={self.name})'.format(self=self)
return '<{self.__class__.__name__}(NotInitialized)'.format(self=self) return '<{self.__class__.__name__}(NotInitialized)'.format(self=self)
class MISPSharingGroup(AbstractMISP):
def __init__(self):
super(MISPSharingGroup, self).__init__()
def from_dict(self, **kwargs):
super(MISPSharingGroup, self).from_dict(**kwargs)

View File

@ -100,7 +100,7 @@ iocMispMapping = {
'RouteEntryItem/Destination': {'type': 'ip-dst'}, 'RouteEntryItem/Destination': {'type': 'ip-dst'},
'RouteEntryItem/Destination/IP': {'type': 'ip-dst', 'comment': 'RouteDestination. '}, 'RouteEntryItem/Destination/IP': {'type': 'ip-dst', 'comment': 'RouteDestination. '},
'RouteEntryItem/Destination/string': {'type': 'url', 'comment': 'RouteDestination. '}, 'RouteEntryItem/Destination/string': {'type': 'hostname', 'comment': 'RouteDestination. '},
'ServiceItem/name': {'type': 'windows-service-name'}, 'ServiceItem/name': {'type': 'windows-service-name'},
@ -218,7 +218,12 @@ def set_values(value1, value2=None):
compositeMapping = '{}|{}'.format(value1.find('context')['search'], value2.find('context')['search']) compositeMapping = '{}|{}'.format(value1.find('context')['search'], value2.find('context')['search'])
mapping = get_mapping(compositeMapping, mappingDict=iocMispCompositeMapping) mapping = get_mapping(compositeMapping, mappingDict=iocMispCompositeMapping)
else: else:
mapping = get_mapping(value1.find('context')['search']) context_search = value1.find('context')['search']
content_type = value1.find('content').get('type', None)
if "RouteEntryItem/Destination" in context_search and content_type:
mapping = get_mapping(context_search + '/' + content_type)
else:
mapping = get_mapping(context_search)
if mapping: if mapping:
attribute_values.update(mapping) attribute_values.update(mapping)