diff options
author | Omar Sandoval <osandov@fb.com> | 2018-11-13 23:47:00 -0800 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-11-26 16:45:24 +0100 |
commit | fee45d5421af26c9a81b57d51393cc3c13a89790 (patch) | |
tree | e1cee11aa7e7135cae82ccd57572a236f02bb2cb | |
parent | 70126a1570f5c5b042620274a2a009effb8639a0 (diff) |
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 <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | libbtrfsutil/python/tests/__init__.py | 31 |
1 files changed, 30 insertions, 1 deletions
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 <http://www.gnu.org/licenses/>. +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) - |