+ static __thread sqlite3 *dbInit = NULL;
+
+static int ail_db_change_perm(const char *db_file, uid_t uid)
+{
+ char buf[BUFSIZE];
+ char journal_file[BUFSIZE];
+ char *files[3];
+ int ret, i;
+ struct passwd *userinfo = NULL;
+ files[0] = (char *)db_file;
+ files[1] = journal_file;
+ files[2] = NULL;
+
+ retv_if(!db_file, AIL_ERROR_FAIL);
+ if(getuid() != OWNER_ROOT) //At this time we should be root to apply this
+ return AIL_ERROR_OK;
+ userinfo = getpwuid(uid);
+ if (!userinfo) {
+ _E("FAIL: user %d doesn't exist", uid);
+ return AIL_ERROR_FAIL;
+ }
+ snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal");
+
+ for (i = 0; files[i]; i++) {
+ // Compare git_t type and not group name
+ ret = chown(files[i], uid, userinfo->pw_gid);
+ SET_SMACK_LABEL(files[i],uid)
+ if (ret == -1) {
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chown %s %d.%d, because %s", db_file, uid, userinfo->pw_gid, buf);
+ return AIL_ERROR_FAIL;
+ }
+
+ ret = chmod(files[i], S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (ret == -1) {
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chmod %s 0664, because %s", db_file, buf);
+ return AIL_ERROR_FAIL;
+ }
+ }
+
+ return AIL_ERROR_OK;
+}
+
+char* ail_get_icon_path(uid_t uid)
+{
+ char *result = NULL;
+ struct group *grpinfo = NULL;
+ char *dir = NULL;
+ struct passwd *userinfo = getpwuid(uid);
+
+ if (uid == 0) {
+ _E("FAIL : Root is not allowed user! please fix it replacing with DEFAULT_USER");
+ return NULL;
+ }
+ if (uid != GLOBAL_USER) {
+ if (userinfo == NULL) {
+ _E("getpwuid(%d) returns NULL !", uid);
+ return NULL;
+ }
+ grpinfo = getgrnam("users");
+ if (grpinfo == NULL) {
+ _E("getgrnam(users) returns NULL !");
+ return NULL;
+ }
+ // Compare git_t type and not group name
+ if (grpinfo->gr_gid != userinfo->pw_gid) {
+ _E("UID [%d] does not belong to 'users' group!", uid);
+ return NULL;
+ }
+ asprintf(&result, "%s/.applications/icons/", userinfo->pw_dir);
+ } else {
+ result = tzplatform_mkpath(TZ_SYS_RW_ICONS, "/");
+ }
+ int ret;
+ mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
+ if (getuid() == OWNER_ROOT) {
+ ret = chown(result, uid, ((grpinfo)?grpinfo->gr_gid:0));
+ SET_SMACK_LABEL(result,uid)
+ if (ret == -1) {
+ char buf[BUFSIZE];
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chown %s %d.%d, because %s", result, uid, ((grpinfo)?grpinfo->gr_gid:0), buf);
+ }
+ }
+ return result;
+}
+
+static char* ail_get_app_DB(uid_t uid)
+{
+ char *result = NULL;
+ char *journal = NULL;
+ struct group *grpinfo = NULL;
+ char *dir = NULL;
+ struct passwd *userinfo = getpwuid(uid);
+
+ if (uid == 0) {
+ _E("FAIL : Root is not allowed! switch to DEFAULT_USER");
+ return NULL;
+ }
+ if (uid != GLOBAL_USER) {
+ if (userinfo == NULL) {
+ _E("getpwuid(%d) returns NULL !", uid);
+ return NULL;
+ }
+ grpinfo = getgrnam("users");
+ if (grpinfo == NULL) {
+ _E("getgrnam(users) returns NULL !");
+ return NULL;
+ }
+ // Compare git_t type and not group name
+ if (grpinfo->gr_gid != userinfo->pw_gid) {
+ _E("UID [%d] does not belong to 'users' group!", uid);
+ return NULL;
+ }
+ asprintf(&result, "%s/.applications/dbspace/.app_info.db", userinfo->pw_dir);
+ asprintf(&journal, "%s/.applications/dbspace/.app_info.db-journal", userinfo->pw_dir);
+ } else {
+ result = strdup(APP_INFO_DB_FILE);
+ journal = strdup(APP_INFO_DB_FILE_JOURNAL);
+ }
+ char *temp = strdup(result);
+ dir = strrchr(temp, '/');
+ if(!dir)
+ {
+ free(temp);
+ return result;
+ }
+ *dir = 0;
+ if ((uid != GLOBAL_USER)||((uid == GLOBAL_USER)&& (geteuid() == 0 ))) {
+ int ret;
+ mkdir(temp, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
+ if (getuid() == OWNER_ROOT) {
+ ret = chown(temp, uid, ((grpinfo)?grpinfo->gr_gid:0));
+ SET_SMACK_LABEL(temp,uid)
+ if (ret == -1) {
+ char buf[BUFSIZE];
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chown %s %d.%d, because %s", temp, uid, ((grpinfo)?grpinfo->gr_gid:0), buf);
+ }
+ }
+ }
+ free(temp);
+ return result;
+}
+
+char* al_get_desktop_path(uid_t uid)
+{
+ char *result = NULL;
+ struct group *grpinfo = NULL;
+ char *dir = NULL;
+ struct passwd *userinfo = getpwuid(uid);
+
+ if (uid == 0) {
+ _E("FAIL : Root is not allowed user! please fix it replacing with DEFAULT_USER");
+ return NULL;
+ }
+ if (uid != GLOBAL_USER) {
+ if (userinfo == NULL) {
+ _E("getpwuid(%d) returns NULL !", uid);
+ return NULL;
+ }
+ grpinfo = getgrnam("users");
+ if (grpinfo == NULL) {
+ _E("getgrnam(users) returns NULL !");
+ return NULL;
+ }
+ // Compare git_t type and not group name
+ if (grpinfo->gr_gid != userinfo->pw_gid) {
+ _E("UID [%d] does not belong to 'users' group!", uid);
+ return NULL;
+ }
+ asprintf(&result, "%s/.applications/desktop/", userinfo->pw_dir);
+ } else {
+ result = tzplatform_mkpath(TZ_SYS_RW_DESKTOP_APP, "/");
+ }
+ if ((uid != GLOBAL_USER)||((uid == GLOBAL_USER)&& (geteuid() == 0 ))) {
+ int ret;
+ mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
+ ret = chown(result, uid, ((grpinfo)?grpinfo->gr_gid:0));
+ SET_SMACK_LABEL(result,uid)
+ if (ret == -1) {
+ char buf[BUFSIZE];
+ strerror_r(errno, buf, sizeof(buf));
+ _E("FAIL : chown %s %d.%d, because %s", result, uid, ((grpinfo)?grpinfo->gr_gid:0), buf);
+ }
+ }
+ return result;
+}