chg: [api] get chat/subchannel/thread messages

lang
terrtia 2024-02-29 16:18:22 +01:00
parent c22d2982fb
commit ad039e4720
No known key found for this signature in database
GPG Key ID: 1E1B1F50D84613D0
5 changed files with 42 additions and 10 deletions

View File

@ -57,6 +57,8 @@ def get_object_all_subtypes(obj_type): # TODO Dynamic subtype
return r_object.smembers(f'all_chat:subtypes') return r_object.smembers(f'all_chat:subtypes')
if obj_type == 'chat-subchannel': if obj_type == 'chat-subchannel':
return r_object.smembers(f'all_chat-subchannel:subtypes') return r_object.smembers(f'all_chat-subchannel:subtypes')
if obj_type == 'chat-thread':
return r_object.smembers(f'all_chat-thread:subtypes')
if obj_type == 'cryptocurrency': if obj_type == 'cryptocurrency':
return ['bitcoin', 'bitcoin-cash', 'dash', 'ethereum', 'litecoin', 'monero', 'zcash'] return ['bitcoin', 'bitcoin-cash', 'dash', 'ethereum', 'litecoin', 'monero', 'zcash']
if obj_type == 'pgp': if obj_type == 'pgp':

View File

@ -420,7 +420,7 @@ def api_get_user_account(user_id, instance_uuid, translation_target=None):
meta = user_account.get_meta({'chats', 'icon', 'info', 'subchannels', 'threads', 'translation', 'username', 'username_meta'}, translation_target=translation_target) meta = user_account.get_meta({'chats', 'icon', 'info', 'subchannels', 'threads', 'translation', 'username', 'username_meta'}, translation_target=translation_target)
return meta, 200 return meta, 200
def api_download_chat(chat_id, subtype): def api_chat_messages(subtype, chat_id):
chat = Chats.Chat(chat_id, subtype) chat = Chats.Chat(chat_id, subtype)
if not chat.exists(): if not chat.exists():
return {"status": "error", "reason": "Unknown chat"}, 404 return {"status": "error", "reason": "Unknown chat"}, 404
@ -434,7 +434,7 @@ def api_download_chat(chat_id, subtype):
meta['messages'], _, _ = chat.get_messages(nb=-1, options=options) meta['messages'], _, _ = chat.get_messages(nb=-1, options=options)
return meta, 200 return meta, 200
def api_download_subchannel(subchannel_id, subtype): def api_subchannel_messages(subtype, subchannel_id):
subchannel = ChatSubChannels.ChatSubChannel(subchannel_id, subtype) subchannel = ChatSubChannels.ChatSubChannel(subchannel_id, subtype)
if not subchannel.exists(): if not subchannel.exists():
return {"status": "error", "reason": "Unknown subchannel"}, 404 return {"status": "error", "reason": "Unknown subchannel"}, 404
@ -450,7 +450,7 @@ def api_download_subchannel(subchannel_id, subtype):
meta['messages'], _, _ = subchannel.get_messages(nb=-1, options=options) meta['messages'], _, _ = subchannel.get_messages(nb=-1, options=options)
return meta, 200 return meta, 200
def api_download_thread(thread_id, subtype): def api_thread_messages(subtype, thread_id):
thread = ChatThreads.ChatThread(thread_id, subtype) thread = ChatThreads.ChatThread(thread_id, subtype)
if not thread.exists(): if not thread.exists():
return {"status": "error", "reason": "Unknown thread"}, 404 return {"status": "error", "reason": "Unknown thread"}, 404

View File

@ -128,12 +128,12 @@ def api_get_object(obj_type, obj_subtype, obj_id):
if not is_valid_object_type(obj_type): if not is_valid_object_type(obj_type):
return {'status': 'error', 'reason': 'Invalid object type'}, 400 return {'status': 'error', 'reason': 'Invalid object type'}, 400
if obj_subtype: if obj_subtype:
if not is_valid_object_subtype(obj_type, subtype): if not is_valid_object_subtype(obj_type, obj_subtype):
return {'status': 'error', 'reason': 'Invalid object subtype'}, 400 return {'status': 'error', 'reason': 'Invalid object subtype'}, 400
obj = get_object(obj_type, obj_subtype, obj_id) obj = get_object(obj_type, obj_subtype, obj_id)
if not obj.exists(): if not obj.exists():
return {'status': 'error', 'reason': 'Object Not Found'}, 404 return {'status': 'error', 'reason': 'Object Not Found'}, 404
options = {'chat', 'content', 'files-names', 'images', 'parent', 'parent_meta', 'reactions', 'thread', 'user-account'} options = {'chat', 'content', 'created_at', 'files-names', 'icon', 'images', 'info', 'nb_participants', 'parent', 'parent_meta', 'reactions', 'thread', 'user-account', 'username', 'subchannels', 'threads'}
return obj.get_meta(options=options), 200 return obj.get_meta(options=options), 200

View File

