uid -> uids, i.e. pass a list of user ids to check for
authorgregor herrmann <gregoa@debian.org>
Tue, 29 May 2012 19:49:29 +0000 (21:49 +0200)
committergregor herrmann <gregoa@debian.org>
Tue, 29 May 2012 19:49:29 +0000 (21:49 +0200)
findwwwritable.py

index bcbb917..0408caa 100755 (executable)
@@ -6,17 +6,18 @@ import stat
 from os.path import join
 
 
-def collect_writable_dirs(rootdir, uid, gids):
+def collect_writable_dirs(rootdir, uids, gids):
     """Returns a list of directories below rootdir (including rootdir) that are writeable 
-    by the user with the given uid or gids or that are world writeable.
-    Normally, uid is the user id of the apache user (e.g. www-data) and gids is a list
+    by the users with the given uids or gids or that are world writeable.
+    Normally, uid(s) is the user id of the apache user (e.g. www-data) and gids is a list
     of group ids this user is member of.
     
     :param rootdir: string. directory where the search should start at
-    :param uid: integer user id
+    :param uids: list of integer user ids
     :param gids: list of integer group ids"""
     assert isinstance(rootdir, str)
-    assert isinstance(uid, int)
+    assert isinstance(uids, list)
+    for uid in uids: assert isinstance(uid, int)
     assert isinstance(gids, list)
     for gid in gids: assert isinstance(gid, int)
 
@@ -27,7 +28,7 @@ def collect_writable_dirs(rootdir, uid, gids):
             dp = join(root, d) # dp is the dir with path
             s = os.lstat(dp)
             if (s.st_mode & stat.S_IFLNK) == stat.S_IFLNK: continue # skip symlinks
-            if s.st_uid == uid and (s.st_mode & stat.S_IWUSR) > 0:
+            if s.st_uid in uids and (s.st_mode & stat.S_IWUSR) > 0:
                 writable_dirs.append(dp)
             elif s.st_gid in gids and (s.st_mode & stat.S_IWGRP) > 0:
                 writable_dirs.append(dp)
@@ -57,12 +58,12 @@ def summarize_dirs(writable_dirs):
 if __name__ == '__main__':
 
     # variables
-    uid = 33                   # user id of the user whos write permissions should be found
+    uids = [33]                # user ids of the user whos write permissions should be found
     gids = [33, 42, 121, 127]  # group ids of the user whos write permissions should be found
     rootdir = '/home'          # directory where the seach is started
 
     # collect and summarize writeable directories
-    writable_dirs = collect_writable_dirs(rootdir, uid, gids)
+    writable_dirs = collect_writable_dirs(rootdir, uids, gids)
     summarize_dirs(writable_dirs)
 
     # print writeable directories