Modify the fixed SDK constant(developer). 83/61783/1
authorKim Gunsoo <gunsoo83.kim@samsung.com>
Thu, 10 Mar 2016 11:54:01 +0000 (20:54 +0900)
committerKim Gunsoo <gunsoo83.kim@samsung.com>
Thu, 10 Mar 2016 11:54:01 +0000 (20:54 +0900)
- changed to obtained using the platform API(tizen-platform-config).

Change-Id: I0c975660c8fda8868561750d747162487733af62
Signed-off-by: Kim Gunsoo <gunsoo83.kim@samsung.com>
src/commandline.c
src/file_sync_service.c
src/sdb.c
src/sdb.h
src/sdktools.c
src/sdktools.h
src/services.c

index 740cd2b84156ec5b4aa4c6e27e1bf6ee6df986f2..1d88c7a4a7350439bc4fbaafb3c33aecd3a0a151 100644 (file)
@@ -127,7 +127,7 @@ void help()
     "  sdb status-window            - continuously print device status for a specified device\n"
 //    "  sdb usb                      - restarts the sdbd daemon listing on USB\n"
 //    "  sdb tcpip                    - restarts the sdbd daemon listing on TCP\n"
-    "  sdb root <on|off>            - switch to root or developer account mode\n"
+    "  sdb root <on|off>            - switch to root or sdk user account mode\n"
     "                                 'on' means to root mode, and vice versa"
     "\n"
         );
index 61842a7227b7d074d93582e19a83aaaa1f388dc8..3f49e39f2b528e828cb528dc1a16866adcafa195 100644 (file)
@@ -672,7 +672,7 @@ void file_sync_service(int fd, void *cookie)
             D("sync: '%s' '%s'\n", (char*) &msg.req, name);
 
             if (should_drop_privileges() && !verify_sync_rule(name)) {
-                set_developer_privileges();
+                set_sdk_user_privileges();
             }
 
             switch(msg.req.id) {
index 175c3fffb2632ccf0f62b5f5d210ffe31a197c88..c29e51fc9c8b551d71237c57ab652882e959f761 100644 (file)
--- a/src/sdb.c
+++ b/src/sdb.c
@@ -26,6 +26,7 @@
 #include <sys/time.h>
 #include <signal.h>
 #include <grp.h>
+#include <pwd.h>
 #include <netdb.h>
 #include <tzplatform_config.h>
 #include <pthread.h>
@@ -68,6 +69,11 @@ SDB_MUTEX_DEFINE( D_lock );
 int HOST = 0;
 #define HOME_DEV_PATH tzplatform_getenv(TZ_SDK_HOME)
 #define DEV_NAME tzplatform_getenv(TZ_SDK_USER_NAME)
+uid_t g_sdk_user_id = -1;
+gid_t g_sdk_group_id = -1;
+char* g_sdk_home_dir = NULL;
+char* g_sdk_home_dir_env = NULL;
+
 #if !SDB_HOST
 SdbdCommandlineArgs sdbd_commandline_args;
 #endif
@@ -1391,41 +1397,108 @@ void register_bootdone_cb() {
        }
 }
 
