diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 709a190ac6..1fab14a07b 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -28,6 +28,8 @@ jobs: python-version: "3.10" - os: ubuntu-latest python-version: "3.12" + - os: ubuntu-latest + python-version: "3.13t" steps: - name: Checkout uses: actions/checkout@v4 diff --git a/jupyter_server/auth/security.py b/jupyter_server/auth/security.py index d46587ffcc..ceead1e230 100644 --- a/jupyter_server/auth/security.py +++ b/jupyter_server/auth/security.py @@ -59,7 +59,11 @@ def passwd(passphrase=None, algorithm="argon2"): raise ValueError(msg) if algorithm == "argon2": - import argon2 + try: + import argon2 + except ModuleNotFoundError: + msg = "argon2 password hashing requires argon2-cffi package. `pip install 'jupyter-server[password]'` for support." + raise ImportError(msg) from None ph = argon2.PasswordHasher( memory_cost=10240, @@ -105,6 +109,11 @@ def passwd_check(hashed_passphrase, passphrase): True """ if hashed_passphrase.startswith("argon2:"): + try: + import argon2 + except ModuleNotFoundError: + msg = "argon2 password hashing requires argon2-cffi package. `pip install 'jupyter-server[password]'` for support." + raise ImportError(msg) from None import argon2 import argon2.exceptions diff --git a/pyproject.toml b/pyproject.toml index e04983380d..8b27778eda 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,10 @@ classifiers = [ requires-python = ">=3.9" dependencies = [ "anyio>=3.1.0", - "argon2-cffi>=21.1", + # argon2-cffi unavailable for free-threaded Python + # make it optional for Python >= 3.13 until PEP 780 + # lets us limit it to the actually affected builds + "argon2-cffi>=21.1; python_version < '3.13'", "jinja2>=3.0.3", "jupyter_client>=7.4.4", "jupyter_core>=4.12,!=5.0.*", @@ -52,6 +55,9 @@ Source = "https://github.com/jupyter-server/jupyter_server" Tracker = "https://github.com/jupyter-server/jupyter_server/issues" [project.optional-dependencies] +password = [ + "argon2-cffi>=21.1", +] test = [ "ipykernel", "pytest-console-scripts",