mirror of
https://github.com/jupyterhub/the-littlest-jupyterhub.git
synced 2025-12-18 21:54:05 +08:00
124 lines
3.4 KiB
Python
124 lines
3.4 KiB
Python
"""
|
|
Test wrappers in tljw.user module
|
|
"""
|
|
from tljh import user
|
|
import os
|
|
import os.path
|
|
import stat
|
|
import uuid
|
|
import pwd
|
|
import grp
|
|
import pytest
|
|
|
|
|
|
def test_ensure_user():
|
|
"""
|
|
Test user creation & removal
|
|
"""
|
|
# Use a prefix to make sure we never start with a number
|
|
username = "u" + str(uuid.uuid4())[:8]
|
|
# Validate that no user exists
|
|
with pytest.raises(KeyError):
|
|
pwd.getpwnam(username)
|
|
|
|
try:
|
|
# Create user!
|
|
user.ensure_user(username)
|
|
# This raises exception if user doesn't exist
|
|
entry = pwd.getpwnam(username)
|
|
# Home directory must also exist
|
|
home_dir = entry.pw_dir
|
|
assert os.path.exists(home_dir)
|
|
# Ensure not word readable/writable especially in teaching context
|
|
homedir_stats = os.stat(home_dir).st_mode
|
|
assert not (
|
|
homedir_stats & stat.S_IROTH
|
|
), "Everyone should not be able to read users home directory"
|
|
assert not (
|
|
homedir_stats & stat.S_IWOTH
|
|
), "Everyone should not be able to write users home directory"
|
|
assert not (
|
|
homedir_stats & stat.S_IXOTH
|
|
), "Everyone should not be able to list what is in users home directory"
|
|
|
|
# Run ensure_user again, should be a noop
|
|
user.ensure_user(username)
|
|
# User still exists, after our second ensure_user call
|
|
pwd.getpwnam(username)
|
|
finally:
|
|
# We clean up and remove user!
|
|
user.remove_user(username)
|
|
with pytest.raises(KeyError):
|
|
pwd.getpwnam(username)
|
|
|
|
|
|
def test_ensure_group():
|
|
"""
|
|
Test group creation & removal
|
|
"""
|
|
# Use a prefix to make sure we never start with a number
|
|
groupname = "g" + str(uuid.uuid4())[:8]
|
|
|
|
# Validate that no group exists
|
|
with pytest.raises(KeyError):
|
|
grp.getgrnam(groupname)
|
|
|
|
try:
|
|
# Create group
|
|
user.ensure_group(groupname)
|
|
# This raises if group doesn't exist
|
|
grp.getgrnam(groupname)
|
|
|
|
# Do it again, this should be a noop
|
|
user.ensure_group(groupname)
|
|
grp.getgrnam(groupname)
|
|
finally:
|
|
# Remove the group
|
|
user.remove_group(groupname)
|
|
with pytest.raises(KeyError):
|
|
grp.getgrnam(groupname)
|
|
|
|
|
|
def test_group_membership():
|
|
"""
|
|
Test group memberships can be added / removed
|
|
"""
|
|
username = "u" + str(uuid.uuid4())[:8]
|
|
groupname = "g" + str(uuid.uuid4())[:8]
|
|
|
|
# Validate that no group exists
|
|
with pytest.raises(KeyError):
|
|
grp.getgrnam(groupname)
|
|
with pytest.raises(KeyError):
|
|
pwd.getpwnam(username)
|
|
|
|
try:
|
|
user.ensure_group(groupname)
|
|
user.ensure_user(username)
|
|
|
|
user.ensure_user_group(username, groupname)
|
|
|
|
assert username in grp.getgrnam(groupname).gr_mem
|
|
|
|
# Do it again, this should be a noop
|
|
user.ensure_user_group(username, groupname)
|
|
|
|
assert username in grp.getgrnam(groupname).gr_mem
|
|
|
|
# Remove it
|
|
user.remove_user_group(username, groupname)
|
|
assert username not in grp.getgrnam(groupname).gr_mem
|
|
|
|
# Do it again, this should be a noop
|
|
user.remove_user_group(username, groupname)
|
|
assert username not in grp.getgrnam(groupname).gr_mem
|
|
finally:
|
|
# Remove the group
|
|
user.remove_user(username)
|
|
user.remove_group(groupname)
|
|
|
|
with pytest.raises(KeyError):
|
|
grp.getgrnam(groupname)
|
|
with pytest.raises(KeyError):
|
|
pwd.getpwnam(username)
|