From d4827db063abce8100817079c8fc0bb2b21429ce Mon Sep 17 00:00:00 2001 From: netblue30 Date: Tue, 25 Apr 2017 10:08:45 -0400 Subject: firecfg fixes --- src/firecfg/main.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/firecfg/main.c b/src/firecfg/main.c index 04ccbf2c3..7d63cb848 100644 --- a/src/firecfg/main.c +++ b/src/firecfg/main.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -287,6 +288,25 @@ static void set_links(void) { free(firejail_exec); } +int have_profile(const char *filename) { + // remove .desktop extension + char *f1 = strdup(filename); + if (!f1) + errExit("strdup"); + f1[strlen(filename) - 8] = '\0'; + + // build profile name + char *profname; + if (asprintf(&profname, "%s/%s.profile", SYSCONFDIR, f1) == -1) + errExit("asprintf"); + + struct stat s; + int rv = stat(profname, &s); + free(f1); + free(profname); + return (rv == 0)? 1: 0; +} + static void fix_desktop_files(char *homedir) { assert(homedir); struct stat sb; @@ -324,7 +344,7 @@ static void fix_desktop_files(char *homedir) { exit(1); } - printf("\nFixing desktop files in ~/.local/shared/applications\n"); + printf("\nFixing desktop files in %s\n", user_apps_dir); // copy struct dirent *entry; while ((entry = readdir(dir)) != NULL) { @@ -348,6 +368,10 @@ static void fix_desktop_files(char *homedir) { if (stat(filename, &sb) == -1) errExit("stat"); + // no profile in /etc/firejail, no desktop file fixing + if (!have_profile(filename)) + continue; + /* coverity[toctou] */ int fd = open(filename, O_RDONLY); if (fd == -1) @@ -501,17 +525,24 @@ int main(int argc, char **argv) { // switch to the local user, and fix desktop files char *user = getlogin(); - if (!user) - goto errexit; + if (!user) { + user = getenv("SUDO_USER"); + if (!user) { + goto errexit; + } + } + if (user) { // find home directory struct passwd *pw = getpwnam(user); - if (!pw) + if (!pw) { goto errexit; + } char *home = pw->pw_dir; - if (!home) + if (!home) { goto errexit; - + } + // drop permissions if (setgroups(0, NULL) < 0) errExit("setgroups"); @@ -528,7 +559,7 @@ int main(int argc, char **argv) { return 0; errexit: - fprintf(stderr, "Error: cannot set desktop files in ~/.local/share/applications\n"); + fprintf(stderr, "Error: cannot detect login user in order to set desktop files in ~/.local/share/applications\n"); return 1; } -- cgit v1.2.3-54-g00ecf