From: Rob Browning Date: Sat, 31 Mar 2018 16:53:24 +0000 (-0500) Subject: is_superuser: test for group 544 or 0 on cygwin X-Git-Tag: 0.30~86 X-Git-Url: https://arthur.barton.de/gitweb/?p=bup.git;a=commitdiff_plain;h=41c3f3d78d79531863110f5ffd9ae8ee5a2b3986 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 --- diff --git a/lib/bup/helpers.py b/lib/bup/helpers.py index 583c65b..1bae59d 100644 --- a/lib/bup/helpers.py +++ b/lib/bup/helpers.py @@ -350,19 +350,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 28e2347..69fad4e 100755 --- a/t/root-status +++ b/t/root-status @@ -9,15 +9,9 @@ from __future__ import absolute_import, print_function 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("can't detect root status for OS version > 5; assuming not root", - file=stderr) - 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')