#include <sys/time.h>
#include <signal.h>
#include <grp.h>
+#include <pwd.h>
#include <netdb.h>
#include <tzplatform_config.h>
#include <pthread.h>
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
}
}
-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};
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;
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);
+ }
}
}
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
#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);
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()) {
} 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);
}
// 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);
#define SHELL_COMMAND "/bin/sh"
#define LOGIN_COMMAND "/bin/login"
-#define SDK_USER "developer"
#define SUPER_USER "root"
#define LOGIN_CONFIG "/etc/login.defs"
};
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) {