salt/68402.patch
Robby Callicotte 75634525be Updated to 3007.8 (rhbz#2391748)
- Added patch to remove deprecated spwd module
2025-10-26 23:00:50 -05:00

167 lines
5.4 KiB
Diff

From be1ab47d8a91344285c80b7a6a53d2837ccaf1d1 Mon Sep 17 00:00:00 2001
From: Toyam Cox <Vaelatern@voidlinux.org>
Date: Wed, 5 Mar 2025 22:42:29 -0500
Subject: [PATCH 1/2] Remove uses of spwd
Module deprecated and no longer shipped with Python 3.13.
Co-authored-by: Toyam Cox <Vaelatern@voidlinux.org>
Co-authored-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
---
changelog/67119.fixed.md | 1 +
salt/modules/linux_shadow.py | 30 ++++++++++++++++++++----------
2 files changed, 21 insertions(+), 10 deletions(-)
create mode 100644 changelog/67119.fixed.md
diff --git a/changelog/67119.fixed.md b/changelog/67119.fixed.md
new file mode 100644
index 000000000000..34eca2d3b2a7
--- /dev/null
+++ b/changelog/67119.fixed.md
@@ -0,0 +1 @@
+Remove usage of spwd
diff --git a/salt/modules/linux_shadow.py b/salt/modules/linux_shadow.py
index 09fe73fdb548..09cba9f3b296 100644
--- a/salt/modules/linux_shadow.py
+++ b/salt/modules/linux_shadow.py
@@ -8,6 +8,7 @@
<module-provider-override>`.
"""
+import collections
import datetime
import functools
import logging
@@ -17,12 +18,6 @@
import salt.utils.files
from salt.exceptions import CommandExecutionError
-try:
- import spwd
-except ImportError:
- pass
-
-
try:
import salt.utils.pycrypto
@@ -34,6 +29,21 @@
log = logging.getLogger(__name__)
+struct_spwd = collections.namedtuple(
+ "struct_spwd",
+ [
+ "sp_namp",
+ "sp_pwdp",
+ "sp_lstchg",
+ "sp_min",
+ "sp_max",
+ "sp_warn",
+ "sp_inact",
+ "sp_expire",
+ "sp_flag",
+ ],
+)
+
def __virtual__():
return __virtualname__ if __grains__.get("kernel", "") == "Linux" else False
@@ -71,7 +81,7 @@ def info(name, root=None):
if root is not None:
getspnam = functools.partial(_getspnam, root=root)
else:
- getspnam = functools.partial(spwd.getspnam)
+ getspnam = functools.partial(_getspnam, root="/")
try:
data = getspnam(name)
@@ -509,7 +519,7 @@ def list_users(root=None):
if root is not None:
getspall = functools.partial(_getspall, root=root)
else:
- getspall = functools.partial(spwd.getspall)
+ getspall = functools.partial(_getspall, root="/")
return sorted(
user.sp_namp if hasattr(user, "sp_namp") else user.sp_nam for user in getspall()
@@ -529,7 +539,7 @@ def _getspnam(name, root=None):
# Generate a getspnam compatible output
for i in range(2, 9):
comps[i] = int(comps[i]) if comps[i] else -1
- return spwd.struct_spwd(comps)
+ return struct_spwd(*comps)
raise KeyError
@@ -545,4 +555,4 @@ def _getspall(root=None):
# Generate a getspall compatible output
for i in range(2, 9):
comps[i] = int(comps[i]) if comps[i] else -1
- yield spwd.struct_spwd(comps)
+ yield struct_spwd(*comps)
From 277ffaa1a520c508ad5d26b97469f0c403e90d28 Mon Sep 17 00:00:00 2001
From: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
Date: Thu, 16 Oct 2025 20:38:06 +0200
Subject: [PATCH 2/2] Replace spwd in linux_shadow tests
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
---
.../pytests/unit/modules/test_linux_shadow.py | 23 ++++++++-----------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/tests/pytests/unit/modules/test_linux_shadow.py b/tests/pytests/unit/modules/test_linux_shadow.py
index 0c742672750b..723e3a8ad26f 100644
--- a/tests/pytests/unit/modules/test_linux_shadow.py
+++ b/tests/pytests/unit/modules/test_linux_shadow.py
@@ -1,5 +1,5 @@
"""
- :codeauthor: Erik Johnson <erik@saltstack.com>
+:codeauthor: Erik Johnson <erik@saltstack.com>
"""
import types
@@ -175,6 +175,11 @@ def test_info(password):
Test if info shows the correct user information
"""
+ data = {
+ "/etc/shadow": f"foo:{password.pw_hash}:31337:0:99999:7:::",
+ "*": Exception("Attempted to open something other than /etc/shadow"),
+ }
+
# First test is with a succesful call
expected_result = [
("expire", -1),
@@ -186,10 +191,7 @@ def test_info(password):
("passwd", password.pw_hash),
("warn", 7),
]
- getspnam_return = spwd.struct_spwd(
- ["foo", password.pw_hash, 31337, 0, 99999, 7, -1, -1, -1]
- )
- with patch("spwd.getspnam", return_value=getspnam_return):
+ with patch("salt.utils.files.fopen", mock_open(read_data=data)):
result = shadow.info("foo")
assert expected_result == sorted(result.items(), key=lambda x: x[0])
@@ -204,15 +206,8 @@ def test_info(password):
("passwd", ""),
("warn", ""),
]
- # We get KeyError exception for non-existent users in glibc based systems
- getspnam_return = KeyError
- with patch("spwd.getspnam", side_effect=getspnam_return):
- result = shadow.info("foo")
- assert expected_result == sorted(result.items(), key=lambda x: x[0])
- # And FileNotFoundError in musl based systems
- getspnam_return = FileNotFoundError
- with patch("spwd.getspnam", side_effect=getspnam_return):
- result = shadow.info("foo")
+ with patch("salt.utils.files.fopen", mock_open(read_data=data)):
+ result = shadow.info("bar")
assert expected_result == sorted(result.items(), key=lambda x: x[0])