-int set_developer_privileges() {
-    gid_t groups[] = { SID_DEVELOPER, SID_APP_LOGGING, SID_SYS_LOGGING, SID_INPUT };
-    if (setgroups(sizeof(groups) / sizeof(groups[0]), groups) != 0) {
+static int sdbd_set_groups() {
+    gid_t *groups = NULL;
+    int ngroups = 0;
+    int default_ngroups = 0;
+    int i, j = 0;
+    int group_match = 0;
+    int added_group_cnt = 0;
+    gid_t default_groups[] = { SID_DEVELOPER, SID_APP_LOGGING, SID_SYS_LOGGING, SID_INPUT };
+
+    default_ngroups = sizeof(default_groups) / sizeof(default_groups[0]);
+
+    getgrouplist(SDK_USER_NAME, g_sdk_group_id, NULL, &ngroups);
+    D("group list : ngroups = %d\n", ngroups);
+    groups = malloc((ngroups + default_ngroups) * sizeof(gid_t));
+    if (groups == NULL) {
+        D("failed to allocate groups(%d)\n", (ngroups + default_ngroups) * sizeof(gid_t));
+        return -1;
+    }
+    if (getgrouplist(SDK_USER_NAME, g_sdk_group_id, groups, &ngroups) == -1) {
+        D("failed to getgrouplist(), ngroups = %d\n", ngroups);
+        free(groups);
+        return -1;
+    }
+
+    for (i = 0; i < default_ngroups; i++) {
+        for (j = 0; j < ngroups; j++) {
+            if (groups[j] == default_groups[i]) {
+                group_match = 1;
+                break;
+            }
+        }
+        if (group_match == 0) {
+            groups[ngroups + added_group_cnt] = default_groups[i];
+            added_group_cnt ++;
+        }
+        group_match = 0;
+    }
+
+    if (setgroups(ngroups+added_group_cnt, groups) != 0) {
+        D("failed to setgroups().\n");
+        free(groups);
+        return -1;
+    }
+
+    free(groups);
+    return 0;
+}
+
+static int sdbd_get_user_pwd(const char* user_name, struct passwd* pwd, char* buf, size_t bufsize) {
+    struct passwd *result = NULL;
+    int ret = 0;
+
+    ret = getpwnam_r(user_name, pwd, buf, bufsize, &result);
+    if (result == NULL) {
+        if (ret == 0) {
+            D("Not found passwd : username(%s)\n", user_name);
+        } else {
+            errno = ret;
+            D("failed to getpwuid_r\n");
+        }
+        free(buf);
+        return -1;
+    }
+
+    return 0;
+}
+
+int set_sdk_user_privileges() {
+    if (g_sdk_user_id < 0 || g_sdk_group_id < 0 ||
+        g_sdk_home_dir == NULL || g_sdk_home_dir_env == NULL) {
+        D("failed to init sdk user information.\n");
+        return -1;
+    }
+
+    if (sdbd_set_groups() < 0) {
         D("set groups failed (errno: %d)\n", errno);
+
+        // set default group list
+        gid_t default_groups[] = { SID_DEVELOPER, SID_APP_LOGGING, SID_SYS_LOGGING, SID_INPUT };
+        int default_ngroups = sizeof(default_groups) / sizeof(default_groups[0]);
+        setgroups(default_ngroups, default_groups);
     }
 
-    // then switch user and group to developer
-    if (setgid(SID_DEVELOPER) != 0) {
+    if (setgid(g_sdk_group_id) != 0) {
         D("set group id failed (errno: %d)\n", errno);
         return -1;
     }
 
-    if (setuid(SID_DEVELOPER) != 0) {
+    if (setuid(g_sdk_user_id) != 0) {
         D("set user id failed (errno: %d)\n", errno);
         return -1;
     }
 
-    if (chdir(HOME_DEV_PATH) < 0) {
-        D("sdbd: unable to change working directory to %s\n", HOME_DEV_PATH);
-    } else {
-        if (chdir("/") < 0) {
-            D("sdbd: unable to change working directory to /\n");
-        }
+    if (chdir(g_sdk_home_dir) < 0) {
+        D("unable to change working directory to %s\n", g_sdk_home_dir);
+        return -1;
     }
-    // TODO: use pam later
-    int env_size = strlen("HOME=") + strlen(HOME_DEV_PATH) + 1;
-    char * env = malloc(env_size);
-    if(env == 0) fatal("failed to allocate for env string");
-    snprintf(env, env_size, "HOME=%s", HOME_DEV_PATH);
-    putenv(env);
-    free(env);
 
-    return 1;
+    // TODO: use pam later
+    putenv(g_sdk_home_dir_env);
+    return 0;
 }
-#define ONDEMAND_ROOT_PATH tzplatform_getenv(TZ_SDK_HOME)
 
 static void execute_required_process() {
     char *cmd_args[] = {"/usr/bin/debug_launchpad_preloading_preinitializing_daemon",NULL};
@@ -1647,6 +1720,52 @@ static void load_sdbd_plugin() {
     D("using sdbd plugin interface.(%s)\n", SDBD_PLUGIN_PATH);
 }
 
+static int init_sdk_userinfo() {
+    struct passwd pwd;
+    char *buf = NULL;
+    size_t bufsize = 0;
+
+    if (g_sdk_user_id > 0 && g_sdk_group_id > 0 &&
+        g_sdk_home_dir != NULL && g_sdk_home_dir_env != NULL) {
+        return 0;
+    }
+
+    bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (bufsize < 0) {
+        bufsize = (16*1024);
+    }
+    buf = malloc(bufsize);
+    if (buf == NULL) {
+        D("failed to allocate passwd buf(%d)\n", bufsize);
+        return -1;
+    }
+
+    if (sdbd_get_user_pwd(SDK_USER_NAME, &pwd, buf, bufsize) < 0) {
+        D("get user passwd info.(errno: %d)\n", errno);
+        free(buf);
+        return -1;
+    }
+    D("username=%s, uid=%d, gid=%d, dir=%s\n", pwd.pw_name, pwd.pw_uid, pwd.pw_gid, pwd.pw_dir);
+
+    g_sdk_user_id = pwd.pw_uid;
+    g_sdk_group_id = pwd.pw_gid;
+    g_sdk_home_dir = strdup(pwd.pw_dir);
+
+    free(buf);
+
+    int env_size = strlen("HOME=") + strlen(g_sdk_home_dir) + 1;
+    g_sdk_home_dir_env = malloc(env_size);
+    if(g_sdk_home_dir_env == 0) {
+        D("failed to allocate for home dir env string\n");
+        free(g_sdk_home_dir);
+        g_sdk_home_dir = NULL;
+        return -1;
+    }
+    snprintf(g_sdk_home_dir_env, env_size, "HOME=%s", g_sdk_home_dir);
+
+    return 0;
+}
+
 static void init_sdk_requirements() {
     struct stat st;
 
@@ -1660,14 +1779,15 @@ static void init_sdk_requirements() {
         putenv("HOME=/root");
     }
 
-    if (stat(ONDEMAND_ROOT_PATH, &st) == -1) {
-        return;
-    }
-    if (st.st_uid != SID_DEVELOPER || st.st_gid != GID_DEVELOPER) {
-        char cmd[128];
-        snprintf(cmd, sizeof(cmd), "chown %s:%s %s -R", DEV_NAME, DEV_NAME, ONDEMAND_ROOT_PATH);
-        if (system(cmd) < 0) {
-            D("failed to change ownership to developer to %s\n", ONDEMAND_ROOT_PATH);
+    init_sdk_userinfo();
+
+    if (g_sdk_home_dir != NULL && stat(g_sdk_home_dir, &st) == 0) {
+        if (st.st_uid != g_sdk_user_id || st.st_gid != g_sdk_group_id) {
+            char cmd[128];
+            snprintf(cmd, sizeof(cmd), "chown %s:%s %s -R", SDK_USER_NAME, SDK_USER_NAME, g_sdk_home_dir);
+            if (system(cmd) < 0) {
+                D("failed to change ownership to sdk user to %s\n", g_sdk_home_dir);
+            }
         }
     }
 
index 295aa328f996480397be525bb95fe8c7edc1bef8..750e9a6653407bbec56b276db7f5ccc52b8c5ffa 100644 (file)
--- a/src/sdb.h
+++ b/src/sdb.h
@@ -374,7 +374,7 @@ void log_service(int fd, void *cookie);
 void remount_service(int fd, void *cookie);
 char * get_log_file_path(const char * log_name);
 
-int rootshell_mode; // 0: developer, 1: root
+int rootshell_mode; // 0: sdk user, 1: root
 int booting_done; // 0: platform booting is in progess 1: platform booting is done
 
 // This is the users and groups config for the platform
@@ -383,16 +383,20 @@ int booting_done; // 0: platform booting is in progess 1: platform booting is do
 #define SID_TTY         5    /* group for /dev/ptmx */
 #define SID_APP         tzplatform_getuid(TZ_USER_NAME) /* application */
 #define SID_DEVELOPER   tzplatform_getuid(TZ_SDK_USER_NAME) /* developer with SDK */
-#define GID_DEVELOPER   100 /* developer will be member of users with SDK */
 #define SID_APP_LOGGING 6509
 #define SID_SYS_LOGGING 6527
 #define SID_INPUT       1004
 
+#define SDK_USER_NAME   tzplatform_getenv(TZ_SDK_USER_NAME)
+extern uid_t g_sdk_user_id;
+extern gid_t g_sdk_group_id;
+extern char* g_sdk_home_dir;
+extern char* g_sdk_home_dir_env;
 #endif
 
 int is_pwlocked(void);
 int should_drop_privileges(void);
-int set_developer_privileges();
+int set_sdk_user_privileges();
 void set_root_privileges();
 
 int get_emulator_forward_port(void);
index 814e066f41e9f7b88261a66791bb8b7705f4e4da..f24bccccc651c6fb7db10f4006282d83c836efee 100644 (file)
@@ -178,7 +178,7 @@ int verify_root_commands(const char *arg1) {
     }
     }
 
-    D("doing the cmd as a %s\n", ret == 1 ? "root" : "developer");
+    D("doing the cmd as a %s\n", ret == 1 ? "root" : SDK_USER_NAME);
 
     if (cnt) {
         free_strings(tokens, cnt);
index 59d8d988e282f3d75907494afbe491c2345d6852..50b68ded84133bdb9f2d6fffcfe4fbb73b36784b 100644 (file)
@@ -13,7 +13,7 @@ struct sudo_command
   const char *path;
   const char *arguments[PERMITTED_ARGUMENT_SIZE];
   //const char *regx;
-  //int   permission; /* 0: root, 1: developer, 2: app*/
+  //int   permission; /* 0: root, 1: sdk user, 2: app*/
 };
 
 
index 739e36ff7c6cb8210cc42ce0e205afb40e9b8643..78cd4aa279a655fa3af6c8f311b14c8a39eefe56 100644 (file)
@@ -186,7 +186,7 @@ void rootshell_service(int fd, void *cookie)
     if (!strcmp(mode, "on")) {
         if (getuid() == 0) {
             if (rootshell_mode == 1) {
-                //snprintf(buf, sizeof(buf), "Already changed to developer mode\n");
+                //snprintf(buf, sizeof(buf), "Already changed to sdk user mode\n");
                 // do not show message
             } else {
                 if (is_support_rootonoff()) {
@@ -207,14 +207,14 @@ void rootshell_service(int fd, void *cookie)
     } else if (!strcmp(mode, "off")) {
         if (rootshell_mode == 1) {
             rootshell_mode = 0;
-            snprintf(buf, sizeof(buf), "Switched to 'developer' account mode\n");
+            snprintf(buf, sizeof(buf), "Switched to 'sdk user' account mode\n");
             writex(fd, buf, strlen(buf));
         }
     } else {
        snprintf(buf, sizeof(buf), "Unknown command option : %s\n", mode);
         writex(fd, buf, strlen(buf));
     }
-    D("set rootshell to %s\n", rootshell_mode == 1 ? "root" : "developer");
+    D("set rootshell to %s\n", rootshell_mode == 1 ? "root" : SDK_USER_NAME);
     free(mode);
     sdb_close(fd);
 }
@@ -459,7 +459,7 @@ static int create_subprocess(const char *cmd, pid_t *pid, const char *argv[], co
                 // do nothing
                 D("sdb: executes root commands!!:%s\n", argv[2]);
             } else {
-                set_developer_privileges();
+                set_sdk_user_privileges();
             }
         }
         redirect_and_exec(pts, cmd, argv, envp);
@@ -478,7 +478,6 @@ static int create_subprocess(const char *cmd, pid_t *pid, const char *argv[], co
 
 #define SHELL_COMMAND "/bin/sh"
 #define LOGIN_COMMAND "/bin/login"
-#define SDK_USER      "developer"
 #define SUPER_USER    "root"
 #define LOGIN_CONFIG  "/etc/login.defs"
 
@@ -578,15 +577,19 @@ static int create_subproc_thread(const char *name, int lines, int columns)
     };
 
     if (should_drop_privileges()) {
-         envp[2] = "HOME=/home/developer";
-         get_env("ENV_PATH", &value);
-     } else {
-         get_env("ENV_SUPATH", &value);
-         if(value == NULL) {
-             get_env("ENV_ROOTPATH", &value);
-         }
-         envp[2] = "HOME=/root";
-     }
+        if (g_sdk_home_dir_env) {
+            envp[2] = g_sdk_home_dir_env;
+        } else {
+            envp[2] = "HOME=/home/owner";
+        }
+        get_env("ENV_PATH", &value);
+    } else {
+        get_env("ENV_SUPATH", &value);
+        if(value == NULL) {
+            get_env("ENV_ROOTPATH", &value);
+        }
+        envp[2] = "HOME=/root";
+    }
     if (value != NULL) {
         trim_value = str_trim(value);
         if (trim_value != NULL) {