From c564e933748d2cee514a82c1676a392b64916d05 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sat, 31 Mar 2018 11:53:24 -0500 Subject: [PATCH] is_superuser: test for group 544 or 0 on cygwin This appears to be the appropriate way to check for admin status in cygwin right now: https://cygwin.com/ml/cygwin/2015-02/msg00057.html Thanks to at least Andrew Skretvedt, Ruvim Pinka, renpj, and Iar De for reporting the problem, Ruvim Pinka, Paul Kronenwetter, and renpj for proposing earlier solutions, and Ben Kelly and Johannes Berg for helping test this approach. Signed-off-by: Rob Browning --- lib/bup/helpers.py | 20 +++++++------------- t/root-status | 9 ++------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/lib/bup/helpers.py b/lib/bup/helpers.py index 86ac90f..694fcdb 100644 --- a/lib/bup/helpers.py +++ b/lib/bup/helpers.py @@ -322,19 +322,13 @@ def detect_fakeroot(): return os.getenv("FAKEROOTKEY") != None -_warned_about_superuser_detection = None -def is_superuser(): - if sys.platform.startswith('cygwin'): - if sys.getwindowsversion()[0] > 5: - # Sounds like situation is much more complicated here - global _warned_about_superuser_detection - if not _warned_about_superuser_detection: - log("can't detect root status for OS version > 5; assuming not root") - _warned_about_superuser_detection = True - return False - import ctypes - return ctypes.cdll.shell32.IsUserAnAdmin() - else: +if sys.platform.startswith('cygwin'): + def is_superuser(): + # https://cygwin.com/ml/cygwin/2015-02/msg00057.html + groups = os.getgroups() + return 544 in groups or 0 in groups +else: + def is_superuser(): return os.geteuid() == 0 diff --git a/t/root-status b/t/root-status index 4f21599..ebf4d94 100755 --- a/t/root-status +++ b/t/root-status @@ -8,14 +8,9 @@ exec "$bup_python" "$0" ${1+"$@"} from sys import stderr import sys - if sys.platform.startswith('cygwin'): - if sys.getwindowsversion()[0] > 5: - # Sounds like the situation is much more complicated here - print >> stderr, "can't detect root status for OS version > 5; assuming not root" - print 'none' - import ctypes - if ctypes.cdll.shell32.IsUserAnAdmin(): + groups = os.getgroups() + if 544 in groups or 0 in groups: print 'root' else: print 'none' -- 2.39.2