@ -20,6 +20,7 @@ from lib import ail_api
from lib import ail_core from lib import ail_core
from lib import ail_updates from lib import ail_updates
from lib import crawlers from lib import crawlers
from lib import chats_viewer
from lib import Investigations from lib import Investigations
from lib import Tag from lib import Tag
@ -179,18 +180,46 @@ def v1_object_type_id(object_type, object_id):
r = ail_objects.api_get_object_type_id(object_type, object_id) r = ail_objects.api_get_object_type_id(object_type, object_id)
return create_json_response(r[0], r[1]) return create_json_response(r[0], r[1])
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # CHATS # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@api_rest.route("api/v1/chat/messages", methods=['GET'])
@token_required('analyst')
def objects_chat_messages():
obj_subtype = request.args.get('subtype')
obj_id = request.args.get('id')
r = chats_viewer.api_chat_messages(obj_subtype, obj_id)
return create_json_response(r[0], r[1])
@api_rest.route("api/v1/chat-subchannel/messages", methods=['GET'])
@token_required('analyst')
def objects_chat_subchannel_messages():
obj_subtype = request.args.get('subtype')
obj_id = request.args.get('id')
r = chats_viewer.api_subchannel_messages(obj_subtype, obj_id)
return create_json_response(r[0], r[1])
@api_rest.route("api/v1/chat-thread/messages", methods=['GET'])
@token_required('analyst')
def objects_chat_thread_messages():
obj_subtype = request.args.get('subtype')
obj_id = request.args.get('id')
r = chats_viewer.api_thread_messages(obj_subtype, obj_id)
return create_json_response(r[0], r[1])
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # TITLES # # # # # # # # # # # # # # # # # # # TODO TO REVIEW # # # # # # # # # # # # # # # TITLES # # # # # # # # # # # # # # # # # # # TODO TO REVIEW
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@api_rest.route("api/v1/titles/download", methods=['GET']) @api_rest.route("api/v1/titles/download", methods=['GET']) # TODO RENAME ->api/v1/titles/domains
@token_required('analyst') @token_required('analyst')
def objects_titles_download(): def objects_titles_download():
return create_json_response(Titles.Titles().get_contents_ids(), 200) return create_json_response(Titles.Titles().get_contents_ids(), 200)
# TODO # TODO
@api_rest.route("api/v1/titles/download/unsafe", methods=['GET']) # TODO REFACTOR ME @api_rest.route("api/v1/titles/download/unsafe", methods=['GET']) # TODO RENAME ->api/v1/titles/domains/unsafe
@token_required('analyst') @token_required('analyst')
def objects_titles_download_unsafe(): def objects_titles_download_unsafe():
all_titles = {} all_titles = {}
@ -212,6 +241,7 @@ def objects_titles_download_unsafe():
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # INVESTIGATIONS # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # INVESTIGATIONS # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@api_rest.route("api/v1/investigation/<investigation_uuid>", methods=['GET']) # TODO options @api_rest.route("api/v1/investigation/<investigation_uuid>", methods=['GET']) # TODO options
@token_required('read_only') @token_required('read_only')
def v1_investigation(investigation_uuid): def v1_investigation(investigation_uuid):

View File

@ -165,7 +165,7 @@ def chats_explorer_chat_participants():
def chats_explorer_chat_download(): def chats_explorer_chat_download():
chat_id = request.args.get('id') chat_id = request.args.get('id')
chat_subtype = request.args.get('uuid') chat_subtype = request.args.get('uuid')
chat = chats_viewer.api_download_chat(chat_id, chat_subtype) chat = chats_viewer.api_chat_messages(chat_subtype, chat_id)
if chat[1] != 200: if chat[1] != 200:
if chat[1] == 404: if chat[1] == 404:
abort(404) abort(404)
@ -180,7 +180,7 @@ def chats_explorer_chat_download():
def objects_subchannel_messages_download(): def objects_subchannel_messages_download():
subchannel_id = request.args.get('id') subchannel_id = request.args.get('id')
instance_uuid = request.args.get('uuid') instance_uuid = request.args.get('uuid')
subchannel = chats_viewer.api_download_subchannel(subchannel_id, instance_uuid) subchannel = chats_viewer.api_subchannel_messages(instance_uuid, subchannel_id)
if subchannel[1] != 200: if subchannel[1] != 200:
return create_json_response(subchannel[0], subchannel[1]) return create_json_response(subchannel[0], subchannel[1])
else: else:
@ -193,7 +193,7 @@ def objects_subchannel_messages_download():
def objects_thread_messages_download(): def objects_thread_messages_download():
thread_id = request.args.get('id') thread_id = request.args.get('id')
instance_uuid = request.args.get('uuid') instance_uuid = request.args.get('uuid')
thread = chats_viewer.api_download_thread(thread_id, instance_uuid) thread = chats_viewer.api_thread_messages(instance_uuid, thread_id)
if thread[1] != 200: if thread[1] != 200:
return create_json_response(thread[0], thread[1]) return create_json_response(thread[0], thread[1])
else: else: