2023-11-02 16:28:33 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*-coding:UTF-8 -*
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
from flask import url_for
|
|
|
|
# from pymisp import MISPObject
|
|
|
|
|
|
|
|
sys.path.append(os.environ['AIL_BIN'])
|
|
|
|
##################################
|
|
|
|
# Import Project packages
|
|
|
|
##################################
|
|
|
|
from lib import ail_core
|
|
|
|
from lib.ConfigLoader import ConfigLoader
|
2023-11-29 16:28:25 +01:00
|
|
|
from lib.objects.abstract_chat_object import AbstractChatObject, AbstractChatObjects
|
2023-11-02 16:28:33 +01:00
|
|
|
|
|
|
|
|
|
|
|
config_loader = ConfigLoader()
|
|
|
|
baseurl = config_loader.get_config_str("Notifications", "ail_domain")
|
|
|
|
r_object = config_loader.get_db_conn("Kvrocks_Objects")
|
|
|
|
r_cache = config_loader.get_redis_conn("Redis_Cache")
|
|
|
|
config_loader = None
|
|
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
################################################################################
|
|
|
|
################################################################################
|
|
|
|
|
2023-11-29 16:28:25 +01:00
|
|
|
class ChatThread(AbstractChatObject):
|
2023-11-02 16:28:33 +01:00
|
|
|
"""
|
|
|
|
AIL Chat Object. (strings)
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, id, subtype):
|
2023-11-29 16:28:25 +01:00
|
|
|
super().__init__('chat-thread', id, subtype)
|
2023-11-02 16:28:33 +01:00
|
|
|
|
|
|
|
# def get_ail_2_ail_payload(self):
|
|
|
|
# payload = {'raw': self.get_gzip_content(b64=True),
|
|
|
|
# 'compress': 'gzip'}
|
|
|
|
# return payload
|
|
|
|
|
|
|
|
# # WARNING: UNCLEAN DELETE /!\ TEST ONLY /!\
|
|
|
|
def delete(self):
|
|
|
|
# # TODO:
|
|
|
|
pass
|
|
|
|
|
|
|
|
def get_link(self, flask_context=False):
|
|
|
|
if flask_context:
|
|
|
|
url = url_for('correlation.show_correlation', type=self.type, subtype=self.subtype, id=self.id)
|
|
|
|
else:
|
|
|
|
url = f'{baseurl}/correlation/show?type={self.type}&subtype={self.subtype}&id={self.id}'
|
|
|
|
return url
|
|
|
|
|
|
|
|
def get_svg_icon(self): # TODO
|
|
|
|
# if self.subtype == 'telegram':
|
|
|
|
# style = 'fab'
|
|
|
|
# icon = '\uf2c6'
|
|
|
|
# elif self.subtype == 'discord':
|
|
|
|
# style = 'fab'
|
|
|
|
# icon = '\uf099'
|
|
|
|
# else:
|
|
|
|
# style = 'fas'
|
|
|
|
# icon = '\uf007'
|
|
|
|
style = 'fas'
|
2023-11-29 16:28:25 +01:00
|
|
|
icon = '\uf7a4'
|
2023-11-02 16:28:33 +01:00
|
|
|
return {'style': style, 'icon': icon, 'color': '#4dffff', 'radius': 5}
|
|
|
|
|
|
|
|
def get_meta(self, options=set()):
|
|
|
|
meta = self._get_meta(options=options)
|
|
|
|
meta['id'] = self.id
|
|
|
|
meta['subtype'] = self.subtype
|
|
|
|
meta['tags'] = self.get_tags(r_list=True)
|
2023-12-04 10:26:02 +01:00
|
|
|
if 'name':
|
|
|
|
meta['name'] = self.get_name()
|
2023-11-29 16:28:25 +01:00
|
|
|
if 'nb_messages':
|
|
|
|
meta['nb_messages'] = self.get_nb_messages()
|
2023-12-06 16:26:26 +01:00
|
|
|
if 'participants':
|
|
|
|
meta['participants'] = self.get_participants()
|
|
|
|
if 'nb_participants':
|
|
|
|
meta['nb_participants'] = self.get_nb_participants()
|
2023-11-29 16:28:25 +01:00
|
|
|
# created_at ???
|
2023-11-02 16:28:33 +01:00
|
|
|
return meta
|
|
|
|
|
|
|
|
def get_misp_object(self):
|
|
|
|
return
|
|
|
|
|
2023-11-29 16:28:25 +01:00
|
|
|
def create(self, container_obj, message_id):
|
|
|
|
if message_id:
|
|
|
|
parent_message = container_obj.get_obj_by_message_id(message_id)
|
|
|
|
if parent_message: # TODO EXCEPTION IF DON'T EXISTS
|
|
|
|
self.set_parent(obj_global_id=parent_message)
|
|
|
|
_, _, parent_id = parent_message.split(':', 2)
|
|
|
|
self.add_correlation('message', '', parent_id)
|
|
|
|
else:
|
|
|
|
self.set_parent(obj_global_id=container_obj.get_global_id())
|
|
|
|
self.add_correlation(container_obj.get_type(), container_obj.get_subtype(r_str=True), container_obj.get_id())
|
|
|
|
|
|
|
|
def create(thread_id, chat_instance, chat_id, subchannel_id, message_id, container_obj):
|
|
|
|
if container_obj.get_type() == 'chat':
|
|
|
|
new_thread_id = f'{chat_id}/{thread_id}'
|
|
|
|
# sub-channel
|
|
|
|
else:
|
|
|
|
new_thread_id = f'{chat_id}/{subchannel_id}/{thread_id}'
|
|
|
|
|
|
|
|
thread = ChatThread(new_thread_id, chat_instance)
|
2024-02-06 11:13:45 +01:00
|
|
|
if not thread.is_children():
|
2023-11-29 16:28:25 +01:00
|
|
|
thread.create(container_obj, message_id)
|
|
|
|
return thread
|
|
|
|
|
|
|
|
class ChatThreads(AbstractChatObjects):
|
|
|
|
def __init__(self):
|
|
|
|
super().__init__('chat-thread')
|
|
|
|
|
|
|
|
# if __name__ == '__main__':
|
|
|
|
# chat = Chat('test', 'telegram')
|
|
|
|
# r = chat.get_messages()
|
|
|
|
# print(r)
|