diff --git a/src/genhomedircon.c b/src/genhomedircon.c index 1aea839..d6fddfe 100644 --- a/src/genhomedircon.c +++ b/src/genhomedircon.c @@ -55,6 +55,8 @@ #define PATH_DEFAULT_HOME "/home" #define PATH_EXPORT_HOME "/export/home" #define PATH_ETC_LOGIN_DEFS "/etc/login.defs" +#define PATH_SRV_HOME "/srv/home" +#define PATH_VAR_SRV_HOME "/var/srv/home" /* other paths */ #define PATH_SHELLS_FILE "/etc/shells" @@ -275,6 +277,15 @@ done: return retval; } +static int push_extra_homedirs(semanage_list_t **phomedir_list, const char *path) +{ + struct stat buf; + + if (!lstat(path, &buf) && S_ISDIR(buf.st_mode)) + return semanage_list_push(phomedir_list, path); + return 0; +} + static semanage_list_t *get_home_dirs(genhomedircon_settings_t * s) { semanage_list_t *homedir_list = NULL; @@ -310,13 +321,14 @@ static semanage_list_t *get_home_dirs(genhomedircon_settings_t * s) } } - if (!stat(PATH_EXPORT_HOME, &buf)) { - if (S_ISDIR(buf.st_mode)) { - if (semanage_list_push(&homedir_list, PATH_EXPORT_HOME)) { - goto fail; - } - } - } + if (push_extra_homedirs(&homedir_list, PATH_EXPORT_HOME)) + goto fail; + + if (push_extra_homedirs(&homedir_list, PATH_SRV_HOME)) + goto fail; + + if (push_extra_homedirs(&homedir_list, PATH_VAR_SRV_HOME)) + goto fail; if (!(s->usepasswd)) return homedir_list; @@ -610,12 +622,13 @@ static int write_home_root_context(genhomedircon_settings_t * s, FILE * out, static int write_user_context(genhomedircon_settings_t * s, FILE * out, semanage_list_t * tpl, const char *user, - const char *seuser, const char *role_prefix) + const char *seuser, const char *role_prefix, const char *level) { replacement_pair_t repl[] = { {.search_for = TEMPLATE_USER,.replace_with = user}, {.search_for = TEMPLATE_ROLE,.replace_with = role_prefix}, {.search_for = TEMPLATE_SEUSER,.replace_with = seuser}, + {.search_for = TEMPLATE_LEVEL,.replace_with = level}, {NULL, NULL} }; Ustr *line = USTR_NULL; @@ -945,7 +958,7 @@ static int write_gen_home_dir_context(genhomedircon_settings_t * s, FILE * out, users->prefix, users->level)) goto err; if (write_user_context(s, out, user_context_tpl, users->name, - users->sename, users->prefix)) + users->sename, users->prefix, users->level)) goto err; } @@ -1031,7 +1044,7 @@ static int write_context_file(genhomedircon_settings_t * s, FILE * out) if (user_context_tpl) { if (write_user_context(s, out, user_context_tpl, ".*", s->fallback_user, - s->fallback_user_prefix) != STATUS_SUCCESS) { + s->fallback_user_prefix, s->fallback_user_level) != STATUS_SUCCESS) { retval = STATUS_ERR; goto done; }