mirror of
https://github.com/d9pouces/id_configurator.git
synced 2026-11-09 01:47:21 +01:00
6813c86fba
Signed-off-by: d9pouces <github@19pouces.net>
102 lines
3.4 KiB
Python
102 lines
3.4 KiB
Python
from id_configurator.users import PasswdEntry, parse_login_defs_uid_min, parse_passwd
|
|
|
|
PASSWD_CONTENT = (
|
|
"root:x:0:0:root:/root:/bin/bash\n"
|
|
"alice:x:1000:1000:Alice:/home/alice:/bin/bash\n"
|
|
"daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n"
|
|
"sync:x:4:65534:sync:/bin:/bin/sync\n"
|
|
"nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/false\n"
|
|
"# a comment\n"
|
|
"\n"
|
|
)
|
|
|
|
|
|
def test_parse_passwd_returns_one_entry_per_line() -> None:
|
|
entries = parse_passwd(PASSWD_CONTENT)
|
|
assert [entry.name for entry in entries] == [
|
|
"root",
|
|
"alice",
|
|
"daemon",
|
|
"sync",
|
|
"nobody",
|
|
]
|
|
|
|
|
|
def test_parse_passwd_skips_comments_and_blank_lines() -> None:
|
|
entries = parse_passwd(PASSWD_CONTENT)
|
|
assert len(entries) == 5
|
|
|
|
|
|
def test_parse_passwd_extracts_uid_home_and_shell() -> None:
|
|
entries = {entry.name: entry for entry in parse_passwd(PASSWD_CONTENT)}
|
|
assert entries["alice"].uid == 1000
|
|
assert entries["alice"].home == "/home/alice"
|
|
assert entries["alice"].shell == "/bin/bash"
|
|
|
|
|
|
def test_parse_passwd_skips_malformed_lines() -> None:
|
|
entries = parse_passwd(
|
|
"tooshort:x:0\nnotanumber:x:abc:0:x:/home/x:/bin/bash\n"
|
|
"root:x:0:0:root:/root:/bin/bash\n"
|
|
)
|
|
assert [entry.name for entry in entries] == ["root"]
|
|
|
|
|
|
def test_has_login_shell_true_for_regular_shell() -> None:
|
|
entry = PasswdEntry(name="alice", uid=1000, home="/home/alice", shell="/bin/bash")
|
|
assert entry.has_login_shell is True
|
|
|
|
|
|
def test_has_login_shell_false_for_nologin_sync_or_false() -> None:
|
|
nologin = PasswdEntry(
|
|
name="daemon", uid=1, home="/usr/sbin", shell="/usr/sbin/nologin"
|
|
)
|
|
sync = PasswdEntry(name="sync", uid=4, home="/bin", shell="/bin/sync")
|
|
false_shell = PasswdEntry(
|
|
name="nobody", uid=65534, home="/nonexistent", shell="/usr/sbin/false"
|
|
)
|
|
assert nologin.has_login_shell is False
|
|
assert sync.has_login_shell is False
|
|
assert false_shell.has_login_shell is False
|
|
|
|
|
|
def test_is_regular_user_true_for_human_account() -> None:
|
|
entry = PasswdEntry(name="alice", uid=1000, home="/home/alice", shell="/bin/bash")
|
|
assert entry.is_regular_user() is True
|
|
|
|
|
|
def test_is_regular_user_true_for_root_despite_uid_zero() -> None:
|
|
entry = PasswdEntry(name="root", uid=0, home="/root", shell="/bin/bash")
|
|
assert entry.is_regular_user() is True
|
|
|
|
|
|
def test_is_regular_user_false_for_root_with_disabled_shell() -> None:
|
|
entry = PasswdEntry(name="root", uid=0, home="/root", shell="/usr/sbin/nologin")
|
|
assert entry.is_regular_user() is False
|
|
|
|
|
|
def test_is_regular_user_false_for_disabled_shell_despite_high_uid() -> None:
|
|
entry = PasswdEntry(
|
|
name="nobody", uid=65534, home="/nonexistent", shell="/usr/sbin/false"
|
|
)
|
|
assert entry.is_regular_user() is False
|
|
|
|
|
|
def test_is_regular_user_honors_custom_uid_min() -> None:
|
|
entry = PasswdEntry(name="svc", uid=500, home="/home/svc", shell="/bin/bash")
|
|
assert entry.is_regular_user(uid_min=1000) is False
|
|
assert entry.is_regular_user(uid_min=100) is True
|
|
|
|
|
|
def test_parse_login_defs_uid_min_found() -> None:
|
|
content = "# comment\nUID_MIN\t500\nGID_MIN\t500\n"
|
|
assert parse_login_defs_uid_min(content) == 500
|
|
|
|
|
|
def test_parse_login_defs_uid_min_missing() -> None:
|
|
assert parse_login_defs_uid_min("GID_MIN\t500\n") is None
|
|
|
|
|
|
def test_parse_login_defs_uid_min_malformed_value() -> None:
|
|
assert parse_login_defs_uid_min("UID_MIN\tnot-a-number\n") is None
|