* Thu Feb 10 2005 Dan Walsh <dwalsh@redhat.com> 1.21.15-2

- Rewrite genhomedircon to generate file_context.homedirs
This commit is contained in:
Daniel J Walsh 2005-02-10 22:13:36 +00:00
parent cd9a16b315
commit 7379f2cf6b
2 changed files with 262 additions and 23 deletions

View File

@ -1,22 +1,256 @@
diff --exclude-from=exclude -N -u -r nsapolicycoreutils/restorecon/restorecon.c policycoreutils-1.21.13/restorecon/restorecon.c
--- nsapolicycoreutils/restorecon/restorecon.c 2005-02-02 17:20:59.000000000 -0500
+++ policycoreutils-1.21.13/restorecon/restorecon.c 2005-02-08 13:32:22.000000000 -0500
@@ -118,8 +118,8 @@
int restore(char *filename) {
int retcontext=0;
int retval=0;
- security_context_t scontext;
- security_context_t prev_context;
+ security_context_t scontext=NULL;
+ security_context_t prev_context=NULL;
int len=strlen(filename);
struct stat st;
char path[PATH_MAX+1];
@@ -185,6 +185,7 @@
if (retcontext >= 0 || errno == ENODATA) {
int customizable=0;
+ if (retcontext < 0) prev_context=NULL;
if (retcontext < 0 ||
(strcmp(prev_context,scontext) != 0 &&
!(customizable=(force ? 0: (is_context_customizable(prev_context) > 0))))) {
diff --exclude-from=exclude -N -u -r nsapolicycoreutils/scripts/genhomedircon policycoreutils-1.21.15/scripts/genhomedircon
--- nsapolicycoreutils/scripts/genhomedircon 2005-01-28 11:16:36.000000000 -0500
+++ policycoreutils-1.21.15/scripts/genhomedircon 2005-02-10 17:08:52.000000000 -0500
@@ -13,38 +13,131 @@
#
# ASSUMPTIONS:
#
-# If a user has more than one role in FILECONTEXTDIR/users, genhomedircon uses
+# The file CONTEXTDIR/files/homedir_template exists. This file is used to
+# set up the home directory context for each real user.
+#
+# If a user has more than one role in CONTEXTDIR/local.users, genhomedircon uses
# the first role in the list.
#
-# If a user is not listed in FILECONTEXTDIR/users, genhomedircon assumes that
-# the user's home dir will be found in one of the HOME_ROOTs.
+# If a user is not listed in CONTEXTDIR/local.users, he will default to user_u, role user
#
# "Real" users (as opposed to system users) are those whose UID is greater than
# or equal STARTING_UID (usually 500) and whose login is not a member of
-# EXCLUDE_LOGINS. Users who are explicitly defined in FILECONTEXTDIR/users
+# EXCLUDE_LOGINS. Users who are explicitly defined in CONTEXTDIR/local.users
# are always "real" (including root, in the default configuration).
#
+#
import commands, sys, os, pwd, string
+rhplPath="/usr/lib/python%d.%d/site-packages/rhpl" % (sys.version_info[0], sys.version_info[1])
+if not rhplPath in sys.path:
+ sys.path.append(rhplPath)
+
+rhplPath="/usr/lib64/python%d.%d/site-packages/rhpl" % (sys.version_info[0], sys.version_info[1])
+if not rhplPath in sys.path:
+ sys.path.append(rhplPath)
+
+from Conf import *
+
EXCLUDE_LOGINS=["/sbin/nologin", "/bin/false"]
-def getPrefixes():
+SELINUXDIR="/etc/selinux/"
+SELINUXCONFIG=SELINUXDIR+"config"
+CONTEXTDIR="/contexts"
+FILECONTEXTDIR=CONTEXTDIR+"/files"
+HOMEDIRTEMPLATE="/homedir_template"
+USERSFILE="/users/local.users"
+
+def getStartingUID():
+ conf=Conf("/etc/login.defs")
+ while conf.findnextcodeline():
+ if conf.getfields()[0] == "UID_MIN":
+ return int(conf.getfields()[1])
+
+ conf.nextline()
+ return 500
+
+def getDefaultHomeDir():
+ conf=ConfShellVar("/etc/default/useradd")
+ if conf.has_key("HOME"):
+ return conf["HOME"]
+ else:
+ return "/home"
+
+def getHomeDirs():
ulist = pwd.getpwall()
- prefixes = {}
+ homedirs = []
+ homedirs.append(getDefaultHomeDir())
+ starting_uid=getStartingUID()
for u in ulist:
- if u[2] >= STARTING_UID and \
+ if u[2] >= starting_uid and \
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] = ""
- return prefixes
+ homedir = u[5][:string.rfind(u[5], "/")]
+ if not homedir in homedirs:
+ homedirs.append(homedir)
+
+ homedirs.sort()
+ return homedirs
-def getUsers():
- rc = commands.getstatusoutput("grep ^user %s/users" % FILECONTEXTDIR)
+def usage(error = ""):
+ if error != "":
+ sys.stderr.write("%s\n" % (error,))
+ sys.stderr.write("Usage: %s \n" % sys.argv[0])
+ sys.stderr.flush()
+ sys.exit(1)
+
+def errorExit(error):
+ 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):
+ self.type="targeted"
+ self.types=[]
+ if os.access(SELINUXDIR, os.F_OK) == 0:
+ #File doesn't exist. return
+ return None
+
+ conf=ConfShellVar(SELINUXCONFIG)
+ if conf.has_key("SELINUXTYPE"):
+ self.type=conf.vars["SELINUXTYPE"]
+
+ def getSelinuxType(self):
+ return self.type
+
+ def getFileContextDir(self):
+ return SELINUXDIR+self.getSelinuxType()+FILECONTEXTDIR
+
+ def getContextDir(self):
+ return SELINUXDIR+self.getSelinuxType()+CONTEXTDIR
+
+ def getHomeDirTemplate(self):
+ return self.getFileContextDir()+HOMEDIRTEMPLATE
+
+ def getHomeRootContext(self):
+ rc=commands.getstatusoutput("grep HOME_ROOT %s | sed -e \"s|^HOME_ROOT|%s|\"" % ( self.getHomeDirTemplate(), getDefaultHomeDir()))
+ if rc[0] == 0:
+ return rc[1]
+ else:
+ errorExit(string.join("sed error ", rc[1]))
+
+ def getUsersFile(self):
+ return SELINUXDIR+self.getSelinuxType()+USERSFILE
+
+ 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):
+ rc = commands.getstatusoutput("grep ^user %s" % self.getUsersFile())
udict = {}
+ prefs = {}
if rc[0] == 0:
ulist = rc[1].strip().split("\n")
for u in ulist:
@@ -68,71 +161,44 @@
sys.stderr.write("The user \"%s\" is not present in the passwd file, skipping...\n" % (user[1],))
return udict
-def usage(error = ""):
- if error != "":
- sys.stderr.write("%s\n" % (error,))
- sys.stderr.write("Usage: %s POLICYSOURCEDIR FILE_CONTEXTS\n" % sys.argv[0])
- sys.stderr.flush()
- sys.exit(1)
-
-def errorExit(error):
- sys.stderr.write("%s exiting for: " % sys.argv[0])
- sys.stderr.write("%s\n" % error)
- sys.stderr.flush()
- sys.exit(1)
-
-def update(filecontext, user, prefs):
- rc=commands.getstatusoutput("grep -h '^HOME_DIR' %s | grep -v vmware | sed -e 's|HOME_DIR|%s|' -e 's/ROLE/%s/' -e 's/system_u/%s/'" % (filecontext, prefs["home"], prefs["role"], user))
- if rc[0] == 0:
- print rc[1]
- else:
- errorExit(string.join("grep/sed error ", rc[1]))
- return rc
-
-try:
- if len(sys.argv) != 3:
- print len(sys.argv)
- usage("Incorrect parameters")
-
- rc=commands.getstatusoutput("grep -h '^UID_MIN' /etc/login.defs | sed -e 's/^UID_MIN[^0-9]*//'")
- if rc[0] == 0:
- STARTING_UID=int(rc[1])
- else:
- STARTING_UID=500
-
- FILECONTEXTDIR=sys.argv[1]
- 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] = ""
-
- # 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, sys.argv[2]))
- if rc[0] == 0:
- print rc[1]
- else:
- errorExit(string.join("sed error ", rc[1]))
-
- users = getUsers()
- print "\n#\n# User-specific file contexts\n#\n"
-
+ def getHomeDirContext(self, user, home, role):
+ ret="\n\n#\n# Context for user %s\n#\n\n" % user
+ rc=commands.getstatusoutput("grep -e '^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]
+
+
+ def genHomeDirContext(self):
+ users = self.getUsers()
+ ret=""
# Fill in HOME and ROLE for users that are defined
for u in users.keys():
- update(sys.argv[2], u, users[u])
+ ret += self.getHomeDirContext (u, users[u]["home"], users[u]["role"])
+ return ret
+
+ def genoutput(self):
+ ret= self.heading()
+ ret += self.getHomeRootContext()
+ for h in getHomeDirs():
+ ret += self.getHomeDirContext ("user_u" , h, "user")
+ ret += self.genHomeDirContext()
+ return ret
+
+ def printout(self):
+ print self.genoutput()
+
+ def write(self):
+ fd = open(self.getFileContextDir()+"/file_context.homedirs", "w")
+ fd.write(self.genoutput())
+ fd.close()
+
+#
+# This script will generate home dir file context
+# based off the homedir_template file, entries in the password file, and
+#
+try:
+ selconf=selinuxConfig()
+ selconf.write()
+
except ValueError, error:
errorExit(string.join("ValueError ", error))
except IndexError, error:

View File

@ -2,10 +2,11 @@
Summary: SELinux policy core utilities.
Name: policycoreutils
Version: 1.21.15
Release: 1
Release: 2
License: GPL
Group: System Environment/Base
Source: http://www.nsa.gov/selinux/archives/policycoreutils-%{version}.tgz
Patch: policycoreutils-rhat.patch
Prefix: %{_prefix}
BuildRequires: libselinux-devel >= %{libselinuxver} pam-devel libsepol-devel >= 1.1.1
@ -32,6 +33,7 @@ context.
%prep
%setup -q
%patch -p1 -b .rhat
%build
make CFLAGS="%{optflags}" all
@ -79,6 +81,9 @@ rm -rf ${RPM_BUILD_ROOT}
%config(noreplace) %{_sysconfdir}/sestatus.conf
%changelog
* Thu Feb 10 2005 Dan Walsh <dwalsh@redhat.com> 1.21.15-2
- Rewrite genhomedircon to generate file_context.homedirs
* Thu Feb 10 2005 Dan Walsh <dwalsh@redhat.com> 1.21.15-1
- Update from NSA
* Changed relabel Makefile target to use restorecon.