Modify create home directory logic 80/152780/2 accepted/tizen/unified/20171010.162508 submit/tizen/20171010.031320
authorYunmi Ha <yunmi.ha@samsung.com>
Wed, 27 Sep 2017 05:28:58 +0000 (14:28 +0900)
committerYunmi Ha <yunmi.ha@samsung.com>
Wed, 27 Sep 2017 05:57:37 +0000 (14:57 +0900)
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 <yunmi.ha@samsung.com>
src/common/gum-file.c

index 2104eab..77b08d3 100755 (executable)
@@ -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;
 }