fixes saltstack/salt#62502 user.present incapable of removing optional groups

This commit is contained in:
nicholasmhughes 2022-08-22 12:14:36 -04:00 committed by Megan Wilhite
parent bb92db9aa7
commit 81ff4329d7
4 changed files with 55 additions and 4 deletions

1
changelog/62502.fixed Normal file
View file

@ -0,0 +1 @@
Fix user.present to allow removing groups using optional_groups parameter and enforcing idempotent group membership.

View file

@ -98,7 +98,7 @@ def _changes(
return False
change = {}
if groups is None:
if not remove_groups and groups is None:
groups = lusr["groups"]
wanted_groups = sorted(set((groups or []) + (optional_groups or [])))
if uid and lusr["uid"] != uid:

View file

@ -363,3 +363,51 @@ def test_user_present_existing(states, username):
assert ret.changes["profile"] == win_profile
assert "description" in ret.changes
assert ret.changes["description"] == win_description
def test_user_present_change_groups(modules, states, username, group_1, group_2):
ret = states.user.present(
name=username,
groups=[group_1.name, group_2.name],
)
assert ret.result is True
user_info = modules.user.info(username)
assert user_info
assert user_info["groups"] == [group_1.name, group_2.name]
# run again and remove group_2
ret = states.user.present(
name=username,
groups=[group_1.name],
)
assert ret.result is True
user_info = modules.user.info(username)
assert user_info
assert user_info["groups"] == [group_1.name]
def test_user_present_change_optional_groups(
modules, states, username, group_1, group_2
):
ret = states.user.present(
name=username,
optional_groups=[group_1.name, group_2.name],
)
assert ret.result is True
user_info = modules.user.info(username)
assert user_info
assert user_info["optional_groups"] == [group_1.name, group_2.name]
# run again and remove group_2
ret = states.user.present(
name=username,
optional_groups=[group_1.name],
)
assert ret.result is True
user_info = modules.user.info(username)
assert user_info
assert user_info["optional_groups"] == [group_1.name]

View file

@ -178,8 +178,10 @@ def test_present_uid_gid_change():
# get the before/after for the changes dict, and one last time to
# confirm that no changes still need to be made.
mock_info = MagicMock(side_effect=[before, before, after, after])
mock_group_to_gid = MagicMock(side_effect=["foo", "othergroup"])
mock_gid_to_group = MagicMock(side_effect=[5000, 5000, 5001, 5001])
mock_group_to_gid = MagicMock(side_effect=[5000, 5001])
mock_gid_to_group = MagicMock(
side_effect=["othergroup", "foo", "othergroup", "othergroup"]
)
dunder_salt = {
"user.info": mock_info,
"user.chuid": Mock(),
@ -197,7 +199,7 @@ def test_present_uid_gid_change():
)
assert ret == {
"comment": "Updated user foo",
"changes": {"gid": 5001, "uid": 5001, "groups": ["othergroup"]},
"changes": {"gid": 5001, "uid": 5001, "groups": []},
"name": "foo",
"result": True,
}