From fee45d5421af26c9a81b57d51393cc3c13a89790 Mon Sep 17 00:00:00 2001 From: Omar Sandoval Date: Tue, 13 Nov 2018 23:47:00 -0800 Subject: libbtrfsutil: add test helpers for dropping privileges These will be used for testing some upcoming changes which allow unprivileged operations. Signed-off-by: Omar Sandoval Signed-off-by: David Sterba --- libbtrfsutil/python/tests/__init__.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/libbtrfsutil/python/tests/__init__.py b/libbtrfsutil/python/tests/__init__.py index 35550e0a..4bc11990 100644 --- a/libbtrfsutil/python/tests/__init__.py +++ b/libbtrfsutil/python/tests/__init__.py @@ -15,14 +15,44 @@ # You should have received a copy of the GNU Lesser General Public License # along with libbtrfsutil. If not, see . +import contextlib import os from pathlib import PurePath +import pwd import subprocess import tempfile import unittest HAVE_PATH_LIKE = hasattr(PurePath, '__fspath__') +try: + NOBODY_UID = pwd.getpwnam('nobody').pw_uid + skipUnlessHaveNobody = lambda func: func +except KeyError: + NOBODY_UID = None + skipUnlessHaveNobody = unittest.skip('must have nobody user') + + +@contextlib.contextmanager +def drop_privs(): + try: + os.seteuid(NOBODY_UID) + yield + finally: + os.seteuid(0) + + +@contextlib.contextmanager +def regain_privs(): + uid = os.geteuid() + if uid: + try: + os.seteuid(0) + yield + finally: + os.seteuid(uid) + else: + yield @unittest.skipIf(os.geteuid() != 0, 'must be run as root') @@ -67,4 +97,3 @@ class BtrfsTestCase(unittest.TestCase): yield fd finally: os.close(fd) - -- cgit v1.2.3