diff options
author | Victor Näslund <victor@sunet.se> | 2022-11-01 01:55:25 +0100 |
---|---|---|
committer | Victor Näslund <victor@sunet.se> | 2022-11-01 01:55:25 +0100 |
commit | ffb26f4a81a9ca61c4105df037f7e1beb8dc5fb0 (patch) | |
tree | 41094f051edbf300a6cd2c2de8dfb8435bfc18a4 | |
parent | 1b836e78db2737ba5d1ae43da9828601a5a5c114 (diff) |
initial fresh up
-rw-r--r-- | auth-server-poc/Dockerfile | 3 | ||||
-rwxr-xr-x | auth-server-poc/setup.sh | 2 | ||||
-rwxr-xr-x | dev-run.sh | 41 | ||||
-rw-r--r-- | docker/collector/Dockerfile | 4 | ||||
-rw-r--r-- | docker/collector/Dockerfile-dev | 4 | ||||
-rw-r--r-- | requirements.in | 15 | ||||
-rw-r--r-- | requirements.txt | 325 | ||||
-rw-r--r-- | src/couch/client.py | 21 | ||||
-rw-r--r-- | src/couch/feedreader.py | 10 | ||||
-rw-r--r-- | src/couch/resource.py | 27 | ||||
-rw-r--r-- | src/couch/utils.py | 58 | ||||
-rwxr-xr-x | src/db.py | 22 | ||||
-rwxr-xr-x | src/main.py | 45 | ||||
-rw-r--r-- | src/schema.py | 11 |
14 files changed, 469 insertions, 119 deletions
diff --git a/auth-server-poc/Dockerfile b/auth-server-poc/Dockerfile index 60ccb8f..b3344d2 100644 --- a/auth-server-poc/Dockerfile +++ b/auth-server-poc/Dockerfile @@ -1,4 +1,5 @@ -FROM debian:buster +FROM debian:bullseye-20221024-slim@sha256:76cdda8fe5eb597ef5e712e4c9a9f5f1fb119e69f353daaa7bd6d0f6e66e541d +# FROM debian:buster RUN mkdir /opt/auth-server-poc COPY requirements.txt setup.sh /opt/auth-server-poc/ diff --git a/auth-server-poc/setup.sh b/auth-server-poc/setup.sh index dd9d81d..77aee9a 100755 --- a/auth-server-poc/setup.sh +++ b/auth-server-poc/setup.sh @@ -5,7 +5,7 @@ set -x export DEBIAN_FRONTEND noninteractive -/bin/sed -i s/deb.debian.org/ftp.se.debian.org/g /etc/apt/sources.list +# /bin/sed -i s/deb.debian.org/ftp.se.debian.org/g /etc/apt/sources.list apt-get update && \ apt-get -y dist-upgrade && \ diff --git a/dev-run.sh b/dev-run.sh new file mode 100755 index 0000000..7847063 --- /dev/null +++ b/dev-run.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +bash quickstart.sh -b || exit 1 +sleep 2 +JWT=$(curl -k http://localhost:8000/api/v1.0/auth -X POST -p -u usr:pwd | jq -r .access_token) || exit 1 +curl -k --data-binary @example_data_1.json -H "Authorization: Bearer $JWT" https://localhost:1443/sc/v0/add || exit 1 +exit 0 + +echo "Checking package" +mypy --strict --namespace-packages --ignore-missing-imports --cache-dir=/dev/null src/*.py || exit 1 +black --line-length 120 src/*.py || exit 1 +pylint --max-line-length 120 src/*.py || exit 1 + +echo "Checking tests" +#mypy --strict --namespace-packages --ignore-missing-imports --cache-dir=/dev/null tests/*.py || exit 1 +#black --line-length 120 tests/*.py || exit 1 +#pylint --max-line-length 120 tests/*.py || exit 1 + +# Stop old container, build and run the new one +# docker build -t pkcs11_ca_service_http . +# docker stop /pkcs11_ca_service_http +# docker rm /pkcs11_ca_service_http +# docker run \ +# --name pkcs11_ca_service_http \ +# --net pkcs11_ca_service_network \ +# --restart always \ +# --security-opt no-new-privileges \ +# --cap-drop all \ +# --read-only \ +# --memory 256m \ +# --cpus 2.75 \ +# --mount type=tmpfs,target=/dev/shm,readonly=true \ +# -v /app_softhsm:/var/lib/softhsm/tokens \ +# -p 8000:8000 \ +# -d \ +# pkcs11_ca_service_http + +# sleep 2 +# echo "Running tests" +# python3 -m unittest + diff --git a/docker/collector/Dockerfile b/docker/collector/Dockerfile index 756f1f2..a62d78e 100644 --- a/docker/collector/Dockerfile +++ b/docker/collector/Dockerfile @@ -1,4 +1,6 @@ -FROM debian:bullseye +FROM debian:bullseye-20221024-slim@sha256:76cdda8fe5eb597ef5e712e4c9a9f5f1fb119e69f353daaa7bd6d0f6e66e541d + +# FROM debian:bullseye ENV DEBIAN_FRONTEND noninteractive diff --git a/docker/collector/Dockerfile-dev b/docker/collector/Dockerfile-dev index 81545d2..15a6ebe 100644 --- a/docker/collector/Dockerfile-dev +++ b/docker/collector/Dockerfile-dev @@ -1,4 +1,6 @@ -FROM debian:bullseye +FROM debian:bullseye-20221024-slim@sha256:76cdda8fe5eb597ef5e712e4c9a9f5f1fb119e69f353daaa7bd6d0f6e66e541d + +# FROM debian:bullseye ENV DEBIAN_FRONTEND noninteractive diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000..baafb83 --- /dev/null +++ b/requirements.in @@ -0,0 +1,15 @@ +cryptography +fastapi +fastapi-jwt-auth +py +pycparser +PyJWT +pyparsing +pytest +requests +rfc3339-validator +toml +typing-extensions +urllib3 +uvicorn +jsonschema diff --git a/requirements.txt b/requirements.txt index 327c7d6..9c587ab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,30 +1,295 @@ -anyio==3.3.4 -asgiref==3.4.1 -attrs==21.2.0 -certifi==2021.10.8 -cffi==1.15.0 -charset-normalizer==2.0.7 -click==8.0.3 -cryptography==35.0.0 -fastapi==0.70.0 -fastapi-jwt-auth==0.5.0 -h11==0.12.0 -idna==3.3 -iniconfig==1.1.1 -nose==1.3.7 -packaging==21.3 -pluggy==1.0.0 -py==1.11.0 -pycparser==2.20 -pydantic==1.8.2 -PyJWT==1.7.1 -pyparsing==3.0.6 -pytest==6.2.5 -requests==2.26.0 -rfc3339-validator==0.1.4 -sniffio==1.2.0 -starlette==0.16.0 -toml==0.10.2 -typing-extensions==3.10.0.2 -urllib3==1.26.7 -uvicorn==0.15.0 +# +# This file is autogenerated by pip-compile with python 3.9 +# To update, run: +# +# pip-compile --allow-unsafe --generate-hashes requirements.in +# +anyio==3.6.2 \ + --hash=sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421 \ + --hash=sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3 + # via starlette +attrs==22.1.0 \ + --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ + --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c + # via + # jsonschema + # pytest +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 + # via requests +cffi==1.15.1 \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 + # via cryptography +charset-normalizer==2.1.1 \ + --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ + --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f + # via requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via uvicorn +cryptography==38.0.1 \ + --hash=sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a \ + --hash=sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f \ + --hash=sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0 \ + --hash=sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407 \ + --hash=sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7 \ + --hash=sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6 \ + --hash=sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153 \ + --hash=sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750 \ + --hash=sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad \ + --hash=sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6 \ + --hash=sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b \ + --hash=sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5 \ + --hash=sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a \ + --hash=sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d \ + --hash=sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d \ + --hash=sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294 \ + --hash=sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0 \ + --hash=sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a \ + --hash=sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac \ + --hash=sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61 \ + --hash=sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013 \ + --hash=sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e \ + --hash=sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb \ + --hash=sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9 \ + --hash=sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd \ + --hash=sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818 + # via -r requirements.in +exceptiongroup==1.0.0 \ + --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ + --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad + # via pytest +fastapi==0.85.2 \ + --hash=sha256:3e10ea0992c700e0b17b6de8c2092d7b9cd763ce92c49ee8d4be10fee3b2f367 \ + --hash=sha256:6292db0edd4a11f0d938d6033ccec5f706e9d476958bf33b119e8ddb4e524bde + # via + # -r requirements.in + # fastapi-jwt-auth +fastapi-jwt-auth==0.5.0 \ + --hash=sha256:43110a227e36f93b99257a1c79e66df8ed3d4c893291db8f9db2686192011f17 \ + --hash=sha256:d98068a9e828fe5909a1f338efabc3bb53149f11a9d2d395ab9d90fbb486b375 + # via -r requirements.in +h11==0.14.0 \ + --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 + # via uvicorn +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via + # anyio + # requests +iniconfig==1.1.1 \ + --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ + --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32 + # via pytest +jsonschema==4.16.0 \ + --hash=sha256:165059f076eff6971bae5b742fc029a7b4ef3f9bcf04c14e4776a7605de14b23 \ + --hash=sha256:9e74b8f9738d6a946d70705dc692b74b5429cd0960d58e79ffecfc43b2221eb9 + # via -r requirements.in +packaging==21.3 \ + --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ + --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 + # via pytest +pluggy==1.0.0 \ + --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ + --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 + # via pytest +py==1.11.0 \ + --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ + --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 + # via -r requirements.in +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via + # -r requirements.in + # cffi +pydantic==1.10.2 \ + --hash=sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42 \ + --hash=sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624 \ + --hash=sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e \ + --hash=sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559 \ + --hash=sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709 \ + --hash=sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9 \ + --hash=sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d \ + --hash=sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52 \ + --hash=sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda \ + --hash=sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912 \ + --hash=sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c \ + --hash=sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525 \ + --hash=sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe \ + --hash=sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41 \ + --hash=sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b \ + --hash=sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283 \ + --hash=sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965 \ + --hash=sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c \ + --hash=sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410 \ + --hash=sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5 \ + --hash=sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116 \ + --hash=sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98 \ + --hash=sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f \ + --hash=sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644 \ + --hash=sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13 \ + --hash=sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd \ + --hash=sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254 \ + --hash=sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6 \ + --hash=sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488 \ + --hash=sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5 \ + --hash=sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c \ + --hash=sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1 \ + --hash=sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a \ + --hash=sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2 \ + --hash=sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d \ + --hash=sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236 + # via fastapi +pyjwt==1.7.1 \ + --hash=sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e \ + --hash=sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96 + # via + # -r requirements.in + # fastapi-jwt-auth +pyparsing==3.0.9 \ + --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ + --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc + # via + # -r requirements.in + # packaging +pyrsistent==0.19.1 \ + --hash=sha256:06579d46d8ad69529b28f88711191a7fe7103c92d04a9f338dc754f71b92efa0 \ + --hash=sha256:1d0620474d509172e1c50b79d5626bfe1899f174bf650186a50c6ce31289ff52 \ + --hash=sha256:2032d971711643049b4f2c3ca5155a855d507d73bad26dac8d4349e5c5dd6758 \ + --hash=sha256:2c641111c3f110379bb9001dbb26b34eb8cafab3d0fa855dc161c391461a4aab \ + --hash=sha256:327f99800d04a9abcf580daecfd6dd4bfdb4a7e61c71bf2cd1189ef1ca44bade \ + --hash=sha256:39f15ad754384e744ac8b00805913bfa66c41131faaa3e4c45c4af0731f3e8f6 \ + --hash=sha256:4c58bd93c4d502f52938fccdbe6c9d70df3a585c6b39d900fab5f76b604282aa \ + --hash=sha256:62a41037387ae849a493cd945e22b34d167a843d57f75b07dbfad6d96cef485c \ + --hash=sha256:62b704f18526a8fc243152de8f3f40ae39c5172baff10f50c0c5d5331d6f2342 \ + --hash=sha256:6df99c3578dc4eb33f3eb26bc28277ab40a720b71649d940bff9c1f704377772 \ + --hash=sha256:6ef7430e45c5fa0bb6c361cada4a08ed9c184b5ed086815a85c3bc8c5054566b \ + --hash=sha256:73b2db09fe15b6e444c0bd566a125a385ca6493456224ce8b367d734f079f576 \ + --hash=sha256:73d4ec2997716af3c8f28f7e3d3a565d273a598982d2fe95639e07ce4db5da45 \ + --hash=sha256:73e3e2fd9da009d558050697cc22ad689f89a14a2ef2e67304628a913e59c947 \ + --hash=sha256:890f577aec554f142e01daf890221d10e4f93a9b1107998d631d3f075b55e8f8 \ + --hash=sha256:8a34a2a8b220247658f7ced871197c390b3a6371d796a5869ab1c62abe0be527 \ + --hash=sha256:8bc23e9ddcb523c3ffb4d712aa0bd5bc67b34ff4e2b23fb557012171bdb4013a \ + --hash=sha256:945297fc344fef4d540135180ce7babeb2291d124698cc6282f3eac624aa5e82 \ + --hash=sha256:aaa869d9199d7d4c70a57678aff21654cc179c0c32bcfde87f1d65d0ff47e520 \ + --hash=sha256:bc33fc20ddfd89b86b7710142963490d8c4ee8307ed6cc5e189a58fa72390eb9 \ + --hash=sha256:cfe6d8b293d123255fd3b475b5f4e851eb5cbaee2064c8933aa27344381744ae \ + --hash=sha256:d16ac5ab3d9db78fed40c884d67079524e4cf8276639211ad9e6fa73e727727e + # via jsonschema +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 + # via -r requirements.in +requests==2.28.1 \ + --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ + --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 + # via -r requirements.in +rfc3339-validator==0.1.4 \ + --hash=sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b \ + --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa + # via -r requirements.in +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via rfc3339-validator +sniffio==1.3.0 \ + --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ + --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 + # via anyio +starlette==0.20.4 \ + --hash=sha256:42fcf3122f998fefce3e2c5ad7e5edbf0f02cf685d646a83a08d404726af5084 \ + --hash=sha256:c0414d5a56297d37f3db96a84034d61ce29889b9eaccf65eb98a0b39441fcaa3 + # via fastapi +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ + --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f + # via -r requirements.in +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via pytest +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e + # via + # -r requirements.in + # pydantic + # starlette +urllib3==1.26.12 \ + --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ + --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 + # via + # -r requirements.in + # requests +uvicorn==0.19.0 \ + --hash=sha256:cc277f7e73435748e69e075a721841f7c4a95dba06d12a72fe9874acced16f6f \ + --hash=sha256:cf538f3018536edb1f4a826311137ab4944ed741d52aeb98846f52215de57f25 + # via -r requirements.in diff --git a/src/couch/client.py b/src/couch/client.py index 188e0de..52477be 100644 --- a/src/couch/client.py +++ b/src/couch/client.py @@ -17,7 +17,7 @@ from couch.resource import Resource DEFAULT_BASE_URL = os.environ.get('COUCHDB_URL', 'http://localhost:5984/') -def _id_to_path(_id): +def _id_to_path(_id: str) -> str: if _id[:1] == "_": return _id.split("/", 1) return [_id] @@ -360,7 +360,7 @@ class Database(object): revision. :returns: doc """ - + _doc = copy.copy(doc) if "_id" not in _doc: _doc['_id'] = uuid.uuid4().hex @@ -371,12 +371,27 @@ class Database(object): params = {} data = utils.force_bytes(json.dumps(_doc)) + + print("gg1", flush=True) + print(data, flush=True) + print("vv1", flush=True) + (resp, result) = self.resource(_doc['_id']).put( data=data, params=params) + print("gg3", flush=True) + print(resp.status_code) + print(resp.content) + #print(resp.contents) + + print("gg2", flush=True) + print(data, flush=True) + print(result, flush=True) + print("vv2", flush=True) + if resp.status_code == 409: raise exp.Conflict(result['reason']) - + if "rev" in result and result["rev"] is not None: _doc["_rev"] = result["rev"] diff --git a/src/couch/feedreader.py b/src/couch/feedreader.py index e293932..98401ab 100644 --- a/src/couch/feedreader.py +++ b/src/couch/feedreader.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- # Based on py-couchdb (https://github.com/histrio/py-couchdb) +from __future__ import annotations - -class BaseFeedReader(object): +class BaseFeedReader: """ Base interface class for changes feed reader. """ - def __call__(self, db): + def __call__(self, db) -> BaseFeedReader: self.db = db return self @@ -44,9 +44,9 @@ class SimpleFeedReader(BaseFeedReader): a valid feed reader interface. """ - def __call__(self, db, callback): + def __call__(self, db, callback) -> BaseFeedReader: self.callback = callback return super(SimpleFeedReader, self).__call__(db) - def on_message(self, message): + def on_message(self, message) -> None: self.callback(message, db=self.db) diff --git a/src/couch/resource.py b/src/couch/resource.py index da1e0dd..364bff4 100644 --- a/src/couch/resource.py +++ b/src/couch/resource.py @@ -3,17 +3,20 @@ from __future__ import unicode_literals +from typing import Union, Tuple import json import requests + + from couch import utils from couch import exceptions -class Resource(object): - def __init__(self, base_url, full_commit=True, session=None, - credentials=None, authmethod="session", verify=False): +class Resource: + def __init__(self, base_url: str, full_commit: bool = True, session: Union[requests.sessions.Session, None] = None, + credentials: Union[Tuple[str, str], None] = None, authmethod: str = "session", verify: bool = False) -> None: self.base_url = base_url # self.verify = verify @@ -31,7 +34,7 @@ class Resource(object): self.session = session self.session.verify = verify - def _authenticate(self, credentials, method): + def _authenticate(self, credentials: Union[Tuple[str, str], None], method: str) -> None: if not credentials: return @@ -50,11 +53,11 @@ class Resource(object): else: raise RuntimeError("Invalid authentication method") - def __call__(self, *path): + def __call__(self, *path: str): base_url = utils.urljoin(self.base_url, *path) return self.__class__(base_url, session=self.session) - def _check_result(self, response, result): + def _check_result(self, response, result) -> None: try: error = result.get('error', None) reason = result.get('reason', None) @@ -74,7 +77,7 @@ class Resource(object): raise exceptions.BadRequest(reason or "Bad request") raise exceptions.GenericError(result) - def request(self, method, path, params=None, data=None, + def request(self, method, path: str, params=None, data=None, headers=None, stream=False, **kwargs): if headers is None: @@ -112,17 +115,17 @@ class Resource(object): return response, result - def get(self, path=None, **kwargs): + def get(self, path: Union[str, None] = None, **kwargs): return self.request("GET", path, **kwargs) - def put(self, path=None, **kwargs): + def put(self, path: Union[str, None] = None, **kwargs): return self.request("PUT", path, **kwargs) - def post(self, path=None, **kwargs): + def post(self, path: Union[str, None] = None, **kwargs): return self.request("POST", path, **kwargs) - def delete(self, path=None, **kwargs): + def delete(self, path: Union[str, None] = None, **kwargs): return self.request("DELETE", path, **kwargs) - def head(self, path=None, **kwargs): + def head(self, path: Union[str, None] = None, **kwargs): return self.request("HEAD", path, **kwargs) diff --git a/src/couch/utils.py b/src/couch/utils.py index 1cd21d8..f0883a6 100644 --- a/src/couch/utils.py +++ b/src/couch/utils.py @@ -1,26 +1,15 @@ # -*- coding: utf-8 -*- # Based on py-couchdb (https://github.com/histrio/py-couchdb) - +from typing import Tuple, Union, Dict, List, Any import json import sys +import requests +from urllib.parse import unquote as _unquote +from urllib.parse import urlunsplit, urlsplit -if sys.version_info[0] == 3: - from urllib.parse import unquote as _unquote - from urllib.parse import urlunsplit, urlsplit - - string_type = str - bytes_type = bytes - - from functools import reduce - -else: - from urllib import unquote as _unquote - from urlparse import urlunsplit, urlsplit - - string_type = unicode # noqa: F821 - bytes_type = str +from functools import reduce URLSPLITTER = '/' @@ -28,7 +17,7 @@ URLSPLITTER = '/' json_encoder = json.JSONEncoder() -def extract_credentials(url): +def extract_credentials(url: str) -> Tuple[str, Union[Tuple[str, str], None]]: """ Extract authentication (user name and password) credentials from the given URL. @@ -46,19 +35,20 @@ def extract_credentials(url): if '@' in netloc: creds, netloc = netloc.split('@') credentials = tuple(_unquote(i) for i in creds.split(':')) - parts = list(parts) - parts[1] = netloc - else: - credentials = None - return urlunsplit(parts), credentials + parts_list = list(parts) + parts_list[1] = netloc + return urlunsplit(parts_list), (credentials[0], credentials[1]) + + parts_list = list(parts) + return urlunsplit(parts_list), None -def _join(head, tail): +def _join(head: str, tail: str) -> str: parts = [head.rstrip(URLSPLITTER), tail.lstrip(URLSPLITTER)] return URLSPLITTER.join(parts) -def urljoin(base, *path): +def urljoin(base: str, *path: str) -> str: """ Assemble a uri based on a base, any number of path segments, and query string parameters. @@ -87,18 +77,18 @@ def urljoin(base, *path): """ return reduce(_join, path, base) - -def as_json(response): +# Probably bugs here +def as_json(response: requests.models.Response) -> Union[Dict[str, Any], None]: if "application/json" in response.headers['content-type']: response_src = response.content.decode('utf-8') if response.content != b'': - return json.loads(response_src) + ret: Dict[str, Any] = json.loads(response_src) + return ret else: return response_src return None - -def _path_from_name(name, type): +def _path_from_name(name: str, type: str) -> List[str]: """ Expand a 'design/foo' style name to its full path as a list of segments. @@ -114,7 +104,7 @@ def _path_from_name(name, type): return ['_design', design, type, name] -def encode_view_options(options): +def encode_view_options(options: Dict[str, Any]) -> Dict[str, Any]: """ Encode any items in the options dict that are sent as a JSON string to a view/list function. @@ -138,13 +128,13 @@ def encode_view_options(options): return retval -def force_bytes(data, encoding="utf-8"): - if isinstance(data, string_type): +def force_bytes(data: Union[str, bytes], encoding: str = "utf-8") -> bytes: + if isinstance(data, str): data = data.encode(encoding) return data -def force_text(data, encoding="utf-8"): - if isinstance(data, bytes_type): +def force_text(data: Union[str, bytes], encoding: str = "utf-8") -> str: + if isinstance(data, bytes): data = data.decode(encoding) return data @@ -7,6 +7,7 @@ # value if you're too quick with generating the timestamps, ie # invoking time.time() several times quickly enough. +from typing import Dict, List, Tuple, Union, Any import os import sys import time @@ -16,7 +17,7 @@ from schema import as_index_list, validate_collector_data class DictDB(): - def __init__(self): + def __init__(self) -> None: """ Check if the database exists, otherwise we will create it together with the indexes specified in index.py. @@ -35,7 +36,7 @@ class DictDB(): if 'COUCHDB_PORT' in os.environ: couchdb_port = os.environ['COUCHDB_PORT'] else: - couchdb_port = 5984 + couchdb_port = "5984" self.server = couch.client.Server( f"http://{self.username}:{self.password}@{self.hostname}:{couchdb_port}/") @@ -52,7 +53,7 @@ class DictDB(): self._ts = time.time() - def unique_key(self): + def unique_key(self) -> int: """ Create a unique key based on the current time. We will use this as the ID for any new documents we store in CouchDB. @@ -65,18 +66,19 @@ class DictDB(): return self._ts - def add(self, data, batch_write=False): + # Why batch_write??? + def add(self, data: Union[List[Dict[str, Any]], Dict[str, Any]]) -> Union[str, Tuple[str, str]]: """ Store a document in CouchDB. """ - if type(data) is list: + if isinstance(data, List): for item in data: error = validate_collector_data(item) if error != "": return error item['_id'] = str(self.unique_key()) - ret = self.couchdb.save_bulk(data) + ret: Tuple[str, str] = self.couchdb.save_bulk(data) else: error = validate_collector_data(data) if error != "": @@ -86,13 +88,13 @@ class DictDB(): return ret - def get(self, key): + def get(self, key: int) -> Dict[str, Any]: """ Get a document based on its ID, return an empty dict if not found. """ try: - doc = self.couchdb.get(key) + doc: Dict[str, Any] = self.couchdb.get(key) except couch.exceptions.NotFound: doc = {} @@ -101,7 +103,7 @@ class DictDB(): def slice(self, key_from=None, key_to=None): pass - def search(self, limit=25, skip=0, **kwargs): + def search(self, limit: int = 25, skip: int = 0, **kwargs: Any) -> List[Dict[str, Any]]: """ Execute a Mango query, ideally we should have an index matching the query otherwise things will be slow. @@ -134,7 +136,7 @@ class DictDB(): return data - def delete(self, key): + def delete(self, key: int) -> Union[int, None]: """ Delete a document based on its ID. """ diff --git a/src/main.py b/src/main.py index 9de8eb8..2730b83 100755 --- a/src/main.py +++ b/src/main.py @@ -1,3 +1,4 @@ +from typing import Dict, Union, List, Any import json import os import sys @@ -48,7 +49,7 @@ else: sys.exit(-1) -def get_pubkey(): +def get_pubkey() -> str: try: if 'JWT_PUBKEY_PATH' in os.environ: keypath = os.environ['JWT_PUBKEY_PATH'] @@ -64,12 +65,18 @@ def get_pubkey(): return pubkey -def get_data(key=None, limit=25, skip=0, ip=None, - port=None, asn=None, domain=None): + +def get_data(key: Union[int, None] = None, + limit: int = 25, + skip: int = 0, + ip: Union[str, None] = None, + port: Union[int, None] = None, + asn: Union[str, None] = None, + domain: Union[str, None] = None) -> List[Dict[str, Any]]: if key: - return db.get(key) + return [db.get(key)] - selectors = dict() + selectors: Dict[str, Any] = {} indexes = get_index_keys() selectors['domain'] = domain @@ -80,7 +87,7 @@ def get_data(key=None, limit=25, skip=0, ip=None, if asn and 'asn' in indexes: selectors['asn'] = asn - data = db.search(**selectors, limit=limit, skip=skip) + data: List[Dict[str, Any]] = db.search(**selectors, limit=limit, skip=skip) return data @@ -96,21 +103,20 @@ def jwt_config(): @app.exception_handler(AuthJWTException) -def authjwt_exception_handler(request: Request, exc: AuthJWTException): +def authjwt_exception_handler(request: Request, exc: AuthJWTException) -> JSONResponse: return JSONResponse(content={"status": "error", "message": exc.message}, status_code=400) @app.exception_handler(RuntimeError) -def app_exception_handler(request: Request, exc: RuntimeError): +def app_exception_handler(request: Request, exc: RuntimeError) -> JSONResponse: return JSONResponse(content={"status": "error", "message": str(exc.with_traceback(None))}, status_code=400) @app.get('/sc/v0/get') -async def get(key=None, limit=25, skip=0, ip=None, port=None, - asn=None, Authorize: AuthJWT = Depends()): +async def get(key: Union[int, None] = None, limit: int = 25, skip: int = 0, ip: Union[str, None] = None, port: Union[int, None] = None, asn: Union[str, None] = None, Authorize: AuthJWT = Depends()) -> JSONResponse: Authorize.jwt_required() @@ -135,7 +141,7 @@ async def get(key=None, limit=25, skip=0, ip=None, port=None, @app.get('/sc/v0/get/{key}') -async def get_key(key=None, Authorize: AuthJWT = Depends()): +async def get_key(key: Union[int, None] = None, Authorize: AuthJWT = Depends()) -> JSONResponse: Authorize.jwt_required() @@ -152,7 +158,10 @@ async def get_key(key=None, Authorize: AuthJWT = Depends()): else: allowed_domains = raw_jwt["read"] - data = get_data(key) + data_list = get_data(key) + + # Handle if missing + data = data_list[0] if data and data["domain"] not in allowed_domains: return JSONResponse( @@ -166,8 +175,9 @@ async def get_key(key=None, Authorize: AuthJWT = Depends()): return JSONResponse(content={"status": "success", "docs": data}) +# WHY IS AUTH OUTCOMMENTED??? @app.post('/sc/v0/add') -async def add(data: Request, Authorize: AuthJWT = Depends()): +async def add(data: Request, Authorize: AuthJWT = Depends()) -> JSONResponse: # Authorize.jwt_required() try: @@ -196,7 +206,7 @@ async def add(data: Request, Authorize: AuthJWT = Depends()): @app.delete('/sc/v0/delete/{key}') -async def delete(key, Authorize: AuthJWT = Depends()): +async def delete(key: int, Authorize: AuthJWT = Depends()) -> JSONResponse: Authorize.jwt_required() @@ -213,7 +223,10 @@ async def delete(key, Authorize: AuthJWT = Depends()): else: allowed_domains = raw_jwt["write"] - data = get_data(key) + data_list = get_data(key) + + # Handle if missing + data = data_list[0] if data and data["domain"] not in allowed_domains: return JSONResponse( @@ -232,7 +245,7 @@ async def delete(key, Authorize: AuthJWT = Depends()): return JSONResponse(content={"status": "success", "docs": data}) -def main(standalone=False): +def main(standalone: bool = False): if not standalone: return app diff --git a/src/schema.py b/src/schema.py index fe2b76c..2b479d2 100644 --- a/src/schema.py +++ b/src/schema.py @@ -1,3 +1,4 @@ +from typing import List, Any, Dict import json import sys import traceback @@ -95,15 +96,15 @@ schema = { # fmt:on -def get_index_keys(): - keys = list() +def get_index_keys() -> List[str]: + keys: List[str] = [] for key in schema["properties"]: keys.append(key) return keys -def as_index_list(): - index_list = list() +def as_index_list() -> List[Dict[str, Any]]: + index_list: List[Dict[str, Any]] = [] for key in schema["properties"]: name = f"{key}-json-index" index = { @@ -120,7 +121,7 @@ def as_index_list(): return index_list -def validate_collector_data(json_blob): +def validate_collector_data(json_blob: Dict[str, Any]) -> str: try: jsonschema.validate(json_blob, schema, format_checker=jsonschema.FormatChecker()) except jsonschema.exceptions.ValidationError as e: |