From 7ab5fde6427e9fa11094eb3468e2c48c34b0834a Mon Sep 17 00:00:00 2001 From: Paul Hutelmyer Date: Fri, 19 Apr 2024 09:00:09 -0400 Subject: [PATCH 1/6] Adding Backend VirusTotal Augment Route --- app/blueprints/strelka.py | 46 ++++++++++++++++++++++++++++++++++++++ app/services/virustotal.py | 33 +++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/app/blueprints/strelka.py b/app/blueprints/strelka.py index 9a5e575..56478a6 100644 --- a/app/blueprints/strelka.py +++ b/app/blueprints/strelka.py @@ -18,6 +18,7 @@ get_virustotal_positives, create_vt_zip_and_download, download_vt_bytes, + get_virustotal_widget_url, ) from services.insights import get_insights @@ -731,6 +732,51 @@ def get_mime_type_stats(user: User) -> Tuple[Response, int]: return jsonify(stats), 200 +@strelka.route("/virustotal/widget-url", methods=["POST"]) +@auth_required +def get_vt_widget_url(resource: str) -> Tuple[Response, int]: + """ + Route to get a VirusTotal widget url with customized theme colors. + + Returns: + A JSON response containing the VirusTotal widget url or an error message. + """ + data = request.get_json() + if not data or "resource" not in data: + return jsonify({"error": "Resource identifier is required"}), 400 + + # Strelka UI Defaults + fg1 = data.get("fg1", "333333") # Dark text color + bg1 = data.get("bg1", "FFFFFF") # Light background color + bg2 = data.get("bg2", "F5F5F5") # Slightly grey background for differentiation + bd1 = data.get("bd1", "E8E8E8") # Light grey border color + + api_key = os.getenv("VIRUSTOTAL_API_KEY") + if not api_key: + return jsonify({"error": "VirusTotal API key is not available."}), 500 + + try: + # Pass the theme colors to the function + widget_url = get_virustotal_widget_url( + api_key, data["resource"], fg1, bg1, bg2, bd1 + ) + return jsonify({"widget_url": widget_url}), 200 + except Exception as e: + return jsonify({"error": str(e)}), 500 + + +@strelka.route("/check_vt_api_key", methods=["GET"]) +def check_vt_api_key(): + """ + Endpoint to check if the VirusTotal API key is available. + + Returns: + A boolean response containing the VirusTotal widget url or an error message. + """ + api_key_exists = bool(os.environ.get("VIRUSTOTAL_API_KEY")) + return jsonify({"apiKeyAvailable": api_key_exists}), 200 + + def submissions_to_json(submission: FileSubmission) -> Dict[str, any]: """ Converts the given submission to a dictionary representation that can be diff --git a/app/services/virustotal.py b/app/services/virustotal.py index 33f4c25..9a05b3e 100644 --- a/app/services/virustotal.py +++ b/app/services/virustotal.py @@ -126,3 +126,36 @@ def download_vt_bytes(api_key: str, file_hash: str) -> BytesIO: error_msg = f"Error downloading file from VirusTotal: {response.text}" logging.error(error_msg) raise Exception(error_msg) + + +def get_virustotal_widget_url( + api_key: str, resource: str, fg1: str, bg1: str, bg2: str, bd1: str +) -> str: + """ + Retrieves a URL for embedding the VirusTotal widget with customized theme colors. + + Args: + api_key (str): The API key for accessing VirusTotal. + resource (str): The resource identifier (file hash, URL, IP, or domain). + fg1 (str): Theme primary foreground color in hex notation. + bg1 (str): Theme primary background color in hex notation. + bg2 (str): Theme secondary background color in hex notation. + bd1 (str): Theme border color. + + Returns: + str: A URL for embedding the VirusTotal widget with the specified theme. + """ + url = f"https://www.virustotal.com/api/v3/widget/url?query={resource}&fg1={fg1}&bg1={bg1}&bg2={bg2}&bd1={bd1}" + headers = {"x-apikey": api_key} + + try: + response = requests.get(url, headers=headers) + response.raise_for_status() + widget_data = response.json() + return widget_data.get("data", {}).get("url", "") + except requests.HTTPError as http_err: + logging.error(f"HTTP error occurred: {http_err}") + raise + except Exception as err: + logging.error(f"An error occurred: {err}") + raise From d99d517cd03b5b8461631ea7b9554998ac662a4c Mon Sep 17 00:00:00 2001 From: Paul Hutelmyer Date: Fri, 19 Apr 2024 09:00:18 -0400 Subject: [PATCH 2/6] Updating Backend Dependencies --- app/poetry.lock | 572 +++++++++++++++++++++++++++++++++++++++------ app/pyproject.toml | 3 +- 2 files changed, 506 insertions(+), 69 deletions(-) diff --git a/app/poetry.lock b/app/poetry.lock index f1ee1ef..df1622c 100644 --- a/app/poetry.lock +++ b/app/poetry.lock @@ -1,5 +1,115 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +[[package]] +name = "aiohttp" +version = "3.9.4" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:76d32588ef7e4a3f3adff1956a0ba96faabbdee58f2407c122dd45aa6e34f372"}, + {file = "aiohttp-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:56181093c10dbc6ceb8a29dfeea1e815e1dfdc020169203d87fd8d37616f73f9"}, + {file = "aiohttp-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7a5b676d3c65e88b3aca41816bf72831898fcd73f0cbb2680e9d88e819d1e4d"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1df528a85fb404899d4207a8d9934cfd6be626e30e5d3a5544a83dbae6d8a7e"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f595db1bceabd71c82e92df212dd9525a8a2c6947d39e3c994c4f27d2fe15b11"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0b09d76e5a4caac3d27752027fbd43dc987b95f3748fad2b924a03fe8632ad"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689eb4356649ec9535b3686200b231876fb4cab4aca54e3bece71d37f50c1d13"}, + {file = "aiohttp-3.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3666cf4182efdb44d73602379a66f5fdfd5da0db5e4520f0ac0dcca644a3497"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b65b0f8747b013570eea2f75726046fa54fa8e0c5db60f3b98dd5d161052004a"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1885d2470955f70dfdd33a02e1749613c5a9c5ab855f6db38e0b9389453dce7"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0593822dcdb9483d41f12041ff7c90d4d1033ec0e880bcfaf102919b715f47f1"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:47f6eb74e1ecb5e19a78f4a4228aa24df7fbab3b62d4a625d3f41194a08bd54f"}, + {file = "aiohttp-3.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c8b04a3dbd54de6ccb7604242fe3ad67f2f3ca558f2d33fe19d4b08d90701a89"}, + {file = "aiohttp-3.9.4-cp310-cp310-win32.whl", hash = "sha256:8a78dfb198a328bfb38e4308ca8167028920fb747ddcf086ce706fbdd23b2926"}, + {file = "aiohttp-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:e78da6b55275987cbc89141a1d8e75f5070e577c482dd48bd9123a76a96f0bbb"}, + {file = "aiohttp-3.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c111b3c69060d2bafc446917534150fd049e7aedd6cbf21ba526a5a97b4402a5"}, + {file = "aiohttp-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efbdd51872cf170093998c87ccdf3cb5993add3559341a8e5708bcb311934c94"}, + {file = "aiohttp-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7bfdb41dc6e85d8535b00d73947548a748e9534e8e4fddd2638109ff3fb081df"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd9d334412961125e9f68d5b73c1d0ab9ea3f74a58a475e6b119f5293eee7ba"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35d78076736f4a668d57ade00c65d30a8ce28719d8a42471b2a06ccd1a2e3063"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:824dff4f9f4d0f59d0fa3577932ee9a20e09edec8a2f813e1d6b9f89ced8293f"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52b8b4e06fc15519019e128abedaeb56412b106ab88b3c452188ca47a25c4093"}, + {file = "aiohttp-3.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eae569fb1e7559d4f3919965617bb39f9e753967fae55ce13454bec2d1c54f09"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:69b97aa5792428f321f72aeb2f118e56893371f27e0b7d05750bcad06fc42ca1"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d79aad0ad4b980663316f26d9a492e8fab2af77c69c0f33780a56843ad2f89e"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:d6577140cd7db19e430661e4b2653680194ea8c22c994bc65b7a19d8ec834403"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:9860d455847cd98eb67897f5957b7cd69fbcb436dd3f06099230f16a66e66f79"}, + {file = "aiohttp-3.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69ff36d3f8f5652994e08bd22f093e11cfd0444cea310f92e01b45a4e46b624e"}, + {file = "aiohttp-3.9.4-cp311-cp311-win32.whl", hash = "sha256:e27d3b5ed2c2013bce66ad67ee57cbf614288bda8cdf426c8d8fe548316f1b5f"}, + {file = "aiohttp-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d6a67e26daa686a6fbdb600a9af8619c80a332556245fa8e86c747d226ab1a1e"}, + {file = "aiohttp-3.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c5ff8ff44825736a4065d8544b43b43ee4c6dd1530f3a08e6c0578a813b0aa35"}, + {file = "aiohttp-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d12a244627eba4e9dc52cbf924edef905ddd6cafc6513849b4876076a6f38b0e"}, + {file = "aiohttp-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dcad56c8d8348e7e468899d2fb3b309b9bc59d94e6db08710555f7436156097f"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7e69a7fd4b5ce419238388e55abd220336bd32212c673ceabc57ccf3d05b55"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4870cb049f10d7680c239b55428916d84158798eb8f353e74fa2c98980dcc0b"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2feaf1b7031ede1bc0880cec4b0776fd347259a723d625357bb4b82f62687b"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939393e8c3f0a5bcd33ef7ace67680c318dc2ae406f15e381c0054dd658397de"}, + {file = "aiohttp-3.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d2334e387b2adcc944680bebcf412743f2caf4eeebd550f67249c1c3696be04"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e0198ea897680e480845ec0ffc5a14e8b694e25b3f104f63676d55bf76a82f1a"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e40d2cd22914d67c84824045861a5bb0fb46586b15dfe4f046c7495bf08306b2"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:aba80e77c227f4234aa34a5ff2b6ff30c5d6a827a91d22ff6b999de9175d71bd"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:fb68dc73bc8ac322d2e392a59a9e396c4f35cb6fdbdd749e139d1d6c985f2527"}, + {file = "aiohttp-3.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f3460a92638dce7e47062cf088d6e7663adb135e936cb117be88d5e6c48c9d53"}, + {file = "aiohttp-3.9.4-cp312-cp312-win32.whl", hash = "sha256:32dc814ddbb254f6170bca198fe307920f6c1308a5492f049f7f63554b88ef36"}, + {file = "aiohttp-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:63f41a909d182d2b78fe3abef557fcc14da50c7852f70ae3be60e83ff64edba5"}, + {file = "aiohttp-3.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c3770365675f6be220032f6609a8fbad994d6dcf3ef7dbcf295c7ee70884c9af"}, + {file = "aiohttp-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:305edae1dea368ce09bcb858cf5a63a064f3bff4767dec6fa60a0cc0e805a1d3"}, + {file = "aiohttp-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f121900131d116e4a93b55ab0d12ad72573f967b100e49086e496a9b24523ea"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b71e614c1ae35c3d62a293b19eface83d5e4d194e3eb2fabb10059d33e6e8cbf"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419f009fa4cfde4d16a7fc070d64f36d70a8d35a90d71aa27670bba2be4fd039"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b39476ee69cfe64061fd77a73bf692c40021f8547cda617a3466530ef63f947"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b33f34c9c7decdb2ab99c74be6443942b730b56d9c5ee48fb7df2c86492f293c"}, + {file = "aiohttp-3.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c78700130ce2dcebb1a8103202ae795be2fa8c9351d0dd22338fe3dac74847d9"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:268ba22d917655d1259af2d5659072b7dc11b4e1dc2cb9662fdd867d75afc6a4"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:17e7c051f53a0d2ebf33013a9cbf020bb4e098c4bc5bce6f7b0c962108d97eab"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7be99f4abb008cb38e144f85f515598f4c2c8932bf11b65add0ff59c9c876d99"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d58a54d6ff08d2547656356eea8572b224e6f9bbc0cf55fa9966bcaac4ddfb10"}, + {file = "aiohttp-3.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7673a76772bda15d0d10d1aa881b7911d0580c980dbd16e59d7ba1422b2d83cd"}, + {file = "aiohttp-3.9.4-cp38-cp38-win32.whl", hash = "sha256:e4370dda04dc8951012f30e1ce7956a0a226ac0714a7b6c389fb2f43f22a250e"}, + {file = "aiohttp-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:eb30c4510a691bb87081192a394fb661860e75ca3896c01c6d186febe7c88530"}, + {file = "aiohttp-3.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:84e90494db7df3be5e056f91412f9fa9e611fbe8ce4aaef70647297f5943b276"}, + {file = "aiohttp-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d4845f8501ab28ebfdbeab980a50a273b415cf69e96e4e674d43d86a464df9d"}, + {file = "aiohttp-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69046cd9a2a17245c4ce3c1f1a4ff8c70c7701ef222fce3d1d8435f09042bba1"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b73a06bafc8dcc508420db43b4dd5850e41e69de99009d0351c4f3007960019"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:418bb0038dfafeac923823c2e63226179976c76f981a2aaad0ad5d51f2229bca"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71a8f241456b6c2668374d5d28398f8e8cdae4cce568aaea54e0f39359cd928d"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:935c369bf8acc2dc26f6eeb5222768aa7c62917c3554f7215f2ead7386b33748"}, + {file = "aiohttp-3.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4e48c8752d14ecfb36d2ebb3d76d614320570e14de0a3aa7a726ff150a03c"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:916b0417aeddf2c8c61291238ce25286f391a6acb6f28005dd9ce282bd6311b6"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9b6787b6d0b3518b2ee4cbeadd24a507756ee703adbac1ab6dc7c4434b8c572a"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:221204dbda5ef350e8db6287937621cf75e85778b296c9c52260b522231940ed"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:10afd99b8251022ddf81eaed1d90f5a988e349ee7d779eb429fb07b670751e8c"}, + {file = "aiohttp-3.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2506d9f7a9b91033201be9ffe7d89c6a54150b0578803cce5cb84a943d075bc3"}, + {file = "aiohttp-3.9.4-cp39-cp39-win32.whl", hash = "sha256:e571fdd9efd65e86c6af2f332e0e95dad259bfe6beb5d15b3c3eca3a6eb5d87b"}, + {file = "aiohttp-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:7d29dd5319d20aa3b7749719ac9685fbd926f71ac8c77b2477272725f882072d"}, + {file = "aiohttp-3.9.4.tar.gz", hash = "sha256:6ff71ede6d9a5a58cfb7b6fffc83ab5d4a63138276c771ac91ceaaddf5459644"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "alembic" version = "1.6.2" @@ -33,6 +143,17 @@ setuptools = ">=20.0" typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} wrapt = ">=1.11,<1.14" +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + [[package]] name = "attrs" version = "21.4.0" @@ -469,6 +590,92 @@ files = [ Flask = ">=0.10" SQLAlchemy = ">=0.8.0" +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + [[package]] name = "greenlet" version = "3.0.3" @@ -657,13 +864,13 @@ setuptools = "*" [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -927,6 +1134,105 @@ files = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + [[package]] name = "mypy-extensions" version = "0.4.3" @@ -1026,70 +1332,80 @@ files = [ [[package]] name = "psycopg2-binary" -version = "2.9.4" +version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "psycopg2-binary-2.9.4.tar.gz", hash = "sha256:a6a2d3d75d8698dee492f4af7ad07606d0734e581edf9e2ce2f74b6fce90f42e"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e72491d72870c3cb2f0d6f4174485533caec0e9ed7e717e2859b7cc7ff2ae1c4"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2903bf90b1e6bfc9bbfc94a1db0b50ffa9830a0ca4c042fbc38d93890c02ce08"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15e0ac0ed8a85f6049e836e95ddee627766561c85be8d23f4b3edb6ddbaa7310"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edf0a66ce9517365c7dcfed597894d8dd1f27b59e550b77a089054101435213b"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:61c6a258469c66412ae8358a0501df6ccb3bb48aa9c43b56624571ff9767f91d"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:704f1fcdc5b606b70563ea696c69bda90caee3a2f45ffc9cee60a901b394a79f"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:30200b07779446760813eef06098ec6d084131e4365b4e023eb43100de758b11"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f5fbb3b325c65010e04af206a9243e2df8606736c510c7f268aca6a93e5294a9"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:52383e932e6de5595963f9178cf2af7b9e1f3daacf5135b9c0e21aabbc5bf7c4"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0d8e0c9eec79fe1ae66691e06e3cc714da6fbd77981209bf32fa823c03dbaff8"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-win32.whl", hash = "sha256:161dc52a617f0bb610a87d391cb2e77fe65b89ebfbd752f4f3217dde701ea196"}, - {file = "psycopg2_binary-2.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:33ac8b4754e6b6b21f3ee180da169d8526d91aee9408ec1fc573c16ab32b0207"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:7751b11cd7f6b952b4b5ec5b93b5be9ce20faba786c18c25c354f5d8717a173c"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b216a15e13f6e763db40ac3beb74b588650bc030d10a78fde182b88d273b82b5"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0eae72190be519bf2629062eab7ac8d4ceec5bd132953cefa1596584d86964fe"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:fb639a0e65dce4a9cccbcbdd8ddd0c8c6ab10bca317b827a5c52ac3c3a4ad60a"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:80ed219ce6cb21a5b53ead0edf5b56b6d23de4cb95389ac606f47670474f4816"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f78cafa25731e0b5aa16fe20bea1abf643d4e853f6bfb8a64421b06b878e2b88"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:34fd249275faa782c3a2016e86ac2330636ac58d731a1580e7d686e3976b9536"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:24d627ed69e754c48dd142a914124858c600b4108c92546eb0ba822e63c0c6e2"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:65d5f4e70a2d3fbaa1349236968792611088f3f2dccead36c1626e1d183cc327"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-win32.whl", hash = "sha256:ae5b41dbf7731b838021923edfbe3b5ccdec84d92d5795f5229c0d08d32509d9"}, - {file = "psycopg2_binary-2.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:97e4f3d9b17d12e7c00cb1c29c0040044135cd5146838da4274615dbe0baae78"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:8660112e9127a019969a23c878e1b4a419e8a6427f9a9050c19830f152628c8a"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea8d5cd689fa7225d81ae0a049ba03e0165f4ed9ca083b19a405be9ad0b36845"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63edc507f8cbfbb5903adb75bad8a99f9798981c854df9119dbebab2ec3ee0e1"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:25e0517ad7ee3c5c3c69dbe3c1d95504c811e42f452b39a3505d0763b1f6caa0"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:0a9465f0aa36480c8e7614991cbe8ca8aa16b0517c5398a49648ce345e446c19"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aff258af03dda9a990960a53759d10c3a9b936837c71fe2f3b581acd356b9121"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:576b9dfbcd154a0e8b5d9dae6316d037450e64a3b31df87dec71d88e2a2d5e5f"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:044b6ab68613de7ea1e63856627deea091bfea09dea5ab4f050b13250fd18cab"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7b47643c45e7619788c081d42e1d9d98c7c8a4933010a9967d097cc3c4c29f41"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-win32.whl", hash = "sha256:82df4a8600999c4c0cb7d6614df1bbdb3c74732f63e79f78487893ffbed3d083"}, - {file = "psycopg2_binary-2.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:8d7bc25729bb6d96b44f49ad78fde0e27a1a867cb205322b7e5f5b49e04d6f1f"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:2f1ded23d17af0d738e7e78087f0b88a53228887845b1989b03af4dfd3fef703"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f225784812b2b57d340f2eb0d2cebef989dcc82c288f5553e28ee9767c7c8344"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89a86c2b35460700d04b4d6461153ab39ee85af5a5385acac9563a8310e6320a"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a3010d566a48b919490a982f6807f68842686941dc12d568e129d9cd7703d6"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:02cde837df012fa5d579b9cf4bc8e1feb460f38d61f7a4ab4a919d55a9f6eeef"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:226f11be577b70a57f4910c0ee28591d4d9fcb3d455e966267179156ae2e0c41"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:181ac372a5a5308b4076933601a9b5f0cd139b389b0aa5e164786a2abbcdb978"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5f27b1d1b56470385faa2b2636fcb823e7ac5b5b734e0aa76b14637c66eb3b7"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:55137faec669c4277c5687c6ce7c1fbc4dece0e2f14256ee808f4a652f0a2170"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ffb2f288f577a748cc23c65a818290755a4c2da1f87a40d7055b61a096d31e20"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-win32.whl", hash = "sha256:451550e0bb5889bbabbf92575a6d6eafced941cc28c86be6ae4667f81bf32d67"}, - {file = "psycopg2_binary-2.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:b23b25b1243576b952689966205ef7d4285688068b966a1ca0e620bcb390d483"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:7ad9d032dc1a31a86ca7b059f43554a049a2bfda8fe32d1492ad25f6686aff03"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7b01d07006a0ac2216921b69a220b9f0974345d0b1b36efaeabdc7550b1cc4f8"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb5341fc7c53fdd95ac2415be77b1de854ab266488cff71174ebb007baf0e675"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a431deb6ffdfa551f7400b3a94fa4b964837e67f49e3c37aa26d90dc75970816"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:d6ba33f39436191ece7ea2b3d0b4dff00af71acd5c6e6f1d6b7563aa7286e9f2"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:d6c5e1df6f427d7a82606cf8f07cf3ba9fb3f366804b01e65f1f00f8df6b54f1"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1c22c59ab7d9dc110d409445f111f58556bf699b0548f3fc5176684a29c629c4"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b896637091cde69d170a89253dde9aee814b25ca204b7e213fd0a6462e666638"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2535f44b00f26f6af0e949c825e6aecb9adcb56c965c17af5b97137fb69f00c0"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6a1618260a112a9c93504511f0b6254b4402a8c41b7130dc6d4c9e39aff3aa0c"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-win32.whl", hash = "sha256:e02f77b620ad6b36564fe41980865436912e21a3b1138cdde175cf24afde1bc5"}, - {file = "psycopg2_binary-2.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:44f5dc9b4384bafca8429759ce76c8960ffc2b583fcad9e5dfb3e5f4894269e4"}, + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, ] [[package]] @@ -1394,6 +1710,23 @@ brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotl secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "vt-py" +version = "0.18.0" +description = "The official Python client library for VirusTotal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "vt-py-0.18.0.tar.gz", hash = "sha256:aa1d481e85028bd2134ee6fb8885efb73256c659e2a125d7772fe68c2b0c7f6f"}, + {file = "vt_py-0.18.0-py3-none-any.whl", hash = "sha256:a2cfaf523e906e6f0d833ffa627858ed9fdfa22ed27dc99d9bb46a2a4fe0c2f0"}, +] + +[package.dependencies] +aiohttp = "*" + +[package.extras] +test = ["pytest", "pytest-asyncio", "pytest-httpserver"] + [[package]] name = "waitress" version = "2.1.2" @@ -1411,13 +1744,13 @@ testing = ["coverage (>=5.0)", "pytest", "pytest-cover"] [[package]] name = "werkzeug" -version = "3.0.1" +version = "3.0.2" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, + {file = "werkzeug-3.0.2-py3-none-any.whl", hash = "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795"}, + {file = "werkzeug-3.0.2.tar.gz", hash = "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d"}, ] [package.dependencies] @@ -1486,6 +1819,109 @@ files = [ {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, ] +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zipp" version = "3.18.1" @@ -1504,4 +1940,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "d04dc96b10c31dd81e260179925e840b3870e3582894b265b39c9bf1941e7891" +content-hash = "c8449b4e368f10a87cde03e14a770c41b18e9e9f2a05c057f27e1619622426e6" diff --git a/app/pyproject.toml b/app/pyproject.toml index 1e0a73a..7942f54 100644 --- a/app/pyproject.toml +++ b/app/pyproject.toml @@ -37,7 +37,7 @@ Pathspec = "0.9.0" Paste = "3.5.2" Platformdirs = "2.4.1" Protobuf = "3.18.3" -Psycopg2-Binary = "2.9.4" +Psycopg2-Binary = "2.9.9" Pyasn1 = "0.4.8" PyJWT = "2.4.0" PyOpenSSL = "20.0.1" @@ -56,6 +56,7 @@ Typing-Extensions = "4.0.1" Urllib3 = "1.26.18" Waitress = "2.1.2" Wrapt = "1.13.3" +vt-py = "0.18.0" [tool.poetry.dev-dependencies] From eee5c37aad4273b679ba23fc3dd6980b9ca37b16 Mon Sep 17 00:00:00 2001 From: Paul Hutelmyer Date: Fri, 19 Apr 2024 09:37:01 -0400 Subject: [PATCH 3/6] Updating dependencies --- ui/package.json | 6 +- ui/yarn.lock | 494 ++++++++++++++++++++++++++++-------------------- 2 files changed, 287 insertions(+), 213 deletions(-) diff --git a/ui/package.json b/ui/package.json index 00e94a2..fabe6c3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -4,13 +4,13 @@ "private": true, "homepage": "/", "dependencies": { - "@ant-design/pro-form": "^2.23.1", - "@ant-design/pro-layout": "^7.17.16", + "@ant-design/pro-form": "^2.25.1", + "@ant-design/pro-layout": "^7.19.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^13.5.0", "ansi-regex": "^6.0.1", - "antd": "^5.3.0", + "antd": "^5.16.1", "browserslist": "^4.20.4", "chroma-js": "^2.4.2", "css-what": "^5.1.0", diff --git a/ui/yarn.lock b/ui/yarn.lock index e2222bd..202732c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -22,7 +22,14 @@ dependencies: "@ctrl/tinycolor" "^3.4.0" -"@ant-design/cssinjs@^1.11.1", "@ant-design/cssinjs@^1.18.1": +"@ant-design/colors@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.0.2.tgz#c5c753a467ce8d86ba7ca4736d2c01f599bb5492" + integrity sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg== + dependencies: + "@ctrl/tinycolor" "^3.6.1" + +"@ant-design/cssinjs@^1.11.1": version "1.18.1" resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.18.1.tgz#ebb0aa28c751ce2203f149554d4a09b2c09174c0" integrity sha512-1JURAPrsjK1GwpqByTq3bJ7nF7lbMKDZpehqeR2n8/IR5O58/W1U4VcOeaw5ZyTHri3tEMcom7dyP2tvxpW54g== @@ -35,12 +42,30 @@ rc-util "^5.35.0" stylis "^4.0.13" +"@ant-design/cssinjs@^1.18.5": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.19.1.tgz#d3bb4f58ee884c9c757688e611e7a6de9867ea75" + integrity sha512-hgQ3wiys3X0sqDKWkqCJ6EYdF79i9JCvtavmIGwuuPUKmoJXV8Ff0sY+yQQSxk2dRmMyam/bYKo/Bwor45hnZw== + dependencies: + "@babel/runtime" "^7.11.1" + "@emotion/hash" "^0.8.0" + "@emotion/unitless" "^0.7.5" + classnames "^2.3.1" + csstype "^3.1.3" + rc-util "^5.35.0" + stylis "^4.0.13" + "@ant-design/icons-svg@^4.3.0": version "4.3.1" resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz#4b2f65a17d4d32b526baa6414aca2117382bf8da" integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== -"@ant-design/icons@^5.0.0", "@ant-design/icons@^5.2.6": +"@ant-design/icons-svg@^4.4.0": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz#ed2be7fb4d82ac7e1d45a54a5b06d6cecf8be6f6" + integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== + +"@ant-design/icons@^5.0.0": version "5.2.6" resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.2.6.tgz#2d4a9a37f531eb2a20cebec01d6fb69cf593900d" integrity sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw== @@ -51,14 +76,25 @@ classnames "^2.2.6" rc-util "^5.31.1" -"@ant-design/pro-field@2.14.2": - version "2.14.2" - resolved "https://registry.yarnpkg.com/@ant-design/pro-field/-/pro-field-2.14.2.tgz#87f1ca7dfd3af4664525fe22f5ad21fb4754a741" - integrity sha512-G4p8hVBA+D2HiscWMPi3eQt/8nyq9Ylqm270LEpxPcFFPXMTKDda/iDI+ZwBktWEd9FjBsfe0iyq6iIheuDXvw== +"@ant-design/icons@^5.3.6": + version "5.3.6" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.3.6.tgz#172bbcfcfa39f9a1d9ef73ad5cf98c6184fb83f8" + integrity sha512-JeWsgNjvkTTC73YDPgWOgdScRku/iHN9JU0qk39OSEmJSCiRghQMLlxGTCY5ovbRRoXjxHXnUKgQEgBDnQfKmA== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/icons-svg" "^4.4.0" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.31.1" + +"@ant-design/pro-field@2.14.9": + version "2.14.9" + resolved "https://registry.yarnpkg.com/@ant-design/pro-field/-/pro-field-2.14.9.tgz#df73bd8244919b6d121cb21670178a726d7d3820" + integrity sha512-o9H/HRndZEhMXS59Oo8rHR1wwYzf22anFtKm0mo0QgfHAHLwDOwxXRjWblRJXRKPPhprLP61wuQYH8i+vcUi6w== dependencies: "@ant-design/icons" "^5.0.0" - "@ant-design/pro-provider" "2.13.5" - "@ant-design/pro-utils" "2.15.2" + "@ant-design/pro-provider" "2.14.1" + "@ant-design/pro-utils" "2.15.6" "@babel/runtime" "^7.18.0" "@chenshuai2144/sketch-color" "^1.0.8" classnames "^2.3.2" @@ -68,15 +104,15 @@ rc-util "^5.4.0" swr "^2.0.0" -"@ant-design/pro-form@^2.23.1": - version "2.23.1" - resolved "https://registry.yarnpkg.com/@ant-design/pro-form/-/pro-form-2.23.1.tgz#1a173840fbd1a4daffa906f14414092da27ca36a" - integrity sha512-ia4obGA/AmjSm74Fg2fyd+4AI1VyM9Dpu6VYiiAvkO8ZxfyhDzAT1V9zHSCzU9M7Pu/G2hw/8bhovwy5waVtFg== +"@ant-design/pro-form@^2.25.1": + version "2.25.1" + resolved "https://registry.yarnpkg.com/@ant-design/pro-form/-/pro-form-2.25.1.tgz#acdb75248f54a7620924979f1422f6b1ecee2a7c" + integrity sha512-mr8/IgLYF/gM2g2dbUUScIvN2WL/A/42iZhIdLKA2EmDWAf8o7cWgL7adM7/N7/Gf7ffRczjao8qG+eNzdtmPw== dependencies: "@ant-design/icons" "^5.0.0" - "@ant-design/pro-field" "2.14.2" - "@ant-design/pro-provider" "2.13.5" - "@ant-design/pro-utils" "2.15.2" + "@ant-design/pro-field" "2.14.9" + "@ant-design/pro-provider" "2.14.1" + "@ant-design/pro-utils" "2.15.6" "@babel/runtime" "^7.18.0" "@chenshuai2144/sketch-color" "^1.0.7" "@umijs/use-params" "^1.0.9" @@ -87,14 +123,14 @@ rc-resize-observer "^1.1.0" rc-util "^5.0.6" -"@ant-design/pro-layout@^7.17.16": - version "7.17.16" - resolved "https://registry.yarnpkg.com/@ant-design/pro-layout/-/pro-layout-7.17.16.tgz#124d87d4b602994a395de34caf814304e2c4b72a" - integrity sha512-nBQbAJEUkGqQNBqT30FcbcNXHepxySj/O7est1+2iXPXeVeyQYLHBJXcdvCrUrMty6ev3loG8K+6L3DXQkJ/5Q== +"@ant-design/pro-layout@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@ant-design/pro-layout/-/pro-layout-7.19.0.tgz#ff9c90f2cfe4373e6fda41994ba22a48023c3e5f" + integrity sha512-E7kfInojfsvyFaYbppQRyGd4f8IRTi+KXXc3wWQ2C1EcWlaASB7AGYlGRjjeJyvIPa3UPOfKkveL7/pM/Z3GiQ== dependencies: "@ant-design/icons" "^5.0.0" - "@ant-design/pro-provider" "2.13.5" - "@ant-design/pro-utils" "2.15.2" + "@ant-design/pro-provider" "2.14.1" + "@ant-design/pro-utils" "2.15.6" "@babel/runtime" "^7.18.0" "@umijs/route-utils" "^4.0.0" "@umijs/use-params" "^1.0.9" @@ -107,10 +143,10 @@ swr "^2.0.0" warning "^4.0.3" -"@ant-design/pro-provider@2.13.5": - version "2.13.5" - resolved "https://registry.yarnpkg.com/@ant-design/pro-provider/-/pro-provider-2.13.5.tgz#4f2a14ec21a014fc334e8a56741433ff06b02be6" - integrity sha512-ZVmzY2cq4nUvgmAlfgyCAaSZYV2l3n/upIQPXPj8sYcT+N/Pt1CeSVkkgW6By3EqokF6apWdIFU7hZMK2rNhrg== +"@ant-design/pro-provider@2.14.1": + version "2.14.1" + resolved "https://registry.yarnpkg.com/@ant-design/pro-provider/-/pro-provider-2.14.1.tgz#01b261fa5221b8de5955ce8fd45475dd03490267" + integrity sha512-N8hTUNJc7dtIjj79ZFviielizo15nOUyjrmz9Ll0Mn68Btne2FLpf8cKHsUMdA+yLDW9oM0ExcqIWJOKyx0nUg== dependencies: "@ant-design/cssinjs" "^1.11.1" "@babel/runtime" "^7.18.0" @@ -118,13 +154,13 @@ rc-util "^5.0.1" swr "^2.0.0" -"@ant-design/pro-utils@2.15.2": - version "2.15.2" - resolved "https://registry.yarnpkg.com/@ant-design/pro-utils/-/pro-utils-2.15.2.tgz#d8a6cdd506842ea0d6d6cabb85e2e247bc096977" - integrity sha512-kzMT658CGrQqoihKPlZhbnRioovwMhM59vqqVXuT6A+IuyxJhs5pxN73C6sN2+ZoeYCo/Gewnfn9v1/2vHU2Zg== +"@ant-design/pro-utils@2.15.6": + version "2.15.6" + resolved "https://registry.yarnpkg.com/@ant-design/pro-utils/-/pro-utils-2.15.6.tgz#24006e9dcd5405f3213a7a390a897daff0bd214d" + integrity sha512-F9ERv14dnXQjsBYXTxMpl0blWPNhluufrP9ko2X/dYyVYohAFX8j0sbcUEHY7auPAxHT3c06+sjlqp2bXG9NDg== dependencies: "@ant-design/icons" "^5.0.0" - "@ant-design/pro-provider" "2.13.5" + "@ant-design/pro-provider" "2.14.1" "@babel/runtime" "^7.18.0" classnames "^2.3.2" dayjs "^1.11.10" @@ -133,10 +169,10 @@ safe-stable-stringify "^2.4.3" swr "^2.0.0" -"@ant-design/react-slick@~1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz#241bb412aeacf7ff5d50c61fa5db66773fde6b56" - integrity sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ== +"@ant-design/react-slick@~1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz#f84ce3e4d0dc941f02b16f1d1d6d7a371ffbb4f1" + integrity sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA== dependencies: "@babel/runtime" "^7.10.4" classnames "^2.2.5" @@ -1238,13 +1274,20 @@ dependencies: regenerator-runtime "^0.13.10" -"@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.4": +"@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -1434,7 +1477,7 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32" integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== -"@ctrl/tinycolor@^3.6.0", "@ctrl/tinycolor@^3.6.1": +"@ctrl/tinycolor@^3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== @@ -1877,15 +1920,15 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@rc-component/color-picker@~1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-1.4.1.tgz#dcab0b660e9c4ed63a7582db68ed4a77c862cb93" - integrity sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw== +"@rc-component/color-picker@~1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-1.5.3.tgz#f3b0e14bb67ec5ee77d1fd5d261f63dd4fd00449" + integrity sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw== dependencies: - "@babel/runtime" "^7.10.1" - "@ctrl/tinycolor" "^3.6.0" + "@babel/runtime" "^7.23.6" + "@ctrl/tinycolor" "^3.6.1" classnames "^2.2.6" - rc-util "^5.30.0" + rc-util "^5.38.1" "@rc-component/context@^1.4.0": version "1.4.0" @@ -1929,21 +1972,21 @@ classnames "^2.3.2" rc-util "^5.24.4" -"@rc-component/tour@~1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.11.1.tgz#bb47af908fb6fcaf395402901a1fb505ef8fb1e6" - integrity sha512-c9Lw3/oVinj5D64Rsp8aDLOXcgdViE+hq7bj0Qoo8fTuQEh9sSpUw5OZcum943JkjeIE4hLcc5FD4a5ANtMJ4w== +"@rc-component/tour@~1.14.2": + version "1.14.2" + resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.14.2.tgz#142f0973975eb0e3af3c75aa868ffc9d8ba27cae" + integrity sha512-A75DZ8LVvahBIvxooj3Gvf2sxe+CGOkmzPNX7ek0i0AJHyKZ1HXe5ieIGo3m0FMdZfVOlbCJ952Duq8VKAHk6g== dependencies: "@babel/runtime" "^7.18.0" "@rc-component/portal" "^1.0.0-9" - "@rc-component/trigger" "^1.3.6" + "@rc-component/trigger" "^2.0.0" classnames "^2.3.2" rc-util "^5.24.4" -"@rc-component/trigger@^1.17.0", "@rc-component/trigger@^1.18.0", "@rc-component/trigger@^1.18.2", "@rc-component/trigger@^1.3.6", "@rc-component/trigger@^1.5.0", "@rc-component/trigger@^1.7.0": - version "1.18.2" - resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-1.18.2.tgz#dc52c4c66fa8aaccaf0710498f2429fc05454e3b" - integrity sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA== +"@rc-component/trigger@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.0.0.tgz#f3d63daea1b734ffe9cbf2e9403fae523d449a8a" + integrity sha512-niwKADPdY5dhdIblV6uwSayVivwo2uUISfJqri+/ovYQcH/omxDYBJKo755QKeoIIsWptxnRpgr7reEnNEZGFg== dependencies: "@babel/runtime" "^7.23.2" "@rc-component/portal" "^1.1.0" @@ -3150,57 +3193,57 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -antd@^5.3.0: - version "5.12.2" - resolved "https://registry.yarnpkg.com/antd/-/antd-5.12.2.tgz#85ede9a9ee810c8c77bb8952ddcf4349bdabd29a" - integrity sha512-lJ4pdBRboN2Tl5hXTqgxUjGIercB2YIK7Z8fVDushgrJ55RhywJjvcQVnBmuxcSPuWEF2Yu8SNBVAnaV4EqzWA== +antd@^5.16.1: + version "5.16.1" + resolved "https://registry.yarnpkg.com/antd/-/antd-5.16.1.tgz#a258e73cac8c6e63c4ec44588e5474f0403cd33a" + integrity sha512-XAlLRrgYV+nj9FHnkXEPS6HNcKcluEa8v44e7Cixjlp8aOXRhUI6IfZaKpc2MPGjQ+06rp62/dsxOUNJW9kfLA== dependencies: - "@ant-design/colors" "^7.0.0" - "@ant-design/cssinjs" "^1.18.1" - "@ant-design/icons" "^5.2.6" - "@ant-design/react-slick" "~1.0.2" - "@babel/runtime" "^7.23.4" + "@ant-design/colors" "^7.0.2" + "@ant-design/cssinjs" "^1.18.5" + "@ant-design/icons" "^5.3.6" + "@ant-design/react-slick" "~1.1.2" + "@babel/runtime" "^7.24.4" "@ctrl/tinycolor" "^3.6.1" - "@rc-component/color-picker" "~1.4.1" + "@rc-component/color-picker" "~1.5.3" "@rc-component/mutate-observer" "^1.1.0" - "@rc-component/tour" "~1.11.1" - "@rc-component/trigger" "^1.18.2" - classnames "^2.3.2" + "@rc-component/tour" "~1.14.2" + "@rc-component/trigger" "^2.0.0" + classnames "^2.5.1" copy-to-clipboard "^3.3.3" - dayjs "^1.11.1" + dayjs "^1.11.10" qrcode.react "^3.1.0" - rc-cascader "~3.20.0" - rc-checkbox "~3.1.0" - rc-collapse "~3.7.2" - rc-dialog "~9.3.4" - rc-drawer "~6.5.2" - rc-dropdown "~4.1.0" - rc-field-form "~1.41.0" - rc-image "~7.5.1" - rc-input "~1.3.6" - rc-input-number "~8.4.0" - rc-mentions "~2.9.1" - rc-menu "~9.12.4" + rc-cascader "~3.24.0" + rc-checkbox "~3.2.0" + rc-collapse "~3.7.3" + rc-dialog "~9.4.0" + rc-drawer "~7.1.0" + rc-dropdown "~4.2.0" + rc-field-form "~1.44.0" + rc-image "~7.6.0" + rc-input "~1.4.5" + rc-input-number "~9.0.0" + rc-mentions "~2.11.1" + rc-menu "~9.13.0" rc-motion "^2.9.0" - rc-notification "~5.3.0" - rc-pagination "~4.0.3" - rc-picker "~3.14.6" - rc-progress "~3.5.1" + rc-notification "~5.4.0" + rc-pagination "~4.0.4" + rc-picker "~4.3.0" + rc-progress "~4.0.0" rc-rate "~2.12.0" rc-resize-observer "^1.4.0" - rc-segmented "~2.2.2" - rc-select "~14.10.0" + rc-segmented "~2.3.0" + rc-select "~14.13.0" rc-slider "~10.5.0" rc-steps "~6.0.1" rc-switch "~4.1.0" - rc-table "~7.36.0" - rc-tabs "~12.14.1" - rc-textarea "~1.5.3" - rc-tooltip "~6.1.2" - rc-tree "~5.8.2" - rc-tree-select "~5.15.0" - rc-upload "~4.3.5" - rc-util "^5.38.1" + rc-table "~7.45.4" + rc-tabs "~14.1.1" + rc-textarea "~1.6.3" + rc-tooltip "~6.2.0" + rc-tree "~5.8.5" + rc-tree-select "~5.19.0" + rc-upload "~4.5.2" + rc-util "^5.39.1" scroll-into-view-if-needed "^3.1.0" throttle-debounce "^5.0.0" @@ -3787,6 +3830,11 @@ classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classna resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +classnames@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + clean-css@^5.2.2: version "5.3.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" @@ -4251,6 +4299,11 @@ csstype@3.1.2, csstype@^3.1.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: version "3.2.4" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" @@ -4384,7 +4437,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -dayjs@^1.11.1, dayjs@^1.11.10: +dayjs@^1.11.10: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== @@ -8430,41 +8483,41 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc-cascader@~3.20.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.20.0.tgz#b270f9d84ed83417ee7309ef5e56e415f1586076" - integrity sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw== +rc-cascader@~3.24.0: + version "3.24.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.24.0.tgz#f43f06233b89b7b46005c19f3233068c5b379b24" + integrity sha512-NwkYsVULA61S085jbOYbq8Z7leyIxVmLwf+71mWLjA3kCfUf/rAKC0WfjQbqBDaLGlU9d4z1EzyPaHBKLYWv6A== dependencies: "@babel/runtime" "^7.12.5" array-tree-filter "^2.1.0" classnames "^2.3.1" - rc-select "~14.10.0" + rc-select "~14.13.0" rc-tree "~5.8.1" rc-util "^5.37.0" -rc-checkbox@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.1.0.tgz#6be0d9d8de2cc96fb5e37f9036a1c3e360d0a42d" - integrity sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ== +rc-checkbox@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.2.0.tgz#04f83b7f2bf63eaf0e2da25e947b88a0a6321b5a" + integrity sha512-8inzw4y9dAhZmv/Ydl59Qdy5tdp9CKg4oPVcRigi+ga/yKPZS5m5SyyQPtYSgbcqHRYOdUhiPSeKfktc76du1A== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.3.2" rc-util "^5.25.2" -rc-collapse@~3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.7.2.tgz#d11538ff9c705a5c988d9a4dfcc051a919692fe3" - integrity sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A== +rc-collapse@~3.7.3: + version "3.7.3" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.7.3.tgz#68161683d8fd1004bef4eb281fc106f3c8dc16eb" + integrity sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^2.3.4" rc-util "^5.27.0" -rc-dialog@~9.3.4: - version "9.3.4" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.3.4.tgz#e0decb3d4a0dbe36524a67ed2f8fe2daa4b7b73c" - integrity sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA== +rc-dialog@~9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.4.0.tgz#194c107d34cb36a56f1db4a49dc73f6d59eeae85" + integrity sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/portal" "^1.0.0-8" @@ -8472,88 +8525,88 @@ rc-dialog@~9.3.4: rc-motion "^2.3.0" rc-util "^5.21.0" -rc-drawer@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.5.2.tgz#49c1f279261992f6d4653d32a03b14acd436d610" - integrity sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ== +rc-drawer@~7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-7.1.0.tgz#2beabb8bab1784aea255d0d850bc206c3dc715da" + integrity sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w== dependencies: - "@babel/runtime" "^7.10.1" + "@babel/runtime" "^7.23.9" "@rc-component/portal" "^1.1.1" classnames "^2.2.6" rc-motion "^2.6.1" - rc-util "^5.36.0" + rc-util "^5.38.1" -rc-dropdown@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" - integrity sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw== +rc-dropdown@~4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.2.0.tgz#c6052fcfe9c701487b141e411cdc277dc7c6f061" + integrity sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng== dependencies: "@babel/runtime" "^7.18.3" - "@rc-component/trigger" "^1.7.0" + "@rc-component/trigger" "^2.0.0" classnames "^2.2.6" rc-util "^5.17.0" -rc-field-form@~1.41.0: - version "1.41.0" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.41.0.tgz#660ed8691fdabbc1e5b1ee6b5e0e4f534b295cf0" - integrity sha512-k9AS0wmxfJfusWDP/YXWTpteDNaQ4isJx9UKxx4/e8Dub4spFeZ54/EuN2sYrMRID/+hUznPgVZeg+Gf7XSYCw== +rc-field-form@~1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.44.0.tgz#a66548790fbcee8c5432e9f2efcd1b46b090984b" + integrity sha512-el7w87fyDUsca63Y/s8qJcq9kNkf/J5h+iTdqG5WsSHLH0e6Usl7QuYSmSVzJMgtp40mOVZIY/W/QP9zwrp1FA== dependencies: "@babel/runtime" "^7.18.0" async-validator "^4.1.0" rc-util "^5.32.2" -rc-image@~7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.5.1.tgz#39a93354e14fe3e5eaafd9c9464e8fe3c6c171a0" - integrity sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag== +rc-image@~7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.6.0.tgz#2867087b77c8595ea9eb37d18ca863e47904b191" + integrity sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg== dependencies: "@babel/runtime" "^7.11.2" "@rc-component/portal" "^1.0.2" classnames "^2.2.6" - rc-dialog "~9.3.4" + rc-dialog "~9.4.0" rc-motion "^2.6.2" rc-util "^5.34.1" -rc-input-number@~8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-8.4.0.tgz#f0d0caa2ce3a4e37f062556f9cb4c08c8c23322d" - integrity sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA== +rc-input-number@~9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-9.0.0.tgz#47da6eaf95b0cf566fcdf68196c4dc82b8c8f166" + integrity sha512-RfcDBDdWFFetouWFXBA+WPEC8LzBXyngr9b+yTLVIygfFu7HiLRGn/s/v9wwno94X7KFvnb28FNynMGj9XJlDQ== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/mini-decimal" "^1.0.1" classnames "^2.2.5" - rc-input "~1.3.5" + rc-input "~1.4.0" rc-util "^5.28.0" -rc-input@~1.3.5, rc-input@~1.3.6: - version "1.3.11" - resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.3.11.tgz#08f25d6d65b418dc9001e8f36432fe323bde37fa" - integrity sha512-jhH7QP5rILanSHCGSUkdoFE5DEtpv8FIseYhuYkOZzUBeiVAiwM3q26YqZ6xBB0QFEZ/yUAgms4xW4iuub3xFQ== +rc-input@~1.4.0, rc-input@~1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.4.5.tgz#1f2f13fb1adb15fce5936aebcfab354f41b4f348" + integrity sha512-AjzykhwnwYTRSwwgCu70CGKBIAv6bP2nqnFptnNTprph/TF1BAs0Qxl91mie/BR6n827WIJB6ZjaRf9iiMwAfw== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-util "^5.18.1" -rc-mentions@~2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.9.1.tgz#cfe55913fd5bc156ef9814f38c1a2ceefee032ce" - integrity sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew== +rc-mentions@~2.11.1: + version "2.11.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.11.1.tgz#3e742d4b558965701021cff75b84af6cd4744ed3" + integrity sha512-upb4AK1SRFql7qGnbLEvJqLMugVVIyjmwBJW9L0eLoN9po4JmJZaBzmKA4089fNtsU8k6l/tdZiVafyooeKnLw== dependencies: "@babel/runtime" "^7.22.5" - "@rc-component/trigger" "^1.5.0" + "@rc-component/trigger" "^2.0.0" classnames "^2.2.6" - rc-input "~1.3.5" - rc-menu "~9.12.0" - rc-textarea "~1.5.0" + rc-input "~1.4.0" + rc-menu "~9.13.0" + rc-textarea "~1.6.1" rc-util "^5.34.1" -rc-menu@~9.12.0, rc-menu@~9.12.4: - version "9.12.4" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.12.4.tgz#4959b5eeb780be7ff52aac31952b35efca46b9a3" - integrity sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg== +rc-menu@~9.13.0: + version "9.13.0" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.13.0.tgz#55426531af5fd0a2a0e0a50020cbd002b231edf9" + integrity sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA== dependencies: "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.17.0" + "@rc-component/trigger" "^2.0.0" classnames "2.x" rc-motion "^2.4.3" rc-overflow "^1.3.1" @@ -8577,17 +8630,17 @@ rc-motion@^2.9.0: classnames "^2.2.1" rc-util "^5.21.0" -rc-notification@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.3.0.tgz#e31c86fe2350598ade8cff383babd1befa7a94fe" - integrity sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ== +rc-notification@~5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.4.0.tgz#c5ea20bfe4ed2dbacc7ef945777626c050945db8" + integrity sha512-li19y9RoYJciF3WRFvD+DvWS70jdL8Fr+Gfb/OshK+iY6iTkwzoigmSIp76/kWh5tF5i/i9im12X3nsF85GYdA== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^2.9.0" rc-util "^5.20.1" -rc-overflow@^1.3.1: +rc-overflow@^1.3.1, rc-overflow@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== @@ -8597,29 +8650,31 @@ rc-overflow@^1.3.1: rc-resize-observer "^1.0.0" rc-util "^5.37.0" -rc-pagination@~4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-4.0.3.tgz#6d35314e8e24468cd2c3e8c00dab89c515a85d08" - integrity sha512-s1MNwyU83AgycikYckRdpmkN+4ZZuul0E0YdDp7dMgcjg/d2fak767ZIbLP4Q5YPPla7NDorfVFTvGQAPj6jXA== +rc-pagination@~4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-4.0.4.tgz#ea401388ae86eac17ed5b41212d487f12b65b773" + integrity sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.3.2" rc-util "^5.38.0" -rc-picker@~3.14.6: - version "3.14.6" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-3.14.6.tgz#60fc34f9883272e10f6c593fa6d82e7e7a70781b" - integrity sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag== +rc-picker@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-4.3.0.tgz#920e89093d0f7e31443718ad822dd97118ad84f4" + integrity sha512-bQNB/+NdW55jlQ5lPnNqF5J90Tq4SihLbAF7tzPBvGDJyoYmDgwLm4FN0ZB3Ot9i1v6vJY/1mgqZZTT9jbYc5w== dependencies: "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.5.0" + "@rc-component/trigger" "^2.0.0" classnames "^2.2.1" - rc-util "^5.30.0" + rc-overflow "^1.3.2" + rc-resize-observer "^1.4.0" + rc-util "^5.38.1" -rc-progress@~3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" - integrity sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw== +rc-progress@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-4.0.0.tgz#5382147d9add33d3a5fbd264001373df6440e126" + integrity sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -8654,23 +8709,23 @@ rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0: rc-util "^5.38.0" resize-observer-polyfill "^1.5.1" -rc-segmented@~2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.2.2.tgz#a34f12ce6c0975fc3042ae7656bcd18e1744798e" - integrity sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA== +rc-segmented@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.3.0.tgz#b3fe080fb434a266c02e30bb62a47d2c6e094341" + integrity sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-motion "^2.4.4" rc-util "^5.17.0" -rc-select@~14.10.0: - version "14.10.0" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.10.0.tgz#5f60e61ed7c9a83c8591616b1174a1c4ab2de0cd" - integrity sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag== +rc-select@~14.13.0: + version "14.13.0" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.13.0.tgz#5f343d18398833e0fe44a060a17a8dc1775cb650" + integrity sha512-ew34FsaqHokK4dxVrcIxSYrgWJ2XJYlkk32eiOIiEo3GkHUExdCzmozMYaUc2P67c5QJRUvvY0uqCs3QG67h5A== dependencies: "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.5.0" + "@rc-component/trigger" "^2.0.0" classnames "2.x" rc-motion "^2.0.1" rc-overflow "^1.3.1" @@ -8704,10 +8759,10 @@ rc-switch@~4.1.0: classnames "^2.2.1" rc-util "^5.30.0" -rc-table@~7.36.0: - version "7.36.0" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.36.0.tgz#95e50805392b6a723105c3eb77eefb1e14ba1ced" - integrity sha512-3xVcdCC5OLeOOhaCg+5Lps2oPreM/GWXmUXWTSX4p6vF7F76ABM4dfPpMJ9Dnf5yGRyh+8pe7FRyhRVnWw2H/w== +rc-table@~7.45.4: + version "7.45.4" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.45.4.tgz#8657450d836f691e94ff2282a1c8ee344fe551e6" + integrity sha512-6aSbGrnkN2GLSt3s1x+wa4f3j/VEgg1uKPpaLY5qHH1/nFyreS2V7DFJ0TfUb18allf2FQl7oVYEjTixlBXEyQ== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/context" "^1.4.0" @@ -8716,51 +8771,51 @@ rc-table@~7.36.0: rc-util "^5.37.0" rc-virtual-list "^3.11.1" -rc-tabs@~12.14.1: - version "12.14.1" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.14.1.tgz#1fe4c0bd54550c216f9612b76eff7fbe750f4d2b" - integrity sha512-1xlE7JQNYxD5RwBsM7jf2xSdUrkmTSDFLFEm2gqAgnsRlOGydEzXXNAVTOT6QcgM1G/gCm+AgG+FYPUGb4Hs4g== +rc-tabs@~14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-14.1.1.tgz#f49467feb69af0156c7864d04c21396e4c5c7911" + integrity sha512-5nOr9PVpJy2SWHTLgv1+kESDOb0tFzl0cYU9r9d8LfL0Wg9i/n1B558rmkxdQHgBwMqxmwoyPSAbQROxMQe8nw== dependencies: "@babel/runtime" "^7.11.2" classnames "2.x" - rc-dropdown "~4.1.0" - rc-menu "~9.12.0" + rc-dropdown "~4.2.0" + rc-menu "~9.13.0" rc-motion "^2.6.2" rc-resize-observer "^1.0.0" rc-util "^5.34.1" -rc-textarea@~1.5.0, rc-textarea@~1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.5.3.tgz#513e837d308584996c05f540f4f58645a3a8c89a" - integrity sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA== +rc-textarea@~1.6.1, rc-textarea@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.6.3.tgz#3f294fdf5dfadbe9d0e7b695cea4da557728a9be" + integrity sha512-8k7+8Y2GJ/cQLiClFMg8kUXOOdvcFQrnGeSchOvI2ZMIVvX5a3zQpLxoODL0HTrvU63fPkRmMuqaEcOF9dQemA== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" - rc-input "~1.3.5" + rc-input "~1.4.0" rc-resize-observer "^1.0.0" rc-util "^5.27.0" -rc-tooltip@~6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.1.2.tgz#33923ecfb2cf24347975093cbd0b048ab33c9567" - integrity sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw== +rc-tooltip@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.2.0.tgz#4dd7575674137a5b14f118a5c16435d3f5e4a9c9" + integrity sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw== dependencies: "@babel/runtime" "^7.11.2" - "@rc-component/trigger" "^1.18.0" + "@rc-component/trigger" "^2.0.0" classnames "^2.3.1" -rc-tree-select@~5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.15.0.tgz#8591f1dd28b043dde6fa1ca30c7acb198b160a42" - integrity sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q== +rc-tree-select@~5.19.0: + version "5.19.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.19.0.tgz#1da83694ffeeeed7ba5e4bd49a1d7df48501677d" + integrity sha512-f4l5EsmSGF3ggj76YTzKNPY9SnXfFaer7ZccTSGb3urUf54L+cCqyT+UsPr+S5TAr8mZSxJ7g3CgkCe+cVQ6sw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" - rc-select "~14.10.0" + rc-select "~14.13.0" rc-tree "~5.8.1" rc-util "^5.16.1" -rc-tree@~5.8.1, rc-tree@~5.8.2: +rc-tree@~5.8.1: version "5.8.2" resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.8.2.tgz#ed3a3f7c56597bbeab3303407a9e1739bbf15621" integrity sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg== @@ -8771,10 +8826,21 @@ rc-tree@~5.8.1, rc-tree@~5.8.2: rc-util "^5.16.1" rc-virtual-list "^3.5.1" -rc-upload@~4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.5.tgz#12fc69b2af74d08646a104828831bcaf44076eda" - integrity sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA== +rc-tree@~5.8.5: + version "5.8.5" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.8.5.tgz#f714a383be27bd87366cf32f7f85b2af1fbae6b6" + integrity sha512-PRfcZtVDNkR7oh26RuNe1hpw11c1wfgzwmPFL0lnxGnYefe9lDAO6cg5wJKIAwyXFVt5zHgpjYmaz0CPy1ZtKg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.1" + +rc-upload@~4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.5.2.tgz#ea493fbaaf57d9369ee954b20e1d8bc35c818a1a" + integrity sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA== dependencies: "@babel/runtime" "^7.18.3" classnames "^2.2.5" @@ -8797,6 +8863,14 @@ rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.28.0, rc-util@^5.30.0, rc-util@^5.3 "@babel/runtime" "^7.18.3" react-is "^18.2.0" +rc-util@^5.39.1: + version "5.39.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.39.1.tgz#7bca4fb55e20add0eef5c23166cd9f9e5f51a8a1" + integrity sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^18.2.0" + rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: version "3.11.3" resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz#77d4e12e20c1ba314b43c0e37e118296674c5401" From 1c087d9ad286d6bf399e0c135873b0415c7d5ed8 Mon Sep 17 00:00:00 2001 From: Paul Hutelmyer Date: Fri, 19 Apr 2024 09:37:13 -0400 Subject: [PATCH 4/6] Updating config / removing VT API key --- ui/src/config.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ui/src/config.js b/ui/src/config.js index 598127c..6b3316e 100644 --- a/ui/src/config.js +++ b/ui/src/config.js @@ -1,11 +1,10 @@ const APP_CONFIG = { BACKEND_URL: process.env.REACT_APP_BACKEND_URL || "/api", DEFAULT_EXCLUDED_SUBMITTERS: process.env.DEFAULT_EXCLUDED_SUBMITTERS || ["User_1"], - VIRUSTOTAL_API_KEY: process.env.VIRUSTOTAL_API_KEY || "", API_TIMEOUT: 30000, LOGIN_TIMEOUT: 30000, - SEARCH_URL: process.env.REACT_APP_SEARCH_URL || "", - SEARCH_NAME: process.env.REACT_APP_SEARCH_NAME || "" + SEARCH_URL: process.env.REACT_APP_SEARCH_URL, + SEARCH_NAME: process.env.REACT_APP_SEARCH_NAME }; export { APP_CONFIG }; From 82ed5ed4393085c00cd9e189ebd674b9f1422eb1 Mon Sep 17 00:00:00 2001 From: Paul Hutelmyer Date: Fri, 19 Apr 2024 09:37:42 -0400 Subject: [PATCH 5/6] Refactoring Cards --- ui/src/App.css | 10 +- .../FileTreeCard.js | 24 +- .../FileTreeCardWithProvider.js | 0 .../FileFlow/NodeTypes/EventNode.js | 2 +- .../EmailOverview}/EmailOverviewCard.js | 12 +- .../EmailOverview/EmailOverviewLanding.js | 65 ++ .../ExiftoolOverview}/ExiftoolOverviewCard.js | 2 +- .../ExiftoolOverviewLanding.js | 43 + .../FileInsights/FileInsightsLanding.js | 40 + .../FileInsights/FileInsightsOverviewCard.js} | 0 .../FileIocsOverview/FileIocsOverviewCard.js | 200 ++++ .../FileIocsOverviewLanding.js | 64 ++ .../FileOverview}/FileOverviewCard.js | 110 ++- .../FileOverview/FileOverviewLanding.js | 54 ++ .../FileTypeOverview}/FileTypeOverviewCard.js | 10 +- .../FileTypeOverviewLanding.js | 67 ++ .../FileOverviews/FileYara/FileYaraLanding.js | 44 + .../FileYara}/YaraOverviewCard.js | 0 .../HeaderFooterOverview/HeaderFooterCard.js} | 0 .../HeaderFooterLanding.js | 46 + .../HeaderOverview/HeaderLanding.js | 16 + .../HeaderOverview/HeaderOverviewCard.js} | 105 ++- .../HighlightsOverviewCard.js} | 106 ++- .../HighlightsOverviewLanding.js | 65 ++ .../JavascriptOverviewCard.js | 2 +- .../JavascriptOverviewLanding.js | 46 + .../FileOverviews/JsonView/JsonViewLanding.js | 90 ++ .../OcrOverview}/OcrOverviewCard.js | 6 +- .../OcrOverview/OcrOverviewLanding.js | 75 ++ .../PeOverview}/PeOverviewCard.js | 6 +- .../PeOverview/PeOverviewLanding.js | 61 ++ .../QrOverview}/QrOverviewCard.js | 2 +- .../QrOverview/QrOverviewLanding.js | 55 ++ .../SubmissionIocOverviewCard.js} | 13 +- .../SubmissionIocs/SubmissionIocsLanding.js | 58 ++ .../FileOverviews/TlshOverview/TlshLanding.js | 50 + .../TlshOverview}/TlshOverviewCard.js | 6 +- .../VbOverview}/VbOverviewCard.js | 2 +- .../VbOverview/VbOverviewLanding.js | 45 + .../XmlOverview/XmlOverviewCard.js | 147 +++ .../XmlOverview/XmlOverviewLanding.js | 45 + .../YaraOverview/YaraOverviewLanding.js | 64 ++ .../YaraOverview}/YaraTypeOverviewCard.js | 20 +- ui/src/components/SubmissionTable.js | 94 +- .../VirusTotal/VirusTotalAugmentDrawer.js | 81 ++ .../VirusTotalUploader.js | 0 .../MimeTypeBarChart.js | 0 ui/src/layouts/AppLayout.js | 100 +- ui/src/pages/Dashboard.js | 56 +- ui/src/pages/SubmissionView.js | 872 +++++------------- ui/src/styles/OcrOverviewCard.css | 14 + ui/src/styles/TlshOverviewCard.css | 6 +- ui/src/utils/NodeSearchPanel.js | 4 +- ui/src/utils/iconMappingTable.js | 27 + ui/src/utils/indexDataUtils.js | 7 +- ui/src/utils/layoutUtils.js | 6 +- ui/src/utils/useVirusTotalApiKey.js | 36 + 57 files changed, 2353 insertions(+), 828 deletions(-) rename ui/src/components/{FileComponents => FileFlow}/FileTreeCard.js (92%) rename ui/src/components/{FileComponents => FileFlow}/FileTreeCardWithProvider.js (100%) rename ui/src/components/{FileComponents => FileOverviews/EmailOverview}/EmailOverviewCard.js (93%) create mode 100644 ui/src/components/FileOverviews/EmailOverview/EmailOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/ExiftoolOverview}/ExiftoolOverviewCard.js (98%) create mode 100644 ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewLanding.js create mode 100644 ui/src/components/FileOverviews/FileInsights/FileInsightsLanding.js rename ui/src/components/{FileComponents/InsightsCard.js => FileOverviews/FileInsights/FileInsightsOverviewCard.js} (100%) create mode 100644 ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewCard.js create mode 100644 ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/FileOverview}/FileOverviewCard.js (51%) create mode 100644 ui/src/components/FileOverviews/FileOverview/FileOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/FileTypeOverview}/FileTypeOverviewCard.js (93%) create mode 100644 ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewLanding.js create mode 100644 ui/src/components/FileOverviews/FileYara/FileYaraLanding.js rename ui/src/components/{FileComponents => FileOverviews/FileYara}/YaraOverviewCard.js (100%) rename ui/src/components/{FileComponents/FileHeaderFooterCard.js => FileOverviews/HeaderFooterOverview/HeaderFooterCard.js} (100%) create mode 100644 ui/src/components/FileOverviews/HeaderFooterOverview/HeaderFooterLanding.js create mode 100644 ui/src/components/FileOverviews/HeaderOverview/HeaderLanding.js rename ui/src/components/{FileComponents/FileHeaderOverviewCard.js => FileOverviews/HeaderOverview/HeaderOverviewCard.js} (76%) rename ui/src/components/{FileComponents/FileHighlightsOverviewCard.js => FileOverviews/HighlightsOverview/HighlightsOverviewCard.js} (78%) create mode 100644 ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/JavascriptOverview}/JavascriptOverviewCard.js (98%) create mode 100644 ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewLanding.js create mode 100644 ui/src/components/FileOverviews/JsonView/JsonViewLanding.js rename ui/src/components/{FileComponents => FileOverviews/OcrOverview}/OcrOverviewCard.js (98%) create mode 100644 ui/src/components/FileOverviews/OcrOverview/OcrOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/PeOverview}/PeOverviewCard.js (98%) create mode 100644 ui/src/components/FileOverviews/PeOverview/PeOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/QrOverview}/QrOverviewCard.js (96%) create mode 100644 ui/src/components/FileOverviews/QrOverview/QrOverviewLanding.js rename ui/src/components/{FileComponents/IocOverviewCard.js => FileOverviews/SubmissionIocs/SubmissionIocOverviewCard.js} (82%) create mode 100644 ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocsLanding.js create mode 100644 ui/src/components/FileOverviews/TlshOverview/TlshLanding.js rename ui/src/components/{FileComponents => FileOverviews/TlshOverview}/TlshOverviewCard.js (97%) rename ui/src/components/{FileComponents => FileOverviews/VbOverview}/VbOverviewCard.js (98%) create mode 100644 ui/src/components/FileOverviews/VbOverview/VbOverviewLanding.js create mode 100644 ui/src/components/FileOverviews/XmlOverview/XmlOverviewCard.js create mode 100644 ui/src/components/FileOverviews/XmlOverview/XmlOverviewLanding.js create mode 100644 ui/src/components/FileOverviews/YaraOverview/YaraOverviewLanding.js rename ui/src/components/{FileComponents => FileOverviews/YaraOverview}/YaraTypeOverviewCard.js (92%) create mode 100644 ui/src/components/VirusTotal/VirusTotalAugmentDrawer.js rename ui/src/components/{FileComponents => VirusTotal}/VirusTotalUploader.js (100%) rename ui/src/components/{FileComponents => Visualizations}/MimeTypeBarChart.js (100%) create mode 100644 ui/src/utils/useVirusTotalApiKey.js diff --git a/ui/src/App.css b/ui/src/App.css index a037310..5d77e59 100644 --- a/ui/src/App.css +++ b/ui/src/App.css @@ -79,9 +79,9 @@ body { .ant-card, .submission-card-height, .ant-collapse-item { - border-radius: 20px; - box-shadow: 0px 4px 6px -1px rgba(0, 0, 0, 0.1), - 0px 2px 4px -1px rgba(0, 0, 0, 0.06); + border-radius: 0px; + box-shadow: -1px 4px 6px -1px rgba(0, 0, 0, 0.1), + -1px -2px 4px -1px rgba(0, 0, 0, 0.06); } /* Collapse Styles */ @@ -92,10 +92,10 @@ body { .ant-collapse > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box, .ant-collapse-content, .ant-collapse-content-box { - border-radius: 20px !important; + border-radius: 0px !important; background-color: #ffffff; border: 0; - padding-top: 5px; + padding-bottom: 5px; } diff --git a/ui/src/components/FileComponents/FileTreeCard.js b/ui/src/components/FileFlow/FileTreeCard.js similarity index 92% rename from ui/src/components/FileComponents/FileTreeCard.js rename to ui/src/components/FileFlow/FileTreeCard.js index cd09e18..fb2a70d 100644 --- a/ui/src/components/FileComponents/FileTreeCard.js +++ b/ui/src/components/FileFlow/FileTreeCard.js @@ -13,15 +13,15 @@ import ReactFlow, { MiniMap, useReactFlow, } from "reactflow"; -import EventNode from "../FileFlow/NodeTypes/EventNode.js"; -import IndexConnectEdge from "../FileFlow/EdgeTypes/IndexConnectEdge.js"; +import EventNode from "./NodeTypes/EventNode.js"; +import IndexConnectEdge from "./EdgeTypes/IndexConnectEdge.js"; import { initialNodes, initialEdges } from "../../data/initialData.js"; import "reactflow/dist/style.css"; import { getDagreLayout } from "../../utils/dagreLayout.js"; -import DownloadImage from "../../utils/downloadImage"; -import ShowFileListing from "../../utils/ShowFileListing"; -import NodeSearchPanel from "../../utils/NodeSearchPanel"; -import ClickGuide from "../../utils/ClickGuide"; +import DownloadImage from "../../utils/downloadImage.js"; +import ShowFileListing from "../../utils/ShowFileListing.js"; +import NodeSearchPanel from "../../utils/NodeSearchPanel.js"; +import ClickGuide from "../../utils/ClickGuide.js"; import ExceededGuide from "../../utils/ExceededGuide.js"; import { @@ -50,6 +50,7 @@ const FileTreeCard = ({ onNodeSelect, fileTypeFilter, fileYaraFilter, + fileIocFilter, fileNameFilter, selectedNodeData, setSelectedNodeData, @@ -125,6 +126,13 @@ const FileTreeCard = ({ ); } + // Apply the ioc filter if it's set + if (fileIocFilter) { + nodesToFilter = nodesToFilter.filter((node) => + node.data.nodeIocList?.includes(fileIocFilter) + ); + } + // If the search term is not empty, further filter the nodes if (searchTerm.trim()) { nodesToFilter = nodesToFilter.filter( @@ -134,7 +142,7 @@ const FileTreeCard = ({ ); } return nodesToFilter; - }, [nodes, searchTerm, fileTypeFilter, fileYaraFilter, fileNameFilter]); + }, [nodes, searchTerm, fileTypeFilter, fileIocFilter, fileYaraFilter, fileNameFilter]); // Reset View when filters are applied useEffect(() => { @@ -226,7 +234,7 @@ const FileTreeCard = ({
{ - const [isModalVisible, setIsModalVisible] = useState(false); const { Text } = Typography; @@ -49,7 +48,7 @@ const EmailOverviewCard = ({ data }) => { { title: "Sender", description: from || "No Sender", tag: "Informational" }, { title: "Recipients", - description: to.map((name) => ({ name })) || [], + description: to?.map((name) => ({ name })) || "No Recipients", tag: "Informational", }, { @@ -62,8 +61,8 @@ const EmailOverviewCard = ({ data }) => { description: message_id || "No Message ID", tag: "Informational", }, - // Conditionally add "Attachment Names" row only if filenames is not empty - ...(filenames.length > 0 + // Check if filenames exist and is an array before trying to map over it + ...(Array.isArray(filenames) && filenames.length > 0 ? [ { title: "Attachment Names", @@ -74,7 +73,8 @@ const EmailOverviewCard = ({ data }) => { : []), { title: "Domains in Header", - description: received_domain.map((domain) => ({ domain })) || [], + description: + received_domain.map((domain) => ({ domain })) || "No Domains", tag: "Informational", }, { title: "Body", description: body || "No Body", tag: "Informational" }, diff --git a/ui/src/components/FileOverviews/EmailOverview/EmailOverviewLanding.js b/ui/src/components/FileOverviews/EmailOverview/EmailOverviewLanding.js new file mode 100644 index 0000000..062bdfc --- /dev/null +++ b/ui/src/components/FileOverviews/EmailOverview/EmailOverviewLanding.js @@ -0,0 +1,65 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography, Tag } from 'antd'; +import EmailOverviewCard from './EmailOverviewCard'; + +const { Text } = Typography; + +const EmailOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.email) { + return null; + } + + const emailData = selectedNodeData.scan.email; + const subjectPreview = emailData.subject && emailData.subject.length > 0 + ? `${emailData.subject.substring(0, 47)}...` + : "No Subject"; + const attachmentsCount = emailData.total && emailData.total.attachments; + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + +
+
+ Email +
{subjectPreview}
+
+
+
+ + Attachments: {attachmentsCount} + + + {emailData.base64_thumbnail ? "Preview Available" : "No Preview"} + +
+
+ } + key="1" + > + + + + ); +}; + +export default EmailOverviewLanding; diff --git a/ui/src/components/FileComponents/ExiftoolOverviewCard.js b/ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewCard.js similarity index 98% rename from ui/src/components/FileComponents/ExiftoolOverviewCard.js rename to ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewCard.js index 90da180..035bfeb 100644 --- a/ui/src/components/FileComponents/ExiftoolOverviewCard.js +++ b/ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Input, Checkbox, Typography, Row, Col } from "antd"; -import "../../styles/ExiftoolOverviewCard.css" +import "../../../styles/ExiftoolOverviewCard.css" const { Text } = Typography; diff --git a/ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewLanding.js b/ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewLanding.js new file mode 100644 index 0000000..3fac2ec --- /dev/null +++ b/ui/src/components/FileOverviews/ExiftoolOverview/ExiftoolOverviewLanding.js @@ -0,0 +1,43 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography } from 'antd'; +import FileExiftoolCard from './ExiftoolOverviewCard'; + +const { Text } = Typography; + +const ExiftoolOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.exiftool) { + return null; + } + + const metadataCount = Object.keys(selectedNodeData.scan.exiftool).length; + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + + File Metadata +
+ Metadata Count: {metadataCount} +
+ + } + key="1" + > + +
+
+ ); +}; + +export default ExiftoolOverviewLanding; diff --git a/ui/src/components/FileOverviews/FileInsights/FileInsightsLanding.js b/ui/src/components/FileOverviews/FileInsights/FileInsightsLanding.js new file mode 100644 index 0000000..124a667 --- /dev/null +++ b/ui/src/components/FileOverviews/FileInsights/FileInsightsLanding.js @@ -0,0 +1,40 @@ +import React, { useState, useEffect } from "react"; +import { Collapse, Tag, Typography } from "antd"; +import InsightsCard from './FileInsightsOverviewCard'; + +const { Text } = Typography; + +const InsightsLanding = ({ selectedNodeData, expandAll }) => { + const insightsData = selectedNodeData?.insights || []; + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + + Insights +
+ + Matches: {insightsData.length} + +
+ + } + key="1" + > + +
+
+ ); +}; + +export default InsightsLanding; diff --git a/ui/src/components/FileComponents/InsightsCard.js b/ui/src/components/FileOverviews/FileInsights/FileInsightsOverviewCard.js similarity index 100% rename from ui/src/components/FileComponents/InsightsCard.js rename to ui/src/components/FileOverviews/FileInsights/FileInsightsOverviewCard.js diff --git a/ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewCard.js b/ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewCard.js new file mode 100644 index 0000000..e0faed2 --- /dev/null +++ b/ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewCard.js @@ -0,0 +1,200 @@ +import React, { useState } from "react"; +import { Tag, Tooltip, Typography, Space } from "antd"; +import { getIconConfig } from "../../../utils/iconMappingTable"; +import { antdColors } from "../../../utils/colors"; + +const { Text } = Typography; + +/** + * Displays an overview of IOC matches for files, categorized into IOC types. + * @param {{ data: Object, onFileIocSelect: Function }} props + */ +const FileIocsOverviewCard = ({ data, onFileIocSelect }) => { + const [selectedIoc, setSelectedIoc] = useState(null); + const [showMore, setShowMore] = useState(false); // State to control showing more IOCs + + // Initialize an object to store details for each unique IOC value + const iocCounts = {}; + + // Helper function descriptions + /** + * Handles selection of a IOC match. + * @param {string} ioc The selected IOC match. + */ + const selectIoc = (ioc) => { + const newSelectedioc = ioc === selectedIoc ? null : ioc; + setSelectedIoc(newSelectedioc); + onFileIocSelect(newSelectedioc); + }; + + // Mapping from IOC type to user-friendly label + const iocTypeLabels = { + domain: "Domains", + url: "URLs", + md5: "MD5 Hashes", + sha1: "SHA-1 Hashes", + sha256: "SHA-256 Hashes", + email: "Email Addresses", + ip: "IP Addresses", + }; + + // Aggregate IOCs and their file counts from strelka_response + data.strelka_response.forEach((response) => { + const iocs = response?.iocs || []; + iocs.forEach((ioc) => { + const iocValue = ioc.ioc; + if (!iocCounts[iocValue]) { + // If this is the first time we've seen this IOC, initialize its details + iocCounts[iocValue] = { + type: ioc.ioc_type, + count: 0, + files: new Set(), + }; + } + // Increment the count and add the file to the set + iocCounts[iocValue].count++; + iocCounts[iocValue].files.add( + response.file.name || response.scan.hash.md5 + ); + }); + }); + + // Now transform the counts into an array suitable for rendering + const iocData = Object.entries(iocCounts) + .map(([value, details]) => ({ + value, + type: details.type, + count: details.count, + files: Array.from(details.files), // Convert the set of files to an array + })) + .sort((a, b) => b.count - a.count); // Sort by count descending + + const hasIocs = iocData.length > 0; + + // Render tags for each IOC within the type using Space for consistent layout + const renderIocTag = (iocType, value, count, files) => { + // Get the icon configuration for the current IOC type + const iconConfig = getIconConfig("strelka", iocType); + const IconComponent = iconConfig?.icon; + const iconColor = iconConfig?.color || antdColors.darkPurple; // Default to darkPurple if no color is provided + + return ( + + selectIoc(value)} + color="default" + style={{ + cursor: "pointer", + width: "100%", + justifyContent: "space-between", + alignItems: "center", + background: + selectedIoc === value + ? `${antdColors.blue}10` + : "none", + border: + selectedIoc === value + ? `1px solid ${antdColors.blue}` + : "none", + }} + > +
+ {IconComponent && ( +
+ +
+ )} + + {value} + + + {count} + +
+
+
+ ); + }; + + // Helper function to render a section for an IOC type + const renderSection = (iocType, iocs) => { + // Display a limited number of IOCs initially + const displayedIocs = showMore ? iocs : iocs.slice(0, 5); + + const label = iocTypeLabels[iocType.toLowerCase()] || iocType; + + return ( + + + {label}: + + {displayedIocs.map((iocData) => + renderIocTag( + iocData.type, + iocData.value, + iocData.count, + iocData.files + ) + )} + {!showMore && iocs.length > 5 && ( + setShowMore(true)} + style={{ + cursor: "pointer", + color: "#1890ff", + marginLeft: "30px", + fontSize: "12px", + }} + > + ... and {iocs.length - 5} more + + )} + + ); + }; + + // Render the complete list of IOC sections + return ( +
+ {!hasIocs ? ( +
+

+ No IOCs Not Found +

+
+ ) : ( + <> + {Object.entries(iocTypeLabels) + .filter(([iocType]) => iocData.some((ioc) => ioc.type === iocType)) // Filter out the IOC types that have no data + .map(([iocType, label]) => { + const iocsForType = iocData.filter( + (iocData) => iocData.type === iocType + ); + return renderSection(iocType, iocsForType); + })} + + )} +
+ ); +}; + +export default FileIocsOverviewCard; diff --git a/ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewLanding.js b/ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewLanding.js new file mode 100644 index 0000000..3662004 --- /dev/null +++ b/ui/src/components/FileOverviews/FileIocsOverview/FileIocsOverviewLanding.js @@ -0,0 +1,64 @@ +import React, { useState } from "react"; +import { Collapse, Tag, Typography } from "antd"; +import FileIocsOverviewCard from "./FileIocsOverviewCard"; +import { antdColors } from "../../../utils/colors"; + +const { Text } = Typography; + +const FileIocsOverviewLanding = ({ data, onFileIocSelect }) => { + const [filterApplied, setFilterApplied] = useState(false); + + const handleIocSelect = (selectedIoc) => { + setFilterApplied(!!selectedIoc); + onFileIocSelect(selectedIoc); + }; + + const borderStyle = filterApplied + ? { + // Styles when the filter is applied + border: `2px solid ${antdColors.blue}50`, + borderRadius: "8px", + boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)", + padding: "3px", + transition: "all 0.3s", // Transition for both applying and removing the filter + } + : { + // Styles when the filter is not applied (could potentially add styles for the normal state if needed) + transition: "all 0.3s", + }; + + return ( + + + Potential IOCs + {filterApplied && ( + + Filter Applied + + )} + + } + key="1" + > + + + + ); +}; + +export default FileIocsOverviewLanding; diff --git a/ui/src/components/FileComponents/FileOverviewCard.js b/ui/src/components/FileOverviews/FileOverview/FileOverviewCard.js similarity index 51% rename from ui/src/components/FileComponents/FileOverviewCard.js rename to ui/src/components/FileOverviews/FileOverview/FileOverviewCard.js index 4a2fca4..d3bb473 100644 --- a/ui/src/components/FileComponents/FileOverviewCard.js +++ b/ui/src/components/FileOverviews/FileOverview/FileOverviewCard.js @@ -1,20 +1,59 @@ import React from "react"; -import { Row, Col, Typography, Tooltip } from "antd"; +import { Row, Col, Typography, Tooltip, Tag } from "antd"; import { InfoCircleOutlined } from "@ant-design/icons"; +import styled from "styled-components"; +import useVirusTotalApiKey from '../../../utils/useVirusTotalApiKey'; + const { Text } = Typography; +const VirusTotalInfoContent = styled.div` + cursor: pointer; + display: flex; + align-items: center; + cursor: ${({ isClickable }) => (isClickable ? "pointer" : "default")}; +`; + +const VirusTotalTag = styled(Tag)` + fontSize: "10px", + fontWeight: "bold", + width: "80%", + textAlignLast: "center", + maxWidth: "75px", +`; + +const InfoRow = styled.div` + display: flex; + align-items: center; + font-size: small; + color: #888; +`; + +const getVirusTotalTagProps = (positives) => { + if (positives > 5) { + return "red"; // Color "volcano" from Ant Design for a red tone + } else if (positives === 0) { + return "success"; // Green color for benign + } + return "default"; // Default for not available or not applicable cases +}; + /** * Component that displays an overview of a file's properties. * * @param {Object} props - Component properties. + * @param {Object} onOpenVt - Resource for VT Augment * @param {Object} props.data - The data object containing file and scan information. * @returns {JSX.Element} A JSX element representing the card. */ -const FileOverviewCard = ({ data }) => { +const FileOverviewCard = ({ data, onOpenVT }) => { + const virustotalData = data?.enrichment?.virustotal; + const vtColor = getVirusTotalTagProps(virustotalData); + const { isApiKeyAvailable } = useVirusTotalApiKey(); + // Helper function to format the text row for display. const renderTextRow = (label, content, isCode = false, copyable = false) => ( - + {label} @@ -25,6 +64,13 @@ const FileOverviewCard = ({ data }) => { ); + // Helper function to open VT Augment if exists + const handleVirusTotalClick = () => { + if (isApiKeyAvailable) { + onOpenVT(data.scan.hash.sha256); + } + }; + // Function to handle entropy styling const getEntropyStyle = (entropy) => { if (entropy > 6.5) { @@ -48,7 +94,7 @@ const FileOverviewCard = ({ data }) => { return ( - + Entropy: @@ -67,7 +113,7 @@ const FileOverviewCard = ({ data }) => {
{renderTextRow("File Name:", data.file.name)} {renderTextRow("MIME Type:", data.file.flavors.mime?.join(", "), true)} - {renderTextRow("YARA Flavors:", data.file.flavors.yara?.join(", "), true)} + {renderTextRow("YARA Flavors:", data.file.flavors.yara?.join(", ") || "N/A", true)} {renderTextRow("MD5:", data.scan.hash.md5, true, true)} {renderTextRow("SHA1:", data.scan.hash.sha1, true, true)} {renderTextRow("SHA256:", data.scan.hash.sha256, true, true)} @@ -79,28 +125,46 @@ const FileOverviewCard = ({ data }) => { )} {data.scan?.entropy && renderEntropy(data.scan.entropy.entropy)} - + VirusTotal: - {data["enrichment"]?.["virustotal"] !== undefined && - data["enrichment"]["virustotal"] !== -1 ? ( - - {data["enrichment"]?.["virustotal"]} Positives - - ) : ( - - Not Found - + {typeof virustotalData !== "undefined" && virustotalData > -1 && ( + + + VirusTotal + + {virustotalData} Positives + + + + )} + {(typeof virustotalData == "undefined" || virustotalData < 0) && ( + + + VirusTotal + + N/A + + + )} diff --git a/ui/src/components/FileOverviews/FileOverview/FileOverviewLanding.js b/ui/src/components/FileOverviews/FileOverview/FileOverviewLanding.js new file mode 100644 index 0000000..177e51e --- /dev/null +++ b/ui/src/components/FileOverviews/FileOverview/FileOverviewLanding.js @@ -0,0 +1,54 @@ +// FileOverviews/FileOverview/FileOverviewLanding.js +import React from "react"; +import { Collapse, Button, Typography } from "antd"; +import FileOverviewCard from "./FileOverviewCard"; + +const { Panel } = Collapse; +const { Text } = Typography; + +const FileOverviewLanding = ({ + selectedNodeData, + onOpenVT, + expandAll, + onToggleAllSections, +}) => { + if (!selectedNodeData) { + return null; + } + + return ( + + +
+ File Overview +
+ Size: {(selectedNodeData.file.size / 1024).toFixed(2)} KB ( + {selectedNodeData.file.size} bytes) +
+
+ +
+ } + key="1" + > + + + + ); +}; + +export default FileOverviewLanding; diff --git a/ui/src/components/FileComponents/FileTypeOverviewCard.js b/ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewCard.js similarity index 93% rename from ui/src/components/FileComponents/FileTypeOverviewCard.js rename to ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewCard.js index bfcad8b..004a3e0 100644 --- a/ui/src/components/FileComponents/FileTypeOverviewCard.js +++ b/ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewCard.js @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { Tag, Tooltip, Typography, Space } from "antd"; -import { getIconConfig } from "../../utils/iconMappingTable"; -import { antdColors } from "../../utils/colors"; +import { getIconConfig } from "../../../utils/iconMappingTable"; +import { antdColors } from "../../../utils/colors"; const { Text } = Typography; @@ -60,11 +60,13 @@ const FileTypeOverviewCard = ({ data, onFileTypeSelect }) => { width: "100%", justifyContent: "space-between", alignItems: "center", - background: "none", + background: selectedFileType === item.mimeType + ? `${antdColors.blue}20` + : "none", cursor: "pointer", border: selectedFileType === item.mimeType - ? `1px solid ${bgColor}` + ? `1px solid ${antdColors.blue}` : "none", }} > diff --git a/ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewLanding.js b/ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewLanding.js new file mode 100644 index 0000000..588a00d --- /dev/null +++ b/ui/src/components/FileOverviews/FileTypeOverview/FileTypeOverviewLanding.js @@ -0,0 +1,67 @@ +import React, { useState } from "react"; +import { Collapse, Typography, Tag } from "antd"; +import FileTypeOverviewCard from "./FileTypeOverviewCard"; +import { antdColors } from "../../../utils/colors"; + +const { Text } = Typography; + +const FileTypeOverviewLanding = ({ data, onFileTypeSelect }) => { + const [filterApplied, setFilterApplied] = useState(false); + + const handleFileTypeSelect = (selectedFileType) => { + setFilterApplied(!!selectedFileType); + onFileTypeSelect(selectedFileType); + }; + + const borderStyle = filterApplied + ? { + // Styles when the filter is applied + border: `2px solid ${antdColors.blue}50`, + borderRadius: "8px", + boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)", + padding: "3px", + transition: "all 0.3s", // Transition for both applying and removing the filter + } + : { + // Styles when the filter is not applied (could potentially add styles for the normal state if needed) + transition: "all 0.3s", + }; + + return ( + + + File Types + {filterApplied && ( + + Filter Applied + + )} + + } + key="1" + > + + + + ); +}; + +export default FileTypeOverviewLanding; diff --git a/ui/src/components/FileOverviews/FileYara/FileYaraLanding.js b/ui/src/components/FileOverviews/FileYara/FileYaraLanding.js new file mode 100644 index 0000000..0135164 --- /dev/null +++ b/ui/src/components/FileOverviews/FileYara/FileYaraLanding.js @@ -0,0 +1,44 @@ +import React, { useState, useEffect } from "react"; +import { Collapse, Tag, Typography } from "antd"; +import YaraOverviewCard from './YaraOverviewCard'; + +const { Text } = Typography; + +const YaraOverviewLanding = ({ selectedNodeData, expandAll }) => { + const yaraMatches = selectedNodeData?.scan?.yara?.matches || []; + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + + YARA Signatures +
+ + Matches: {yaraMatches.length} + +
+ + } + key="1" + > + {yaraMatches.length > 0 ? ( + + ) : ( + "No YARA Matches" + )} +
+
+ ); +}; + +export default YaraOverviewLanding; diff --git a/ui/src/components/FileComponents/YaraOverviewCard.js b/ui/src/components/FileOverviews/FileYara/YaraOverviewCard.js similarity index 100% rename from ui/src/components/FileComponents/YaraOverviewCard.js rename to ui/src/components/FileOverviews/FileYara/YaraOverviewCard.js diff --git a/ui/src/components/FileComponents/FileHeaderFooterCard.js b/ui/src/components/FileOverviews/HeaderFooterOverview/HeaderFooterCard.js similarity index 100% rename from ui/src/components/FileComponents/FileHeaderFooterCard.js rename to ui/src/components/FileOverviews/HeaderFooterOverview/HeaderFooterCard.js diff --git a/ui/src/components/FileOverviews/HeaderFooterOverview/HeaderFooterLanding.js b/ui/src/components/FileOverviews/HeaderFooterOverview/HeaderFooterLanding.js new file mode 100644 index 0000000..b14eb9d --- /dev/null +++ b/ui/src/components/FileOverviews/HeaderFooterOverview/HeaderFooterLanding.js @@ -0,0 +1,46 @@ +import React, { useState, useEffect } from "react"; +import { Collapse, Typography } from "antd"; +import FileHeaderFooterCard from "./HeaderFooterCard"; + +const { Text } = Typography; + +const FileHeaderFooterLanding = ({ selectedNodeData, expandAll }) => { + const header = selectedNodeData?.scan?.header; + const footer = selectedNodeData?.scan?.footer; + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!header || !footer) { + return null; + } + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + + Header / Footer +
+ Header: {header.header} +
+
+ Footer: {footer.footer} +
+ + } + key="1" + > + +
+
+ ); +}; + +export default FileHeaderFooterLanding; diff --git a/ui/src/components/FileOverviews/HeaderOverview/HeaderLanding.js b/ui/src/components/FileOverviews/HeaderOverview/HeaderLanding.js new file mode 100644 index 0000000..9a2cc13 --- /dev/null +++ b/ui/src/components/FileOverviews/HeaderOverview/HeaderLanding.js @@ -0,0 +1,16 @@ +// FileOverviews/FileHeaderOverview/FileHeaderOverviewLanding.js +import React from 'react'; +import { Row, Col } from 'antd'; +import FileHeaderOverviewCard from './HeaderOverviewCard'; + +const FileHeaderOverviewLanding = ({ data, onOpenVT }) => { + return ( + + + + + + ); +}; + +export default FileHeaderOverviewLanding; diff --git a/ui/src/components/FileComponents/FileHeaderOverviewCard.js b/ui/src/components/FileOverviews/HeaderOverview/HeaderOverviewCard.js similarity index 76% rename from ui/src/components/FileComponents/FileHeaderOverviewCard.js rename to ui/src/components/FileOverviews/HeaderOverview/HeaderOverviewCard.js index c84dea0..9d107b8 100644 --- a/ui/src/components/FileComponents/FileHeaderOverviewCard.js +++ b/ui/src/components/FileOverviews/HeaderOverview/HeaderOverviewCard.js @@ -1,9 +1,10 @@ import React from "react"; import { Card, Row, Tooltip, Button, Tag, Typography } from "antd"; -import { getIconConfig } from "../../utils/iconMappingTable"; +import { getIconConfig } from "../../../utils/iconMappingTable"; -import { APP_CONFIG } from "../../config"; +import { APP_CONFIG } from "../../../config"; import styled from "styled-components"; +import useVirusTotalApiKey from "../../../utils/useVirusTotalApiKey"; const { Text } = Typography; @@ -18,6 +19,23 @@ const StyledText = styled(Text)` margin-right: 8px; `; +const VirusTotalInfoContent = styled.div` + cursor: ${({ isApiKeyAvailable }) => + !isApiKeyAvailable ? "default" : "pointer"}; + display: flex; + align-items: center; + pointer-events: ${({ isApiKeyAvailable }) => + !isApiKeyAvailable ? "none" : "auto"}; +`; + +const VirusTotalTag = styled(Tag)` + fontSize: "10px", + fontWeight: "bold", + width: "80%", + textAlignLast: "center", + maxWidth: "75px", +`; + const LeftWrapper = styled.div` margin-right: 15px; width: 44px; @@ -70,6 +88,15 @@ const formatFileSize = (size) => { } }; +const getVirusTotalTagProps = (positives) => { + if (positives > 5) { + return "red"; // Color "volcano" from Ant Design for a red tone + } else if (positives === 0) { + return "success"; // Green color for benign + } + return "default"; // Default for not available or not applicable cases +}; + const getDisposition = (data) => { let text = "Not Found on VirusTotal"; // Default text let color = "default"; // Default color @@ -117,8 +144,12 @@ const getRandomColor = () => { const getColorForMimetypes = () => getRandomColor(); -const FileHeaderOverviewCard = ({ data }) => { +const FileHeaderOverviewCard = ({ data, onOpenVT }) => { const sortedScannersRun = [...(data?.scanners_run || [])].sort(); + const virustotalData = data.strelka_response[0]?.enrichment?.virustotal; + const vtColor = getVirusTotalTagProps(virustotalData); + const { isApiKeyAvailable } = useVirusTotalApiKey(); + const mappingEntry = getIconConfig( "strelka", data.strelka_response[0].file.flavors.mime[0].toLowerCase() @@ -126,8 +157,15 @@ const FileHeaderOverviewCard = ({ data }) => { const IconComponent = mappingEntry?.icon; const color = mappingEntry?.color || data.color; + const handleVirusTotalClick = () => { + if (isApiKeyAvailable) { + const sha256Hash = data.strelka_response[0]?.scan?.hash?.sha256; + onOpenVT(sha256Hash); + } + }; + return ( -
+
{ Insights: {data.insights.length} )} - - {getDisposition(data)} - + {getDisposition(data)} {[ - APP_CONFIG.SEARCH_URL && APP_CONFIG.SEARCH_NAME && ( - ", - data.file_id - )}`} - target="_blank" - rel="noreferrer" - > - - - ), - ]} + APP_CONFIG.SEARCH_URL && APP_CONFIG.SEARCH_NAME && ( + ", + data.file_id + )}`} + target="_blank" + rel="noreferrer" + > + + + ), + ]}
@@ -227,9 +265,9 @@ const FileHeaderOverviewCard = ({ data }) => { > {`... and ${ @@ -327,6 +365,29 @@ const FileHeaderOverviewCard = ({ data }) => { + {typeof virustotalData !== "undefined" && virustotalData > -1 && ( + + VirusTotal: + + VirusTotal + + {virustotalData} Positives + + + + )}
{sortedScannersRun.map((tag) => ( diff --git a/ui/src/components/FileComponents/FileHighlightsOverviewCard.js b/ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewCard.js similarity index 78% rename from ui/src/components/FileComponents/FileHighlightsOverviewCard.js rename to ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewCard.js index 58829e4..ac81b42 100644 --- a/ui/src/components/FileComponents/FileHighlightsOverviewCard.js +++ b/ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewCard.js @@ -6,20 +6,41 @@ import { RightOutlined, WarningOutlined, } from "@ant-design/icons"; -import { getIconConfig } from "../../utils/iconMappingTable"; -import { antdColors } from "../../utils/colors"; +import { getIconConfig } from "../../../utils/iconMappingTable"; +import { antdColors } from "../../../utils/colors"; const { Text } = Typography; const FileHighlightsOverviewCard = ({ data, onFileNameSelect }) => { const [expandedNodes, setExpandedNodes] = useState(new Set()); const [selectedNodeId, setSelectedNodeId] = useState(null); + const [visibleNodeCount, setVisibleNodeCount] = useState(20); // start with 20 nodes visible + const LOAD_MORE_COUNT = 10; // number of nodes to load on each click const insightsByNode = {}; const iocsByNode = {}; const mimeTypeByNode = {}; const filenameByNode = {}; + // Function to load more nodes + const loadMoreNodes = () => { + setVisibleNodeCount((prevCount) => prevCount + LOAD_MORE_COUNT); + }; + + const getVTPositivesInfo = (response) => { + const vtCount = response?.enrichment?.virustotal; + if (typeof vtCount === "number") { + if (vtCount < 0) { + return null; // No box if VT data is not available + } + return { + count: vtCount, + color: vtCount > 3 ? "volcano" : "green", // Red if > 3, green if 0-3 + }; + } + return null; // No box if VT data is not available + }; + // Populate insights, iocs, mime types, and filenames by node data.strelka_response.forEach((response) => { if (response.insights?.length > 0 || response.iocs?.length > 0) { @@ -39,11 +60,25 @@ const FileHighlightsOverviewCard = ({ data, onFileNameSelect }) => { const sortedNodeIds = Object.keys(filenameByNode) .map((nodeId) => ({ nodeId, - filename: filenameByNode[nodeId] || 'No Filename', + filename: filenameByNode[nodeId] || "No Filename", iocCount: iocsByNode[nodeId]?.length || 0, insightCount: insightsByNode[nodeId]?.length || 0, })) .sort((a, b) => { + // Get VT positives or assign a default for comparison + const vtPositivesA = + getVTPositivesInfo( + data.strelka_response.find((res) => res.file.tree.node === a.nodeId) + )?.count || 0; + const vtPositivesB = + getVTPositivesInfo( + data.strelka_response.find((res) => res.file.tree.node === b.nodeId) + )?.count || 0; + + // Descending sort for VT positives + if (vtPositivesA !== vtPositivesB) { + return vtPositivesB - vtPositivesA; + } if (a.iocCount !== b.iocCount) { return b.iocCount - a.iocCount; } else if (a.insightCount !== b.insightCount) { @@ -53,19 +88,8 @@ const FileHighlightsOverviewCard = ({ data, onFileNameSelect }) => { }) .map((sortedItem) => sortedItem.nodeId); - const getVTPositivesInfo = (response) => { - const vtCount = response?.enrichment?.virustotal; - if (typeof vtCount === "number") { - if (vtCount < 0) { - return null; // No box if VT data is not available - } - return { - count: vtCount, - color: vtCount > 3 ? "volcano" : "green", // Red if > 3, green if 0-3 - }; - } - return null; // No box if VT data is not available - }; + // Only show the nodes that are within the visibleNodeCount + const visibleNodeIds = sortedNodeIds.slice(0, visibleNodeCount); // Check if there are any highlights const hasHighlights = sortedNodeIds.length > 0; @@ -91,7 +115,7 @@ const FileHighlightsOverviewCard = ({ data, onFileNameSelect }) => { setExpandedNodes(newExpandedNodes); }; - const nodeList = sortedNodeIds.map((nodeId) => { + const nodeList = visibleNodeIds.map((nodeId) => { const isExpanded = expandedNodes.has(nodeId); const filename = filenameByNode[nodeId] || "No Filename"; const insights = insightsByNode[nodeId] || []; @@ -114,10 +138,14 @@ const FileHighlightsOverviewCard = ({ data, onFileNameSelect }) => { marginBottom: "8px", overflow: "hidden", cursor: "pointer", + background: + selectedNodeId === nodeId + ? `${antdColors.blue}10` + : "none", borderRadius: "5px", border: selectedNodeId === nodeId - ? `1px solid ${antdColors.lightGray}` + ? `1px solid ${antdColors.blue}` : "none", }} > @@ -252,21 +280,35 @@ const FileHighlightsOverviewCard = ({ data, onFileNameSelect }) => { return (
{hasHighlights ? ( - nodeList + <> + {nodeList} + {visibleNodeCount < sortedNodeIds.length && ( + + ...and {sortedNodeIds.length - visibleNodeCount} more (show next{" "} + {Math.min( + LOAD_MORE_COUNT, + sortedNodeIds.length - visibleNodeCount + )} + ) + + )} + ) : ( -
- - {" "} - No Highlights for this Submission - -
+ + No Highlights for this Submission + )}
); diff --git a/ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewLanding.js b/ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewLanding.js new file mode 100644 index 0000000..0200cfd --- /dev/null +++ b/ui/src/components/FileOverviews/HighlightsOverview/HighlightsOverviewLanding.js @@ -0,0 +1,65 @@ +import React, { useState } from "react"; +import { Collapse, Tag } from "antd"; +import FileHighlightsOverviewCard from "./HighlightsOverviewCard"; +import { antdColors } from "../../../utils/colors"; + +const FileHighlightsOverviewLanding = ({ data, onFileNameSelect }) => { + const [filterApplied, setFilterApplied] = useState(false); + + const handleFileNameSelect = (selectedFileName) => { + setFilterApplied(!!selectedFileName); + onFileNameSelect(selectedFileName); + }; + + const borderStyle = filterApplied + ? { + // Styles when the filter is applied + border: `2px solid ${antdColors.blue}50`, + borderRadius: "8px", + boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)", + padding: "3px", + transition: "all 0.3s", // Transition for both applying and removing the filter + } + : { + // Styles when the filter is not applied (could potentially add styles for the normal state if needed) + transition: "all 0.3s", + }; + + return ( + + + File Highlights + {filterApplied && ( + + Filter Applied + + )}{" "} +
+ } + key="1" + > + + + + ); +}; + +export default FileHighlightsOverviewLanding; diff --git a/ui/src/components/FileComponents/JavascriptOverviewCard.js b/ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewCard.js similarity index 98% rename from ui/src/components/FileComponents/JavascriptOverviewCard.js rename to ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewCard.js index 5a33174..e3793a4 100644 --- a/ui/src/components/FileComponents/JavascriptOverviewCard.js +++ b/ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Input, Checkbox, Typography, Row, Col } from "antd"; -import "../../styles/ExiftoolOverviewCard.css" +import "../../../styles/ExiftoolOverviewCard.css" const { Text } = Typography; diff --git a/ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewLanding.js b/ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewLanding.js new file mode 100644 index 0000000..af843f0 --- /dev/null +++ b/ui/src/components/FileOverviews/JavascriptOverview/JavascriptOverviewLanding.js @@ -0,0 +1,46 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography } from 'antd'; +import JavascriptOverviewCard from './JavascriptOverviewCard'; + +const { Text } = Typography; + +const JavascriptOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.javascript) { + return null; + } + + const jsData = selectedNodeData.scan.javascript; + const scriptLength = jsData.script_length_bytes + ? `${jsData.script_length_bytes} bytes` + : "(Length calculation not supported by this release of Strelka)"; + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + + JavaScript +
+ Script Length: {scriptLength} +
+
+ } + key="1" + > + + + + ); +}; + +export default JavascriptOverviewLanding; diff --git a/ui/src/components/FileOverviews/JsonView/JsonViewLanding.js b/ui/src/components/FileOverviews/JsonView/JsonViewLanding.js new file mode 100644 index 0000000..fa08735 --- /dev/null +++ b/ui/src/components/FileOverviews/JsonView/JsonViewLanding.js @@ -0,0 +1,90 @@ +import React, { useState } from "react"; + +import { Collapse, Typography, Input } from "antd"; +import ReactJson from "react-json-view"; + +const { Text } = Typography; + +const JsonViewLanding = ({ jsonData }) => { + const [filterQuery, setFilterQuery] = useState(""); + + const filterValues = (json, query) => { + if (!query) return json; + + let result = Array.isArray(json) ? [] : {}; + + if (typeof json === "object") { + for (const key of Object.keys(json)) { + const value = json[key]; + // Recursively find matches in nested objects/arrays + if (typeof value === 'object') { + const filteredChild = filterValues(value, query); + if (filteredChild && Object.keys(filteredChild).length !== 0) { + // If there is a match in children, include this key in the result + result[key] = filteredChild; + } + } else if (typeof value === 'string' && value.toLowerCase().includes(query.toLowerCase())) { + // Direct matches with the string representation of the value are included + result[key] = value; + } + } + } else if (typeof json === 'string' && json.toLowerCase().includes(query.toLowerCase())) { + // If this is a string and it matches, return it directly. + return json; + } + + // If we're working with an array after filtering, filter out any empty objects or arrays. + if (Array.isArray(result)) { + result = result.filter(item => typeof item === 'object' ? Object.keys(item).length > 0 : true); + } + + // Return an empty object/array if no matches found, + // or an object/array only containing matching keys/values. + return result; + }; + + const filteredJsonData = filterValues(jsonData, filterQuery); + + return ( + + + JSON View +
+ Raw Strelka data, including scanners not yet available in Card + view. +
+ + } + key="1" + > + setFilterQuery(e.target.value)} + style={{ + width: "100%", + padding: "10px", + margin: "0 0 20px 0", + }} + /> + { + if (field.name === "scan") { + return false; + } + if (typeof field.src !== "object" || Array.isArray(field.src)) { + return false; + } + return field.level > 2; + }} + /> +
+
+ ); +}; + +export default JsonViewLanding; diff --git a/ui/src/components/FileComponents/OcrOverviewCard.js b/ui/src/components/FileOverviews/OcrOverview/OcrOverviewCard.js similarity index 98% rename from ui/src/components/FileComponents/OcrOverviewCard.js rename to ui/src/components/FileOverviews/OcrOverview/OcrOverviewCard.js index 9336319..a23f5ba 100644 --- a/ui/src/components/FileComponents/OcrOverviewCard.js +++ b/ui/src/components/FileOverviews/OcrOverview/OcrOverviewCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Checkbox, Input, Row, Col, Modal, Button, Tooltip } from "antd"; -import "../../styles/OcrOverviewCard.css"; +import "../../../styles/OcrOverviewCard.css"; const OcrOverviewCard = ({ data }) => { const [isModalVisible, setIsModalVisible] = useState(false); @@ -67,7 +67,7 @@ const OcrOverviewCard = ({ data }) => { return (
- + setFilter(e.target.value)} @@ -91,7 +91,7 @@ const OcrOverviewCard = ({ data }) => { diff --git a/ui/src/components/FileOverviews/OcrOverview/OcrOverviewLanding.js b/ui/src/components/FileOverviews/OcrOverview/OcrOverviewLanding.js new file mode 100644 index 0000000..13eea70 --- /dev/null +++ b/ui/src/components/FileOverviews/OcrOverview/OcrOverviewLanding.js @@ -0,0 +1,75 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography, Tag } from 'antd'; +import OcrOverviewCard from './OcrOverviewCard'; + +const { Text } = Typography; + +const OcrOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.ocr) { + return null; + } + + const ocrData = selectedNodeData.scan.ocr; + const ocrText = ocrData.text; + const textSummary = Array.isArray(ocrText) + ? ocrText.join(" ").substring(0, 47) + "..." + : typeof ocrText === "string" && ocrText.length > 0 + ? ocrText.substring(0, 47) + "..." + : "No Text"; + + const wordsCount = Array.isArray(ocrText) + ? ocrText.length + : typeof ocrText === "string" + ? ocrText.split(" ").length + : 0; + + const hasPreview = !!ocrData.base64_thumbnail; + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + +
+
+ Optical Character Recognition +
+ {textSummary} +
+
+
+
+ + Words Extracted: {wordsCount} + + + {hasPreview ? "Preview Available" : "No Preview"} + +
+
+ } + key="1" + > + + + + ); +}; + +export default OcrOverviewLanding; diff --git a/ui/src/components/FileComponents/PeOverviewCard.js b/ui/src/components/FileOverviews/PeOverview/PeOverviewCard.js similarity index 98% rename from ui/src/components/FileComponents/PeOverviewCard.js rename to ui/src/components/FileOverviews/PeOverview/PeOverviewCard.js index ce4d737..d1ddb0b 100644 --- a/ui/src/components/FileComponents/PeOverviewCard.js +++ b/ui/src/components/FileOverviews/PeOverview/PeOverviewCard.js @@ -8,7 +8,7 @@ import { } from "antd"; import { WarningOutlined, CheckCircleOutlined } from "@ant-design/icons"; -import "../../styles/PeOverviewCard.css"; +import "../../../styles/PeOverviewCard.css"; const { Text } = Typography; @@ -217,7 +217,7 @@ const PeOverviewCard = ({ data }) => { ( {item} @@ -232,7 +232,7 @@ const PeOverviewCard = ({ data }) => { ( {item} diff --git a/ui/src/components/FileOverviews/PeOverview/PeOverviewLanding.js b/ui/src/components/FileOverviews/PeOverview/PeOverviewLanding.js new file mode 100644 index 0000000..e08d1fc --- /dev/null +++ b/ui/src/components/FileOverviews/PeOverview/PeOverviewLanding.js @@ -0,0 +1,61 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography, Tag } from 'antd'; +import PeOverviewCard from './PeOverviewCard'; + +const { Text } = Typography; + +const PeOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.pe) { + return null; + } + + const { file_info, compile_time, security } = selectedNodeData.scan.pe; + const productName = file_info?.product_name; + const isSigned = security ? "Signed" : "Not Signed"; + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + +
+ Executable Information +
+ Product: {productName} +
+ Compiled: {compile_time} +
+
+ + {isSigned} + + + } + key="1" + > + +
+
+ ); +}; + +export default PeOverviewLanding; diff --git a/ui/src/components/FileComponents/QrOverviewCard.js b/ui/src/components/FileOverviews/QrOverview/QrOverviewCard.js similarity index 96% rename from ui/src/components/FileComponents/QrOverviewCard.js rename to ui/src/components/FileOverviews/QrOverview/QrOverviewCard.js index 46171b7..ddfaa8a 100644 --- a/ui/src/components/FileComponents/QrOverviewCard.js +++ b/ui/src/components/FileOverviews/QrOverview/QrOverviewCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Input, Table, Typography } from "antd"; -import "../../styles/IocOverviewCard.css"; +import "../../../styles/IocOverviewCard.css"; const { Text } = Typography; diff --git a/ui/src/components/FileOverviews/QrOverview/QrOverviewLanding.js b/ui/src/components/FileOverviews/QrOverview/QrOverviewLanding.js new file mode 100644 index 0000000..8f9092f --- /dev/null +++ b/ui/src/components/FileOverviews/QrOverview/QrOverviewLanding.js @@ -0,0 +1,55 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography } from 'antd'; +import QrOverviewCard from './QrOverviewCard'; + +const { Text } = Typography; + +const QrOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.qr || !selectedNodeData.scan.qr.data) { + return null; + } + + const qrData = selectedNodeData.scan.qr.data; + const qrDataCount = qrData.length; + + return ( + setActiveKey(keys)} + defaultActiveKey={[]} + style={{ width: "100%", marginBottom: "10px" }} + > + +
+
+ QR Code Data +
+ {qrDataCount > 0 ? `QR Data Count: ${qrDataCount}` : "No QR Data"} +
+
+
+ + } + key="1" + > + +
+
+ ); +}; + +export default QrOverviewLanding; diff --git a/ui/src/components/FileComponents/IocOverviewCard.js b/ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocOverviewCard.js similarity index 82% rename from ui/src/components/FileComponents/IocOverviewCard.js rename to ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocOverviewCard.js index 7a6f8a6..4e67ac7 100644 --- a/ui/src/components/FileComponents/IocOverviewCard.js +++ b/ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocOverviewCard.js @@ -1,11 +1,12 @@ import React, { useState } from "react"; import { Input, Table, Typography } from "antd"; -import "../../styles/IocOverviewCard.css"; +import "../../../styles/IocOverviewCard.css"; const { Text } = Typography; const IocOverviewCard = ({ data }) => { const [filter, setFilter] = useState(""); + const [pageSize, setPageSize] = useState(10); const columns = [ { @@ -54,11 +55,16 @@ const IocOverviewCard = ({ data }) => { })); }; + const handleTableChange = (pagination) => { + // Update pageSize when table pagination changes + setPageSize(pagination.pageSize); + }; + + const filteredIocs = processIocData(); return (
- {" "} setFilter(e.target.value)} @@ -67,9 +73,10 @@ const IocOverviewCard = ({ data }) => { ); diff --git a/ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocsLanding.js b/ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocsLanding.js new file mode 100644 index 0000000..4caddea --- /dev/null +++ b/ui/src/components/FileOverviews/SubmissionIocs/SubmissionIocsLanding.js @@ -0,0 +1,58 @@ +import React, { useState, useEffect } from "react"; +import { Collapse, Typography, Tag } from "antd"; +import IocOverviewCard from "./SubmissionIocOverviewCard"; + +const { Text } = Typography; + +const FilePotentialIocsOverview = ({ selectedNodeData, expandAll }) => { + const iocs = selectedNodeData?.iocs; + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + if (!iocs || iocs.length === 0) { + return null; + } + + const firstIoc = iocs[0]?.ioc || "N/A"; + const iocsCount = iocs.length; + const additionalIocs = iocsCount > 1 ? ` and ${iocsCount - 1} more` : ""; + + return ( + setActiveKey(keys)} + style={{ width: "100%", marginBottom: "10px" }} + > + +
+ Indicators of Compromise (IOCs) +
+ {firstIoc} + {additionalIocs} +
+
+ + {iocsCount} Potential IOCs Extracted + + + } + key="1" + > + +
+
+ ); +}; + +export default FilePotentialIocsOverview; diff --git a/ui/src/components/FileOverviews/TlshOverview/TlshLanding.js b/ui/src/components/FileOverviews/TlshOverview/TlshLanding.js new file mode 100644 index 0000000..6bcfbfb --- /dev/null +++ b/ui/src/components/FileOverviews/TlshOverview/TlshLanding.js @@ -0,0 +1,50 @@ +import React, { useState, useEffect } from "react"; +import { Collapse, Tag, Typography } from "antd"; +import TlshOverviewCard from "./TlshOverviewCard"; + +const { Text } = Typography; + +const FileTlshLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ["1"] : []); + }, [expandAll]); + + const tlshData = selectedNodeData?.scan?.tlsh?.match; + + const getTlshRating = (score) => { + if (score <= 30) return { label: "Very Similar", color: "red" }; + if (score <= 60) return { label: "Somewhat Similar", color: "volcano" }; + if (score <= 120) return { label: "Moderately Different", color: "orange" }; + if (score <= 180) return { label: "Quite Different", color: "gold" }; + return { label: "Very Different", color: "green" }; + }; + + return tlshData ? ( + + + TLSH Related Match +
+ + {getTlshRating(tlshData.score).label} + +
+ + } + key="1" + > + +
+
+ ) : null; +}; + +export default FileTlshLanding; diff --git a/ui/src/components/FileComponents/TlshOverviewCard.js b/ui/src/components/FileOverviews/TlshOverview/TlshOverviewCard.js similarity index 97% rename from ui/src/components/FileComponents/TlshOverviewCard.js rename to ui/src/components/FileOverviews/TlshOverview/TlshOverviewCard.js index 74a008f..0c7a065 100644 --- a/ui/src/components/FileComponents/TlshOverviewCard.js +++ b/ui/src/components/FileOverviews/TlshOverview/TlshOverviewCard.js @@ -1,7 +1,7 @@ import React from "react"; import { Typography, Tag } from "antd"; -import { antdColors } from "../../utils/colors"; -import "../../styles/TlshOverviewCard.css"; +import { antdColors } from "../../../utils/colors"; +import "../../../styles/TlshOverviewCard.css"; const { Text } = Typography; @@ -158,4 +158,4 @@ const TlshOverviewCard = ({ data }) => { ); }; -export default TlshOverviewCard; +export default TlshOverviewCard; \ No newline at end of file diff --git a/ui/src/components/FileComponents/VbOverviewCard.js b/ui/src/components/FileOverviews/VbOverview/VbOverviewCard.js similarity index 98% rename from ui/src/components/FileComponents/VbOverviewCard.js rename to ui/src/components/FileOverviews/VbOverview/VbOverviewCard.js index 61f5b65..5e390fb 100644 --- a/ui/src/components/FileComponents/VbOverviewCard.js +++ b/ui/src/components/FileOverviews/VbOverview/VbOverviewCard.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Input, Checkbox, Typography, Row, Col } from "antd"; -import "../../styles/ExiftoolOverviewCard.css"; +import "../../../styles/ExiftoolOverviewCard.css"; const { Text } = Typography; diff --git a/ui/src/components/FileOverviews/VbOverview/VbOverviewLanding.js b/ui/src/components/FileOverviews/VbOverview/VbOverviewLanding.js new file mode 100644 index 0000000..8d577bd --- /dev/null +++ b/ui/src/components/FileOverviews/VbOverview/VbOverviewLanding.js @@ -0,0 +1,45 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography } from 'antd'; +import VbOverviewCard from './VbOverviewCard'; + +const { Text } = Typography; + +const VbOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ['1'] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.vb) { + return null; + } + + const vbData = selectedNodeData.scan.vb; + const scriptLength = vbData.script_length_bytes || 0; + + return ( + + + Visual Basic +
+ Script Length: {scriptLength} bytes +
+ + } + key="1" + > + +
+
+ ); +}; + +export default VbOverviewLanding; diff --git a/ui/src/components/FileOverviews/XmlOverview/XmlOverviewCard.js b/ui/src/components/FileOverviews/XmlOverview/XmlOverviewCard.js new file mode 100644 index 0000000..92bafdb --- /dev/null +++ b/ui/src/components/FileOverviews/XmlOverview/XmlOverviewCard.js @@ -0,0 +1,147 @@ +import React, { useState } from "react"; +import { Descriptions, Typography, List, Input, Row, Col } from "antd"; +import "../../../styles/ExiftoolOverviewCard.css"; + +const { Text } = Typography; + +const XmlOverviewCard = ({ xmlData }) => { + const [filter, setFilter] = useState(""); + + // Handles filtering and processing of list items (objects or strings) + const filterData = (dataSource) => { + const searchTerm = filter.toLowerCase(); + return dataSource.filter((item) => { + const content = typeof item === "object" ? JSON.stringify(item) : item; + return !filter || content.toLowerCase().includes(searchTerm); + }); + }; + + // Function to render item content based on whether it is a string or object + const renderItemContent = (item) => { + if (typeof item === "object") { + return ( +
+ {Object.entries(item).map(([key, value], index) => { + // Exclude standalone "Type" entries from being displayed + if ( + key.toLowerCase() === "type" && + Object.keys(item).length === 1 + ) { + return null; + } + return ( + +
+ {key}: + + + + {value.toString()} + + + + ); + })} + + ); + } + return ( + + {item} + + ); + }; + + return ( +
+ setFilter(e.target.value)} + style={{ marginBottom: "10px" }} + /> + + + {xmlData.doc_type && ( + + + {xmlData.doc_type} + + + )} + {xmlData.version && ( + + + {xmlData.version} + + + )} + {xmlData.namespaces?.length > 0 && ( + + {xmlData.namespaces.map((ns, index) => ( + + {ns} + + ))} + + )} + {xmlData.total && ( + + {xmlData.total.tags} + + )} + {xmlData.total && ( + + {xmlData.total.extracted} + + )} + + + {xmlData.emitted_content && xmlData.emitted_content.length > 0 ? ( + ( + {renderItemContent(item)} + )} + style={{ maxHeight: "200px", overflow: "auto" }} + /> + ) : ( + No Data + )} + + + + {xmlData.tags && xmlData.tags.length > 0 ? ( + ( + {renderItemContent(item)} + )} + style={{ maxHeight: "200px", overflow: "auto" }} + /> + ) : ( + No Data + )} + + + + {xmlData.tag_data && xmlData.tag_data.length > 0 ? ( + ( + {renderItemContent(item)} + )} + style={{ maxHeight: "200px", overflow: "auto" }} + /> + ) : ( + No Data + )} + + +
+ ); +}; + +export default XmlOverviewCard; diff --git a/ui/src/components/FileOverviews/XmlOverview/XmlOverviewLanding.js b/ui/src/components/FileOverviews/XmlOverview/XmlOverviewLanding.js new file mode 100644 index 0000000..c362bb5 --- /dev/null +++ b/ui/src/components/FileOverviews/XmlOverview/XmlOverviewLanding.js @@ -0,0 +1,45 @@ +import React, { useState, useEffect } from 'react'; +import { Collapse, Typography } from 'antd'; +import XmlOverviewCard from './XmlOverviewCard'; + +const { Text } = Typography; + +const XmlOverviewLanding = ({ selectedNodeData, expandAll }) => { + const [activeKey, setActiveKey] = useState([]); + + useEffect(() => { + setActiveKey(expandAll ? ['1'] : []); + }, [expandAll]); + + if (!selectedNodeData || !selectedNodeData.scan || !selectedNodeData.scan.xml) { + return null; + } + + const xmlData = selectedNodeData.scan.xml; + const emittedContentCount = xmlData.emitted_content ? xmlData.emitted_content.length : 0; + + return ( + + + XML +
+ Emitted Content Count: {emittedContentCount} +
+ + } + key="1" + > + +
+
+ ); +}; + +export default XmlOverviewLanding; diff --git a/ui/src/components/FileOverviews/YaraOverview/YaraOverviewLanding.js b/ui/src/components/FileOverviews/YaraOverview/YaraOverviewLanding.js new file mode 100644 index 0000000..e0b0f94 --- /dev/null +++ b/ui/src/components/FileOverviews/YaraOverview/YaraOverviewLanding.js @@ -0,0 +1,64 @@ +import React, { useState } from "react"; +import { Collapse, Tag, Typography } from "antd"; +import YaraTypeOverviewCard from "./YaraTypeOverviewCard"; +import { antdColors } from "../../../utils/colors"; + +const { Text } = Typography; + +const FileYaraOverviewLanding = ({ data, onFileYaraSelect }) => { + const [filterApplied, setFilterApplied] = useState(false); + + const handleYaraSelect = (selectedYara) => { + setFilterApplied(!!selectedYara); + onFileYaraSelect(selectedYara); + }; + + const borderStyle = filterApplied + ? { + // Styles when the filter is applied + border: `2px solid ${antdColors.purple}50`, + borderRadius: "8px", + boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)", + padding: "3px", + transition: "all 0.3s", // Transition for both applying and removing the filter + } + : { + // Styles when the filter is not applied (could potentially add styles for the normal state if needed) + transition: "all 0.3s", + }; + + return ( + + + File YARA Matches + {filterApplied && ( + + Filter Applied + + )} + + } + key="1" + > + + + + ); +}; + +export default FileYaraOverviewLanding; diff --git a/ui/src/components/FileComponents/YaraTypeOverviewCard.js b/ui/src/components/FileOverviews/YaraOverview/YaraTypeOverviewCard.js similarity index 92% rename from ui/src/components/FileComponents/YaraTypeOverviewCard.js rename to ui/src/components/FileOverviews/YaraOverview/YaraTypeOverviewCard.js index e83c255..76bdebd 100644 --- a/ui/src/components/FileComponents/YaraTypeOverviewCard.js +++ b/ui/src/components/FileOverviews/YaraOverview/YaraTypeOverviewCard.js @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { Tag, Tooltip, Typography, Row } from "antd"; import { WarningOutlined, BookOutlined } from "@ant-design/icons"; -import { antdColors } from "../../utils/colors"; +import { antdColors } from "../../../utils/colors"; const { Text } = Typography; @@ -48,9 +48,14 @@ const YaraTypeOverviewCard = ({ data, onFileYaraSelect }) => { yaraMatches.forEach((match) => { if (yaraCounts[match]) { yaraCounts[match].count++; - yaraCounts[match].files.push(response.file.name || response.scan.hash.md5); + yaraCounts[match].files.push( + response.file.name || response.scan.hash.md5 + ); } else { - yaraCounts[match] = { count: 1, files: [response.file.name || response.scan.hash.md5] }; + yaraCounts[match] = { + count: 1, + files: [response.file.name || response.scan.hash.md5], + }; } }); }); @@ -79,12 +84,17 @@ const YaraTypeOverviewCard = ({ data, onFileYaraSelect }) => { width: "95%", justifyContent: "space-between", alignItems: "center", - background: "none", + background: + selectedYara === item.yara + ? isSuspicious + ? `${antdColors.deepOrange}20` + : `${antdColors.blue}20` + : "none", cursor: "pointer", border: selectedYara === item.yara ? `1px solid ${ - isSuspicious ? antdColors.deepOrange : antdColors.darkGray + isSuspicious ? antdColors.deepOrange : antdColors.blue }` : "none", }} diff --git a/ui/src/components/SubmissionTable.js b/ui/src/components/SubmissionTable.js index c9dbe7e..f7dd0ae 100644 --- a/ui/src/components/SubmissionTable.js +++ b/ui/src/components/SubmissionTable.js @@ -20,6 +20,9 @@ import { import { Link } from "react-router-dom"; import { getIconConfig } from "../utils/iconMappingTable"; +import useVirusTotalApiKey from '../utils/useVirusTotalApiKey'; +import VirusTotalAugmentDrawer from "./VirusTotal/VirusTotalAugmentDrawer.js"; + import { debounce } from "lodash"; import AuthCtx from "../contexts/auth"; @@ -27,7 +30,6 @@ import { fetchWithTimeout } from "../util.js"; import { APP_CONFIG } from "../config"; const { Text } = Typography; - /** * A table component for displaying submission data. */ @@ -42,6 +44,18 @@ const SubmissionTable = () => { const defaultSorter = { field: "submitted_at", order: "descend" }; const [sorter, setSorter] = useState(defaultSorter); const [pagination, setPagination] = useState({ current: 1, pageSize: 10 }); + const [vtDrawerVisible, setVtDrawerVisible] = useState(false); + const [selectedResource, setSelectedResource] = useState(null); + const { isApiKeyAvailable } = useVirusTotalApiKey(); + + + // Function to handle opening the VT Augment + const handleVtOpen = (sha256Hash) => { + if (isApiKeyAvailable) { + setSelectedResource(sha256Hash); + setVtDrawerVisible(true); + } + }; // Fetches Data from the Strelka UP API const fetchData = useCallback(async () => { @@ -208,18 +222,20 @@ const SubmissionTable = () => { }, { - title: "VT +", + title: ( + + + VT + + + + + ), dataIndex: "strelka_response", key: "vt", width: 1, render: (strelkaResponse) => { - // Find the highest VirusTotal enrichment number in the responses - const highestVtEnrichment = strelkaResponse.reduce((max, response) => { - const enrichmentNumber = response?.enrichment?.virustotal; - return enrichmentNumber > max ? enrichmentNumber : max; - }, -1); // Start with -1 to handle cases where there are no positive numbers - const tagStyle = { + const defaultTagStyle = { fontSize: "10px", fontWeight: "bold", width: "80%", @@ -227,24 +243,55 @@ const SubmissionTable = () => { maxWidth: "75px", }; - let tagColor = "default"; - let vtText = - highestVtEnrichment >= 0 ? highestVtEnrichment.toString() : "N/A"; + const VtTagStyle = { + fontSize: "10px", + fontWeight: "bold", + width: "80%", + textAlignLast: "center", + maxWidth: "75px", + cursor: "pointer" + }; - if (highestVtEnrichment >= 5) { - tagColor = "error"; // red - } else if (highestVtEnrichment >= 0) { - tagColor = "success"; // green + // Initialize the object to store the highest VT enrichment and SHA256 + const highestVt = { + enrichment: -1, + sha256: null, + }; + + // Iterate over strelkaResponse to find the highest VT enrichment and its SHA256 + strelkaResponse.forEach((response) => { + const enrichmentNumber = response?.enrichment?.virustotal; + if (enrichmentNumber > highestVt.enrichment) { + highestVt.enrichment = enrichmentNumber; + highestVt.sha256 = response.scan.hash.sha256; + } + }); + + // Determine color based on enrichment value + let vtColor = "default"; + if (highestVt.enrichment > 5) { + vtColor = "volcano"; // Ant Design's volcano color for high enrichment + } else if (highestVt.enrichment >= 0) { + vtColor = "green"; // Ant Design's green color for low enrichment } - - return ( - - {vtText} + + // Check if enrichment value is "N/A", then return a non-clickable tag without an icon + if (highestVt.enrichment === -1) { + return N/A; + } else { + // Enrichment value exists, so return a clickable tag with the VirusTotal icon + return ( + !isApiKeyAvailable ? null : handleVtOpen(highestVt.sha256)} + > + {highestVt.enrichment} - ); + ); + } }, }, - { title: "Filename", dataIndex: "file_id", @@ -650,6 +697,11 @@ const SubmissionTable = () => { return (
+ setVtDrawerVisible(false)} + open={vtDrawerVisible} + />
diff --git a/ui/src/components/VirusTotal/VirusTotalAugmentDrawer.js b/ui/src/components/VirusTotal/VirusTotalAugmentDrawer.js new file mode 100644 index 0000000..cdd8a7c --- /dev/null +++ b/ui/src/components/VirusTotal/VirusTotalAugmentDrawer.js @@ -0,0 +1,81 @@ +import React, { useState, useEffect } from "react"; +import { Drawer, message } from "antd"; +import { APP_CONFIG } from "../../config"; +import { fetchWithTimeout } from "../../util"; + +const VirusTotalAugmentDrawer = ({ resource, onClose, open }) => { + const [widgetUrl, setWidgetUrl] = useState(null); + + useEffect(() => { + if (!open) { + return; + } + + const fetchWidgetUrl = () => { + const payload = { resource }; + + fetchWithTimeout( + `${APP_CONFIG.BACKEND_URL}/strelka/virustotal/widget-url`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + mode: "cors", + credentials: "include", + timeout: APP_CONFIG.API_TIMEOUT, + } + ) + .then((response) => { + if (!response.ok) { + return response.json().then((errorData) => { + throw new Error( + errorData.details || + "Error occurred while retrieving VirusTotal widget token" + ); + }); + } + return response.json(); + }) + .then((data) => { + setWidgetUrl(data.widget_url); + }) + .catch((error) => { + message.error(`Error retrieving widget token: ${error.message}`); + }); + }; + + fetchWidgetUrl(); + }, [open, resource]); + + return ( + + {widgetUrl ? ( +