Run filtered requests on global db if we are GLOBAL_USER
[platform/core/appfw/ail.git] / src / ail_db.c
index df285da..474f453 100755 (executable)
@@ -113,25 +113,19 @@ static int ail_db_change_perm(const char *db_file)
 
 char* ail_get_icon_path(uid_t uid)
 {
-       char *result_psswd = NULL;
-       if(uid == GLOBAL_USER)
-       {
-               result_psswd = tzplatform_getenv(TZ_SYS_RW_ICONS);
-       }
-       else
-       {
-               const char *name = "users";
-               struct passwd *userinfo = NULL;
-               struct group *grpinfo = NULL;
+       char *result = NULL;
+       struct group *grpinfo = NULL;
+       char *dir = NULL;
+       struct passwd *userinfo = getpwuid(uid);
+
+       if (uid != GLOBAL_USER) {
 
-               userinfo = getpwuid(uid);
-               if(userinfo == NULL) {
+               if (userinfo == NULL) {
                        _E("getpwuid(%d) returns NULL !", uid);
                        return NULL;
                }
-               
-               grpinfo = getgrnam(name);
-               if(grpinfo == NULL) {
+               grpinfo = getgrnam("users");
+               if (grpinfo == NULL) {
                        _E("getgrnam(users) returns NULL !");
                        return NULL;
                }
@@ -140,34 +134,106 @@ char* ail_get_icon_path(uid_t uid)
                        _E("UID [%d] does not belong to 'users' group!", uid);
                        return NULL;
                }
-               result_psswd = tzplatform_getenv(TZ_USER_ICONS);
+               asprintf(&result, "%s/.applications/icons/", userinfo->pw_dir);
+       } else {
+               result = tzplatform_mkpath(TZ_SYS_RW_ICONS, "/");
+               grpinfo = getgrnam("root");
+               if (grpinfo == NULL) {
+                       _E("getgrnam(root) returns NULL !");
+                       return NULL;
+                       }
+                       if (grpinfo->gr_gid != userinfo->pw_gid) {
+                               _E("UID [%d] does not belong to 'root' group!", uid);
+                               return NULL;
+                       }
+       }
+       int ret;
+       mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
+       ret = chown(result, uid, grpinfo->gr_gid);
+       if (ret == -1) {
+               char buf[BUFSIZE];
+               strerror_r(errno, buf, sizeof(buf));
+               _E("FAIL : chown %s %d.%d, because %s", result, uid, grpinfo->gr_gid, buf);
        }
-       return result_psswd;
+       return result;
 }
 
 static char* ail_get_app_DB(uid_t uid)
 {
-       char *result_psswd = NULL;
+       char *result = NULL;
+       char *journal = NULL;
        struct group *grpinfo = NULL;
-       char * dir = NULL;
-       if(uid == GLOBAL_USER)
-       {
-               result_psswd = strdup(APP_INFO_DB_FILE);
-               grpinfo = getgrnam("root");
-               if(grpinfo == NULL) {
+       char *dir = NULL;
+       struct passwd *userinfo = getpwuid(uid);
+
+       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;
+                       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 {
+               grpinfo = getgrnam("root");
+               if (grpinfo == NULL) {
+                       _E("getgrnam(root) returns NULL !");
+                       return NULL;
+                       }
+                       if (grpinfo->gr_gid != userinfo->pw_gid) {
+                               _E("UID [%d] does not belong to 'root' group!", uid);
+                               return NULL;
+                       }
+                       result = strdup(APP_INFO_DB_FILE);
+                       journal = strdup(APP_INFO_DB_FILE_JOURNAL);
        }
-       else
+       char *temp = strdup(result);
+       dir = strrchr(temp, '/');
+       if(!dir)
        {
-               struct passwd *userinfo = getpwuid(uid);
-               if(userinfo == NULL) {
+               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);
+               ret = chown(dir + 1, uid, grpinfo->gr_gid);
+               if (ret == -1) {
+                       char buf[BUFSIZE];
+                       strerror_r(errno, buf, sizeof(buf));
+                       _E("FAIL : chown %s %d.%d, because %s", dir + 1, uid, grpinfo->gr_gid, 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 != GLOBAL_USER) {
+
+               if (userinfo == NULL) {
                        _E("getpwuid(%d) returns NULL !", uid);
                        return NULL;
                }
                grpinfo = getgrnam("users");
-               if(grpinfo == NULL) {
+               if (grpinfo == NULL) {
                        _E("getgrnam(users) returns NULL !");
                        return NULL;
                }
@@ -176,34 +242,33 @@ static char* ail_get_app_DB(uid_t uid)
                        _E("UID [%d] does not belong to 'users' group!", uid);
                        return NULL;
                }
-               asprintf(&result_psswd, "%s/.applications/dbspace/.app_info.db", userinfo->pw_dir);
+               asprintf(&result, "%s/.applications/desktop/", userinfo->pw_dir);
+       } else {
+               grpinfo = getgrnam("root");
+               if (grpinfo == NULL) {
+                       _E("getgrnam(root) returns NULL !");
+                       return NULL;
+               }
+               if (grpinfo->gr_gid != userinfo->pw_gid) {
+                       _E("UID [%d] does not belong to 'root' group!", uid);
+                       return NULL;
+               }
+               result = tzplatform_mkpath(TZ_SYS_RW_DESKTOP_APP, "/");
        }
-
-       dir = strrchr(result_psswd, '/');
-       if(!dir)
-               return result_psswd;
-
-       //Control if db exist create otherwise 
-       if(access(dir + 1, F_OK)) {
+       if ((uid != GLOBAL_USER)||((uid == GLOBAL_USER)&& (geteuid() == 0 ))) {
                int ret;
-               mkdir(dir + 1, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
-               ret = chown(dir + 1, uid, grpinfo->gr_gid);
+               mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
+               ret = chown(result, uid, grpinfo->gr_gid);
                if (ret == -1) {
                        char buf[BUFSIZE];
                        strerror_r(errno, buf, sizeof(buf));
-                       _E("FAIL : chown %s %d.%d, because %s", dir + 1, uid, grpinfo->gr_gid, buf);
+                       _E("FAIL : chown %s %d.%d, because %s", result, uid, grpinfo->gr_gid, buf);
                }
-    /* chsmack */
-    if(smack_setlabel(result_psswd, "_", SMACK_LABEL_ACCESS))
-         {
-                 _E("failed chsmack -a \"_\" %s", result_psswd);
-         } else {
-                 _D("chsmack -a \"_\" %s", result_psswd);
-         }
        }
-       return result_psswd;
+       return result;
 }
 
+
 static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt)
 {
        int ret;
@@ -272,51 +337,52 @@ ail_error_e db_open(db_open_mode mode, uid_t uid)
                                ret = do_db_exec(tbls[i], dbInit);
                                retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
                        }
+                       if(AIL_ERROR_OK != ail_db_change_perm(ail_get_app_DB(uid))) {
+                               _E("Failed to change permission\n");
+               }
                } else {
                        dbInit = NULL;
-                       _E("Failed to create table %s\n",ail_get_app_DB(uid));
+                       _E("Failed to create table %s\n", ail_get_app_DB(uid));
                }
        }
        if(dbInit) {
-               if(AIL_ERROR_OK != ail_db_change_perm(ail_get_app_DB(uid))) {
-                               _E("Failed to change permission\n");
-               }
                ret = sqlite3_close(dbInit);
                retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
                dbInit = NULL;
        }
        if(mode & DB_OPEN_RO) {
-               if (!db_info.dbUserro) {
-                       db_util_open_with_options(ail_get_app_DB(uid), &db_info.dbUserro, SQLITE_OPEN_READONLY, NULL);
-                       char query_attach[AIL_SQL_QUERY_MAX_LEN];
-                       char query_view_app[AIL_SQL_QUERY_MAX_LEN];
-                       char query_view_local[AIL_SQL_QUERY_MAX_LEN];
-                       snprintf(query_attach, AIL_SQL_QUERY_MAX_LEN, QUERY_ATTACH, ail_get_app_DB(GLOBAL_USER));
-                       _E("info : execute query_attach : %s", query_attach );
-                       if (db_exec_usr_ro(query_attach) < 0) {
-                               return AIL_ERROR_DB_FAILED;
-                       }
-                       snprintf(query_view_app, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_APP);
-                       _E("info : execute query_attach : %s", query_view_app );
-                       if (db_exec_usr_ro(query_view_app) < 0) {
-                               return AIL_ERROR_DB_FAILED;
+               if(uid != GLOBAL_USER) {
+                       if (!db_info.dbUserro) {
+                               db_util_open_with_options(ail_get_app_DB(uid), &db_info.dbUserro, SQLITE_OPEN_READONLY, NULL);
+                               char query_attach[AIL_SQL_QUERY_MAX_LEN];
+                               char query_view_app[AIL_SQL_QUERY_MAX_LEN];
+                               char query_view_local[AIL_SQL_QUERY_MAX_LEN];
+                               snprintf(query_attach, AIL_SQL_QUERY_MAX_LEN, QUERY_ATTACH, ail_get_app_DB(GLOBAL_USER));
+                               if (db_exec_usr_ro(query_attach) < 0) {
+                                       _D("executing query_attach : %s", query_attach );
+                                       return AIL_ERROR_DB_FAILED;
+                               }
+                               snprintf(query_view_app, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_APP);
+                               if (db_exec_usr_ro(query_view_app) < 0) {
+                                       _D("executing query_attach : %s", query_view_app );
+                                       return AIL_ERROR_DB_FAILED;
+                               }
+
+                               snprintf(query_view_local, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_LOCAL);
+                               if (db_exec_usr_ro(query_view_local) < 0) {
+                                       _D("executing query_attach : %s", query_view_local );
+                                       return AIL_ERROR_DB_FAILED;
+                               }
                        }
-
-                       snprintf(query_view_local, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_LOCAL);
-                       _E("info : execute query_attach : %s", query_view_local );
-                       if (db_exec_usr_ro(query_view_local) < 0) {
-                               return AIL_ERROR_DB_FAILED;
-                       }
-               }
-               if (!db_info.dbGlobalro) {
+               } else {
+                       if (!db_info.dbGlobalro) {
                                ret = db_util_open_with_options(ail_get_app_DB(GLOBAL_USER), &db_info.dbGlobalro, SQLITE_OPEN_READONLY, NULL);
                                retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
                        }
-       }
-
+               }
+ }
        if(mode & DB_OPEN_RW) {
-               //if (__is_admin) {
-               if(uid != GLOBAL_USER) {//TOCHANGETO is_admin
+               if(uid != GLOBAL_USER) {
                        if(!db_info.dbUserrw){
                                ret = db_util_open(ail_get_app_DB(uid), &db_info.dbUserrw, 0);
                        }
@@ -326,8 +392,6 @@ ail_error_e db_open(db_open_mode mode, uid_t uid)
                        }
                }
                retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
-       
-               //}
        }
 
        return AIL_ERROR_OK;
@@ -560,9 +624,9 @@ EXPORT_API ail_error_e ail_db_close(void)
 int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
 {
        char *error_message = NULL;
-       if(db_info.dbUserro) {
+       if(db_info.dbGlobalro) {
                if (SQLITE_OK !=
-                       sqlite3_exec(db_info.dbUserro, query, callback, data, &error_message)) {
+                       sqlite3_exec(db_info.dbGlobalro, query, callback, data, &error_message)) {
                        _E("Don't execute query = %s error message = %s\n", query,
                                error_message);
                        sqlite3_free(error_message);