Split APIs not to access DB while trying to access DB 66/240766/2
authorYunjin Lee <yunjin-.lee@samsung.com>
Tue, 11 Aug 2020 07:13:12 +0000 (16:13 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Wed, 12 Aug 2020 05:59:16 +0000 (14:59 +0900)
- Split some APIs access DB while trying to access DB

Change-Id: I3a840fbd15a6f4b767c7e7601f4796610d7eeb8b
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
capi/include/privilege_db_manager.h
capi/include/privilege_manager_types.h
capi/src/privilege_db_manager.c
capi/src/privilege_info.c
capi/src/privilege_package_info.c
test/tc-common.c
test/tc-privilege-db-manager.c

index 52c18ab..688ddb4 100755 (executable)
 void free_privilege_level_info_list(GList* list);
 
 /**
+ * @brief Free GList of privilege_privacy_info_s* allocated by privilege_db_manager_get_privacy_filtered_privilege_info_list()
+ * @param [in] list The GList allocated by privilege_db_manager_get_privacy_filtered_privilege_info_list()
+ */
+void free_privilege_privacy_info_list(GList *list);
+
+/**
+ * @brief Free privilege_privacy_info_s
+ * @param [in] info The privilege_privacy_info_s
+ */
+void free_privilege_privacy_info(privilege_privacy_info_s* info);
+
+/**
  * @brief Free GList allocated by privilege_db_manager APIs
  * @param [in] list The GList allocated by privilege_db_manager APIs
  */
@@ -143,26 +155,26 @@ int privilege_db_manager_is(char type, const char* privilege);
  * @brief See if the given package id is privacy whitelisted for the given privilege.
  * @remarks @a privilege must be privacy related
  * @param [in] pkgid The package ID
- * @param [in] privilege The privilege
+ * @param [in] privacy_id The privacy id
  * @return 1 on true(is whitelisted), 0 on false and negative value on error.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY Out of memory.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_INVALID_QUERY Failed to prepare sql query.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_DB_NOENTRY DB not exist.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_CONNECTION_FAIL DB exist but failed to open DB.
  */
-int privilege_db_manager_is_privacy_white_list(const char* pkgid, const char* privilege);
+int privilege_db_manager_is_privacy_white_list(const char* pkgid, int privacy_id);
 
 /**
  * @brief See if the given package id is user-settable for the given privacy.
  * @param [in] pkgid_name The privacy name
- * @param [in] privacy_name The privacy name
+ * @param [in] privacy_id The privacy ID
  * @return 1 on true(is user-settable), 0 on false and negative value on error.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY Out of memory.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_INVALID_QUERY Failed to prepare sql query.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_DB_NOENTRY DB not exist.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_CONNECTION_FAIL DB exist but failed to open DB.
  */
-int privilege_db_manager_is_user_settable(const char* pkgid, const char* privacy_name);
+int privilege_db_manager_is_user_settable(const char* pkgid, int privacy_id);
 
 /**
  * @brief Get all privacy list
@@ -238,7 +250,7 @@ int privilege_db_manager_get_privacy_id_by_privilege(const char* privilege, int*
  * @retval #PRIVILEGE_DB_MANAGER_ERR_DB_NOENTRY DB not exist.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_CONNECTION_FAIL DB exist but failed to open DB.
  */
-int privilege_db_manager_get_privacy_id(const char* privacy, int *privacy_id);
+int privilege_db_manager_get_privacy_id(const char* privacy_name, int *privacy_id);
 
 /**
  * @brief See if the given privilege is in the mdm blacklist for the given uid.
@@ -320,9 +332,8 @@ int privilege_db_manager_check_black_list(uid_t uid, privilege_manager_package_t
  * @remarks @a privilege_list must be released by you.
  * @param [in] uid The uid
  * @param [in] pkgid The package ID
- * @param [in] package_type The package type of the given privilege list
  * @param [in] api_version The api-version of the package
- * @param [in] privilege_list The privacy privilege list
+ * @param [in] privilege_list The user-settable privacy privilege list of the package
  * @return 0 on success, otherwise a negative error value.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_NONE  Successful.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_INVALID_QUERY Failed to prepare sql query.
@@ -333,7 +344,7 @@ int privilege_db_manager_check_black_list(uid_t uid, privilege_manager_package_t
  * @retval #PRIVILEGE_DB_MANAGER_ERR_DB_FULL_FAIL Write could not complete due to the disk is full.
  * @retval #PRIVILEGE_DB_MANAGER_ERR_DB_UPDATE_FAIL DB update failed.
  */
-int privilege_db_manager_set_package_privacy_privilege_info(const uid_t uid, const char* pkgid, privilege_manager_package_type_e package_type, const char* api_version, GList* privilege_list);
+int privilege_db_manager_set_package_privacy_privilege_info(const uid_t uid, const char* pkgid, const char* api_version, GList* privilege_list);
 
 /**
  * @brief Delete all privacy privilege info of the given application package.
@@ -426,6 +437,16 @@ int privilege_db_manager_get_package_list_by_privacy(const uid_t uid, const char
  */
 int privilege_db_manager_get_privilege_list_by_pkgid_and_privacy(const uid_t uid, const char* pkgid, const char* privacy, GList** privilege_list);
 
+/**
+ * @brief Get privilege privacy info list filtered by privacy
+ * @remarks @a privilage_privacy_info_list must released by using free_privilege_privacy_info_list().
+ * @remarks If you want to free an element of @a privilege_privacy_info_list then use free_privilege_privacy_info().
+ * @param [in] privilege_list The privilege list to filter privacy
+ * @param [in] privacy_name The privacy name to filter privilege list. If the privacy name is NULL then just filter privacy privileges.
+ * @param [out] privilege_privacy_info_list The filtered privileges and their privacy info
+ */
+int privilege_db_manager_get_privacy_filtered_privilege_info_list(GList *privilege_list, const char* privacy_name, GList **privilege_privacy_info_list);
+
 #ifdef __cplusplus
        }
 #endif
