Skip to content

import_from_firstuse not working: Previous users cannot log in or create an account. #219

@mtav

Description

@mtav

Bug description

After setting c.NativeAuthenticator.import_from_firstuse = True and reloading the configuration, the users from firstuse_dbm_path do get added to the new database, but they cannot log in or create a new account.

This is because the hashed password from firstuse_dbm_path is passed to the user creation function as if it were a normal password, leading to a different hash.
The user then exists in the new database, preventing them from signing up with the same name.
And they cannot sign in because their old password will not match the new hash.

Expected behaviour

All users would be transferred with the same username and password and are able to sign in without having to sign up first.

Actual behaviour

They cannot log in or create a new account with the same username.

How to reproduce

  1. Set up tljh with an admin user and password (randomly chosen here):
curl -L https://tljh.jupyter.org/bootstrap.py \
  | sudo python3 - \
    --admin the_admin:PUYLjBrI5q
  1. Create the file /opt/tljh/config/jupyterhub_config.d/native_auth.py with:
c.JupyterHub.authenticator_class = 'nativeauthenticator.NativeAuthenticator'
c.Authenticator.admin_users = {'the_admin'}
c.NativeAuthenticator.enable_signup = True
c.NativeAuthenticator.import_from_firstuse = True
  1. Reload the hub:
    sudo tljh-config reload
  2. Try to log in as the_admin with password PUYLjBrI5q or create a new user named the_admin.

Your personal set up

Tested on the-littlest-jupyterhub.

  • OS:
    Ubuntu 22.04.1 LTS
  • Version(s):
    JupyterHub version 1.5.0, python 3.10
Full environment
# paste output of `pip freeze` or `conda list` here
Configuration
# jupyterhub_config.py
"""
JupyterHub config for the littlest jupyterhub.
"""

from glob import glob
import os

from tljh import configurer
from tljh.config import INSTALL_PREFIX, USER_ENV_PREFIX, CONFIG_DIR
from tljh.utils import get_plugin_manager
from tljh.user_creating_spawner import UserCreatingSpawner
from jupyterhub_traefik_proxy import TraefikTomlProxy

c.JupyterHub.spawner_class = UserCreatingSpawner

# leave users running when the Hub restarts
c.JupyterHub.cleanup_servers = False

# Use a high port so users can try this on machines with a JupyterHub already present
c.JupyterHub.hub_port = 15001

c.TraefikTomlProxy.should_start = False

dynamic_conf_file_path = os.path.join(INSTALL_PREFIX, "state", "rules", "rules.toml")
c.TraefikTomlProxy.toml_dynamic_config_file = dynamic_conf_file_path
c.JupyterHub.proxy_class = TraefikTomlProxy

c.SystemdSpawner.extra_paths = [os.path.join(USER_ENV_PREFIX, "bin")]
c.SystemdSpawner.default_shell = "/bin/bash"
# Drop the '-singleuser' suffix present in the default template
c.SystemdSpawner.unit_name_template = "jupyter-{USERNAME}"

tljh_config = configurer.load_config()
configurer.apply_config(tljh_config, c)

# Let TLJH hooks modify `c` if they want

# Call our custom configuration plugin
pm = get_plugin_manager()
pm.hook.tljh_custom_jupyterhub_config(c=c)

# Load arbitrary .py config files if they exist.
# This is our escape hatch
extra_configs = sorted(glob(os.path.join(CONFIG_DIR, "jupyterhub_config.d", "*.py")))
for ec in extra_configs:
    load_subconfig(ec)
Logs

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions