From 029f96e0b4fe3270ab81206b2e8ab92dc4981526 Mon Sep 17 00:00:00 2001 From: Ivan Kudinov Date: Wed, 25 Sep 2024 17:22:34 +0300 Subject: [PATCH] Add antimalware check --- backend/.DS_Store | Bin 0 -> 6148 bytes backend/app/bot/rpc/methods.py | 21 +++++++++++ backend/app/resources/example_files/eicar.com | 1 + backend/app/resources/example_files/logo.png | Bin 0 -> 40363 bytes backend/app/services/answers.py | 15 ++++++++ backend/app/services/ui_elements.py | 1 + .../modules/antimalware/AntimalwarePage.tsx | 33 +++++++++++++++++ .../modules/antimalware/antimalware.store.ts | 35 ++++++++++++++++++ .../modules/features-list/ClientFeatures.tsx | 4 ++ .../features-list/FeaturesListPage.tsx | 2 + .../send-bot-command/SendBotCommandPage.tsx | 2 +- frontend/app/store/rootStore.ts | 3 ++ frontend/package.json | 2 +- frontend/smartapp-manifest.json | 2 +- 14 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 backend/.DS_Store create mode 100644 backend/app/resources/example_files/eicar.com create mode 100644 backend/app/resources/example_files/logo.png create mode 100644 frontend/app/modules/antimalware/AntimalwarePage.tsx create mode 100644 frontend/app/modules/antimalware/antimalware.store.ts diff --git a/backend/.DS_Store b/backend/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1855c69cc253e3514d97d149e85e168f66be4028 GIT binary patch literal 6148 zcmeH~I}XA?3`A{0fkcy%avKi74OR$FzyvIYIqf#4$mI7QhFYo8^+Vg;}!TM!kPMk^St>SKu2 zy&WuhT}`%Nw2S8Op?PPuDF&v|E?SVlv^p5502LT0&_&+c`M-sKoBszbOsN1B_%j7` zy4h{kc&R*FKVHx3`>fi!!9l+q;q4~?i5 RPCResultResponse[str]: ) return RPCResultResponse(await build_static_image_url(async_file, smartapp)) + + +class GetExampleFileArgs(RPCArgsBaseModel): + file_type: str + +@rpc.feature("get_example_file", name="Example file", ui_elements=[ui_elements.file_type]) +async def get_example_file( + smartapp: SmartApp, rpc_arguments: GetExampleFileArgs +) -> RPCResultResponse[str]: + try: + async_file = await build_example_file_meta(rpc_arguments.file_type, smartapp) + except IndexError: + raise RPCErrorExc( + RPCError( + reason="File type required", + id="ASYNC_FILES_REQUIRED", + ) + ) + + return RPCResultResponse("ok", files=[async_file]) diff --git a/backend/app/resources/example_files/eicar.com b/backend/app/resources/example_files/eicar.com new file mode 100644 index 0000000..a2463df --- /dev/null +++ b/backend/app/resources/example_files/eicar.com @@ -0,0 +1 @@ +X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* \ No newline at end of file diff --git a/backend/app/resources/example_files/logo.png b/backend/app/resources/example_files/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa00d42d4ed436c5d53d8701a185d912cb14188 GIT binary patch literal 40363 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 M8$TjynEl581!}flzyJUM literal 0 HcmV?d00001 diff --git a/backend/app/services/answers.py b/backend/app/services/answers.py index eab9e2f..6a95071 100644 --- a/backend/app/services/answers.py +++ b/backend/app/services/answers.py @@ -2,6 +2,7 @@ from typing import Any, Dict from aiofiles.tempfile import SpooledTemporaryFile +from aiofiles.threadpool import open as aioopen from pybotx import File, Image, UserFromSearch from pybotx_smartapp_rpc import SmartApp @@ -67,3 +68,17 @@ async def build_static_image_url(image_file: Image, smartapp: SmartApp) -> str: ) return link + + +async def build_example_file_meta(file_type: str, smartapp: SmartApp) -> str: + filename = "./app/resources/example_files/eicar.com" if file_type == "infected" else "./app/resources/example_files/logo.png" + + async with aioopen(filename, mode="rb") as file: + file = await smartapp.bot.upload_file( + bot_id=smartapp.bot_id, + chat_id=smartapp.chat_id, + async_buffer=file, + filename=filename, + ) + + return file diff --git a/backend/app/services/ui_elements.py b/backend/app/services/ui_elements.py index 0c06b66..e31f459 100644 --- a/backend/app/services/ui_elements.py +++ b/backend/app/services/ui_elements.py @@ -10,3 +10,4 @@ file_picker = UIElement(id="file", type=UIElementTypes.FILE_PICKER, label="File") files_picker = UIElement(id="files", type=UIElementTypes.FILE_PICKER, label="Files") huids_input = UIElement(id="huids", type=UIElementTypes.ARRAY_UUID, label="Huids") +file_type = UIElement(id="file_type", type=UIElementTypes.INPUT_TEXT, label="File type") diff --git a/frontend/app/modules/antimalware/AntimalwarePage.tsx b/frontend/app/modules/antimalware/AntimalwarePage.tsx new file mode 100644 index 0000000..718a0ca --- /dev/null +++ b/frontend/app/modules/antimalware/AntimalwarePage.tsx @@ -0,0 +1,33 @@ +import React, { FC } from 'react' +import { observer } from 'mobx-react' +import styled from 'styled-components' +import { useStore } from '../../hooks/useStore' +import FeatureHeader from '../../components/FeatureHeader' +import Button from '../../components/Button' +import FeaturePage from '../../components/FeaturePage' + +const Buttons = styled.div` + display: flex; + justify-content: space-between; +` + +const AntimalwarePage: FC = () => { + const { antimalwareStore: store } = useStore() + + const handleOpenRegularFile = () => store.openFile(false) + + const handleOpenInfectedFile = () => store.openFile(true) + + return ( + + + Открыть файл + +