index 166a622..5dda048 100644 (file)
@@ -81,6 +81,11 @@ typedef struct {
        int privilege_level_id;
 } privilege_level_info_s;
 
+typedef struct {
+       char* privilege_name;
+       char* privacy_name;
+} privilege_privacy_info_s;
+
 /**
  * @brief Enumerations of privilege DB type
  */
@@ -102,7 +107,7 @@ typedef enum {
        PRIVILEGE_DB_MANAGER_ERR_CONNECTION_FAIL     = -2,
        PRIVILEGE_DB_MANAGER_ERR_INVALID_QUERY       = -3,
        PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY       = -4,
-       PRIVILEGE_DB_MANAGER_ERR_INVALID_TYPE        = -5,
+       PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER   = -5,
        PRIVILEGE_DB_MANAGER_ERR_DB_BUSY_FAIL        = -6,
        PRIVILEGE_DB_MANAGER_ERR_DB_CONSTRAINT_FAIL  = -7,
        PRIVILEGE_DB_MANAGER_ERR_DB_FULL_FAIL        = -8,
index c830ffa..89ed131 100755 (executable)
@@ -169,7 +169,7 @@ static int __initialize_db(privilege_db_type_e type, sqlite3 ** db)
                break;
        default:
                _LOGE("Undefined db initialize mode!");
-               return PRIVILEGE_DB_MANAGER_ERR_INVALID_TYPE;
+               return PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER;
        }
 
        if (access(db_path, F_OK) == -1 && errno == ENOENT)
@@ -512,7 +512,7 @@ int privilege_db_manager_is(char type, const char* privilege)
        default:
                _LOGE("Undefined type for privilege_db_manager_is()");
                __finalize_db(db, stmt, sql);
-               return PRIVILEGE_DB_MANAGER_ERR_INVALID_TYPE;
+               return PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER;
        }
 
        TRY_PREPARE_STMT(db, sql, &stmt);
@@ -540,23 +540,19 @@ int privilege_db_manager_is(char type, const char* privilege)
        return ret;
 }
 
-// TODO: change it to get package's privacy option only.
-int privilege_db_manager_is_privacy_white_list(const char* pkgid, const char* privilege)
+// TODO: Change it to use cert_level to check privacy whitelist
+int privilege_db_manager_is_privacy_white_list(const char* pkgid, int privacy_id)
 {
        sqlite3 *db = NULL;
        sqlite3_stmt *stmt = NULL;
 
-       int privacy_id = 0;
-       int ret = privilege_db_manager_get_privacy_id_by_privilege(privilege, &privacy_id);
-       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE, , ret, "[PRIVILEGE_DB_MANAGER] privilege_db_manager_get_privacy_id_by_privilege failed");
-
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
 
        char *sql = sqlite3_mprintf("select privacy_option from privacy_whitelist where pkg_id=%Q", pkgid);
 
        TRY_PREPARE_STMT(db, sql, &stmt);
 
