From 52b2fcb46376bbb892de099ac66028dc5e7e0dcf Mon Sep 17 00:00:00 2001 From: Yunmi Ha Date: Wed, 27 Sep 2017 14:28:58 +0900 Subject: [PATCH] Modify create home directory logic If user's home directory already exists, try to delete it. And copy files from skel folder. Change-Id: I68ab2ea9fc603893fced5383ecbae147bef81a4c Signed-off-by: Yunmi Ha (cherry picked from commit f54ca8184e8a42777b91e0dca08a2367e41f652d) --- src/common/gum-file.c | 82 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/src/common/gum-file.c b/src/common/gum-file.c index 2104eab..77b08d3 100755 --- a/src/common/gum-file.c +++ b/src/common/gum-file.c @@ -814,49 +814,65 @@ gum_file_create_home_dir ( "Invalid home directory path", error, FALSE); } - if (g_access (home_dir, F_OK) != 0) { - GumConfig *config = gum_config_new (NULL); - const gchar *skel_dir = NULL; + if (g_access (home_dir, F_OK) == 0) { + if (!gum_file_delete_home_dir(home_dir, NULL)) { + gchar *backup_dir = NULL; + size_t len = strlen(home_dir) + strlen("_bak") + 1; + + backup_dir = g_malloc0(len); + snprintf(backup_dir, len, "%s_bak", home_dir); + + if (0 != g_rename(home_dir, backup_dir)) { + g_free(backup_dir); + WARN ("Error: Skipped to copy files. Home directory(%s) already exists.", home_dir); + return retval; + } else + DBG("Rename existing home directory(%s) to backup directory(%s)", home_dir, backup_dir); + + g_free(backup_dir); + } else + DBG("Delete existing home directory(%s)", home_dir); + } - skel_dir = gum_config_get_string (config, GUM_CONFIG_GENERAL_SKEL_DIR); - g_object_unref (config); + GumConfig *config = gum_config_new (NULL); + const gchar *skel_dir = NULL; - if (!g_file_test (home_dir, G_FILE_TEST_EXISTS)) { - g_mkdir_with_parents (home_dir, mode); - } + skel_dir = gum_config_get_string (config, GUM_CONFIG_GENERAL_SKEL_DIR); + g_object_unref (config); - if (!g_file_test (home_dir, G_FILE_TEST_IS_DIR)) { - GUM_RETURN_WITH_ERROR (GUM_ERROR_HOME_DIR_CREATE_FAILURE, - "Home directory creation failure", error, FALSE); - } + if (!g_file_test (home_dir, G_FILE_TEST_EXISTS)) { + g_mkdir_with_parents (home_dir, mode); + } - if (!_copy_file_attributes (skel_dir, home_dir)) { - GUM_RETURN_WITH_ERROR (GUM_ERROR_FILE_ATTRIBUTE, - "Unable to get/set dir attributes", error, FALSE); - } + if (!g_file_test (home_dir, G_FILE_TEST_IS_DIR)) { + GUM_RETURN_WITH_ERROR (GUM_ERROR_HOME_DIR_CREATE_FAILURE, + "Home directory creation failure", error, FALSE); + } - if (!_set_smack64_attr (home_dir, - GUM_CONFIG_GENERAL_SMACK64_USER_FILES, TRUE)) { - GUM_RETURN_WITH_ERROR (GUM_ERROR_FILE_ATTRIBUTE, - "Unable to set smack64 home dir attr", error, FALSE); - } + if (!_copy_file_attributes (skel_dir, home_dir)) { + GUM_RETURN_WITH_ERROR (GUM_ERROR_FILE_ATTRIBUTE, + "Unable to get/set dir attributes", error, FALSE); + } - /* when run in test mode, user may not exist */ + if (!_set_smack64_attr (home_dir, + GUM_CONFIG_GENERAL_SMACK64_USER_FILES, TRUE)) { + GUM_RETURN_WITH_ERROR (GUM_ERROR_FILE_ATTRIBUTE, + "Unable to set smack64 home dir attr", error, FALSE); + } + + /* when run in test mode, user may not exist */ #ifdef ENABLE_TESTS - uid = getuid (); - gid = getgid (); + uid = getuid (); + gid = getgid (); #endif - if (lchown (home_dir, uid, gid) < 0) { - GUM_RETURN_WITH_ERROR (GUM_ERROR_HOME_DIR_CREATE_FAILURE, - "Home directory chown failure", error, FALSE); - } - - retval = _copy_dir_recursively (skel_dir, home_dir, uid, gid, umask, - error); - } else { - WARN ("Error: Failed to copy files. Home directory(%s) already exists.", home_dir); + if (lchown (home_dir, uid, gid) < 0) { + GUM_RETURN_WITH_ERROR (GUM_ERROR_HOME_DIR_CREATE_FAILURE, + "Home directory chown failure", error, FALSE); } + retval = _copy_dir_recursively (skel_dir, home_dir, uid, gid, umask, + error); + return retval; } -- 2.7.4