]> arthur.barton.de Git - bup.git/commitdiff
is_superuser: test for group 544 or 0 on cygwin
authorRob Browning <rlb@defaultvalue.org>
Sat, 31 Mar 2018 16:53:24 +0000 (11:53 -0500)
committerRob Browning <rlb@defaultvalue.org>
Sat, 31 Mar 2018 16:53:24 +0000 (11:53 -0500)
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 <rlb@defaultvalue.org>
lib/bup/helpers.py
t/root-status

index 86ac90f5793d2d38ba1a5d84c1460376e022781c..694fcdb2bd3af3bca19afb38e6560260e3da3c35 100644 (file)
@@ -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
 
 
index 4f21599f83aaacb98c83b8ccbb1d0b9989d2d0fb..ebf4d9408f39272ef2bfaf79c2a1955528a54041 100755 (executable)
@@ -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'