-       ret = 0;
+       int ret = 0;
        while (sqlite3_step(stmt) == SQLITE_ROW) {
                char* privacy_option = (char *)sqlite3_column_text(stmt, 0);
                if (privacy_option[privacy_id] == '1') {
@@ -570,25 +566,26 @@ int privilege_db_manager_is_privacy_white_list(const char* pkgid, const char* pr
        return ret;
 }
 
-// TODO: make it to get package's privacy option and settable info only.
-int privilege_db_manager_is_user_settable(const char* pkgid, const char* privacy_name)
+int privilege_db_manager_is_user_settable(const char* pkgid, int privacy_id)
 {
+       TryReturn(privacy_id >= 0, , PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER, "invalid privacy_id = %d", privacy_id);
        sqlite3 *db = NULL;
        sqlite3_stmt *stmt = NULL;
 
-       int privacy_id = 0;
-       int ret = privilege_db_manager_get_privacy_id(privacy_name, &privacy_id);
-       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE, , ret, "[PRIVILEGE_DB_MANAGER] privilege_db_manager_get_privacy_id failed");
-
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
 
        char *sql = sqlite3_mprintf("select privacy_option, settable from privacy_whitelist where pkg_id=%Q", pkgid);
 
        TRY_PREPARE_STMT(db, sql, &stmt);
 
-       ret = 1;
+       int ret = 1;
        while (sqlite3_step(stmt) == SQLITE_ROW) {
                char* privacy_option = (char *)sqlite3_column_text(stmt, 0);
+               if (privacy_id >= (int)strlen(privacy_option)) {
+                       ret = PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER;
+                       _LOGE("invalid privacy_id = %d", privacy_id);
+                       break;
+               }
                int settable_flag = (int)sqlite3_column_int(stmt, 1);
                if (privacy_option[privacy_id] == '1' && settable_flag == 1) {
                        break;
@@ -744,7 +741,7 @@ int privilege_db_manager_get_privacy_id_by_privilege(const char* privilege, int
        return ret;
 }
 
-int privilege_db_manager_get_privacy_id(const char* privacy, int *privacy_id)
+int privilege_db_manager_get_privacy_id(const char* privacy_name, int *privacy_id)
 {
        sqlite3 *db = NULL;
        sqlite3_stmt *stmt = NULL;
@@ -752,7 +749,7 @@ int privilege_db_manager_get_privacy_id(const char* privacy, int *privacy_id)
 
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
 
-       char *sql = sqlite3_mprintf("select privacy_id from privacy_info where privacy_name=%Q", privacy);
+       char *sql = sqlite3_mprintf("select privacy_id from privacy_info where privacy_name=%Q", privacy_name);
 
 
        TRY_PREPARE_STMT(db, sql, &stmt);
@@ -762,7 +759,7 @@ int privilege_db_manager_get_privacy_id(const char* privacy, int *privacy_id)
                *privacy_id = (int)sqlite3_column_int(stmt, 0);
                ret = PRIVILEGE_DB_MANAGER_ERR_NONE;
        } else {
-               _LOGD("privacy %s not exist", privacy);
+               _LOGD("privacy %s not exist", privacy_name);
                ret = PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT;
        }
 
@@ -865,8 +862,7 @@ int privilege_db_manager_unset_black_list(int uid, privilege_manager_package_typ
        TRY_FINISH_TRANSACTION(ret, db, stmt, sql);
 }
 
-//TODO: Do insert only. DO NOT determine whether to insert or not in here.
-int privilege_db_manager_set_package_privacy_privilege_info(const uid_t uid, const char* pkgid, privilege_manager_package_type_e package_type, const char* api_version, GList* privilege_list)
+int privilege_db_manager_set_package_privacy_privilege_info(const uid_t uid, const char* pkgid, const char* api_version, GList* privilege_list)
 {
        sqlite3 *db = NULL;
        sqlite3_stmt *stmt = NULL;
@@ -876,39 +872,26 @@ int privilege_db_manager_set_package_privacy_privilege_info(const uid_t uid, con
 
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_PRIVACY_RW, &db);
 
-       GList* mapped_privilege_list = NULL;
-       ret = privilege_db_manager_get_mapped_privilege_list(api_version, package_type, privilege_list, &mapped_privilege_list);
-       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE && mapped_privilege_list != NULL, __finalize_db(db, stmt, NULL), PRIVILEGE_DB_MANAGER_ERR_DB_UPDATE_FAIL, "[DB_FAIL] privilege_db_manager_get_mapped_privilege_list failed");
-
        TRY_BEGIN_TRANSACTION(db);
 
-       GList *l = NULL;
-       for (l = mapped_privilege_list; l != NULL; l = l->next) {
-               char *privilege_name = (char *)l->data;
-               if (strstr(privilege_name, "/internal/") == NULL) {
-                       char * privacy_name = NULL;
-                       ret = privilege_db_manager_get_privacy_by_privilege(privilege_name, &privacy_name);
-                       if (ret == PRIVILEGE_DB_MANAGER_ERR_NONE && strstr(privacy_name, "N/A") == NULL && privilege_db_manager_is_user_settable(pkgid, privacy_name) == 1) {
-                               sql = sqlite3_mprintf("insert or ignore into privacy_package (uid, pkg_id, privacy_name, privilege_name, api_version, is_critical) values (%d, %Q, %Q, %Q, %Q, 0)", uid, pkgid, privacy_name, privilege_name, api_version);
-
-                               if (__prepare_stmt(db, sql, &stmt) != PRIVILEGE_DB_MANAGER_ERR_NONE) {
-                                       ret = PRIVILEGE_DB_MANAGER_ERR_DB_UPDATE_FAIL;
-                                       break;
-                               }
+       for (GList *l = privilege_list; l != NULL; l = l->next) {
+               privilege_privacy_info_s* p = (privilege_privacy_info_s*)l->data;
+               sql = sqlite3_mprintf("insert or ignore into privacy_package (uid, pkg_id, privacy_name, privilege_name, api_version, is_critical) values (%d, %Q, %Q, %Q, %Q, 0)", uid, pkgid, p->privacy_name, p->privilege_name, api_version);
 
-                               if (sqlite3_step(stmt) != SQLITE_DONE) {
-                                       _LOGE("sqlite3_step() failed. [%s]", sqlite3_errmsg(db));
-                                       ret = PRIVILEGE_DB_MANAGER_ERR_DB_UPDATE_FAIL;
-                                       break;
-                               }
+               if (__prepare_stmt(db, sql, &stmt) != PRIVILEGE_DB_MANAGER_ERR_NONE) {
+                       ret = PRIVILEGE_DB_MANAGER_ERR_DB_UPDATE_FAIL;
+                       break;
+               }
 
-                               SAFE_SQLITE_FREE(sql);
-                               SAFE_SQLITE_FINALIZE(stmt);
-                       }
-                       SAFE_FREE(privacy_name);
+               if (sqlite3_step(stmt) != SQLITE_DONE) {
+                       _LOGE("sqlite3_step() failed. [%s]", sqlite3_errmsg(db));
+                       ret = PRIVILEGE_DB_MANAGER_ERR_DB_UPDATE_FAIL;
+                       break;
                }
+
+               SAFE_SQLITE_FREE(sql);
+               SAFE_SQLITE_FINALIZE(stmt);
        }
-       SAFE_G_LIST_FREE_FULL(mapped_privilege_list, free);
 
        TRY_FINISH_TRANSACTION(ret, db, stmt, sql);
 }
@@ -1074,3 +1057,66 @@ int privilege_db_manager_get_privilege_list_by_pkgid_and_privacy(const uid_t uid
 
        return PRIVILEGE_DB_MANAGER_ERR_NONE;
 }
+
+void free_privilege_privacy_info(privilege_privacy_info_s* p)
+{
+       SAFE_FREE(p->privilege_name);
+       SAFE_FREE(p->privacy_name);
+       SAFE_FREE(p);
+}
+
+static void __free_privilege_privacy_info_list(gpointer privilege_privacy_info_list)
+{
+       free_privilege_privacy_info((privilege_privacy_info_s*)privilege_privacy_info_list);
+}
+
+void free_privilege_privacy_info_list(GList *info_list)
+{
+       SAFE_G_LIST_FREE_FULL(info_list, __free_privilege_privacy_info_list);
+}
+
+static privilege_privacy_info_s* __new_privilege_privacy_info(const char* privilege_name, const char* privacy_name)
+{
+       privilege_privacy_info_s *p = (privilege_privacy_info_s*)malloc(sizeof(privilege_privacy_info_s));
+       TryReturn(p != NULL, , NULL, "malloc() of privilege_privacy_info_s failed.");
+
+       p->privilege_name = g_strdup(privilege_name);
+       p->privacy_name = g_strdup(privacy_name);
+
+       return p;
+}
+
+int privilege_db_manager_get_privacy_filtered_privilege_info_list(GList *privilege_list, const char* privacy_name, GList **privilege_privacy_info_list)
+{
+       TryReturn(privilege_list != NULL, , PRIVILEGE_DB_MANAGER_ERR_NONE, "The given privilege_list is empty");
+
+       sqlite3 *db = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
+
+       char* privilege_list_str = NULL;
+       TryReturn(__make_privilege_list_str(privilege_list, &privilege_list_str) == 0 && privilege_list_str != NULL, sqlite3_close(db), PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY, "[PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY] making privilege_list_str for where in query is failed.");
+
+       char* sql = NULL;
+       if (privacy_name != NULL)
+               sql = sqlite3_mprintf("select distinct privilege_name, privacy_name from privilege_info where privilege_name in (%s) and is_privacy='1' and privacy_name=%Q", privilege_list_str, privacy_name);
+       else
+               sql = sqlite3_mprintf("select distinct privilege_name, privacy_name from privilege_info where privilege_name in (%s) and is_privacy='1'", privilege_list_str);
+
+       SAFE_SQLITE_FREE(privilege_list_str);
+
+       TRY_PREPARE_STMT(db, sql, &stmt);
+
+       GList *temp_privilege_list = NULL;
+       while (sqlite3_step(stmt) == SQLITE_ROW) {
+               privilege_privacy_info_s *p = __new_privilege_privacy_info((const char*)sqlite3_column_text(stmt, 0), (const char*)sqlite3_column_text(stmt, 1));
+               TryReturn(p != NULL, free_privilege_privacy_info_list(temp_privilege_list); __finalize_db(db, stmt, sql), PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY, "[PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY] __new_privacy_privilege_info() failed.");
+               temp_privilege_list = g_list_append(temp_privilege_list, p);
+       }
+
+       __finalize_db(db, stmt, sql);
+
+       *privilege_privacy_info_list = temp_privilege_list;
+       return PRIVILEGE_DB_MANAGER_ERR_NONE;
+}
index 3cef4a3..0623bf0 100755 (executable)
@@ -470,6 +470,23 @@ static int __get_pkg_type(uid_t uid, const char *pkgid, privilege_manager_packag
        return 0;
 }
 
+/*
+ * @brief Check whether the given package is whitelisted for the given privacy privilege.
+ * @remarks @a privilege must be a privacy privilege
+ * @return 1 on privacy whitelisted case else 0 and negative value for error.
+ */
+//TODO: Add cert_level as a parameter
+static int __is_privacy_whitelisted(const char* pkgid, const char* privilege)
+{
+       TryReturn(pkgid != NULL && privilege != NULL, , -1, "[PRVMGR_ERR_INVALID_PARAMETER] pkgid and privilege shouldn't be NULL.");
+
+       int privacy_id = -1;
+       int ret = privilege_db_manager_get_privacy_id_by_privilege(privilege, &privacy_id);
+       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE && privacy_id != -1, , -1, "privilege_db_manager_get_privacy_id_by_privilege() failed. pkgid = %s, privilege = %s", pkgid, privilege);
+
+       return privilege_db_manager_is_privacy_white_list(pkgid, privacy_id);
+}
+
 int privilege_info_get_privilege_type(uid_t uid, const char* pkgid, privilege_manager_package_type_e package_type, privilege_manager_visibility_e cert_level, const char* privilege, privilege_manager_privilege_type_e *type)
 {
        TryReturn(pkgid != NULL && privilege != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] pkgid or privilege is NULL");
@@ -479,7 +496,7 @@ int privilege_info_get_privilege_type(uid_t uid, const char* pkgid, privilege_ma
        int ret = PRVMGR_ERR_NONE;
        ret = privilege_info_is_privacy(privilege);
        if (ret == 1) {
-               ret = privilege_db_manager_is_privacy_white_list(pkgid, privilege);
+               ret = __is_privacy_whitelisted(pkgid, privilege);
                if (ret == 1) {
                        *type = PRIVILEGE_MANAGER_PRIVILEGE_TYPE_NORMAL;
                        ret = PRVMGR_ERR_NONE;
@@ -525,17 +542,22 @@ int privilege_info_get_privilege_type(uid_t uid, const char* pkgid, privilege_ma
        return ret;
 }
 
-int privilege_info_is_user_settable(const char* pkgid, const char* privacy)
+int privilege_info_is_user_settable(const char* pkgid, const char* privacy_name)
 {
-       TryReturn(pkgid != NULL && privacy != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] pkgid or privacy is NULL");
-       int ret = privilege_db_manager_is_user_settable(pkgid, privacy);
+       TryReturn(pkgid != NULL && privacy_name != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] pkgid and privacy_name shoudln't be NULL");
+
+       int privacy_id = -1;
+       int ret = privilege_db_manager_get_privacy_id(privacy_name, &privacy_id);
+       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE && privacy_id != -1, , -1, "[PRVMGR_ERR_INTERNAL_ERROR] privilege_db_manager_get_privacy_id() failed. privacy_name = %s, privacy_id = %d", privacy_name, privacy_id);
+
+       ret = privilege_db_manager_is_user_settable(pkgid, privacy_id);
        if (ret == 1)
                return 1;
        else if (ret == 0)
                return 0;
 
        if (ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT)
-               LOGE("%s is invalid privacy name", privacy);
+               LOGE("%s is invalid privacy name", privacy_name);
        else
                LOGE("ret = %d", ret);
 
index 9a486c1..d83c197 100755 (executable)
                return returnValue;     \
        }
 
+static int __get_user_settable_privilege_privacy_info_list(const char* pkgid, privilege_manager_package_type_e pkg_type, const char* api_version, GList *privilege_list, GList **privilege_privacy_info_list)
+{
+       GList *mapped_privilege_list = NULL;
+       int ret = privilege_db_manager_get_mapped_privilege_list(api_version, pkg_type, privilege_list, &mapped_privilege_list);
+       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE && mapped_privilege_list != NULL, , PRVMGR_ERR_INTERNAL_ERROR, "[PRVMGR_ERR_INTERNAL_ERROR] privilege_db_manager_get_mapped_privilege_list() failed. ret = %d", ret);
+
+       ret = privilege_db_manager_get_privacy_filtered_privilege_info_list(mapped_privilege_list, NULL, privilege_privacy_info_list);
+       privilege_db_manager_list_free(mapped_privilege_list);
+       TryReturn(ret == PRIVILEGE_DB_MANAGER_ERR_NONE, ,PRVMGR_ERR_INTERNAL_ERROR, "[PRVMGR_ERR_INTERNAL_ERROR] privilege_db_manager_get_privacy_filtered_privilege_info_list() failed. ret = %d", ret);
+
+       GList *ll = NULL;
+       for (GList *l = *privilege_privacy_info_list; l != NULL; l = ll, ret = PRVMGR_ERR_NONE) {
+               ll = l->next;
+               int privacy_id = -1;
+               const char* privilege = (const char*)((privilege_privacy_info_s*)l->data)->privilege_name;
+               ret = privilege_db_manager_get_privacy_id_by_privilege(privilege, &privacy_id);
+               if (ret == PRIVILEGE_DB_MANAGER_ERR_NONE && privacy_id != -1) {
+                       ret = privilege_db_manager_is_user_settable(pkgid, privacy_id);
+                       if (ret == 1) {
+                               continue;
+                       } else if (ret == 0) {
+                               privilege_privacy_info_s* tmp = l->data;
+                               *privilege_privacy_info_list = g_list_remove(*privilege_privacy_info_list, tmp);
+                               free_privilege_privacy_info(tmp);
+                       } else {
+                               LOGE("privilege_db_manager_is_user_settable(%s, %d) failed. ret = %d", pkgid, privacy_id, ret);
+                               ret = PRVMGR_ERR_INTERNAL_ERROR;
+                               break;
+                       }
+               } else {
+                       LOGE("privilege_db_manager_get_privacy_id_by_privilege() failed. privilege = %s. ret = %d", privilege, ret);
+                       ret = PRVMGR_ERR_INTERNAL_ERROR;
+                       break;
+               }
+       }
+       return ret;
+}
+
 int privilege_package_info_set_privacy_privilege(const uid_t uid, const char* pkgid, privilege_manager_package_type_e pkg_type, const char* api_version, GList* privilege_list)
 {
        if (DISABLE_ASKUSER)
                return PRVMGR_ERR_NONE;
-
        TryReturn(pkgid != NULL && api_version != NULL && privilege_list != NULL, , PRVMGR_ERR_INVALID_PARAMETER, "[PRVMGR_ERR_INVALID_PARAMETER] pkgid, api_version, and privilege_list must not be NULL.");
-       int ret = privilege_db_manager_set_package_privacy_privilege_info(uid, pkgid, pkg_type, api_version, privilege_list);
+
+       GList *privilege_privacy_info_list = NULL;
+       int ret = __get_user_settable_privilege_privacy_info_list(pkgid, pkg_type, api_version, privilege_list, &privilege_privacy_info_list);
+       TryReturn(ret == PRVMGR_ERR_NONE, , PRVMGR_ERR_INTERNAL_ERROR, "__get_user_settable_privilege_privacy_info_list() failed. ret = %d", ret);
+
+       if (privilege_privacy_info_list == NULL) {
+               LOGD("%s have no user-settable privacy privilege", pkgid);
+               return PRVMGR_ERR_NONE;
+       }
+
+       ret = privilege_db_manager_set_package_privacy_privilege_info(uid, pkgid, api_version, privilege_privacy_info_list);
+       free_privilege_privacy_info_list(privilege_privacy_info_list);
+
        if (ret != PRIVILEGE_DB_MANAGER_ERR_NONE) {
                LOGE("privilege_db_manager_set_package_privacy_privilege_info failed. ret = %d", ret);
                return PRVMGR_ERR_INTERNAL_ERROR;
index a7dfbe2..8211444 100755 (executable)
@@ -87,8 +87,8 @@ char* __get_result_string(char type, int ret)
                        return "PRIVILEGE_DB_MANAGER_ERR_INVALID_QUERY";
                else if (ret == PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY)
                        return "PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY";
-               else if (ret == PRIVILEGE_DB_MANAGER_ERR_INVALID_TYPE)
-                       return "PRIVILEGE_DB_MANAGER_ERR_INVALID_TYPE";
+               else if (ret == PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER)
+                       return "PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER";
                else if (ret == PRIVILEGE_DB_MANAGER_ERR_DB_BUSY_FAIL)
                        return "PRIVILEGE_DB_MANAGER_ERR_DB_BUSY_FAIL";
                else if (ret == PRIVILEGE_DB_MANAGER_ERR_DB_CONSTRAINT_FAIL)
index 8c25b59..ae8a769 100755 (executable)
@@ -387,9 +387,9 @@ void __test_privilege_db_manager_is_privacy_white_list()
 
        __print_line();
        printf("pkgid: ise-default\n");
-       printf("privilege: http://tizen.org/privilege/call\n");
+       printf("privilege: http://tizen.org/privilege/call => privacy ID: 3\n");
        printf("is privacy whitelist\n");
-       ret = privilege_db_manager_is_privacy_white_list("ise-default", "http://tizen.org/privilege/call");
+       ret = privilege_db_manager_is_privacy_white_list("ise-default", 3);
        printf("ret = %d\n", ret);
        if ((ENABLE_ASKUSER && ret == 1) || (DISABLE_ASKUSER && ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT)) {
                success_cnt++;
@@ -401,9 +401,9 @@ void __test_privilege_db_manager_is_privacy_white_list()
 
        __print_line();
        printf("pkgid: ise-default\n");
-       printf("privilege: http://tizen.org/privilege/location\n");
+       printf("privilege: http://tizen.org/privilege/location => privacy ID: 7\n");
        printf("is not privacy whitelist\n");
-       ret = privilege_db_manager_is_privacy_white_list("ise-default", "http://tizen.org/privilege/location");
+       ret = privilege_db_manager_is_privacy_white_list("ise-default", 7);
        printf("ret = %d\n", ret);
        if ((ENABLE_ASKUSER && ret == 0) || (DISABLE_ASKUSER && ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT)) {
                success_cnt++;
@@ -415,9 +415,9 @@ void __test_privilege_db_manager_is_privacy_white_list()
 
        __print_line();
        printf("pkgid: ise-default\n");
-       printf("privilege: http://tizen.org/privilege/calendar.read\n");
+       printf("privilege: http://tizen.org/privilege/calendar.read => privacy ID: 2\n");
        printf("is privacy whitelist\n");
-       ret = privilege_db_manager_is_privacy_white_list("ise-default", "http://tizen.org/privilege/calendar.read");
+       ret = privilege_db_manager_is_privacy_white_list("ise-default", 2);
        printf("ret = %d\n", ret);
        if ((ENABLE_ASKUSER && ret == 1) || (DISABLE_ASKUSER && ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT)) {
                success_cnt++;
@@ -429,9 +429,9 @@ void __test_privilege_db_manager_is_privacy_white_list()
 
        __print_line();
        printf("pkgid: orxxxxx\n");
-       printf("privilege: http://tizen.org/privilege/call\n");
+       printf("privilege: http://tizen.org/privilege/call => privacy ID: 3\n");
        printf("is not privacy whitelist\n");
-       ret = privilege_db_manager_is_privacy_white_list("orxxxxx", "http://tizen.org/privilege/call");
+       ret = privilege_db_manager_is_privacy_white_list("orxxxxx", 3);
        printf("ret = %d\n", ret);
        if ((ENABLE_ASKUSER && ret == 0) || (DISABLE_ASKUSER && ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT)) {
                success_cnt++;
@@ -478,9 +478,9 @@ void __test_privilege_db_manager_is_user_settable()
 
        __print_line();
        printf("pkgid: ise-default\n");
-       printf("privilege: http://tizen.org/privacy/calendar\n");
+       printf("privilege: http://tizen.org/privacy/calendar => privacy ID: 2\n");
        printf("is not user-settable\n");
-       ret = privilege_db_manager_is_user_settable("ise-default", "http://tizen.org/privacy/calendar");
+       ret = privilege_db_manager_is_user_settable("ise-default", 2);
        printf("ret = %d\n", ret);
        if ((ENABLE_ASKUSER && ret == 0) || (DISABLE_ASKUSER && ret == 1)) {
                success_cnt++;
@@ -492,9 +492,9 @@ void __test_privilege_db_manager_is_user_settable()
 
        __print_line();
        printf("pkgid: ise-default\n");
-       printf("privilege: http://tizen.org/privacy/location\n");
+       printf("privilege: http://tizen.org/privacy/location => privacy ID: 7\n");
        printf("is user-settable\n");
-       ret = privilege_db_manager_is_user_settable("ise-default", "http://tizen.org/privacy/location");
+       ret = privilege_db_manager_is_user_settable("ise-default", 7);
        printf("ret = %d\n", ret);
        if (ret == 1) {
                success_cnt++;
@@ -506,9 +506,9 @@ void __test_privilege_db_manager_is_user_settable()
 
        __print_line();
        printf("pkgid: org.tizen.xxxxxxx\n");
-       printf("privilege: http://tizen.org/privacy/location\n");
+       printf("privilege: http://tizen.org/privacy/location => privacy ID: 7\n");
        printf("is user-settable\n");
-       ret = privilege_db_manager_is_user_settable("org.tizen.xxxxxxx", "http://tizen.org/privacy/location");
+       ret = privilege_db_manager_is_user_settable("org.tizen.xxxxxxx", 7);
        printf("ret = %d\n", ret);
        if (ret == 1) {
                success_cnt++;
@@ -522,9 +522,12 @@ void __test_privilege_db_manager_is_user_settable()
        printf("pkgid: org.tizen.xxxxxxx\n");
        printf("privilege: http://tizen.org/privacy/xxxxx\n");
        printf("is user-settable\n");
-       ret = privilege_db_manager_is_user_settable("org.tizen.xxxxxxx", "http://tizen.org/privacy/xxxxx");
-       printf("ret = %d\n", ret);
-       if (ret == PRIVILEGE_DB_MANAGER_ERR_NO_EXIST_RESULT) {
+       ret = privilege_db_manager_is_user_settable("org.tizen.xxxxxxx", -1);
+       if (ret < 0)
+               printf("ret = %s\n", __get_result_string('d', ret));
+       else
+               printf("ret = %d\n", ret);
+       if (ret == PRIVILEGE_DB_MANAGER_ERR_INVALID_PARAMETER) {
                success_cnt++;
                printf_green("success\n");
        } else {