From 4a4d38b09d533bdc39524cf27f9f3f6792eded93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= <raphael@vinot.info> Date: Wed, 4 Sep 2024 16:30:33 +0200 Subject: [PATCH] new: Use talisman, refactor JS, enable strict CSP. --- poetry.lock | 450 +++++++++--------- pyproject.toml | 11 +- website/web/__init__.py | 45 +- website/web/sri.txt | 6 +- website/web/static/generic.js | 5 + website/web/static/hostname_popup.js | 74 +++ website/web/static/tree.js | 7 +- website/web/static/tree_modals.js | 220 +++++++++ website/web/templates/body_hash.html | 22 +- website/web/templates/bulk_captures.html | 6 +- website/web/templates/capture.html | 1 + website/web/templates/categories.html | 2 +- website/web/templates/cookie_name.html | 20 +- website/web/templates/cookies.html | 2 +- website/web/templates/favicon_details.html | 2 +- website/web/templates/favicons.html | 2 +- website/web/templates/hash_type_details.html | 2 +- website/web/templates/hhh_details.html | 26 +- website/web/templates/hhhashes.html | 2 +- website/web/templates/historical_lookups.html | 11 +- website/web/templates/hostname.html | 2 +- website/web/templates/hostname_popup.html | 72 +-- website/web/templates/identifier_details.html | 2 +- website/web/templates/index.html | 2 +- website/web/templates/macros.html | 28 +- website/web/templates/main.html | 5 +- website/web/templates/ressources.html | 4 +- website/web/templates/search.html | 1 + website/web/templates/simple_capture.html | 3 +- website/web/templates/stats.html | 2 + website/web/templates/tree.html | 272 ++--------- website/web/templates/tree_body_hashes.html | 12 +- website/web/templates/tree_favicons.html | 15 +- website/web/templates/tree_hashes_types.html | 2 +- website/web/templates/tree_hostnames.html | 13 +- website/web/templates/tree_identifiers.html | 2 +- website/web/templates/tree_urls.html | 2 +- website/web/templates/url.html | 2 +- website/web/templates/urls_rendered.html | 13 +- 39 files changed, 776 insertions(+), 594 deletions(-) create mode 100644 website/web/static/hostname_popup.js create mode 100644 website/web/static/tree_modals.js diff --git a/poetry.lock b/poetry.lock index 4c07ff7d..07be8af8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -178,18 +178,22 @@ python-socks = {version = ">=2.4.3,<3.0.0", extras = ["asyncio"]} [[package]] name = "aioitertools" -version = "0.11.0" +version = "0.12.0" description = "itertools and builtins for AsyncIO and mixed iterables" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, - {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, + {file = "aioitertools-0.12.0-py3-none-any.whl", hash = "sha256:fc1f5fac3d737354de8831cbba3eb04f79dd649d8f3afb4c5b114925e662a796"}, + {file = "aioitertools-0.12.0.tar.gz", hash = "sha256:c2a9055b4fbb7705f561b9d86053e8af5d10cc845d22c32008c43490b2d8dd6b"}, ] [package.dependencies] typing_extensions = {version = ">=4.0", markers = "python_version < \"3.10\""} +[package.extras] +dev = ["attribution (==1.8.0)", "black (==24.8.0)", "build (>=1.2)", "coverage (==7.6.1)", "flake8 (==7.1.1)", "flit (==3.9.0)", "mypy (==1.11.2)", "ufmt (==2.7.1)", "usort (==1.0.8.post1)"] +docs = ["sphinx (==8.0.2)", "sphinx-mdinclude (==0.6.2)"] + [[package]] name = "aiosignal" version = "1.3.1" @@ -560,13 +564,13 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -785,38 +789,38 @@ files = [ [[package]] name = "cryptography" -version = "43.0.0" +version = "43.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, - {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, - {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, - {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, - {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, - {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, - {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, + {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, + {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, + {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, + {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, + {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, + {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, + {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, ] [package.dependencies] @@ -829,7 +833,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -952,13 +956,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -1016,13 +1020,13 @@ dotenv = ["python-dotenv"] [[package]] name = "flask-cors" -version = "4.0.1" +version = "5.0.0" description = "A Flask extension adding a decorator for CORS support" optional = false python-versions = "*" files = [ - {file = "Flask_Cors-4.0.1-py2.py3-none-any.whl", hash = "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677"}, - {file = "flask_cors-4.0.1.tar.gz", hash = "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4"}, + {file = "Flask_Cors-5.0.0-py2.py3-none-any.whl", hash = "sha256:b9e307d082a9261c100d8fb0ba909eec6a228ed1b60a8315fd85f783d61910bc"}, + {file = "flask_cors-5.0.0.tar.gz", hash = "sha256:5aadb4b950c4e93745034594d9f3ea6591f734bb3662e16e255ffbf5e89c88ef"}, ] [package.dependencies] @@ -1067,6 +1071,17 @@ dev = ["Faker (==2.0.0)", "black", "blinker", "invoke (==2.2.0)", "mock (==3.0.5 doc = ["Sphinx (==5.3.0)", "alabaster (==0.7.12)", "sphinx-issues (==3.0.1)"] test = ["Faker (==2.0.0)", "blinker", "invoke (==2.2.0)", "mock (==3.0.5)", "pytest (==7.0.1)", "pytest-benchmark (==3.4.1)", "pytest-cov (==4.0.0)", "pytest-flask (==1.3.0)", "pytest-mock (==3.6.1)", "pytest-profiling (==1.7.0)", "setuptools", "twine (==3.8.0)", "tzlocal"] +[[package]] +name = "flask-talisman" +version = "1.1.0" +description = "HTTP security headers for Flask." +optional = false +python-versions = "*" +files = [ + {file = "flask-talisman-1.1.0.tar.gz", hash = "sha256:c5f486f5f54420729f84b3c3850cd63f96e8b033a9629bee66c524ea363797ff"}, + {file = "flask_talisman-1.1.0-py2.py3-none-any.whl", hash = "sha256:3c42b610ebe49b0e35ca150e179bf51aa1da01e4635b49a674868ea681046208"}, +] + [[package]] name = "frozenlist" version = "1.4.1" @@ -1556,13 +1571,13 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "ipython" -version = "8.26.0" +version = "8.27.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, - {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, + {file = "ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c"}, + {file = "ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e"}, ] [package.dependencies] @@ -2376,63 +2391,64 @@ files = [ [[package]] name = "numpy" -version = "2.1.0" +version = "2.1.1" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b"}, - {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b"}, - {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f"}, - {file = "numpy-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84"}, - {file = "numpy-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33"}, - {file = "numpy-2.1.0-cp310-cp310-win32.whl", hash = "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211"}, - {file = "numpy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e"}, - {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb"}, - {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3"}, - {file = "numpy-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36"}, - {file = "numpy-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd"}, - {file = "numpy-2.1.0-cp311-cp311-win32.whl", hash = "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"}, - {file = "numpy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8"}, - {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745"}, - {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111"}, - {file = "numpy-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0"}, - {file = "numpy-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574"}, - {file = "numpy-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02"}, - {file = "numpy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b"}, - {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195"}, - {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977"}, - {file = "numpy-2.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1"}, - {file = "numpy-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62"}, - {file = "numpy-2.1.0-cp313-cp313-win32.whl", hash = "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324"}, - {file = "numpy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d"}, - {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd"}, - {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6"}, - {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a"}, - {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2"}, - {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647"}, + {file = "numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728"}, + {file = "numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, + {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, + {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, + {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, + {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556"}, + {file = "numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b"}, + {file = "numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39"}, + {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, ] [[package]] @@ -2753,13 +2769,13 @@ files = [ [[package]] name = "publicsuffixlist" -version = "1.0.2.20240827" +version = "1.0.2.20240903" description = "publicsuffixlist implement" optional = false python-versions = ">=3.5" files = [ - {file = "publicsuffixlist-1.0.2.20240827-py2.py3-none-any.whl", hash = "sha256:54db24ac936d9cc7fe52eab5de8acf6dc263d3088313461ba640bdfabf759801"}, - {file = "publicsuffixlist-1.0.2.20240827.tar.gz", hash = "sha256:68f5aa02abe59a192f2b13d41f587eafe14b16811fc563549c8dacc2a9264954"}, + {file = "publicsuffixlist-1.0.2.20240903-py2.py3-none-any.whl", hash = "sha256:d4436dead5f6da280eb0d3e4139a0f30077ba4bff2de837c91ff58d40af7e705"}, + {file = "publicsuffixlist-1.0.2.20240903.tar.gz", hash = "sha256:99c7f35974ef30a5dbe57739736a7078e16e304f0a520b7234fa11b2cc5fec40"}, ] [package.extras] @@ -3171,19 +3187,19 @@ docs = ["Sphinx (<7.2)", "Sphinx (>=7.2,<8.0)", "Sphinx (>=8,<9)"] [[package]] name = "pymisp" -version = "2.4.196" +version = "2.4.197" description = "Python API for MISP." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "pymisp-2.4.196-py3-none-any.whl", hash = "sha256:f56ad708566b9f912809375cb982fadf67a3eb282970e1172d971b0fad35042b"}, - {file = "pymisp-2.4.196.tar.gz", hash = "sha256:86620b0b77b51eb5d08dcb2c1705ab0ce36813e35f48a488067266f565005dc9"}, + {file = "pymisp-2.4.197-py3-none-any.whl", hash = "sha256:6e9078dbe4066701318ff8d5de2723db33bfac79677e16b274c517f0adec74a2"}, + {file = "pymisp-2.4.197.tar.gz", hash = "sha256:840881779d1762803e9329ae5129a88abb0e6110afb43c9e3e6e3877e5931a6c"}, ] [package.dependencies] deprecated = ">=1.2.14,<2.0.0" lief = {version = ">=0.15.0,<0.16.0", optional = true, markers = "extra == \"fileobjects\""} -publicsuffixlist = ">=1.0.2.20240814,<2.0.0.0" +publicsuffixlist = ">=1.0.2.20240827,<2.0.0.0" pydeep2 = {version = ">=0.5.1,<0.6.0", optional = true, markers = "extra == \"fileobjects\""} pyfaup = {version = ">=1.2,<2.0", optional = true, markers = "extra == \"url\""} python-dateutil = ">=2.9.0.post0,<3.0.0" @@ -3192,8 +3208,8 @@ requests = ">=2.32.3,<3.0.0" [package.extras] brotli = ["urllib3[brotli]"] -docs = ["Sphinx (>=7.2,<8.0)", "Sphinx (>=8,<9)", "docutils (>=0.21.1,<0.22.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-autodoc-typehints (>=2.2.3,<3.0.0)"] -email = ["RTFDE (>=0.1.1,<0.2.0)", "extract_msg (>=0.48.5,<0.49.0)", "oletools (>=0.60.1,<0.61.0)"] +docs = ["Sphinx (>=7.2,<8.0)", "Sphinx (>=8,<9)", "docutils (>=0.21.1,<0.22.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-autodoc-typehints (>=2.3.0,<3.0.0)"] +email = ["RTFDE (>=0.1.1,<0.2.0)", "extract_msg (>=0.49,<0.50)", "oletools (>=0.60.1,<0.61.0)"] fileobjects = ["lief (>=0.15.0,<0.16.0)", "pydeep2 (>=0.5.1,<0.6.0)", "python-magic (>=0.4.27,<0.5.0)"] openioc = ["beautifulsoup4 (>=4.12.3,<5.0.0)"] pdfexport = ["reportlab (>=4.2.2,<5.0.0)"] @@ -3795,13 +3811,13 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "74.0.0" +version = "74.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.0.0-py3-none-any.whl", hash = "sha256:0274581a0037b638b9fc1c6883cc71c0210865aaa76073f7882376b641b84e8f"}, - {file = "setuptools-74.0.0.tar.gz", hash = "sha256:a85e96b8be2b906f3e3e789adec6a9323abf79758ecfa3065bd740d81158b11e"}, + {file = "setuptools-74.1.1-py3-none-any.whl", hash = "sha256:fc91b5f89e392ef5b77fe143b17e32f65d3024744fba66dc3afe07201684d766"}, + {file = "setuptools-74.1.1.tar.gz", hash = "sha256:2353af060c06388be1cecbf5953dcdb1f38362f87a2356c480b6b4d5fcfc8847"}, ] [package.extras] @@ -3984,13 +4000,13 @@ files = [ [[package]] name = "types-psutil" -version = "6.0.0.20240621" +version = "6.0.0.20240901" description = "Typing stubs for psutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-psutil-6.0.0.20240621.tar.gz", hash = "sha256:1be027326c42ff51ebd65255a5146f9dc57e5cf8c4f9519a88b3f3f6a7fcd00e"}, - {file = "types_psutil-6.0.0.20240621-py3-none-any.whl", hash = "sha256:b02f05d2c4141cd5926d82d8b56e4292a4d8f483d8a3400b73edf153834a3c64"}, + {file = "types-psutil-6.0.0.20240901.tar.gz", hash = "sha256:437affa76670363db9ffecfa4f153cc6900bf8a7072b3420f3bc07a593f92226"}, + {file = "types_psutil-6.0.0.20240901-py3-none-any.whl", hash = "sha256:20af311bfb0386a018a27ae47dc952119d7c0e849ff72b6aa24fc0433afb92a6"}, ] [[package]] @@ -4032,13 +4048,13 @@ files = [ [[package]] name = "types-redis" -version = "4.6.0.20240819" +version = "4.6.0.20240903" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" files = [ - {file = "types-redis-4.6.0.20240819.tar.gz", hash = "sha256:08f51f550ad41d0152bd98d77ac9d6d8f761369121710a213642f6036b9a7183"}, - {file = "types_redis-4.6.0.20240819-py3-none-any.whl", hash = "sha256:86db9af6f0033154e12bc22c77236cef0907b995fda8c9f0f0eacd59943ed2fc"}, + {file = "types-redis-4.6.0.20240903.tar.gz", hash = "sha256:4bab1a378dbf23c2c95c370dfdb89a8f033957c4fd1a53fee71b529c182fe008"}, + {file = "types_redis-4.6.0.20240903-py3-none-any.whl", hash = "sha256:0e7537e5c085fe96b7d468d5edae0cf667b4ba4b62c6e4a5dfc340bd3b868c23"}, ] [package.dependencies] @@ -4075,13 +4091,13 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "73.0.0.20240822" +version = "74.0.0.20240831" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-73.0.0.20240822.tar.gz", hash = "sha256:3a060681098eb3fbc2fea0a86f7f6af6aa1ca71906039d88d891ea2cecdd4dbf"}, - {file = "types_setuptools-73.0.0.20240822-py3-none-any.whl", hash = "sha256:b9eba9b68546031317a0fa506d4973641d987d74f79e7dd8369ad4f7a93dea17"}, + {file = "types-setuptools-74.0.0.20240831.tar.gz", hash = "sha256:8b4a544cc91d42a019dc1e41fd397608b4bc7e20c7d7d5bc326589ffd9e8f8a1"}, + {file = "types_setuptools-74.0.0.20240831-py3-none-any.whl", hash = "sha256:4d9d18ea9214828d695a384633130009f5dee2681a157ee873d3680b62931590"}, ] [[package]] @@ -4162,13 +4178,13 @@ six = "*" [[package]] name = "urllib3" -version = "1.26.19" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, - {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] @@ -4347,101 +4363,103 @@ email = ["email-validator"] [[package]] name = "yarl" -version = "1.9.4" +version = "1.9.8" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, + {file = "yarl-1.9.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:08359dbc3540fafa8972db45d3ef2d61370b4c24b8a028a4301bc5d076eee0e2"}, + {file = "yarl-1.9.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7a716aae4fcecadfe4648268d3c194315152715391f4af6fad50d502be122e9"}, + {file = "yarl-1.9.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62223670042a219b8e6fbd2c7f35c456278dcd346d3aba3f2c01c9bdec28f37e"}, + {file = "yarl-1.9.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18097a9e50ea31c61fece83bac8f63263f0c0c16c439bf82ac729c23f3b170e3"}, + {file = "yarl-1.9.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5809f8a48c8dab91f708947d358271ef1890c3012d6c45719f49d04af2112057"}, + {file = "yarl-1.9.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71ff7a22355241f89e850afbc8858fb671ba7e2763af32ebbea158d23a84902a"}, + {file = "yarl-1.9.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d54e9880e781a490483200a74f6314fb6cf692a8197ccde93adf32bec95626b"}, + {file = "yarl-1.9.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ad8ea6ab27e27821739dfb94fab63284e3a52055e268f04529dc082fd0d59a2"}, + {file = "yarl-1.9.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b79e031524259b51cdd1ea41f5053491ad3565b9cecd76389c9f705752d14283"}, + {file = "yarl-1.9.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bd91ccded75d080f13ed01a5f5796887916d2e8c0999cd68bcb58f89f9b1c29c"}, + {file = "yarl-1.9.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:583f48ab25b3906e3716479e8f700c4cc487e44d52766a4ea52b01cb7ea772d6"}, + {file = "yarl-1.9.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2f3e89838acdaf5bbd69383c408d9e119b4e9efbe8a38fa40045b5c966f918e3"}, + {file = "yarl-1.9.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a44c0b83d1871e1e1859167a1804143f590f86ac4708380852dca4d8299d8594"}, + {file = "yarl-1.9.8-cp310-cp310-win32.whl", hash = "sha256:5d39ae58a67b64b470021d18a13529d0c58efc5bf057936ec4b29092d4061030"}, + {file = "yarl-1.9.8-cp310-cp310-win_amd64.whl", hash = "sha256:f89ade31926b9931bbe29f5c62d4174057e532fb0c72e2e6abdd129fda6a60f3"}, + {file = "yarl-1.9.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:986296e65b0312c1da168de4ec1bb054b4a7b0ec26e3f9e8dafc06bbb1385030"}, + {file = "yarl-1.9.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b4c7c015dc813aa5fe15379f3540d178e3743c0f1cf9e4a4a8bff94bd2832a4d"}, + {file = "yarl-1.9.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:22b2db22f72e1cb8a552ae12dfb748167153c7cbf353c62781915b5328bf2561"}, + {file = "yarl-1.9.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a567416bfb2a2b093aa64685aa7b6dfb593888784ef91b16fa6b985cceb951"}, + {file = "yarl-1.9.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:178f4ab054f3a5dc84c8091bd7395b6713aac83af893b62259d5eb3f5359ce7f"}, + {file = "yarl-1.9.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02fe9809b29a7dc4a27b769a43c556288d949205db54338871a122b64751e0f4"}, + {file = "yarl-1.9.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c885a81f6c89b0d45fc0dd88e005c77dd8ba1dac421466d0dbb9192ce6d34e1e"}, + {file = "yarl-1.9.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99f78f45c8b4c9824e1a37eb0a3ae63ad2dff66434d9620265a4256088be9cda"}, + {file = "yarl-1.9.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:30929a10be9a13026fd68377aba3223d633370abb93dadd3932754f3dcf4734a"}, + {file = "yarl-1.9.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ee7c00a1979b3f23c8094dce6d9875453b3cb91b1153d9efaefa6773cf80cdb0"}, + {file = "yarl-1.9.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e89d76b2aa11287f038a37577528c5f62d9385020b795a011f60dfd1b217cf9f"}, + {file = "yarl-1.9.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:81fde88456d2cbe005e16aca78ef744f322b3b15184dfe41b5b04f97b46aa5be"}, + {file = "yarl-1.9.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3dca0a4e192207f8bb4057725ff95e9a14d53a04728742f2b03692fc91b0a43"}, + {file = "yarl-1.9.8-cp311-cp311-win32.whl", hash = "sha256:9ea3a8532ea9fc2eeb6fc3def0c341aaeab7625545844f9c0a15350c17f9f479"}, + {file = "yarl-1.9.8-cp311-cp311-win_amd64.whl", hash = "sha256:c810606719683f4ab92127712efe283674d6ed29a627374411c762852913c2dd"}, + {file = "yarl-1.9.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b3d373373908e687aa4c8b0666870b0cf65605254ba0819ed8d5af2fc0780496"}, + {file = "yarl-1.9.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e3d1be58e28825a14fb9561733de62fbe95c892febe7d7a9ebcde916c531d603"}, + {file = "yarl-1.9.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7318736a8ee9de8217d590866dd716fa3c0895e684e2ec6152d945a4ab758043"}, + {file = "yarl-1.9.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db3dd602cbf6613dc1e4a6fbde7a1bee86948e5940086090bb505c2ab959bbdf"}, + {file = "yarl-1.9.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5950226b128a1610f57c1f756fc611fdbdcb1e6b4497ccb05fce76a38915b07"}, + {file = "yarl-1.9.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b341a995673180ed81a1040228a59e0b47ee687e367b1a03d829fa3c0eb4607e"}, + {file = "yarl-1.9.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f912153a34698994f32cf683d966014b0dd99c73481302d6159bcb3a8303e84"}, + {file = "yarl-1.9.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ceab2b16043ae1953863ec240eb918ba1ac40d2aad55225141aac288c606442"}, + {file = "yarl-1.9.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c0d2bc2646ae2380bb91b9ddc2eb1e1fa6baef128499e817134d1d50c8b6c56"}, + {file = "yarl-1.9.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ebd98e16ff9948e4d31514c937275017a122b765cb89961dd5d44ecd2cc18140"}, + {file = "yarl-1.9.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:83273ca458c85d7b026c770a86df6e36349e85100bd2cefe6d0ad7167a8f12a6"}, + {file = "yarl-1.9.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4511dd73b6aeda0cc39111839923f1545726d621813c9d13355824fba328dbcf"}, + {file = "yarl-1.9.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ffb9f1cad56c547aa127e2c315e666ee9838156c8a3b14f37ba545b0167aa5e"}, + {file = "yarl-1.9.8-cp312-cp312-win32.whl", hash = "sha256:5796358c3d6c72b108b570e20ab951463237ec473b6d204da21050feaaaf7dca"}, + {file = "yarl-1.9.8-cp312-cp312-win_amd64.whl", hash = "sha256:c2dc6e941bf53160b44858d1b24767a056cd83166b69fbdd3b2e401856d8932e"}, + {file = "yarl-1.9.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cb3d488f049db9522e3a0de50e07bac0c53565acd88a07bc9cf7182fd6890307"}, + {file = "yarl-1.9.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:50cbf73b6a4b62c3ad633e8920f2791adf485356ef37c9edbd5a1e7de8da2ddc"}, + {file = "yarl-1.9.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1e0649ee7ac354a3e40ee849707140b14a2cd0cd2dc2062fe620458dfe465c8"}, + {file = "yarl-1.9.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2501b230e89cad2361719860648f780197812d3be91c7ca6658a097a7e22fc4"}, + {file = "yarl-1.9.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be441a73f9f49427906274008bd98384d8ca4655981735281c314fc7c145d256"}, + {file = "yarl-1.9.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7de1968a1c2690b86e32e91acf8ed2043c346293f9bbe1704b9f6a481b73bd11"}, + {file = "yarl-1.9.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce892a75a2209cf4f7007de21c6f6d607f4b9406ac613a59ad02340f6e933e4"}, + {file = "yarl-1.9.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:405e75bb94b87cc4167eef0e08d6a539f60633229f7043edc2e65c82ef80e874"}, + {file = "yarl-1.9.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5811c1906b38f2a203df1266c6dd11680ca85d610d6ee3701dde262a305520"}, + {file = "yarl-1.9.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:51476f19fe1296d3efe3770179548f5f4822e5c4ead9f5160ba156a6a9f5272c"}, + {file = "yarl-1.9.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2af144a81883db914636bec646da4dcccfe9db05c2899e7afe90a3d817ffce"}, + {file = "yarl-1.9.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:8c91b71b0af1fb5454709e34b39e38c975faaa89c0cc8bb744d60300ca710fcd"}, + {file = "yarl-1.9.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a562055b5ec6371c307320e8460d16675244e810b20f343371fc52797d23615"}, + {file = "yarl-1.9.8-cp313-cp313-win32.whl", hash = "sha256:f7442a9342aa04ea60b760a8f0d210e269f881eb0660a2000fa1f8cb89820931"}, + {file = "yarl-1.9.8-cp313-cp313-win_amd64.whl", hash = "sha256:21ef75d8a18fa47725b50fcb7ae6d23a51c71a7426cdf7097e52f9e12a995eb6"}, + {file = "yarl-1.9.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd9affa8c18198dfa5a19c63b29ef2a2f35b8efacaf0bdd3e58f974c0ab0108d"}, + {file = "yarl-1.9.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f79e65f16413a95d9f7633802a2ee34730b3ba1dd0af82811b377057883c4fb7"}, + {file = "yarl-1.9.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3f8c454cf7e4d3762515ed2b5a40cf2feaeb8a8ed1d121f131a6178e16015319"}, + {file = "yarl-1.9.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f972fc63a1d6165d1cff650a16a498b0087334f7f9cd7385860c086d009cd49"}, + {file = "yarl-1.9.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ac4aa2f2d8253b9a5455d5f0ed45687ea9715b78a563490ddf7954337974cb7"}, + {file = "yarl-1.9.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b001379047de5e03224dc0592f1b0e60738857a9b992d9b636b5050500ecce23"}, + {file = "yarl-1.9.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39deb5a67b591682e54d1b09b36e79cd608ca27bea1fefed3bcaaa0b05d2b25e"}, + {file = "yarl-1.9.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffd9dd7eac5d36f53fccdf11e98730b7a628561c77f6c2a9e0909d2a304f34d1"}, + {file = "yarl-1.9.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:497d5fd7dce44b5dcac648c830c99a673d30bc6cd9905b3e255c92c6dc01f537"}, + {file = "yarl-1.9.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d99011d564f2b5cb4cf1012f9058e08d8d79674332474f7e940131f5952015df"}, + {file = "yarl-1.9.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:600f734296cb99db1af7e34c0dcf8ec9477072f72c4621677637fdc2273af120"}, + {file = "yarl-1.9.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6703deac7bb0dd8b3f0bc3cb6844dab4e74c85c70783ae89bd0b52286ebdc102"}, + {file = "yarl-1.9.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3346e2f641fcf31cf32c5a394d625e0676aba6fadccc06d35435e475753ed05d"}, + {file = "yarl-1.9.8-cp38-cp38-win32.whl", hash = "sha256:a54f7a63e48156a77a7c0333cefed29ceb004ab683d685a1192b341ac445cb73"}, + {file = "yarl-1.9.8-cp38-cp38-win_amd64.whl", hash = "sha256:45992ff8d941a1901c35f2ed90a60cb5fee8705ffadff395db4a5fd164473542"}, + {file = "yarl-1.9.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:590437f092af08e71521cc302940ef897e969152434c825bb3fb8f308b63a8bb"}, + {file = "yarl-1.9.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:551c26789acd38c7b90a89a1f262291d9f9a6a677185a83b5781e2a2c4258aec"}, + {file = "yarl-1.9.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:121bf7d647b3f6481ce1030350c1cc4c43e18758010732a449c71a1784ae793d"}, + {file = "yarl-1.9.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c9db466370e8bc3459912850494ad3401f3664ff3a56842f0d4514166f54c9f"}, + {file = "yarl-1.9.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff56e21379824f3e3c39a37083d5ab905168b9483b1c0c563dd92eb2db18b251"}, + {file = "yarl-1.9.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cce910a1510d60c7eff4bb263b28b9afdcc5f6b85c555e492cfe7548a09e2476"}, + {file = "yarl-1.9.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ba7c4b50cc0bb4caaa54554613ca13db47a24878a4fc1063e6303494fc67567"}, + {file = "yarl-1.9.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b345de5e725b82e9458dc1381d7e28fe7d7ef93491370461dc98283b9dda51e2"}, + {file = "yarl-1.9.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:49dd58b79b0fd04e880c90bc570fde68407cc516c58812f0321f5e74c131107c"}, + {file = "yarl-1.9.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:15fb127bcc19065fd912391a43bc80114635f0062e0465765633ab5d0c7fc3a1"}, + {file = "yarl-1.9.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6f4f87a7c97ba77fdc764b893ae4083c74e5857904962a70025ade0cd42bdbaf"}, + {file = "yarl-1.9.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:d336601d9ff3dc3b12263739ab1add25bdd2345d675f59ad49f72d9a6ccbc865"}, + {file = "yarl-1.9.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3574834e4aaf24e24d12fa4fd53d0b0fd1d70b24a67bed81c44b284377e81d45"}, + {file = "yarl-1.9.8-cp39-cp39-win32.whl", hash = "sha256:db9305328486539bb7182c15f1ad1ea95dae52245e93a049f2b1d6f04e63674d"}, + {file = "yarl-1.9.8-cp39-cp39-win_amd64.whl", hash = "sha256:588d62a57c7a43b230557728ec9f252b3f81ad073cb5c0ef48d87cd3f8b6ace2"}, + {file = "yarl-1.9.8-py3-none-any.whl", hash = "sha256:d1612ce50f23b94897b9ef5eb65b72398a9a83ea990b42825272590f3484dae3"}, + {file = "yarl-1.9.8.tar.gz", hash = "sha256:3089553548d9ab23152cecb5a71131caaa9e9b16d7fc8196057c374fdc53cc4b"}, ] [package.dependencies] @@ -4470,4 +4488,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.13" -content-hash = "ecffe85ed5a1098b73930c38b4a4b2ef6b1e06333b4e8bc5d9c2ad16d8671fca" +content-hash = "bfbc321147c15f18994b6d1fd0e57d08ac128e79341fb46cb44f071ff0d06bf2" diff --git a/pyproject.toml b/pyproject.toml index 4724fb6e..6f26968d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,12 +53,12 @@ pysanejs = "^2.0.2" pylookyloo = "^1.25.0" dnspython = "^2.6.1" pytaxonomies = "^1.5.0" -pymisp = {version = "^2.4.196", extras = ["url", "fileobjects"]} +pymisp = {version = "^2.4.197", extras = ["url", "fileobjects"]} Pillow = "^10.4.0" flask-restx = "^1.3.0" rich = "^13.8.0" pyphishtanklookup = "^1.4.0" -Flask-Cors = "^4.0.1" +Flask-Cors = "^5.0.0" pyhashlookup = "^1.2.4" lief = "^0.15" ua-parser = "^0.18.0" @@ -71,7 +71,7 @@ pypandora = "^1.9.0" lacuscore = "^1.10.12" pylacus = "^1.10.0" pyipasnhistory = "^2.1.2" -publicsuffixlist = "^1.0.2.20240827" +publicsuffixlist = "^1.0.2.20240903" pyfaup = "^1.2" chardet = "^5.2.0" pysecuritytxt = "^1.3.2" @@ -86,6 +86,7 @@ pypdns = "^2.2.3" mmh3 = "^4.1.0" puremagic = "^1.27" psutil = "^6.0.0" +flask-talisman = "^1.1.0" [tool.poetry.group.dev.dependencies] mypy = "^1.11.2" @@ -98,13 +99,13 @@ types-requests = [ {version = "<2.31", python = "<3.10"}, {version = "^2.31.0.10", python = ">=3.10"} ] -types-redis = {version = "^4.6.0.20240819"} +types-redis = {version = "^4.6.0.20240903"} types-Deprecated = "^1.2.9.20240311" types-python-dateutil = "^2.9.0.20240821" types-beautifulsoup4 = "^4.12.0.20240511" types-Pillow = "^10.2.0.20240822" types-pytz = "^2024.1.0.20240417" -types-psutil = "^6.0.0.20240621" +types-psutil = "^6.0.0.20240901" [build-system] requires = ["poetry_core"] diff --git a/website/web/__init__.py b/website/web/__init__.py index 57ed6174..f95d38e8 100644 --- a/website/web/__init__.py +++ b/website/web/__init__.py @@ -32,6 +32,7 @@ from flask import (Flask, Response, Request, flash, jsonify, redirect, render_te from flask_bootstrap import Bootstrap5 # type: ignore[import-untyped] from flask_cors import CORS # type: ignore[import-untyped] from flask_restx import Api # type: ignore[import-untyped] +from flask_talisman import Talisman # type: ignore[import-untyped] from lacuscore import CaptureStatus, CaptureSettingsError from puremagic import from_string from pymisp import MISPEvent, MISPServerError # type: ignore[attr-defined] @@ -69,7 +70,46 @@ Bootstrap5(app) app.config['BOOTSTRAP_SERVE_LOCAL'] = True app.config['SESSION_COOKIE_NAME'] = 'lookyloo' app.config['SESSION_COOKIE_SAMESITE'] = 'Strict' -app.debug = False +app.debug = bool(os.environ.get('DEBUG', False)) + +SELF = "'self'" +Talisman(app, + content_security_policy_nonce_in=['script-src', 'script-src-elem'], + content_security_policy={ + 'default-src': SELF, + 'base-uri': SELF, + 'img-src': [ + SELF, + "data:", + "blob:", + "'unsafe-inline'" + ], + 'script-src': [ + SELF, + "'strict-dynamic'", + "'unsafe-inline'", + "http:", + "https:" + ], + 'script-src-elem': [ + SELF, + "'strict-dynamic'", + "'unsafe-inline'", + ], + 'style-src': [ + SELF, + "'unsafe-inline'" + ], + 'media-src': [ + SELF, + "data:", + "blob:", + "'unsafe-inline'" + ], + 'frame-ancestors': [ + SELF, + ], + }) pkg_version = version('lookyloo') @@ -1724,8 +1764,9 @@ def cookies_name_detail(cookie_name: str) -> str: @app.route('/hhhdetails/<string:hhh>', methods=['GET']) def hhh_detail(hhh: str) -> str: + from_popup = True if (request.args.get('from_popup') and request.args.get('from_popup') == 'True') else False captures, headers = get_hhh_investigator(hhh.strip()) - return render_template('hhh_details.html', hhh=hhh, captures=captures, headers=headers) + return render_template('hhh_details.html', hhh=hhh, captures=captures, headers=headers, from_popup=from_popup) @app.route('/identifier_details/<string:identifier_type>/<string:identifier>', methods=['GET']) diff --git a/website/web/sri.txt b/website/web/sri.txt index 4d0c6093..96a9926f 100644 --- a/website/web/sri.txt +++ b/website/web/sri.txt @@ -20,7 +20,8 @@ "favicon.ico": "KOmrfwRbOQqhhwSeBkNpMRAxSVMmmLg+2kRMg9iSv7OWjE9spJc7x4MKB4AE/hi0knaV7UBVctAU6XZ7AC72ZA==", "font.png": "RwoQkj9dT9SLUL2F7cAA16Nat9t2hDb58eQlHF9ThUar829p0INUXG+5XuDaFOC8SsmCZK5vw2f+YAQ6mLC1Qw==", "generic.css": "Sh/BcxFMLYYaLdCluVt9efGvJ9CF5d+YJ7lkL2M24PRGu8VZHI9lJiUlFObIocjQgwss3Ve2U5cUAE5WiAdpQQ==", - "generic.js": "h2tLqpn8r1mZ/5FqiBDK6Er6mY5MdRuyir2mS9piT8VUUco2daxdKWSkiEtIsH2Ok+/W+NJb95A1ob5J/6sW4A==", + "generic.js": "XgwjuFX2l5fhV2Ko9hJHenhI3LeKQTxnmL/844gJrzmwH/gSYnzikGavmucy9HjhwCaohXgZ5UD3ZJ3s8XHBog==", + "hostname_popup.js": "8VoaZVwk2FBFCBVjgAup534WPy8B+e5/uUJPqyERUYf3kBcUVC8/T72ha9BYPYj5a6SNOOUJPgVmD5QI6qtAWw==", "html.png": "T7pZrb8MMDsA/JV/51hu+TOglTqlxySuEVY0rpDjTuAEyhzk2v+W4kYrj7vX+Tp3n2d2lvVD08PwhCG62Yfbzg==", "ifr.png": "rI5YJypmz1QcULRf9UaOYSqV4tPUSxUdLAycoYzCwywt4Pw4eWzBg9SUr769VyIimoiIyJR+aNuoIA4p5WO2fQ==", "img.png": "bknBlmIfSb9qv9/lSaJ2idn2a8bDyvJ2pATj4oOpehRlCdXlWYOyb2jN3wV1QGHFoqyxNqOv5MfCpI0tbqkicg==", @@ -36,7 +37,8 @@ "stats.css": "/kY943FwWBTne4IIyf7iBROSfbGd82TeBicEXqKkRwawMVRIvM/Pk5MRa7okUyGIxaDjFQGmV/U1vy+PhN6Jbw==", "stats_graph.js": "S/sMNQK1UMMLD0xQeEa7sq3ce8o6oPxwxGlyKVtaHOODjair86dbBDm7cu6pa/elMRDJT1j09jEFjWp+5GbhTw==", "tree.css": "jc7+RiJaZy7utfMu7iMWicpt0y0ZFiEQlB4c7MFNdlWcZf0czi3LgSQUFlDWt828Mx463V+JP1RalXuRjbGcEg==", - "tree.js": "Czw6AAUPQsIawEXi+eM9WG4vqfBw/y9vKbn0EedI3QG5+Y5ryZF05kGEexRc04wj5ec8RNRbR6QGnaVX3DAq3g==", + "tree.js": "V7P3EisB9n58pHvSv6xxPxWaU8Rkz7ci7/WnVasvz5m8z5ERrzgsp5DZXZfWLJ59MDPKphXg+wn6ljRgn2TiQQ==", + "tree_modals.js": "mGWQ9o4O+x8vBe9XNuAFrEfz8veuRwqE+wpreVKFQcvBvxNcgvxI0SjH9Z3gdozTTY7Hq7yqvC7xA9PWDblN/Q==", "up.jpg": "d1ljZJ9f5JekyM6RLFFH2Ua44j6neiQBdUIXOenRTjGppQr3JaeglpQIH6BjPCJL177+TH52U3UIRNS5YAyKIg==", "up_right.jpg": "OMmz+n+MxR34P8/fn5t4DkqKqdJRzQbXQ7fAi2lhkZIJGhVs2vIyY1f2hpYoBxDAX1OcYsSE2lqIR2vXNDGZsA==", "video.png": "gJtmkfr8I1Kw43pYEKjg6CAjgmhl1vIBKBQ3ZkxCu3wvxQm+6kf93iLrrFiY2WuiXzxEn2Leu52GJzmVN5id0g==", diff --git a/website/web/static/generic.js b/website/web/static/generic.js index e6902c23..31576325 100644 --- a/website/web/static/generic.js +++ b/website/web/static/generic.js @@ -25,6 +25,11 @@ function checkAllBoxes(name) { } } +const goBackButtons = document.querySelectorAll('.goBack'); +goBackButtons.forEach(el => el.addEventListener('click', event => { + window.history.back(); +})); + // Parameters: // contentType: The content type of your file. // its like application/pdf or application/msword or image/jpeg or diff --git a/website/web/static/hostname_popup.js b/website/web/static/hostname_popup.js new file mode 100644 index 00000000..9d4ca200 --- /dev/null +++ b/website/web/static/hostname_popup.js @@ -0,0 +1,74 @@ +const locateInTree = document.querySelectorAll(".locateInTree") +if (locateInTree) { + locateInTree.forEach(el => el.addEventListener('click', event => { + window.opener.LocateNode(el.dataset.hostnode); + })); +} + +let openTreeInNewTab = (capture_uuid, hostnode_uuid=Null) => { + let success = window.opener.openTreeInNewTab(capture_uuid, hostnode_uuid); + if (! success) { + alert("Your browser doesn't allow Lookyloo to open a new tab. There should be an icon on the right side of your URL bar *in the main window* to allow it."); + } +} + +var openNewTabButtons = document.querySelectorAll('.openNewTab'); +if (openNewTabButtons) { + openNewTabButtons.forEach(el => el.addEventListener('click', event => { + openTreeInNewTab(el.dataset.capture, el.dataset.hostnode); + })); +} + +document.addEventListener("DOMContentLoaded", () => { + // Grab any text in the attribute 'data-copy' and pass it to the copy function + $('.js-copy').tooltip(); + $('.js-copy').click(function() { + const text = $(this).attr('data-copy'); + const el = $(this); + copyToClipboard(text, el); + }); +}); + +document.addEventListener("DOMContentLoaded", () => { + $(function () { + $('[data-bs-toggle="tooltip"]').tooltip() + }) +}); + +function submit_pandora(node_uuid, ressource_hash){ + let data = {}; + if (node_uuid) { + data.node_uuid = node_uuid; + }; + if (ressource_hash) { + data.ressource_hash = ressource_hash; + }; + fetch("{{ url_for('pandora_submit', tree_uuid=tree_uuid)}}", { + method: "POST", + body: JSON.stringify(data), + }) + .then(response => response.json()) + .then(data => { + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(data.link); + } + openURLInNewTab(data.link); + }) + .catch((error) => { + throw new Error(error); + }); +}; + +var submitPandoraButtons = document.querySelectorAll('.submitPandoraButton'); +if (submitPandoraButtons) { + submitPandoraButtons.forEach(el => el.addEventListener('click', event => { + submit_pandora(el.dataset.hostnode, el.dataset.hash); + })); +} + +let openURLInNewTab = (url) => { + let success = window.opener.openURLInNewTab(url); + if (! success) { + alert("Your browser doesn't allow Lookyloo to open a new tab. There should be an icon on the right side of your URL bar *in the main window* to allow it."); + } +} diff --git a/website/web/static/tree.js b/website/web/static/tree.js index 1e28d5a4..64d10003 100644 --- a/website/web/static/tree.js +++ b/website/web/static/tree.js @@ -171,7 +171,7 @@ function openTreeInNewTab(capture_uuid, hostnode_uuid=null) { if (hostnode_uuid != null) { url += `/${hostnode_uuid}`; } - openURLInNewTab(url); + return openURLInNewTab(url); } function open_hostnode_popup(hostnode_uuid) { @@ -891,3 +891,8 @@ const downloadSvg = () => { console.error('Error:', error); }); }; + +const dlTreeAsSVG = document.getElementById("dlTreeAsSVG") +if (dlTreeAsSVG) { + dlTreeAsSVG.addEventListener("click", downloadSvg) +} diff --git a/website/web/static/tree_modals.js b/website/web/static/tree_modals.js new file mode 100644 index 00000000..102b264d --- /dev/null +++ b/website/web/static/tree_modals.js @@ -0,0 +1,220 @@ +// Modals + +$('#hashlookupModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#modulesModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); +$('#historyModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#categoriesModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#statsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#identifiersModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#identifierDetailsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#faviconsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#faviconDetailsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#captureHashesTypesModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#captureHashesTypesDetailsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#faviconDetailsProbabilisticHashModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#bodyHashesModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#bodyHashDetailsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#hostnamesModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#hostnameDetailsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#urlsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#urlDetailsModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +$('#mispPushModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote"), function(result){ + $('#mispSelector button').on('click', function(e){ + var thisBtn = $(this); + thisBtn.addClass('active').siblings().removeClass('active'); + $(`#${thisBtn.val()}`).show().siblings().hide() + }); + }); +}); + +$('#mispLookupModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote"), function(result){ + $('#mispSelector button').on('click', function(e){ + var thisBtn = $(this); + thisBtn.addClass('active').siblings().removeClass('active'); + $(`#${thisBtn.val()}`).show().siblings().hide() + }); + }); +}); + +$('#urlsInPageModal').on('show.bs.modal', function(e) { + var button = $(e.relatedTarget); + var modal = $(this); + modal.find('.modal-body').load(button.data("remote")); +}); + +// Categories + +document.getElementById("legitimate").addEventListener('change', function(){ + if (this.checked){ + disableInput(document.getElementById('malicious-categories')); + enableInput(document.getElementById('legitimate-categories')); + } +}); +document.getElementById("malicious").addEventListener('change', function(){ + if (this.checked){ + enableInput(document.getElementById('malicious-categories')); + disableInput(document.getElementById('legitimate-categories')); + } +}); +document.getElementById("unclear").addEventListener('change', function(){ + if (this.checked){ + disableInput(document.getElementById('malicious-categories')); + disableInput(document.getElementById('legitimate-categories')); + } +}); +document.getElementById("legitimate-categories").addEventListener('click', function(){ + if (this.querySelectorAll('input[type="checkbox"]:checked').length > 0) { + document.getElementById("legitimate").checked = true; + } +}); +document.getElementById("malicious-categories").addEventListener('click', function(){ + if (this.querySelectorAll('input[type="checkbox"]:checked').length > 0) { + document.getElementById("malicious").checked = true; + } +}); + +function disableInput(container) { + const Input = container.querySelectorAll('input'); + Input.forEach(function(checkbox){ + checkbox.disabled = true; + checkbox.checked = false; + }); + container.hidden = true; +} + +function enableInput(container) { + const Input = container.querySelectorAll('input'); + Input.forEach(checkbox => checkbox.disabled = false); + container.hidden = false; +} + +// OnClicks + +const removeCapture = document.getElementById("removeCapture") +if (removeCapture) { + removeCapture.addEventListener("click", function (e) { + e.preventDefault(); + if (confirm('Are you sure you want to remove the capture?')) { + window.location = this.href; + }; + }, false); +} + +const unbookmarkAllNodes = document.getElementById("unbookmarkAllNodes") +if (unbookmarkAllNodes) { + unbookmarkAllNodes.addEventListener("click", UnbookmarkAllNodes); +} + +const markAsKnown = document.getElementById("markAsKnown") +if (markAsKnown) { + markAsKnown.addEventListener("click", function (e) { + MarkAsKnown(treeUUID) + }); +} + +const blurScreenshot = document.getElementById("blurScreenshot") +if (blurScreenshot) { + blurScreenshot.addEventListener("click", function (e) { + let blur_status = document.getElementById('screenshot').classList.toggle('blur'); + if (blur_status) { + this.innerText = 'Unblur'; + } else { + this.innerText = 'Blur'; + } + }); +} diff --git a/website/web/templates/body_hash.html b/website/web/templates/body_hash.html index 2a6a6872..2777d59e 100644 --- a/website/web/templates/body_hash.html +++ b/website/web/templates/body_hash.html @@ -9,19 +9,23 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 1, "desc" ]], "pageLength": 500 }); </script> -<script type="text/javascript"> - function openTreeInNewTab(treeUUID) { - window.opener.openTreeInNewTab(treeUUID); - }; +<script type="text/javascript" nonce="{{ csp_nonce() }}"> + const openNewTabButtons = document.querySelectorAll('.openNewTab'); + if (openNewTabButtons) { + openNewTabButtons.forEach(el => el.addEventListener('click', event => { + window.opener.openTreeInNewTab(el.dataset.capture, el.dataset.hostnode); + })); + } </script> + {% endblock %} {%endif%} @@ -29,7 +33,7 @@ {% block content %} {% if from_popup %} -<button onclick="window.history.back();" class="btn btn-primary" type="button">Go Back</button> +<button class="btn btn-primary goBack" type="button">Go Back</button> {%endif%} <center> @@ -37,14 +41,14 @@ <a href="{{ url_for('ressource_by_hash', sha512=body_hash) }}">Download</a> </center> -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#freqHostTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '20%', targets: 0 }, { width: '80%', targets: 1 }], }); </script> -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#bodyHashDetailsTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '20%', targets: 0, @@ -88,7 +92,7 @@ <td>{{ timestamp }}</td> <td> {% if from_popup %} - <a href="#/" onclick="openTreeInNewTab('{{ capture_uuid }}')">{{ title }}</a> + <button type="button" class="btn btn-link openNewTab" data-capture="{{capture_uuid}}" data-hostnode="{{hostnode_uuid}}">{{ title }}</button> {% else %} <a href="{{ url_for('tree', tree_uuid=capture_uuid, node_uuid=hostnode_uuid) }}">{{ title }}</a> {% endif %} diff --git a/website/web/templates/bulk_captures.html b/website/web/templates/bulk_captures.html index c18627a7..82133dd4 100644 --- a/website/web/templates/bulk_captures.html +++ b/website/web/templates/bulk_captures.html @@ -7,7 +7,7 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 0, "desc" ]], "pageLength": 50, @@ -15,7 +15,7 @@ "paging": false }); </script> -<script> +<script nonce="{{ csp_nonce() }}"> async function update_status() { let capture_status = document.getElementsByClassName('capture_status'); let capture_error = document.getElementsByClassName('capture_error'); @@ -54,7 +54,7 @@ {% block content %} <center> <h4>Ongoing captures</h4> - <button onclick="window.history.back();" class="btn btn-primary" type="button">Go Back</button> + <button class="btn btn-primary goBack" type="button">Go Back</button> </center> <div>The captures below are queued, it will take a few minutes before the links are working</div> <div class="table-responsive"> diff --git a/website/web/templates/capture.html b/website/web/templates/capture.html index 6bee1507..b45dee37 100644 --- a/website/web/templates/capture.html +++ b/website/web/templates/capture.html @@ -468,6 +468,7 @@ {{ super() }} <script src='{{ url_for('static', filename='capture.js') }}' {{get_sri('static', 'capture.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> {% endblock %} diff --git a/website/web/templates/categories.html b/website/web/templates/categories.html index d08f3400..98670191 100644 --- a/website/web/templates/categories.html +++ b/website/web/templates/categories.html @@ -6,7 +6,7 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 1, "desc" ]], "pageLength": 500 diff --git a/website/web/templates/cookie_name.html b/website/web/templates/cookie_name.html index 4d726d67..9ce295ae 100644 --- a/website/web/templates/cookie_name.html +++ b/website/web/templates/cookie_name.html @@ -6,25 +6,27 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 1, "desc" ]], "pageLength": 500 }); </script> -<script type="text/javascript"> - function openTreeInNewTab(treeUUID) { - window.opener.openTreeInNewTab(treeUUID); - }; +<script type="text/javascript" nonce="{{ csp_nonce() }}"> + const openNewTabButtons = document.querySelectorAll('.openNewTab'); + if (openNewTabButtons) { + openNewTabButtons.forEach(el => el.addEventListener('click', event => { + window.opener.openTreeInNewTab(el.dataset.capture); + })); + } </script> - {% endblock %} {% block content %} <center> <h2>{{ cookie_name }}</h2> - <button onclick="window.history.back();" class="btn btn-primary" type="button">Go Back</button> + <button class="btn btn-primary goBack" type="button">Go Back</button> </center> <div class="table-responsive"> <table id="table" class="table" style="width:96%"> @@ -57,7 +59,9 @@ <p>A cookie with that name was seen in these captures:</p> <ul> {% for capture_uuid, title in captures %} - <li><a href="#/" onclick="openTreeInNewTab('{{ capture_uuid }}')">{{ title }}</a></li> + <li> + <button type="button" class="btn btn-link openNewTab" data-capture="{{capture_uuid}}">{{ title }}</button> + </li> {% endfor %} </ul> {% endblock %} diff --git a/website/web/templates/cookies.html b/website/web/templates/cookies.html index ba2056a1..615394b0 100644 --- a/website/web/templates/cookies.html +++ b/website/web/templates/cookies.html @@ -6,7 +6,7 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 1, "desc" ]], "pageLength": 500 diff --git a/website/web/templates/favicon_details.html b/website/web/templates/favicon_details.html index a860f43c..1716d5c9 100644 --- a/website/web/templates/favicon_details.html +++ b/website/web/templates/favicon_details.html @@ -1,6 +1,6 @@ {% from "macros.html" import shorten_string %} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#faviconDetailsTable_{{favicon_sha512}}', { order: [[ 0, "desc" ]], columnDefs: [{ width: '30%', diff --git a/website/web/templates/favicons.html b/website/web/templates/favicons.html index 49962d07..c722ba23 100644 --- a/website/web/templates/favicons.html +++ b/website/web/templates/favicons.html @@ -6,7 +6,7 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 1, "desc" ]], "pageLength": 500 diff --git a/website/web/templates/hash_type_details.html b/website/web/templates/hash_type_details.html index 885aec95..0bc44a92 100644 --- a/website/web/templates/hash_type_details.html +++ b/website/web/templates/hash_type_details.html @@ -1,6 +1,6 @@ {% from "macros.html" import shorten_string %} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#hashTypeDetailsTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '30%', diff --git a/website/web/templates/hhh_details.html b/website/web/templates/hhh_details.html index 44eb3cae..54245f80 100644 --- a/website/web/templates/hhh_details.html +++ b/website/web/templates/hhh_details.html @@ -1,10 +1,28 @@ +{% if from_popup %} {% extends "main.html" %} {% from 'bootstrap5/utils.html' import render_messages %} {% block title %}{{ hhh }}{% endblock %} +{% block scripts %} +{{ super() }} +<script type="text/javascript" nonce="{{ csp_nonce() }}"> + const openNewTabButtons = document.querySelectorAll('.openNewTab'); + if (openNewTabButtons) { + openNewTabButtons.forEach(el => el.addEventListener('click', event => { + window.opener.openTreeInNewTab(el.dataset.capture, el.dataset.hostnode); + })); + } +</script> +{% endblock %} + +{%endif%} + {% block content %} +{% if from_popup %} +<button class="btn btn-primary goBack" type="button">Go Back</button> +{%endif%} <center> <h2>{{ hhh }}</h2> </center> @@ -40,9 +58,11 @@ {% for capture_uuid, hostnode_uuid, url, title in captures %} <tr> <td> - <a href="{{ url_for('tree', tree_uuid=capture_uuid, node_uuid=hostnode_uuid) }}"> - {{ title }} - </a> + {% if from_popup %} + <button type="button" class="btn btn-link openNewTab" data-capture="{{capture_uuid}}" data-hostnode="{{hostnode_uuid}}">{{ title }}</button> + {% else %} + <a href="{{ url_for('tree', tree_uuid=capture_uuid, node_uuid=hostnode_uuid) }}">{{ title }}</a> + {% endif %} </td> <td>{{url}}</td> </tr> diff --git a/website/web/templates/hhhashes.html b/website/web/templates/hhhashes.html index 19f90367..bbb1be66 100644 --- a/website/web/templates/hhhashes.html +++ b/website/web/templates/hhhashes.html @@ -6,7 +6,7 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 1, "desc" ]], "pageLength": 500 diff --git a/website/web/templates/historical_lookups.html b/website/web/templates/historical_lookups.html index f9c94629..117a5c17 100644 --- a/website/web/templates/historical_lookups.html +++ b/website/web/templates/historical_lookups.html @@ -5,7 +5,7 @@ No historical data available {%else%} {% if circl_pdns %} - <script type="text/javascript"> + <script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#CIRCL_pdns_table', { order: [[ 1, "desc" ]], autoWidth: false, @@ -19,10 +19,9 @@ <center> <h1 class="display-4">CIRCL Passive DNS - <div class="help-tip" title="Click for more details" - onclick="location.href='https://www.circl.lu/services/passive-dns/';" - style="cursor: pointer;"> - </div> + <a href='https://www.circl.lu/services/passive-dns/' target="_blank"> + <div class="help-tip" title="Click for more details" style="cursor: pointer;"></div> + </a> </h1> {% for query, responses in circl_pdns.items() if responses %} <div> @@ -53,7 +52,7 @@ {% endif%} {% if riskiq %} <hr> - <script type="text/javascript"> + <script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#RiskIQ_pdns_table', { order: [[ 1, "desc" ]], autoWidth: false, diff --git a/website/web/templates/hostname.html b/website/web/templates/hostname.html index 0b7b4191..e70a9426 100644 --- a/website/web/templates/hostname.html +++ b/website/web/templates/hostname.html @@ -6,7 +6,7 @@ <h4>{{ hostname }}</h4> </center> -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#hostnameTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '20%', targets: 0, diff --git a/website/web/templates/hostname_popup.html b/website/web/templates/hostname_popup.html index 3e3dedfe..b40697eb 100644 --- a/website/web/templates/hostname_popup.html +++ b/website/web/templates/hostname_popup.html @@ -15,66 +15,10 @@ {% block scripts %} {{ super() }} - <script> - let whereAmI = (hostnode_uuid) => window.opener.LocateNode(hostnode_uuid); - let openTreeInNewTab = (capture_uuid, hostnode_uuid=Null) => { - let success = window.opener.openTreeInNewTab(capture_uuid, hostnode_uuid); - if (! success) { - alert("Your browser doesn't allow Lookyloo to open a new tab. There should be an icon on the right side of your URL bar *in the main window* to allow it."); - } - } - </script> - <script> - document.addEventListener("DOMContentLoaded", () => { - // Grab any text in the attribute 'data-copy' and pass it to the copy function - $('.js-copy').tooltip(); - $('.js-copy').click(function() { - const text = $(this).attr('data-copy'); - const el = $(this); - copyToClipboard(text, el); - }); - }); - </script> - <script> - document.addEventListener("DOMContentLoaded", () => { - $(function () { - $('[data-bs-toggle="tooltip"]').tooltip() - }) - }); - </script> - <script> - function submit_pandora(node_uuid, ressource_hash){ - let data = {}; - if (node_uuid) { - data.node_uuid = node_uuid; - }; - if (ressource_hash) { - data.ressource_hash = ressource_hash; - }; - fetch("{{ url_for('pandora_submit', tree_uuid=tree_uuid)}}", { - method: "POST", - body: JSON.stringify(data), - }) - .then(response => response.json()) - .then(data => { - if (navigator.clipboard && window.isSecureContext) { - navigator.clipboard.writeText(data.link); - } - openURLInNewTab(data.link); - }) - .catch((error) => { - throw new Error(error); - }); - }; - - let openURLInNewTab = (url) => { - let success = window.opener.openURLInNewTab(url); - if (! success) { - alert("Your browser doesn't allow Lookyloo to open a new tab. There should be an icon on the right side of your URL bar *in the main window* to allow it."); - } - } - </script> - + <script src='{{ url_for('static', filename='hostname_popup.js') }}' + {{get_sri('static', 'hostname_popup.js')}} + nonce="{{ csp_nonce() }}" + crossorigin="anonymous"></script> {% endblock %} {% block content %} @@ -88,7 +32,7 @@ <h3>{{hostnode.name}}</h3> {% endif %} </br> - <button type="button" class="btn btn-primary" onclick="whereAmI('{{ hostnode_uuid }}')">Locate in tree</button> + <button type="button" class="btn btn-primary locateInTree" data-hostnode="{{ hostnode_uuid }}">Locate in tree</button> {% if uwhois_available %} <a href="{{ url_for('whois', query=hostnode.name) }}" class="btn btn-primary" role="button"> Download whois entry @@ -286,7 +230,11 @@ </p> </div> {% if url['url_object'].hhhash %} - <button type="button" class="btn btn-sm btn-link" onclick="openURLInNewTab('{{ url_for('hhh_detail', hhh=url['url_object'].hhhash) }}')">See other captures with the same HTTP Headers Hash</button> + <p> + <a href="{{ url_for('hhh_detail', hhh=url['url_object'].hhhash, from_popup=True) }}"> + See other captures with the same HTTP Headers Hash + </a> + </p> {% endif %} {% endif %} diff --git a/website/web/templates/identifier_details.html b/website/web/templates/identifier_details.html index 2608ee27..f85c4304 100644 --- a/website/web/templates/identifier_details.html +++ b/website/web/templates/identifier_details.html @@ -1,6 +1,6 @@ {% from "macros.html" import shorten_string %} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#identifierDetailsTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '30%', diff --git a/website/web/templates/index.html b/website/web/templates/index.html index 84337151..af7fac42 100644 --- a/website/web/templates/index.html +++ b/website/web/templates/index.html @@ -25,7 +25,7 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $(document).ready(function () { $('#table').DataTable( { "order": [[ 1, "desc" ]], diff --git a/website/web/templates/macros.html b/website/web/templates/macros.html index 32bfb40e..5e7026fc 100644 --- a/website/web/templates/macros.html +++ b/website/web/templates/macros.html @@ -65,7 +65,7 @@ </tbody> </table> </div> -<script> +<script nonce="{{ csp_nonce() }}"> $('.categorize_capture').on('click',function(e){ var button = $(this); $.get("{{ url_for('categorize_capture', tree_uuid=tree_uuid) }}" + button.val()) @@ -229,7 +229,7 @@ {% endmacro %} {% macro other_captures_table(entries, max_entries, identifier) %} - <script type="text/javascript"> + <script type="text/javascript" nonce="{{ csp_nonce() }}"> document.addEventListener("DOMContentLoaded", () => { new DataTable('#table_other_captures{{identifier}}', { "order": [[ 1, "desc" ]], @@ -250,6 +250,7 @@ } ); }); </script> + <div> <table id="table_other_captures{{identifier}}" class="table table-striped" style="width:100%"> <thead> @@ -263,7 +264,7 @@ {% for capture_uuid, urlnode_uuid, title, timestamp, hostname in entries[:max_entries] %} <tr> <td> - <a href="#/" onclick="openTreeInNewTab('{{ capture_uuid }}', '{{ urlnode_uuid }}')">{{ title }}</a> + <button type="button" class="btn btn-link openNewTab" data-capture="{{capture_uuid}}" data-hostnode="{{urlnode_uuid}}">{{ title }}</button> </td> <td>{{ timestamp }}</td> <td>{{ hostname }}</td> @@ -292,7 +293,7 @@ {{ cookie_name_value[0] }}</a>={{ shorten_string(cookie_name_value[1], 200) }} - </br> {{ button_text }} - <button type="button" class="btn btn-primary" onclick="whereAmI('{{ detail[1] }}')">Locate</button> + <button type="button" class="btn btn-primary locateInTree" data-hostnode="{{ detail[1] }}">Locate</button> </li> {% endif %} {% endfor %} @@ -317,15 +318,12 @@ {% macro pandora_submit(node_uuid, ressource_hash) %} <div class="col-sm-8"> - <button id="pandora_submit_button" type="button" class="btn btn-primary btn-sm" title="open a new tab with the pandora report" - {% if node_uuid and ressource_hash %} - onclick="submit_pandora('{{node_uuid}}', '{{ressource_hash}}')" - {% elif node_uuid %} - onclick="submit_pandora('{{node_uuid}}')" - {% else %} - onclick="submit_pandora()" - {% endif %} - >Submit to Pandora</button> + <button type="button" class="btn btn-primary btn-sm submitPandoraButton" + title="open a new tab with the pandora report" + data-hostnode="{{ node_uuid }}" + data-hash="{{ ressource_hash }}"> + Submit to Pandora + </button> </div> {% endmacro %} @@ -366,9 +364,9 @@ {% for child in urlnode.children if child.name == urlnode.redirect_url %} <div title='{{ urlnode.redirect_url }}'> <b>Redirect to</b>: {{ shorten_string(urlnode.redirect_url, 50) }} - <a href="#/" role="button" onclick="whereAmI('{{ child.hostnode_uuid }}')" title="See the node the URL redirects to."> + <button type="button" class="btn btn-link locateInTree" data-hostnode="{{ child.hostnode_uuid }}" title="See the node the URL redirects to."> <img src="{{ url_for('static', filename=icon_info['icon']) }}" alt="{{ icon_info['tooltip'] }}" width="21" height="21"/> - </a> + </button> </div> {% else %} <img src="{{ url_for('static', filename=icon_info['icon']) }}" diff --git a/website/web/templates/main.html b/website/web/templates/main.html index 4c23c039..768ddcc9 100644 --- a/website/web/templates/main.html +++ b/website/web/templates/main.html @@ -34,15 +34,18 @@ {% block scripts %} <!-- Optional JavaScript --> - {{ bootstrap.load_js() }} + {{ bootstrap.load_js(nonce=csp_nonce()) }} <script src='{{ url_for('static', filename='jquery.min.js') }}' {{get_sri('static', 'jquery.min.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> <script src='{{ url_for('static', filename='datatables.min.js') }}' {{get_sri('static', 'datatables.min.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> <script src='{{ url_for('static', filename='generic.js') }}' {{get_sri('static', 'generic.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> {% endblock %} </body> diff --git a/website/web/templates/ressources.html b/website/web/templates/ressources.html index 676167aa..d00fe0d5 100644 --- a/website/web/templates/ressources.html +++ b/website/web/templates/ressources.html @@ -9,13 +9,13 @@ {% block scripts %} {{ super() }} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> $('#table').DataTable( { "order": [[ 2, "desc" ]], "pageLength": 500 }); </script> -<script> +<script nonce="{{ csp_nonce() }}"> $(document).ready(() => { $(function () { $('[data-bs-toggle="tooltip"]').tooltip() diff --git a/website/web/templates/search.html b/website/web/templates/search.html index a4738e20..9981758b 100644 --- a/website/web/templates/search.html +++ b/website/web/templates/search.html @@ -63,5 +63,6 @@ {{ super() }} <script src='{{ url_for('static', filename='capture.js') }}' {{get_sri('static', 'capture.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> {% endblock %} diff --git a/website/web/templates/simple_capture.html b/website/web/templates/simple_capture.html index 2ac2dc8d..bbbc3716 100644 --- a/website/web/templates/simple_capture.html +++ b/website/web/templates/simple_capture.html @@ -67,8 +67,9 @@ {{ super() }} <script src='{{ url_for('static', filename='capture.js') }}' {{get_sri('static', 'capture.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> - <script> + <script nonce="{{ csp_nonce() }}"> document.getElementById('multipleCaptures').addEventListener('click', function(e) { if (document.getElementById('multipleCaptures').checked == true) { document.getElementById('singleCaptureField').value = ''; diff --git a/website/web/templates/stats.html b/website/web/templates/stats.html index b42617e3..af8a5607 100644 --- a/website/web/templates/stats.html +++ b/website/web/templates/stats.html @@ -71,9 +71,11 @@ {{ super() }} <script src='{{ url_for('static', filename='d3.min.js') }}' {{get_sri('static', 'd3.min.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> <script src='{{ url_for('static', filename='stats_graph.js') }}' {{get_sri('static', 'stats_graph.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> {% endblock %} diff --git a/website/web/templates/tree.html b/website/web/templates/tree.html index cbc3db44..b1d9bdbc 100644 --- a/website/web/templates/tree.html +++ b/website/web/templates/tree.html @@ -30,249 +30,47 @@ {{ super() }} <script src='{{ url_for('static', filename='d3.min.js') }}' {{get_sri('static', 'd3.min.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> <script src='{{ url_for('static', filename='tree.js') }}' {{get_sri('static', 'tree.js')}} + nonce="{{ csp_nonce() }}" + crossorigin="anonymous"></script> + <script src='{{ url_for('static', filename='tree_modals.js') }}' + {{get_sri('static', 'tree_modals.js')}} + nonce="{{ csp_nonce() }}" crossorigin="anonymous"></script> - <script> - $('#hashlookupModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#modulesModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - $('#historyModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - $('.modulesForceRefresh').on('click',function(){ + <script nonce="{{ csp_nonce() }}"> + $('.modulesForceRefresh').on('click',function(){ $('#modulesModal .modal-body').text("Reloading modules, please wait...") $('#modulesModal .modal-body').load("{{ url_for('trigger_modules', tree_uuid=tree_uuid, force=True) }}", function(){ $('#modulesModal').modal({show:true}); }); - }); - </script> - - <script> - $('#categoriesModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - /*$('#searchCategories').submit(function(event){ - var query = $("#query").val(); - $('#categoriesModal .modal-body').load("{ url_for('categories_capture', tree_uuid=tree_uuid) }}" + query, function() { - $('#categoriesModal').modal({show:true}); }); - event.preventDefault(); - }); - */ + </script> - $('#fast-categories').submit(function(event){ + <script nonce="{{ csp_nonce() }}"> + $('#fast-categories').submit(function(event){ event.preventDefault(); - var query = $('#fast-categories').serialize(); // Serialize form data + var query = $('#fast-categories').serialize(); // Serialize form data - $.ajax({ - type: 'POST', - url: '{{ url_for('categories_capture', tree_uuid=tree_uuid) }}', - data: query, - success: function(response) { - $('#categoriesModal .modal-body').html(response); - $('#categoriesModal').modal({show:true}); - }, - error: function(error) { - console.log("An error occurred: ", error); - } + $.ajax({ + type: 'POST', + url: '{{ url_for('categories_capture', tree_uuid=tree_uuid) }}', + data: query, + success: function(response) { + $('#categoriesModal .modal-body').html(response); + $('#categoriesModal').modal({show:true}); + }, + error: function(error) { + console.log("An error occurred: ", error); + } + }); }); - }); - - // Fast categories - document.getElementById("legitimate").addEventListener('change', function(){ - if (this.checked){ - disableInput(document.getElementById('malicious-categories')); - enableInput(document.getElementById('legitimate-categories')); - } - }); - document.getElementById("malicious").addEventListener('change', function(){ - if (this.checked){ - enableInput(document.getElementById('malicious-categories')); - disableInput(document.getElementById('legitimate-categories')); - } - }); - document.getElementById("unclear").addEventListener('change', function(){ - if (this.checked){ - disableInput(document.getElementById('malicious-categories')); - disableInput(document.getElementById('legitimate-categories')); - } - }); - document.getElementById("legitimate-categories").addEventListener('click', function(){ - if (this.querySelectorAll('input[type="checkbox"]:checked').length > 0) { - document.getElementById("legitimate").checked = true; - } - }); - document.getElementById("malicious-categories").addEventListener('click', function(){ - if (this.querySelectorAll('input[type="checkbox"]:checked').length > 0) { - document.getElementById("malicious").checked = true; - } - }); - - function disableInput(container) { - const Input = container.querySelectorAll('input'); - Input.forEach(function(checkbox){ - checkbox.disabled = true; - checkbox.checked = false; - }); - container.hidden = true; - } - - function enableInput(container) { - const Input = container.querySelectorAll('input'); - Input.forEach(checkbox => checkbox.disabled = false); - container.hidden = false; - } </script> - <script> - $('#statsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#identifiersModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#identifierDetailsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#faviconsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#faviconDetailsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#captureHashesTypesModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#captureHashesTypesDetailsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#faviconDetailsProbabilisticHashModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#bodyHashesModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#bodyHashDetailsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#hostnamesModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#hostnameDetailsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#urlsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#urlDetailsModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - <script> - $('#mispPushModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote"), function(result){ - $('#mispSelector button').on('click', function(e){ - var thisBtn = $(this); - thisBtn.addClass('active').siblings().removeClass('active'); - $(`#${thisBtn.val()}`).show().siblings().hide() - }); - }); - }); - </script> - <script> - $('#mispLookupModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote"), function(result){ - $('#mispSelector button').on('click', function(e){ - var thisBtn = $(this); - thisBtn.addClass('active').siblings().removeClass('active'); - $(`#${thisBtn.val()}`).show().siblings().hide() - }); - }); - }); - </script> - <script> - $('#urlsInPageModal').on('show.bs.modal', function(e) { - var button = $(e.relatedTarget); - var modal = $(this); - modal.find('.modal-body').load(button.data("remote")); - }); - </script> - - <script> + <script nonce="{{ csp_nonce() }}"> {% if urlnode_uuid %} history.scrollRestoration = "manual"; window.addEventListener('DOMContentLoaded', (event) => { @@ -287,12 +85,12 @@ </script> {% if auto_trigger_modules %} - <script> + <script nonce="{{ csp_nonce() }}"> $.get("{{ url_for('trigger_modules', tree_uuid=tree_uuid, auto_trigger=True) }}") </script> {% endif%} {% if enable_monitoring %} - <script> + <script nonce="{{ csp_nonce() }}"> const today = new Date() let tomorrow = new Date() tomorrow.setDate(today.getDate() + 1) @@ -306,14 +104,16 @@ {% block styles %} {{ super() }} - <link rel="stylesheet" href="{{ url_for('static', filename='tree.css') }}"> + <link rel="stylesheet" + {{get_sri('static', 'tree.css')}} + href="{{ url_for('static', filename='tree.css') }}"> {% endblock %} {% block content %} {{super()}} -<script> +<script nonce="{{ csp_nonce() }}"> var treeUUID = "{{ tree_uuid }}"; var screenshot_thumbnail = "{{ screenshot_thumbnail }}"; var favicon = "{{ favicon }}"; @@ -470,7 +270,7 @@ <div id="admin-menu-content" class="dropdown-content"> <a href="{{ url_for('rebuild_tree', tree_uuid=tree_uuid) }}" role="button">Rebuild capture</a> <a href="{{ url_for('hide_capture', tree_uuid=tree_uuid) }}" role="button">Hide capture</a> - <a href="{{ url_for('remove_capture', tree_uuid=tree_uuid) }}" role="button" onclick="return confirm('Are you sure you want to remove the capture?')">Remove capture</a> + <a href="{{ url_for('remove_capture', tree_uuid=tree_uuid) }}" role="button" id="removeCapture">Remove capture</a> {% if misp_push%} <a href="#mispPushModal" data-remote="{{ url_for('web_misp_push_view', tree_uuid=tree_uuid) }}" data-bs-toggle="modal" data-bs-target="#mispPushModal" role="button">Prepare push to MISP</a> @@ -493,10 +293,10 @@ data-bs-toggle="modal" data-bs-target="#categoriesModal" role="button">Manage categories</a> {% endif %} {% if enable_bookmark %} - <a href="#/" role="button" onclick="UnbookmarkAllNodes();">Unbookmark all nodes</a> + <a href="#/" role="button" id="unbookmarkAllNodes">Unbookmark all nodes</a> {% endif %} {% if enable_context_by_users %} - <a href="#/" role="button" onclick="MarkAsKnown('{{ tree_uuid }}');">Mark all the captures' entries as known</a> + <a href="#/" role="button" id="markAsKnown">Mark all the captures' entries as known</a> {% endif %} </div> </div> @@ -970,7 +770,7 @@ </br> {% endif %} {% if blur_screenshot %} - <button type="button" class="btn btn-primary" onclick="$('#screenshot').removeClass('blur')">Unblur</button> + <button type="button" class="btn btn-primary" id="blurScreenshot">Unblur</button> {% endif %} <a href="{{ url_for('image', tree_uuid=tree_uuid) }}" role="button" class="btn btn-primary">Download</a> </br> @@ -1046,7 +846,7 @@ <div class="modal-body"> <ul> <li> - <a href="#" onclick="downloadSvg()" role="button">Download tree as PNG</a> + <a href="#" id="dlTreeAsSVG" role="button">Download tree as PNG</a> </li> <li> <a href="{{ url_for('image', tree_uuid=tree_uuid) }}" role="button">Download screenshot</a> diff --git a/website/web/templates/tree_body_hashes.html b/website/web/templates/tree_body_hashes.html index a836c2e1..393c4860 100644 --- a/website/web/templates/tree_body_hashes.html +++ b/website/web/templates/tree_body_hashes.html @@ -1,6 +1,6 @@ {% from "macros.html" import popup_icons_response %} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> var table = new DataTable('#bodyHashesTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '10%', targets: 0 }, @@ -14,6 +14,14 @@ $('[data-bs-toggle="tooltip"]').tooltip({html: true}); }); </script> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> + let openNewTabButtons = document.querySelectorAll('.openNewTab'); + if (openNewTabButtons) { + openNewTabButtons.forEach(el => el.addEventListener('click', event => { + openTreeInNewTab(el.dataset.capture, el.dataset.hostnode); + })); + } +</script> <table id="bodyHashesTable" class="table table-striped" style="width:100%"> <thead> @@ -34,7 +42,7 @@ </td> <td> <p class="text-break">{{ info['node'].name }}</p> - <a href="#/" onclick="openTreeInNewTab('{{ tree_uuid }}', '{{ info['node'].uuid }}')">Show on tree</a> + <button type="button" class="btn btn-link openNewTab" data-capture="{{tree_uuid}}" data-hostnode="{{info['node'].uuid}}">Show on tree</button> </td> <td> <span class="d-inline-block text-truncate" style="max-width: 200px;"> diff --git a/website/web/templates/tree_favicons.html b/website/web/templates/tree_favicons.html index 588c7e13..bc2048f9 100644 --- a/website/web/templates/tree_favicons.html +++ b/website/web/templates/tree_favicons.html @@ -1,4 +1,4 @@ -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#faviconsTable', { columnDefs: [{ width: '10%', targets: 0 }, { width: '40%', targets: 1 }, @@ -7,6 +7,15 @@ }); </script> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> +const downloadFavicons = document.querySelectorAll(".downloadFaviconButton") +if (downloadFavicons) { + downloadFavicons.forEach(el => el.addEventListener('click', event => { + downloadBase64File(el.dataset.mimetype, el.dataset.b64favicon, el.dataset.filename); + })); +} +</script> + <h5 class="text-center">Click on the favicon to see the other captures it's been found in</h5> <table id="faviconsTable" class="table table-striped" style="width:100%"> @@ -31,7 +40,9 @@ </td> <td><a href="https://www.shodan.io/search?query=http.favicon.hash%3A{{ mmh3_shodan }}" target="_blank">{{ mmh3_shodan }}</a></td> <td> - <button type="button" class="btn btn-light" onclick="downloadBase64File('{{mimetype}}', '{{b64_favicon}}', 'favicon.ico')"> + <button type="button" class="btn btn-light downloadFaviconButton" + data-mimetype="{{mimetype}}" data-b64favicon="{{b64_favicon}}" + data-filename="favicon.ico"> <img src="{{ url_for('static', filename='download.svg') }}" style="width:16px;height:16px;" title="Download the favicon"/> </button> diff --git a/website/web/templates/tree_hashes_types.html b/website/web/templates/tree_hashes_types.html index a19c4077..9adb7971 100644 --- a/website/web/templates/tree_hashes_types.html +++ b/website/web/templates/tree_hashes_types.html @@ -1,4 +1,4 @@ -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#treeHashesTable', { columnDefs: [{ width: '20%', targets: 0 }, { width: '40%', targets: 1 }, diff --git a/website/web/templates/tree_hostnames.html b/website/web/templates/tree_hostnames.html index 831f529c..483e3242 100644 --- a/website/web/templates/tree_hostnames.html +++ b/website/web/templates/tree_hostnames.html @@ -1,6 +1,6 @@ {% from "macros.html" import popup_icons_response %} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> var table = new DataTable('#hostnamesTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '10%', targets: 0 }, @@ -14,6 +14,15 @@ }); </script> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> + let openNewTabButtons = document.querySelectorAll('.openNewTab'); + if (openNewTabButtons) { + openNewTabButtons.forEach(el => el.addEventListener('click', event => { + openTreeInNewTab(el.dataset.capture, el.dataset.hostnode); + })); + } +</script> + <table id="hostnamesTable" class="table table-striped" style="width:100%"> <thead> <tr> @@ -49,7 +58,7 @@ {% for node in info['nodes'] %} <li> <p class="text-break">{{ node.name }}</p> - <a href="#/" onclick="openTreeInNewTab('{{ tree_uuid }}', '{{ node.uuid }}')">Show on tree</a> + <button type="button" class="btn btn-link openNewTab" data-capture="{{tree_uuid}}" data-hostnode="{{node.uuid}}">Show on tree</button> </li> {% endfor %} <ul> diff --git a/website/web/templates/tree_identifiers.html b/website/web/templates/tree_identifiers.html index c8748582..2ec42a44 100644 --- a/website/web/templates/tree_identifiers.html +++ b/website/web/templates/tree_identifiers.html @@ -1,4 +1,4 @@ -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#identifiersTable', { columnDefs: [{ width: '20%', targets: 0 }, { width: '40%', targets: 1 }, diff --git a/website/web/templates/tree_urls.html b/website/web/templates/tree_urls.html index ac3e5c84..42b35fe6 100644 --- a/website/web/templates/tree_urls.html +++ b/website/web/templates/tree_urls.html @@ -1,6 +1,6 @@ {% from "macros.html" import popup_icons_response %} -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> var table = new DataTable('#urlsTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '10%', targets: 0 }, diff --git a/website/web/templates/url.html b/website/web/templates/url.html index 393feb2b..48781862 100644 --- a/website/web/templates/url.html +++ b/website/web/templates/url.html @@ -6,7 +6,7 @@ <h4>{{ url }}</h4> </center> -<script type="text/javascript"> +<script type="text/javascript" nonce="{{ csp_nonce() }}"> new DataTable('#urlTable', { order: [[ 0, "desc" ]], columnDefs: [{ width: '20%', targets: 0, diff --git a/website/web/templates/urls_rendered.html b/website/web/templates/urls_rendered.html index d36c1616..e3416c57 100644 --- a/website/web/templates/urls_rendered.html +++ b/website/web/templates/urls_rendered.html @@ -1,9 +1,7 @@ <div> <h4>Select below the URLs you want to capture.</h4> <hr> - <button type="button" class="btn btn-secondary" id="toggleSelection" - onclick="checkAllBoxes('url')" - title="(un)select all URLs"> + <button type="button" class="btn btn-secondary" id="toggleURLs" title="(un)select all URLs"> Toggle selection </button> <hr> @@ -17,3 +15,12 @@ <button type="submit" class="btn btn-primary" id="btn-capture-urls">Capture selected URLs</button> </form> </div> + +<script nonce="{{ csp_nonce() }}"> + const toggleURLs = document.getElementById("toggleURLs"); + if (toggleURLs) { + toggleURLs.addEventListener("click", function() { + checkAllBoxes("url"); + }); + } +</script>