mirror of https://github.com/CIRCL/AIL-framework
chg: [api] get chat/subchannel/thread messages
parent
c22d2982fb
commit
ad039e4720
|
@ -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':
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue