mirror of
https://github.com/d9pouces/id_configurator.git
synced 2026-11-09 01:47:21 +01:00
feat: can specify several users to configure
Signed-off-by: d9pouces <github@19pouces.net>
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
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") # noqa: B604
|
||||
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", # noqa: B604
|
||||
)
|
||||
sync = PasswdEntry(name="sync", uid=4, home="/bin", shell="/bin/sync") # noqa: B604
|
||||
false_shell = PasswdEntry(
|
||||
name="nobody",
|
||||
uid=65534,
|
||||
home="/nonexistent",
|
||||
shell="/usr/sbin/false", # noqa: B604
|
||||
)
|
||||
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") # noqa: B604
|
||||
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") # noqa: B604
|
||||
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") # noqa: B604
|
||||
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", # noqa: B604
|
||||
)
|
||||
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") # noqa: B604
|
||||
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
|
||||
Reference in New Issue
Block a user