diff --git a/documentation/_static/keycloak-service-account-roles.png b/documentation/_static/keycloak-service-account-roles.png new file mode 100644 index 00000000..e4ca0219 Binary files /dev/null and b/documentation/_static/keycloak-service-account-roles.png differ diff --git a/documentation/maintainers/settings.rst b/documentation/maintainers/settings.rst index af569a71..8dfb3997 100644 --- a/documentation/maintainers/settings.rst +++ b/documentation/maintainers/settings.rst @@ -19,3 +19,56 @@ Pour utiliser ces pages statiques, on peut utiliser le paramètre `error_page `_. + +Il est donc nécessaire de configurer les paramètres de configuration suivants : + +- :attr:`~b3desk.settings.MainSettings.SECONDARY_IDENTITY_PROVIDER_ENABLED` +- :attr:`~b3desk.settings.MainSettings.SECONDARY_IDENTITY_PROVIDER_URI` +- :attr:`~b3desk.settings.MainSettings.SECONDARY_IDENTITY_PROVIDER_REALM` +- :attr:`~b3desk.settings.MainSettings.SECONDARY_IDENTITY_PROVIDER_CLIENT_ID` +- :attr:`~b3desk.settings.MainSettings.SECONDARY_IDENTITY_PROVIDER_CLIENT_SECRET` + +On peut ensuite tester que la configuration est correcte grâce à la commande suivante: + +.. code-block:: bash + + docker exec -it flask get-apps-id + +En remplaçant ```` par l’identifiant du conteneur `b3desk_web`, et ```` par l’email d’un utilisateur, cette commande tente une connexion à l’API keycloak d’apps, afin de récupérer l’identifiant dont l’email a été passé en paramètre. + +Si la connexion à l’API de keycloak échoue, cette commande indiquera à quelle étape, et quelles sont les pistes de résolution. + +Configuration de Keycloak +------------------------- + +Pour que la connexion de B3Desk à Apps fonctionne correctement, il est nécessaire que keycloak autorise les connexion par `identifiants client `_. + +Vérifier que la configuration de Keycloak est correcte +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Se rendre la console d’administration Keycloak, dans le `realm` ``apps``. + Par exemple https://auth.eole3.dev/auth/admin/master/console/#/apps +- Se rendre dans la section « Clients » et sélectionner « b3desk » +- Sélectionner l’onglet « Service account roles » +- À cet endroit on doit voir deux lignes avec les droits ``real-management view-users`` et ``realm-management query-users``. + +.. image:: ../_static/keycloak-service-account-roles.png + +Configuration de Keycloak est correcte +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Si les droits ``real-management view-users`` et ``realm-management query-users`` ne sont pas présents, il faut les ajouter : + +- Cliquer sur le bouton « Assign roles », une fenêtre modale doit s’ouvrir +- Cliquer sur le menu déroulant des filtres en haut à gauche, et sélectionner « Filter by clients » plutôt que « Filter by realm roles » +- Dans le champ de recherche, entrer « users » et valider +- Cocher « view-users » et « query-users » puis sur le bouton « Assign » diff --git a/poetry.lock b/poetry.lock index 2a026165..0587fd0c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -217,13 +217,13 @@ files = [ [[package]] name = "canaille" -version = "0.0.51" -description = "Lightweight identity and autorization management software" +version = "0.0.53" +description = "Lightweight identity and authorization management software" optional = false -python-versions = "<4.0,>=3.8" +python-versions = "<4.0,>=3.9" files = [ - {file = "canaille-0.0.51-cp312-cp312-manylinux_2_39_x86_64.whl", hash = "sha256:abe9d39e55442e341322fd82bf9d94183530e40563afe2f33d3ac9c0f23e7bc2"}, - {file = "canaille-0.0.51.tar.gz", hash = "sha256:b5598c7ef9325940ebc3b6fbde55d0978d900ea296a34a98d9ce8ff46e08d3c6"}, + {file = "canaille-0.0.53-cp311-cp311-manylinux_2_39_x86_64.whl", hash = "sha256:e3fa454827174fb347bc1aedf1286bbe9b6beedabf3cf82d8fdba7fb7420a8be"}, + {file = "canaille-0.0.53.tar.gz", hash = "sha256:c9b1579d63e9777528dff0f9071c8fe755a5da171f1018b4c41742781a7d73cd"}, ] [package.dependencies] @@ -2071,17 +2071,17 @@ python-dotenv = ">=0.9.1" [[package]] name = "pytest-iam" -version = "0.0.9" +version = "0.0.12" description = "A fully functional OAUTH2 / OpenID Connect (OIDC) server to be used in your testsuite" optional = false -python-versions = "<4.0,>=3.8" +python-versions = "<4.0,>=3.9" files = [ - {file = "pytest_iam-0.0.9-py3-none-any.whl", hash = "sha256:ea20832cb51c3be8a8509ad1bf2524db11444186db0ecee94b8418e838fd28c3"}, - {file = "pytest_iam-0.0.9.tar.gz", hash = "sha256:d043f83ebe7aa0ce10ffabf3849e2f42d76fd47ad47ead9c0b4c91ccc108dd8a"}, + {file = "pytest_iam-0.0.12-py3-none-any.whl", hash = "sha256:480a7ff195dae5f3b56cb81a7ca80d0dd8ea0274e79f684390d42fe9c4cc101e"}, + {file = "pytest_iam-0.0.12.tar.gz", hash = "sha256:15b6f343ff3c3649d9355fd8d0fd631553282176104939d4b595048703061b70"}, ] [package.dependencies] -canaille = {version = "<1", extras = ["oidc"]} +canaille = {version = ">=0.0.53,<1", extras = ["oidc"]} faker = ">=21.0.0" portpicker = ">=1.6.0" pytest = ">=7.0.0" @@ -2891,4 +2891,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "8b4de0bd382a742b2334b748475c9d07d4bd8f22c568c0a1bee1f8eccd0b080b" +content-hash = "40acc55fd255873d306e230e86272caad86500f522e41003352d597dbc52054a" diff --git a/pyproject.toml b/pyproject.toml index dbc36900..ddc5408f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "b3desk" -version = "1.2.3" +version = "1.2.4" description = "Outil de visioconférence pour les agents de l'Education Nationale et de l'Etat en général." authors = ["Your Name "] readme = "README.md" @@ -45,7 +45,7 @@ pre-commit = "^3.1.1" pytest = "^8.0.0" pytest-cov = "^5.0.0" pytest-dotenv = "^0.5.2" -pytest-iam = "^0.0.9" +pytest-iam = "^0.0.12" pytest-mock = "^3.11.1" wsgidav = "^4.3.1" pytest-smtpd = "^0.1.0" diff --git a/web/b3desk/__init__.py b/web/b3desk/__init__.py index 99859a81..dbf3a1cc 100644 --- a/web/b3desk/__init__.py +++ b/web/b3desk/__init__.py @@ -29,7 +29,7 @@ from .utils import enum_converter from .utils import model_converter -__version__ = "1.2.3" +__version__ = "1.2.4" LANGUAGES = ["en", "fr"] diff --git a/web/b3desk/models/bbb.py b/web/b3desk/models/bbb.py index de69c485..4b7c95f4 100644 --- a/web/b3desk/models/bbb.py +++ b/web/b3desk/models/bbb.py @@ -320,7 +320,7 @@ def meeting_file_addition_xml(self, meeting_files): f"{current_app.config['SECRET_KEY']}-0-{meeting_file.id}-{current_app.config['SECRET_KEY']}".encode() ).hexdigest() current_app.logger.info( - "Add document on BigBLueButton room creation for file", + "Add document on BigBLueButton room creation for file %s", meeting_file.title, ) url = url_for( diff --git a/web/b3desk/settings.py b/web/b3desk/settings.py index d61d600a..10361d19 100644 --- a/web/b3desk/settings.py +++ b/web/b3desk/settings.py @@ -433,6 +433,28 @@ def get_allowed_mime_types_server_side( Plus d’infos sur https://flask-pyoidc.readthedocs.io/en/latest/api.html#module-flask_pyoidc.provider_configuration """ + SECONDARY_IDENTITY_PROVIDER_ENABLED: Optional[bool] = False + """Indique si un second serveur d'identité pour la connection a un + Nextcloud est activée. + + S'il y a bien besoin de ce second serveur d'identité pour connecter + un utilisateur sur un Nextcloud, l'identifiant Nextcloud de + l'utilisateur sera recherché à partir de son mail. + """ + + SECONDARY_IDENTITY_PROVIDER_URI: Optional[str] = None + """Url du serveur d'identité permettant de retrouver un id utilisateur à + partir de son email.""" + + SECONDARY_IDENTITY_PROVIDER_REALM: Optional[str] = None + """Groupe sous lequel est enregistré l'utilisateur.""" + + SECONDARY_IDENTITY_PROVIDER_CLIENT_ID: Optional[str] = None + """ID du client B3desk dans ce serveur d'identité.""" + + SECONDARY_IDENTITY_PROVIDER_CLIENT_SECRET: Optional[str] = None + """Secret du client B3desk dans ce serveur d'identité.""" + @field_validator("OIDC_ATTENDEE_ISSUER") def get_attendee_issuer(cls, attendee_issuer: str, info: ValidationInfo) -> str: return attendee_issuer or info.data.get("OIDC_ISSUER") diff --git a/web/misc/run_webserver.sh b/web/misc/run_webserver.sh index 4f2658b1..b506e8e7 100644 --- a/web/misc/run_webserver.sh +++ b/web/misc/run_webserver.sh @@ -3,4 +3,4 @@ # DB Migration flask db upgrade &>> /var/log/flask-migrate.log -gunicorn --chdir /opt/bbb-visio --bind 0.0.0.0:5000 --log-level warning --access-logfile /var/log/gunicorn-access.log --error-logfile /var/log/gunicorn-error.log wsgi:app +gunicorn --chdir /opt/bbb-visio --bind 0.0.0.0:5000 --log-level info --access-logfile /var/log/gunicorn-access.log --error-logfile /var/log/gunicorn-error.log wsgi:app diff --git a/web/requirements.app.txt b/web/requirements.app.txt index f5f57ca1..6729e84f 100644 --- a/web/requirements.app.txt +++ b/web/requirements.app.txt @@ -6,7 +6,7 @@ babel==2.14.0 ; python_version >= "3.9" and python_version < "4.0" billiard==4.2.0 ; python_version >= "3.9" and python_version < "4.0" blinker==1.7.0 ; python_version >= "3.9" and python_version < "4.0" cachelib==0.9.0 ; python_version >= "3.9" and python_version < "4.0" -celery==5.3.6 ; python_version >= "3.9" and python_version < "4.0" +celery==5.4.0 ; python_version >= "3.9" and python_version < "4.0" certifi==2024.2.2 ; python_version >= "3.9" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.9" and python_version < "4.0" and platform_python_implementation != "PyPy" charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0" @@ -25,18 +25,18 @@ flask-pyoidc==3.14.3 ; python_version >= "3.9" and python_version < "4.0" flask-sqlalchemy==3.0.5 ; python_version >= "3.9" and python_version < "4.0" flask-uploads==0.2.1 ; python_version >= "3.9" and python_version < "4.0" flask-wtf==1.2.1 ; python_version >= "3.9" and python_version < "4.0" -flask==3.0.2 ; python_version >= "3.9" and python_version < "4.0" +flask==3.0.3 ; python_version >= "3.9" and python_version < "4.0" future==1.0.0 ; python_version >= "3.9" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.9" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version < "4.0" gunicorn==21.2.0 ; python_version >= "3.9" and python_version < "4.0" -idna==3.6 ; python_version >= "3.9" and python_version < "4.0" +idna==3.7 ; python_version >= "3.9" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.9" and python_version < "3.10" importlib-resources==6.4.0 ; python_version >= "3.9" and python_version < "4.0" -itsdangerous==2.1.2 ; python_version >= "3.9" and python_version < "4.0" +itsdangerous==2.2.0 ; python_version >= "3.9" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.9" and python_version < "4.0" -kombu==5.3.6 ; python_version >= "3.9" and python_version < "4.0" +kombu==5.3.7 ; python_version >= "3.9" and python_version < "4.0" lxml==5.2.1 ; python_version >= "3.9" and python_version < "4.0" -mako==1.3.2 ; python_version >= "3.9" and python_version < "4.0" +mako==1.3.3 ; python_version >= "3.9" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "4.0" netaddr==1.2.1 ; python_version >= "3.9" and python_version < "4.0" oic==1.6.1 ; python_version >= "3.9" and python_version < "4.0" @@ -45,9 +45,9 @@ prompt-toolkit==3.0.43 ; python_version >= "3.9" and python_version < "4.0" psycopg2==2.9.9 ; python_version >= "3.9" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.9" and python_version < "4.0" and platform_python_implementation != "PyPy" pycryptodomex==3.20.0 ; python_version >= "3.9" and python_version < "4.0" -pydantic-core==2.16.3 ; python_version >= "3.9" and python_version < "4.0" +pydantic-core==2.18.1 ; python_version >= "3.9" and python_version < "4.0" pydantic-settings==2.2.1 ; python_version >= "3.9" and python_version < "4.0" -pydantic==2.6.4 ; python_version >= "3.9" and python_version < "4.0" +pydantic==2.7.0 ; python_version >= "3.9" and python_version < "4.0" pyjwkest==1.4.2 ; python_version >= "3.9" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.9" and python_version < "4.0" python-dotenv==1.0.1 ; python_version >= "3.9" and python_version < "4.0" @@ -60,7 +60,7 @@ sqlalchemy-json==0.7.0 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy-utils==0.41.2 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy==1.4.52 ; python_version >= "3.9" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.9" and python_version < "4.0" -typing-extensions==4.10.0 ; python_version >= "3.9" and python_version < "4.0" +typing-extensions==4.11.0 ; python_version >= "3.9" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.9" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.9" and python_version < "4.0" vine==5.1.0 ; python_version >= "3.9" and python_version < "4.0" diff --git a/web/requirements.dev.txt b/web/requirements.dev.txt index 67ee1237..9fb11ee0 100644 --- a/web/requirements.dev.txt +++ b/web/requirements.dev.txt @@ -5,7 +5,7 @@ attrs==23.2.0 ; python_version >= "3.9" and python_version < "4" authlib==1.3.0 ; python_version >= "3.9" and python_version < "4.0" beautifulsoup4==4.12.3 ; python_version >= "3.9" and python_version < "4" blinker==1.7.0 ; python_version >= "3.9" and python_version < "4.0" -canaille[oidc]==0.0.45 ; python_version >= "3.9" and python_version < "4.0" +canaille[oidc]==0.0.53 ; python_version >= "3.9" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.9" and python_version < "4" and platform_python_implementation != "PyPy" cfgv==3.4.0 ; python_version >= "3.9" and python_version < "4.0" click==8.1.7 ; python_version >= "3.9" and python_version < "4.0" @@ -16,55 +16,53 @@ cryptography==42.0.5 ; python_version >= "3.9" and python_version < "4" cssselect==1.2.0 ; python_version >= "3.9" and python_version < "4.0" defusedxml==0.7.1 ; python_version >= "3.9" and python_version < "4.0" distlib==0.3.8 ; python_version >= "3.9" and python_version < "4.0" -enum-extend==0.1.1 ; python_version >= "3.9" and python_version < "4.0" -exceptiongroup==1.2.0 ; python_version >= "3.9" and python_version < "3.11" -faker==24.4.0 ; python_version >= "3.9" and python_version < "4.0" -filelock==3.13.3 ; python_version >= "3.9" and python_version < "4.0" +exceptiongroup==1.2.1 ; python_version >= "3.9" and python_version < "3.11" +faker==24.11.0 ; python_version >= "3.9" and python_version < "4.0" +filelock==3.13.4 ; python_version >= "3.9" and python_version < "4.0" flake8==7.0.0 ; python_version >= "3.9" and python_version < "4.0" flask-webtest==0.1.4 ; python_version >= "3.9" and python_version < "4.0" flask-wtf==1.2.1 ; python_version >= "3.9" and python_version < "4.0" -flask==3.0.2 ; python_version >= "3.9" and python_version < "4.0" +flask==3.0.3 ; python_version >= "3.9" and python_version < "4.0" freezegun==1.4.0 ; python_version >= "3.9" and python_version < "4.0" -identify==2.5.35 ; python_version >= "3.9" and python_version < "4.0" +identify==2.5.36 ; python_version >= "3.9" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.9" and python_version < "3.10" iniconfig==2.0.0 ; python_version >= "3.9" and python_version < "4.0" -itsdangerous==2.1.2 ; python_version >= "3.9" and python_version < "4.0" +itsdangerous==2.2.0 ; python_version >= "3.9" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.9" and python_version < "4.0" -json5==0.9.24 ; python_version >= "3.9" and python_version < "4.0" +json5==0.9.25 ; python_version >= "3.9" and python_version < "4.0" lxml==5.2.1 ; python_version >= "3.9" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "4.0" mccabe==0.7.0 ; python_version >= "3.9" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.9" and python_version < "4.0" packaging==24.0 ; python_version >= "3.9" and python_version < "4.0" platformdirs==4.2.0 ; python_version >= "3.9" and python_version < "4.0" -pluggy==1.4.0 ; python_version >= "3.9" and python_version < "4.0" +pluggy==1.5.0 ; python_version >= "3.9" and python_version < "4.0" portpicker==1.6.0 ; python_version >= "3.9" and python_version < "4.0" -pre-commit==3.5.0 ; python_version >= "3.9" and python_version < "4.0" +pre-commit==3.7.0 ; python_version >= "3.9" and python_version < "4.0" psutil==5.9.8 ; python_version >= "3.9" and python_version < "4.0" pycodestyle==2.11.1 ; python_version >= "3.9" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.9" and python_version < "4" and platform_python_implementation != "PyPy" -pydantic-core==2.16.3 ; python_version >= "3.9" and python_version < "4.0" +pydantic-core==2.18.1 ; python_version >= "3.9" and python_version < "4.0" pydantic-settings==2.2.1 ; python_version >= "3.9" and python_version < "4.0" -pydantic==2.6.4 ; python_version >= "3.9" and python_version < "4.0" +pydantic==2.7.0 ; python_version >= "3.9" and python_version < "4.0" pyflakes==3.2.0 ; python_version >= "3.9" and python_version < "4.0" pyquery==2.0.0 ; python_version >= "3.9" and python_version < "4.0" pytest-cov==5.0.0 ; python_version >= "3.9" and python_version < "4.0" pytest-dotenv==0.5.2 ; python_version >= "3.9" and python_version < "4.0" -pytest-iam==0.0.9 ; python_version >= "3.9" and python_version < "4.0" +pytest-iam==0.0.12 ; python_version >= "3.9" and python_version < "4.0" pytest-mock==3.14.0 ; python_version >= "3.9" and python_version < "4.0" pytest-smtpd==0.1.0 ; python_version >= "3.9" and python_version < "4" pytest==8.1.1 ; python_version >= "3.9" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.9" and python_version < "4.0" python-dotenv==1.0.1 ; python_version >= "3.9" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0" -setuptools==69.2.0 ; python_version >= "3.9" and python_version < "4.0" +setuptools==69.5.1 ; python_version >= "3.9" and python_version < "4.0" six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" -smtpdfix==0.5.1 ; python_version >= "3.9" and python_version < "4" +smtpdfix==0.5.2 ; python_version >= "3.9" and python_version < "4" soupsieve==2.5 ; python_version >= "3.9" and python_version < "4" -sphinx-enum-extend==0.1.3 ; python_version >= "3.9" and python_version < "4.0" tomli==2.0.1 ; python_version >= "3.9" and python_full_version <= "3.11.0a6" -typing-extensions==4.10.0 ; python_version >= "3.9" and python_version < "4.0" -virtualenv==20.25.1 ; python_version >= "3.9" and python_version < "4.0" +typing-extensions==4.11.0 ; python_version >= "3.9" and python_version < "4.0" +virtualenv==20.25.3 ; python_version >= "3.9" and python_version < "4.0" waitress==3.0.0 ; python_version >= "3.9" and python_version < "4" webob==1.8.7 ; python_version >= "3.9" and python_version < "4" webtest==3.0.0 ; python_version >= "3.9" and python_version < "4" diff --git a/web/requirements.doc.txt b/web/requirements.doc.txt index 968fc6d9..b6b109f0 100644 --- a/web/requirements.doc.txt +++ b/web/requirements.doc.txt @@ -1,4 +1,4 @@ -alabaster==0.7.13 ; python_version >= "3.9" and python_version < "4.0" +alabaster==0.7.16 ; python_version >= "3.9" and python_version < "4.0" alembic==1.13.1 ; python_version >= "3.9" and python_version < "4.0" amqp==5.2.0 ; python_version >= "3.9" and python_version < "4.0" annotated-types==0.6.0 ; python_version >= "3.9" and python_version < "4.0" @@ -8,7 +8,7 @@ babel==2.14.0 ; python_version >= "3.9" and python_version < "4.0" billiard==4.2.0 ; python_version >= "3.9" and python_version < "4.0" blinker==1.7.0 ; python_version >= "3.9" and python_version < "4.0" cachelib==0.9.0 ; python_version >= "3.9" and python_version < "4.0" -celery==5.3.6 ; python_version >= "3.9" and python_version < "4.0" +celery==5.4.0 ; python_version >= "3.9" and python_version < "4.0" certifi==2024.2.2 ; python_version >= "3.9" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.9" and python_version < "4.0" and platform_python_implementation != "PyPy" charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0" @@ -28,19 +28,19 @@ flask-pyoidc==3.14.3 ; python_version >= "3.9" and python_version < "4.0" flask-sqlalchemy==3.0.5 ; python_version >= "3.9" and python_version < "4.0" flask-uploads==0.2.1 ; python_version >= "3.9" and python_version < "4.0" flask-wtf==1.2.1 ; python_version >= "3.9" and python_version < "4.0" -flask==3.0.2 ; python_version >= "3.9" and python_version < "4.0" +flask==3.0.3 ; python_version >= "3.9" and python_version < "4.0" future==1.0.0 ; python_version >= "3.9" and python_version < "4.0" greenlet==3.0.3 ; python_version >= "3.9" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version < "4.0" gunicorn==21.2.0 ; python_version >= "3.9" and python_version < "4.0" -idna==3.6 ; python_version >= "3.9" and python_version < "4.0" +idna==3.7 ; python_version >= "3.9" and python_version < "4.0" imagesize==1.4.1 ; python_version >= "3.9" and python_version < "4.0" importlib-metadata==7.1.0 ; python_version >= "3.9" and python_version < "3.10" importlib-resources==6.4.0 ; python_version >= "3.9" and python_version < "4.0" -itsdangerous==2.1.2 ; python_version >= "3.9" and python_version < "4.0" +itsdangerous==2.2.0 ; python_version >= "3.9" and python_version < "4.0" jinja2==3.1.3 ; python_version >= "3.9" and python_version < "4.0" -kombu==5.3.6 ; python_version >= "3.9" and python_version < "4.0" +kombu==5.3.7 ; python_version >= "3.9" and python_version < "4.0" lxml==5.2.1 ; python_version >= "3.9" and python_version < "4.0" -mako==1.3.2 ; python_version >= "3.9" and python_version < "4.0" +mako==1.3.3 ; python_version >= "3.9" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.9" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "4.0" mdit-py-plugins==0.4.0 ; python_version >= "3.9" and python_version < "4.0" @@ -53,9 +53,9 @@ prompt-toolkit==3.0.43 ; python_version >= "3.9" and python_version < "4.0" psycopg2==2.9.9 ; python_version >= "3.9" and python_version < "4.0" pycparser==2.22 ; python_version >= "3.9" and python_version < "4.0" and platform_python_implementation != "PyPy" pycryptodomex==3.20.0 ; python_version >= "3.9" and python_version < "4.0" -pydantic-core==2.16.3 ; python_version >= "3.9" and python_version < "4.0" +pydantic-core==2.18.1 ; python_version >= "3.9" and python_version < "4.0" pydantic-settings==2.2.1 ; python_version >= "3.9" and python_version < "4.0" -pydantic==2.6.4 ; python_version >= "3.9" and python_version < "4.0" +pydantic==2.7.0 ; python_version >= "3.9" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.9" and python_version < "4.0" pyjwkest==1.4.2 ; python_version >= "3.9" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.9" and python_version < "4.0" @@ -67,21 +67,22 @@ redis==5.0.3 ; python_version >= "3.9" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.9" and python_version < "4.0" six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" snowballstemmer==2.2.0 ; python_version >= "3.9" and python_version < "4.0" -sphinx-issues==4.0.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx-issues==4.1.0 ; python_version >= "3.9" and python_version < "4.0" sphinx-rtd-theme==2.0.0 ; python_version >= "3.9" and python_version < "4.0" -sphinx==7.1.2 ; python_version >= "3.9" and python_version < "4.0" -sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.9" and python_version < "4.0" -sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.9" and python_version < "4.0" -sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.9" and python_version < "4.0" +sphinx==7.3.7 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-applehelp==1.0.8 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-devhelp==1.0.6 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-htmlhelp==2.0.5 ; python_version >= "3.9" and python_version < "4.0" sphinxcontrib-jquery==4.1 ; python_version >= "3.9" and python_version < "4.0" sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.9" and python_version < "4.0" -sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.9" and python_version < "4.0" -sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-qthelp==1.0.7 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-serializinghtml==1.1.10 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy-json==0.7.0 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy-utils==0.41.2 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy==1.4.52 ; python_version >= "3.9" and python_version < "4.0" text-unidecode==1.3 ; python_version >= "3.9" and python_version < "4.0" -typing-extensions==4.10.0 ; python_version >= "3.9" and python_version < "4.0" +tomli==2.0.1 ; python_version >= "3.9" and python_version < "3.11" +typing-extensions==4.11.0 ; python_version >= "3.9" and python_version < "4.0" tzdata==2024.1 ; python_version >= "3.9" and python_version < "4.0" urllib3==2.2.1 ; python_version >= "3.9" and python_version < "4.0" vine==5.1.0 ; python_version >= "3.9" and python_version < "4.0" diff --git a/web/tests/conftest.py b/web/tests/conftest.py index 26eed23e..443f4206 100644 --- a/web/tests/conftest.py +++ b/web/tests/conftest.py @@ -47,6 +47,7 @@ def iam_client(iam_server): scope=["openid", "profile", "email"], preconsent=True, ) + iam_client.save() iam_client.audience = [iam_client] iam_client.save() yield iam_client