* Thu Mar 10 2005 Dan Walsh <dwalsh@redhat.com> 1.22-1
- Update to released version from NSA - Patch genhomedircon to handle passwd in different places.
This commit is contained in:
parent
c40c765680
commit
69a80f1250
@ -26,3 +26,4 @@ policycoreutils-1.21.19.tgz
|
||||
policycoreutils-1.21.20.tgz
|
||||
policycoreutils-1.21.21.tgz
|
||||
policycoreutils-1.21.22.tgz
|
||||
policycoreutils-1.22.tgz
|
||||
|
@ -1,29 +1,644 @@
|
||||
diff --exclude-from=exclude -N -u -r nsapolicycoreutils/scripts/genhomedircon policycoreutils-1.21.22/scripts/genhomedircon
|
||||
diff --exclude-from=exclude -N -u -r nsapolicycoreutils/scripts/genhomedircon policycoreutils-1.22/scripts/genhomedircon
|
||||
--- nsapolicycoreutils/scripts/genhomedircon 2005-03-08 14:03:05.000000000 -0500
|
||||
+++ policycoreutils-1.21.22/scripts/genhomedircon 2005-03-09 10:35:37.000000000 -0500
|
||||
@@ -45,7 +45,7 @@
|
||||
+++ policycoreutils-1.22/scripts/genhomedircon 2005-03-10 09:36:17.000000000 -0500
|
||||
@@ -40,15 +40,32 @@
|
||||
# are always "real" (including root, in the default configuration).
|
||||
#
|
||||
|
||||
-import commands, sys, os, pwd, string, getopt
|
||||
+import commands, sys, os, pwd, string, getopt, re
|
||||
|
||||
EXCLUDE_LOGINS=["/sbin/nologin", "/bin/false"]
|
||||
|
||||
def getStartingUID():
|
||||
- rc=commands.getstatusoutput("grep ^UID_MIN /etc/login.defs | tail -1")
|
||||
+ rc=commands.getstatusoutput("grep ^UID_MIN /etc/login.defs")
|
||||
if rc[0]==0:
|
||||
return int(rc[1].split()[-1])
|
||||
return 500
|
||||
@@ -152,13 +152,13 @@
|
||||
- if rc[0]==0:
|
||||
- return int(rc[1].split()[-1])
|
||||
- return 500
|
||||
+ starting_uid = sys.maxint
|
||||
+ rc=commands.getstatusoutput("grep -h '^UID_MIN' /etc/login.defs")
|
||||
+ if rc[0] == 0:
|
||||
+ uid_min = re.sub("^UID_MIN[^0-9]*", "", rc[1])
|
||||
+ #stip any comment from the end of the line
|
||||
+ uid_min = uid_min.split("#")[0]
|
||||
+ uid_min = uid_min.strip()
|
||||
+ if int(uid_min) < starting_uid:
|
||||
+ starting_uid = int(uid_min)
|
||||
+ rc=commands.getstatusoutput("grep -h '^LU_UIDNUMBER' /etc/libuser.conf")
|
||||
+ if rc[0] == 0:
|
||||
+ lu_uidnumber = re.sub("^LU_UIDNUMBER[^0-9]*", "", rc[1])
|
||||
+ #stip any comment from the end of the line
|
||||
+ lu_uidnumber = re.sub("[ \t].*", "", lu_uidnumber)
|
||||
+ lu_uidnumber = lu_uidnumber.split("#")[0]
|
||||
+ lu_uidnumber = lu_uidnumber.strip()
|
||||
+ if int(lu_uidnumber) < starting_uid:
|
||||
+ starting_uid = int(lu_uidnumber)
|
||||
+ if starting_uid == sys.maxint:
|
||||
+ starting_uid = 500
|
||||
+ return starting_uid
|
||||
|
||||
#############################################################################
|
||||
#
|
||||
@@ -57,13 +74,13 @@
|
||||
#############################################################################
|
||||
def getPrefixes():
|
||||
ulist = pwd.getpwall()
|
||||
- STARTING_UID=getStartingUID()
|
||||
+ STARTING_UID=getStartingUID()
|
||||
prefixes = {}
|
||||
for u in ulist:
|
||||
if u[2] >= STARTING_UID and \
|
||||
- not u[6] in EXCLUDE_LOGINS and \
|
||||
- u[5] != "/" and \
|
||||
- string.count(u[5], "/") > 1:
|
||||
+ not u[6] in EXCLUDE_LOGINS and \
|
||||
+ u[5] != "/" and \
|
||||
+ string.count(u[5], "/") > 1:
|
||||
prefix = u[5][:string.rfind(u[5], "/")]
|
||||
if not prefixes.has_key(prefix):
|
||||
prefixes[prefix] = ""
|
||||
@@ -104,46 +121,108 @@
|
||||
return rc
|
||||
|
||||
def oldgenhomedircon(filecontextdir, filecontext):
|
||||
- sys.stderr.write("Using genhomedircon in this fashion is supported for backwards compatability\n")
|
||||
- sys.stderr.write("Please update to the latest policy\n")
|
||||
- sys.stderr.flush()
|
||||
-
|
||||
- if os.path.isdir(filecontextdir) == 0:
|
||||
- sys.stderr.write("New usage is the following\n")
|
||||
- usage()
|
||||
-
|
||||
- prefixes = getPrefixes()
|
||||
-
|
||||
- rc=commands.getstatusoutput("grep -h '^HOME' /etc/default/useradd")
|
||||
- if rc[0] == 0:
|
||||
- homedir = rc[1].split("=")[1]
|
||||
- else:
|
||||
- sys.stderr.write("%s\n" % (rc[1],))
|
||||
- sys.stderr.write("You do not have access to /etc/default/useradd, default /home\n")
|
||||
- sys.stderr.flush()
|
||||
- homedir = "/home"
|
||||
-
|
||||
-
|
||||
- if not prefixes.has_key(homedir):
|
||||
- prefixes[homedir] = ""
|
||||
+ sys.stderr.write("Using genhomedircon in this fashion is supported for backwards compatability\n")
|
||||
+ sys.stderr.write("Please update to the latest policy\n")
|
||||
+ sys.stderr.flush()
|
||||
+
|
||||
+ if os.path.isdir(filecontextdir) == 0:
|
||||
+ sys.stderr.write("New usage is the following\n")
|
||||
+ usage()
|
||||
+ #We are going to define home directory used by libuser and show-utils as a home directory root
|
||||
+ prefixes = {}
|
||||
+ rc=commands.getstatusoutput("grep -h '^HOME' /etc/default/useradd")
|
||||
+ if rc[0] == 0:
|
||||
+ homedir = rc[1].split("=")[1]
|
||||
+ homedir = homedir.split("#")[0]
|
||||
+ homedir = homedir.strip()
|
||||
+ if not prefixes.has_key(homedir):
|
||||
+ prefixes[homedir] = ""
|
||||
+ else:
|
||||
+ #rc[0] == 256 means the file was there, we read it, but the grep didn't match
|
||||
+ if rc[0] != 256:
|
||||
+ sys.stderr.write("%s\n" % (rc[1],))
|
||||
+ sys.stderr.write("You do not have access to /etc/default/useradd HOME=\n")
|
||||
+ sys.stderr.flush()
|
||||
+
|
||||
+
|
||||
+ rc=commands.getstatusoutput("grep -h '^LU_HOMEDIRECTORY' /etc/libuser.conf")
|
||||
+ if rc[0] == 0:
|
||||
+ homedir = rc[1].split("=")[1]
|
||||
+ homedir = homedir.split("#")[0]
|
||||
+ homedir = homedir.strip()
|
||||
+ homedir = re.sub(r"[^/a-zA-Z0-9].*$", "", homedir)
|
||||
+ if not prefixes.has_key(homedir):
|
||||
+ prefixes[homedir] = ""
|
||||
+ else:
|
||||
+ if rc[0] != 256:
|
||||
+ sys.stderr.write("%s\n" % (rc[1],))
|
||||
+ sys.stderr.write("You do not have access to /etc/libuser.conf LU_HOMEDIRECTORY=\n")
|
||||
+ sys.stderr.flush()
|
||||
+
|
||||
+ #the idea is that we need to find all of the home_root_t directories we do this by just accepting
|
||||
+ #any default home directory defined by either /etc/libuser.conf or /etc/default/useradd
|
||||
+ #we then get the potential home directory roots from /etc/passwd or nis or whereever and look at
|
||||
+ #the defined homedir for all users with UID > STARTING_UID. This list of possible root homedirs
|
||||
+ #is then checked to see if it has an explicite context defined in the file_contexts. Explicit
|
||||
+ #is any regex that would match it which does not end with .*$ or .+$ since those are general
|
||||
+ #recursive matches. We then take any regex which ends with [pattern](/.*)?$ and just check against
|
||||
+ #[pattern]
|
||||
+ potential_prefixes = getPrefixes()
|
||||
+ prefix_regex = {}
|
||||
+ #this works by grepping the file_contexts for
|
||||
+ # 1. ^/ makes sure this is not a comment
|
||||
+ # 2. prints only the regex in the first column first cut on \t then on space
|
||||
+ rc=commands.getstatusoutput("grep \"^/\" %s | cut -f 1 | cut -f 1 -d \" \" " % (sys.argv[2]) )
|
||||
+ if rc[0] == 0:
|
||||
+ prefix_regex = rc[1].split("\n")
|
||||
+ else:
|
||||
+ sys.stderr.write("%s\n" % (rc[1],))
|
||||
+ sys.stderr.write("You do not have access to grep/cut/the file contexts\n")
|
||||
+ sys.stderr.flush()
|
||||
+ for potential in potential_prefixes.keys():
|
||||
+ addme = 1
|
||||
+ for regex in prefix_regex:
|
||||
+ #match a trailing (/*)? which is actually a bug in rpc_pipefs
|
||||
+ regex = re.sub("\(/\*\)\?$", "", regex)
|
||||
+ #match a trailing .+
|
||||
+ regex = re.sub("\.+$", "", regex)
|
||||
+ #match a trailing .*
|
||||
+ regex = re.sub("\.\*$", "", regex)
|
||||
+ #strip a (/.*)? which matches anything trailing to a /*$ which matches trailing /'s
|
||||
+ regex = re.sub("\(\/\.\*\)\?", "", regex)
|
||||
+ regex = regex + "/*$"
|
||||
+ if re.search(regex, potential, 0):
|
||||
+ addme = 0
|
||||
+ if addme == 1:
|
||||
+ if not prefixes.has_key(potential):
|
||||
+ prefixes[potential] = ""
|
||||
+
|
||||
+
|
||||
+ if prefixes.__eq__({}):
|
||||
+ sys.stderr.write("LU_HOMEDIRECTORY not set in /etc/libuser.conf\n")
|
||||
+ sys.stderr.write("HOME= not set in /etc/default/useradd\n")
|
||||
+ sys.stderr.write("And no users with a reasonable homedir found in passwd/nis/ldap/etc...\n")
|
||||
+ sys.stderr.write("Assuming /home is the root of home directories\n")
|
||||
+ sys.stderr.flush()
|
||||
+ prefixes["/home"] = ""
|
||||
+
|
||||
+ # There may be a more elegant sed script to expand a macro to multiple lines, but this works
|
||||
+ sed_root = "h; s|^HOME_ROOT|%s|" % (string.join(prefixes.keys(), "|; p; g; s|^HOME_ROOT|"),)
|
||||
+ sed_dir = "h; s|^HOME_DIR|%s/[^/]+|; s|ROLE_|user_|" % (string.join(prefixes.keys(), "/[^/]+|; s|ROLE_|user_|; p; g; s|^HOME_DIR|"),)
|
||||
+
|
||||
+ # Fill in HOME_ROOT, HOME_DIR, and ROLE for users not explicitly defined in /etc/security/selinux/src/policy/users
|
||||
+ rc=commands.getstatusoutput("sed -e \"/^HOME_ROOT/{%s}\" -e \"/^HOME_DIR/{%s}\" %s" % (sed_root, sed_dir, filecontext))
|
||||
+ if rc[0] == 0:
|
||||
+ print rc[1]
|
||||
+ else:
|
||||
+ errorExit(string.join("sed error ", rc[1]))
|
||||
+
|
||||
+ users = getUsers(filecontextdir)
|
||||
+ print "\n#\n# User-specific file contexts\n#\n"
|
||||
|
||||
- # There may be a more elegant sed script to expand a macro to multiple lines, but this works
|
||||
- sed_root = "h; s|^HOME_ROOT|%s|" % (string.join(prefixes.keys(), "|; p; g; s|^HOME_ROOT|"),)
|
||||
- sed_dir = "h; s|^HOME_DIR|%s/[^/]+|; s|ROLE_|user_|" % (string.join(prefixes.keys(), "/[^/]+|; s|ROLE_|user_|; p; g; s|^HOME_DIR|"),)
|
||||
-
|
||||
- # Fill in HOME_ROOT, HOME_DIR, and ROLE for users not explicitly defined in /etc/security/selinux/src/policy/users
|
||||
- rc=commands.getstatusoutput("sed -e \"/^HOME_ROOT/{%s}\" -e \"/^HOME_DIR/{%s}\" %s" % (sed_root, sed_dir, filecontext))
|
||||
- if rc[0] == 0:
|
||||
- print rc[1]
|
||||
- else:
|
||||
- errorExit(string.join("sed error ", rc[1]))
|
||||
-
|
||||
- users = getUsers(filecontextdir)
|
||||
- print "\n#\n# User-specific file contexts\n#\n"
|
||||
-
|
||||
- # Fill in HOME and ROLE for users that are defined
|
||||
- for u in users.keys():
|
||||
- update(filecontext, u, users[u])
|
||||
+ # Fill in HOME and ROLE for users that are defined
|
||||
+ for u in users.keys():
|
||||
+ update(filecontext, u, users[u])
|
||||
|
||||
#############################################################################
|
||||
#
|
||||
@@ -152,203 +231,256 @@
|
||||
#############################################################################
|
||||
|
||||
def getDefaultHomeDir():
|
||||
- rc=commands.getstatusoutput("grep ^HOME= /etc/default/useradd | tail -1")
|
||||
- if rc[0]==0:
|
||||
+ rc=commands.getstatusoutput("grep ^HOME= /etc/default/useradd")
|
||||
+ if rc[0] == 0:
|
||||
return rc[1].split("=")[-1].strip()
|
||||
return "/home"
|
||||
- return rc[1].split("=")[-1].strip()
|
||||
- return "/home"
|
||||
+ ret = []
|
||||
+ rc=commands.getstatusoutput("grep -h '^HOME' /etc/default/useradd")
|
||||
+ if rc[0] == 0:
|
||||
+ homedir = rc[1].split("=")[1]
|
||||
+ homedir = homedir.split("#")[0]
|
||||
+ homedir = homedir.strip()
|
||||
+ if not homedir in ret:
|
||||
+ ret.append(homedir)
|
||||
+ else:
|
||||
+ #rc[0] == 256 means the file was there, we read it, but the grep didn't match
|
||||
+ if rc[0] != 256:
|
||||
+ sys.stderr.write("%s\n" % (rc[1],))
|
||||
+ sys.stderr.write("You do not have access to /etc/default/useradd HOME=\n")
|
||||
+ sys.stderr.flush()
|
||||
+ rc=commands.getstatusoutput("grep -h '^LU_HOMEDIRECTORY' /etc/libuser.conf")
|
||||
+ if rc[0] == 0:
|
||||
+ homedir = rc[1].split("=")[1]
|
||||
+ homedir = homedir.split("#")[0]
|
||||
+ homedir = homedir.strip()
|
||||
+ if not homedir in ret:
|
||||
+ ret.append(homedir)
|
||||
+ else:
|
||||
+ #rc[0] == 256 means the file was there, we read it, but the grep didn't match
|
||||
+ if rc[0] != 256:
|
||||
+ sys.stderr.write("%s\n" % (rc[1],))
|
||||
+ sys.stderr.write("You do not have access to /etc/libuser.conf LU_HOMEDIRECTORY=\n")
|
||||
+ sys.stderr.flush()
|
||||
+ return ret
|
||||
|
||||
def getSELinuxType(directory):
|
||||
- rc=commands.getstatusoutput("grep ^SELINUXTYPE= %s/config | tail -1" % directory)
|
||||
+ rc=commands.getstatusoutput("grep ^SELINUXTYPE= %s/config" % directory)
|
||||
if rc[0]==0:
|
||||
return rc[1].split("=")[-1].strip()
|
||||
return "targeted"
|
||||
- if rc[0]==0:
|
||||
- return rc[1].split("=")[-1].strip()
|
||||
- return "targeted"
|
||||
+ rc=commands.getstatusoutput("grep ^SELINUXTYPE= %s/config" % directory)
|
||||
+ if rc[0]==0:
|
||||
+ return rc[1].split("=")[-1].strip()
|
||||
+ return "targeted"
|
||||
|
||||
def usage(error = ""):
|
||||
- if error != "":
|
||||
- sys.stderr.write("%s\n" % (error,))
|
||||
- sys.stderr.write("Usage: %s [ -d selinuxdir ] [-n | --nopasswd] [-t selinuxtype ]\n" % sys.argv[0])
|
||||
- sys.stderr.flush()
|
||||
- sys.exit(1)
|
||||
-
|
||||
+ if error != "":
|
||||
+ sys.stderr.write("%s\n" % (error,))
|
||||
+ sys.stderr.write("Usage: %s [ -d selinuxdir ] [-n | --nopasswd] [-t selinuxtype ]\n" % sys.argv[0])
|
||||
+ sys.stderr.flush()
|
||||
+ sys.exit(1)
|
||||
+
|
||||
def warning(warning = ""):
|
||||
- sys.stderr.write("%s\n" % warning)
|
||||
- sys.stderr.flush()
|
||||
-
|
||||
+ sys.stderr.write("%s\n" % warning)
|
||||
+ sys.stderr.flush()
|
||||
+
|
||||
def errorExit(error):
|
||||
- sys.stderr.write("%s exiting for: " % sys.argv[0])
|
||||
- sys.stderr.write("%s\n" % error)
|
||||
- sys.stderr.flush()
|
||||
- sys.exit(1)
|
||||
-
|
||||
+ sys.stderr.write("%s exiting for: " % sys.argv[0])
|
||||
+ sys.stderr.write("%s\n" % error)
|
||||
+ sys.stderr.flush()
|
||||
+ sys.exit(1)
|
||||
+
|
||||
class selinuxConfig:
|
||||
- def __init__(self, selinuxdir="/etc/selinux", type="targeted", usepwd=1):
|
||||
- self.type=type
|
||||
- self.selinuxdir=selinuxdir +"/"
|
||||
- self.contextdir="/contexts"
|
||||
- self.filecontextdir=self.contextdir+"/files"
|
||||
- self.usepwd=usepwd
|
||||
-
|
||||
- def getFileContextDir(self):
|
||||
- return self.selinuxdir+self.type+self.filecontextdir
|
||||
-
|
||||
- def getFileContextFile(self):
|
||||
- return self.getFileContextDir()+"/file_contexts"
|
||||
-
|
||||
- def getContextDir(self):
|
||||
- return self.selinuxdir+self.type+self.contextdir
|
||||
-
|
||||
- def getHomeDirTemplate(self):
|
||||
- return self.getFileContextDir()+"/homedir_template"
|
||||
-
|
||||
- def getHomeRootContext(self, homedir):
|
||||
- rc=commands.getstatusoutput("grep HOME_ROOT %s | sed -e \"s|^HOME_ROOT|%s|\"" % ( self.getHomeDirTemplate(), homedir))
|
||||
- if rc[0] == 0:
|
||||
- return rc[1]+"\n"
|
||||
- else:
|
||||
- errorExit(string.join("sed error ", rc[1]))
|
||||
-
|
||||
- def getUsersFile(self):
|
||||
- return self.selinuxdir+self.type+"/users/local.users"
|
||||
-
|
||||
- def getSystemUsersFile(self):
|
||||
- return self.selinuxdir+self.type+"/users/system.users"
|
||||
-
|
||||
- def heading(self):
|
||||
- ret = "\n#\n#\n# User-specific file contexts, generated via %s\n" % sys.argv[0]
|
||||
- ret += "# edit %s to change file_context\n#\n#\n" % self.getUsersFile()
|
||||
- return ret
|
||||
+ def __init__(self, selinuxdir="/etc/selinux", type="targeted", usepwd=1):
|
||||
+ self.type=type
|
||||
+ self.selinuxdir=selinuxdir +"/"
|
||||
+ self.contextdir="/contexts"
|
||||
+ self.filecontextdir=self.contextdir+"/files"
|
||||
+ self.usepwd=usepwd
|
||||
+
|
||||
+ def getFileContextDir(self):
|
||||
+ return self.selinuxdir+self.type+self.filecontextdir
|
||||
+
|
||||
+ def getFileContextFile(self):
|
||||
+ return self.getFileContextDir()+"/file_contexts"
|
||||
+
|
||||
+ def getContextDir(self):
|
||||
+ return self.selinuxdir+self.type+self.contextdir
|
||||
+
|
||||
+ def getHomeDirTemplate(self):
|
||||
+ return self.getFileContextDir()+"/homedir_template"
|
||||
+
|
||||
+ def getHomeRootContext(self, homedir):
|
||||
+ rc=commands.getstatusoutput("grep HOME_ROOT %s | sed -e \"s|^HOME_ROOT|%s|\"" % ( self.getHomeDirTemplate(), homedir))
|
||||
+ if rc[0] == 0:
|
||||
+ return rc[1]+"\n"
|
||||
+ else:
|
||||
+ errorExit(string.join("sed error ", rc[1]))
|
||||
|
||||
- def getUsers(self):
|
||||
- users=""
|
||||
- rc = commands.getstatusoutput('grep "^user" %s' % self.getSystemUsersFile())
|
||||
- if rc[0] == 0:
|
||||
- users+=rc[1]+"\n"
|
||||
- rc = commands.getstatusoutput("grep ^user %s" % self.getUsersFile())
|
||||
- if rc[0] == 0:
|
||||
- users+=rc[1]
|
||||
- udict = {}
|
||||
- prefs = {}
|
||||
- if users != "":
|
||||
- ulist = users.split("\n")
|
||||
+ def getUsersFile(self):
|
||||
+ return self.selinuxdir+self.type+"/users/local.users"
|
||||
+
|
||||
+ def getSystemUsersFile(self):
|
||||
+ return self.selinuxdir+self.type+"/users/system.users"
|
||||
+
|
||||
+ def heading(self):
|
||||
+ ret = "\n#\n#\n# User-specific file contexts, generated via %s\n" % sys.argv[0]
|
||||
+ ret += "# edit %s to change file_context\n#\n#\n" % self.getUsersFile()
|
||||
+ return ret
|
||||
+
|
||||
+ def getUsers(self):
|
||||
+ users=""
|
||||
+ rc = commands.getstatusoutput('grep "^user" %s' % self.getSystemUsersFile())
|
||||
+ if rc[0] == 0:
|
||||
+ users+=rc[1]+"\n"
|
||||
+ rc = commands.getstatusoutput("grep ^user %s" % self.getUsersFile())
|
||||
+ if rc[0] == 0:
|
||||
+ users+=rc[1]
|
||||
+ udict = {}
|
||||
+ prefs = {}
|
||||
+ if users != "":
|
||||
+ ulist = users.split("\n")
|
||||
+ for u in ulist:
|
||||
+ user = u.split()
|
||||
+ try:
|
||||
+ if len(user)==0 or user[1] == "user_u" or user[1] == "system_u":
|
||||
+ continue
|
||||
+ # !!! chooses first role in the list to use in the file context !!!
|
||||
+ role = user[3]
|
||||
+ if role == "{":
|
||||
+ role = user[4]
|
||||
+ role = role.split("_r")[0]
|
||||
+ home = pwd.getpwnam(user[1])[5]
|
||||
+ if home == "/":
|
||||
+ continue
|
||||
+ prefs = {}
|
||||
+ prefs["role"] = role
|
||||
+ prefs["home"] = home
|
||||
+ udict[user[1]] = prefs
|
||||
+ except KeyError:
|
||||
+ sys.stderr.write("The user \"%s\" is not present in the passwd file, skipping...\n" % (user[1],))
|
||||
+ return udict
|
||||
+
|
||||
+ def getHomeDirContext(self, user, home, role):
|
||||
+ ret="\n\n#\n# Context for user %s\n#\n\n" % user
|
||||
+ rc=commands.getstatusoutput("grep '^HOME_DIR' %s | sed -e 's|HOME_DIR|%s|' -e 's/ROLE/%s/' -e 's/system_u/%s/'" % (self.getHomeDirTemplate(), home, role, user))
|
||||
+ return ret + rc[1] + "\n"
|
||||
+
|
||||
+ def genHomeDirContext(self):
|
||||
+ users = self.getUsers()
|
||||
+ ret=""
|
||||
+ # Fill in HOME and ROLE for users that are defined
|
||||
+ for u in users.keys():
|
||||
+ ret += self.getHomeDirContext (u, users[u]["home"], users[u]["role"])
|
||||
+ return ret+"\n"
|
||||
+
|
||||
+ def checkExists(self, home):
|
||||
+ if commands.getstatusoutput("grep -E '^%s[^[:alnum:]_-]' %s" % (home, self.getFileContextFile()))[0] == 0:
|
||||
+ return 0
|
||||
+ #this works by grepping the file_contexts for
|
||||
+ # 1. ^/ makes sure this is not a comment
|
||||
+ # 2. prints only the regex in the first column first cut on \t then on space
|
||||
+ rc=commands.getstatusoutput("grep \"^/\" %s | cut -f 1 | cut -f 1 -d \" \" " % self.getFileContextFile() )
|
||||
+ if rc[0] == 0:
|
||||
+ prefix_regex = rc[1].split("\n")
|
||||
+ else:
|
||||
+ sys.stderr.write("%s\n" % (rc[1],))
|
||||
+ sys.stderr.write("You do not have access to grep/cut/the file contexts\n")
|
||||
+ sys.stderr.flush()
|
||||
+ exists=1
|
||||
+ for regex in prefix_regex:
|
||||
+ #match a trailing (/*)? which is actually a bug in rpc_pipefs
|
||||
+ regex = re.sub("\(/\*\)\?$", "", regex)
|
||||
+ #match a trailing .+
|
||||
+ regex = re.sub("\.+$", "", regex)
|
||||
+ #match a trailing .*
|
||||
+ regex = re.sub("\.\*$", "", regex)
|
||||
+ #strip a (/.*)? which matches anything trailing to a /*$ which matches trailing /'s
|
||||
+ regex = re.sub("\(\/\.\*\)\?", "", regex)
|
||||
+ regex = regex + "/*$"
|
||||
+ if re.search(regex, home, 0):
|
||||
+ exists = 0
|
||||
+ break
|
||||
+ if exists == 1:
|
||||
+ return 1
|
||||
+ else:
|
||||
+ return 0
|
||||
+
|
||||
+
|
||||
+ def getHomeDirs(self):
|
||||
+ homedirs = []
|
||||
+ homedirs = homedirs + getDefaultHomeDir()
|
||||
+ starting_uid=getStartingUID()
|
||||
+ if self.usepwd==0:
|
||||
+ return homedirs
|
||||
+ ulist = pwd.getpwall()
|
||||
for u in ulist:
|
||||
- user = u.split()
|
||||
- try:
|
||||
- if len(user)==0 or user[1] == "user_u" or user[1] == "system_u":
|
||||
- continue
|
||||
- # !!! chooses first role in the list to use in the file context !!!
|
||||
- role = user[3]
|
||||
- if role == "{":
|
||||
- role = user[4]
|
||||
- role = role.split("_r")[0]
|
||||
- home = pwd.getpwnam(user[1])[5]
|
||||
- if home == "/":
|
||||
- continue
|
||||
- prefs = {}
|
||||
- prefs["role"] = role
|
||||
- prefs["home"] = home
|
||||
- udict[user[1]] = prefs
|
||||
- except KeyError:
|
||||
- sys.stderr.write("The user \"%s\" is not present in the passwd file, skipping...\n" % (user[1],))
|
||||
- return udict
|
||||
+ if u[2] >= starting_uid and \
|
||||
+ not u[6] in EXCLUDE_LOGINS and \
|
||||
+ u[5] != "/" and \
|
||||
+ string.count(u[5], "/") > 1:
|
||||
+ homedir = u[5][:string.rfind(u[5], "/")]
|
||||
+ if not homedir in homedirs:
|
||||
+ if self.checkExists(homedir)==0:
|
||||
+ warning("%s is already defined in %s,\n%s will not create a new context." % (homedir, self.getFileContextFile(), sys.argv[0]))
|
||||
+ else:
|
||||
+ homedirs.append(homedir)
|
||||
+
|
||||
+ homedirs.sort()
|
||||
+ return homedirs
|
||||
+
|
||||
+ def genoutput(self):
|
||||
+ ret= self.heading()
|
||||
+ for h in self.getHomeDirs():
|
||||
+ ret += self.getHomeDirContext ("user_u" , h+'/[^/]*', "user")
|
||||
+ ret += self.getHomeRootContext(h)
|
||||
+ ret += self.genHomeDirContext()
|
||||
+ return ret
|
||||
+
|
||||
+ def printout(self):
|
||||
+ print self.genoutput()
|
||||
+
|
||||
+ def write(self):
|
||||
+ try:
|
||||
+ fd = open(self.getFileContextDir()+"/file_contexts.homedirs", "w")
|
||||
+ fd.write(self.genoutput())
|
||||
+ fd.close()
|
||||
+ except IOError, error:
|
||||
+ sys.stderr.write("%s: %s\n" % ( sys.argv[0], error ))
|
||||
|
||||
- def getHomeDirContext(self, user, home, role):
|
||||
- ret="\n\n#\n# Context for user %s\n#\n\n" % user
|
||||
- rc=commands.getstatusoutput("grep '^HOME_DIR' %s | sed -e 's|HOME_DIR|%s|' -e 's/ROLE/%s/' -e 's/system_u/%s/'" % (self.getHomeDirTemplate(), home, role, user))
|
||||
- return ret + rc[1] + "\n"
|
||||
-
|
||||
- def genHomeDirContext(self):
|
||||
- users = self.getUsers()
|
||||
- ret=""
|
||||
- # Fill in HOME and ROLE for users that are defined
|
||||
- for u in users.keys():
|
||||
- ret += self.getHomeDirContext (u, users[u]["home"], users[u]["role"])
|
||||
- return ret+"\n"
|
||||
|
||||
- def checkExists(self, home):
|
||||
- return commands.getstatusoutput("grep -E '^%s[^[:alnum:]_-]' %s" % (home, self.getFileContextFile()))[0]
|
||||
|
||||
- def getHomeDirs(self):
|
||||
- homedirs = []
|
||||
- homedirs.append(getDefaultHomeDir())
|
||||
- starting_uid=getStartingUID()
|
||||
- if self.usepwd==0:
|
||||
- return homedirs
|
||||
- ulist = pwd.getpwall()
|
||||
- for u in ulist:
|
||||
- if u[2] >= starting_uid and \
|
||||
- not u[6] in EXCLUDE_LOGINS and \
|
||||
- u[5] != "/" and \
|
||||
- string.count(u[5], "/") > 1:
|
||||
- homedir = u[5][:string.rfind(u[5], "/")]
|
||||
- if not homedir in homedirs:
|
||||
- if self.checkExists(homedir)==0:
|
||||
- warning("%s is already defined in %s,\n%s will not create a new context." % (homedir, self.getFileContextFile(), sys.argv[0]))
|
||||
- else:
|
||||
- homedirs.append(homedir)
|
||||
-
|
||||
- homedirs.sort()
|
||||
- return homedirs
|
||||
-
|
||||
- def genoutput(self):
|
||||
- ret= self.heading()
|
||||
- for h in self.getHomeDirs():
|
||||
- ret += self.getHomeDirContext ("user_u" , h+'/[^/]*', "user")
|
||||
- ret += self.getHomeRootContext(h)
|
||||
- ret += self.genHomeDirContext()
|
||||
- return ret
|
||||
-
|
||||
- def printout(self):
|
||||
- print self.genoutput()
|
||||
-
|
||||
- def write(self):
|
||||
- try:
|
||||
- fd = open(self.getFileContextDir()+"/file_contexts.homedirs", "w")
|
||||
- fd.write(self.genoutput())
|
||||
- fd.close()
|
||||
- except IOError, error:
|
||||
- sys.stderr.write("%s: %s\n" % ( sys.argv[0], error ))
|
||||
-
|
||||
-
|
||||
-
|
||||
#
|
||||
# This script will generate home dir file context
|
||||
# based off the homedir_template file, entries in the password file, and
|
||||
#
|
||||
try:
|
||||
- usepwd=1
|
||||
- directory="/etc/selinux"
|
||||
- type=None
|
||||
- gopts, cmds = getopt.getopt(sys.argv[1:], 'nd:t:', ['help',
|
||||
- 'type=',
|
||||
- 'nopasswd',
|
||||
- 'dir='])
|
||||
- for o,a in gopts:
|
||||
- if o == '--type' or o == "-t":
|
||||
- type=a
|
||||
- if o == '--nopasswd' or o == "-n":
|
||||
- usepwd=0
|
||||
- if o == '--dir' or o == "-d":
|
||||
- directory=a
|
||||
- if o == '--help':
|
||||
- usage()
|
||||
-
|
||||
-
|
||||
- if type==None:
|
||||
- type=getSELinuxType(directory)
|
||||
-
|
||||
- if len(cmds) == 2:
|
||||
- oldgenhomedircon(cmds[0], cmds[1])
|
||||
- sys.exit(0)
|
||||
-
|
||||
- if len(cmds) != 0:
|
||||
- usage()
|
||||
- selconf=selinuxConfig(directory, type, usepwd)
|
||||
- selconf.write()
|
||||
-
|
||||
+ usepwd=1
|
||||
+ directory="/etc/selinux"
|
||||
+ type=None
|
||||
+ gopts, cmds = getopt.getopt(sys.argv[1:], 'nd:t:', ['help',
|
||||
+ 'type=',
|
||||
+ 'nopasswd',
|
||||
+ 'dir='])
|
||||
+ for o,a in gopts:
|
||||
+ if o == '--type' or o == "-t":
|
||||
+ type=a
|
||||
+ if o == '--nopasswd' or o == "-n":
|
||||
+ usepwd=0
|
||||
+ if o == '--dir' or o == "-d":
|
||||
+ directory=a
|
||||
+ if o == '--help':
|
||||
+ usage()
|
||||
+
|
||||
+
|
||||
+ if type==None:
|
||||
+ type=getSELinuxType(directory)
|
||||
+
|
||||
+ if len(cmds) == 2:
|
||||
+ oldgenhomedircon(cmds[0], cmds[1])
|
||||
+ sys.exit(0)
|
||||
+
|
||||
+ if len(cmds) != 0:
|
||||
+ usage()
|
||||
+ selconf=selinuxConfig(directory, type, usepwd)
|
||||
+ selconf.write()
|
||||
+
|
||||
except getopt.error, error:
|
||||
- errorExit(string.join("Options Error ", error))
|
||||
-
|
||||
+ errorExit(string.join("Options Error ", error))
|
||||
except ValueError, error:
|
||||
- errorExit(string.join("ValueError ", error))
|
||||
+ errorExit(string.join("ValueError ", error))
|
||||
except IndexError, error:
|
||||
- errorExit("IndexError")
|
||||
+ errorExit("IndexError")
|
||||
|
@ -2,8 +2,8 @@
|
||||
%define libsepolver 1.3.8-1
|
||||
Summary: SELinux policy core utilities.
|
||||
Name: policycoreutils
|
||||
Version: 1.21.22
|
||||
Release: 2
|
||||
Version: 1.22
|
||||
Release: 1
|
||||
License: GPL
|
||||
Group: System Environment/Base
|
||||
Source: http://www.nsa.gov/selinux/archives/policycoreutils-%{version}.tgz
|
||||
@ -81,6 +81,10 @@ rm -rf ${RPM_BUILD_ROOT}
|
||||
%config(noreplace) %{_sysconfdir}/sestatus.conf
|
||||
|
||||
%changelog
|
||||
* Thu Mar 10 2005 Dan Walsh <dwalsh@redhat.com> 1.22-1
|
||||
- Update to released version from NSA
|
||||
- Patch genhomedircon to handle passwd in different places.
|
||||
|
||||
* Wed Mar 9 2005 Dan Walsh <dwalsh@redhat.com> 1.21.22-2
|
||||
- Fix genhomedircon to not put bad userad error in file_contexts.homedir
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user