From ff4ec1895ee086c291bfce33f4e3e1baf2a16fd7 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Fri, 6 Jan 2017 13:59:35 +0900 Subject: [PATCH] Fix appinfo to check additional db - Add codes to check package_app_info_for_uid table to check certain global app is disabled for this user or not. Change-Id: Id0f0fb80872cb6443795e860f4a7e07f033d3b04 Signed-off-by: Junghyun Yeon --- src/pkgmgrinfo_appinfo.c | 27 +++++++++++++++++++-------- src/pkgmgrinfo_pkginfo.c | 6 +++--- src/pkgmgrinfo_private.c | 12 ++++++++++-- src/pkgmgrinfo_private.h | 3 ++- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index edf146a..92c8647 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -52,9 +52,12 @@ static const char join_app_control[] = static const char join_metadata[] = " LEFT OUTER JOIN package_app_app_metadata" " ON ai.app_id=package_app_app_metadata.app_id "; +static const char join_appinfo_for_uid[] = + " LEFT OUTER JOIN package_app_info_for_uid" + " ON ai.app_id=package_app_info_for_uid.app_id "; static int _get_filtered_query(pkgmgrinfo_filter_x *filter, - const char *locale, char **query, GList **bind_params) + const char *locale, uid_t uid, char **query, GList **bind_params) { int joined = 0; size_t len = 0; @@ -75,7 +78,7 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter, } for (list = filter->list; list; list = list->next) { - joined |= __get_filter_condition(list->data, &condition, bind_params); + joined |= __get_filter_condition(list->data, uid, &condition, bind_params); if (condition == NULL) continue; @@ -105,6 +108,10 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter, strncat(tmp_query, join_metadata, MAX_QUERY_LEN - len - 1); len += strlen(join_metadata); } + if (joined & E_PMINFO_APPINFO_JOIN_APPINFO_FOR_UID) { + strncat(tmp_query, join_appinfo_for_uid, MAX_QUERY_LEN - len - 1); + len += strlen(join_appinfo_for_uid); + } strncat(tmp_query, buf, MAX_QUERY_LEN - len - 1); len += strlen(buf); @@ -426,14 +433,17 @@ static int __get_appinfo_for_uid(sqlite3 *db, application_x *info, uid_t uid) _save_column_str(stmt, 0, &info->splash_screen_display); if (strcasecmp(info->is_disabled, "false") == 0) { _save_column_str(stmt, 1, &is_disabled); - if (strcasecmp(is_disabled, "true") == 0) - ret = PMINFO_R_ERROR; - free(is_disabled); + if (strcasecmp(is_disabled, "true") == 0) { + free(info->is_disabled); + info->is_disabled = is_disabled; + } else { + free(is_disabled); + } } } sqlite3_finalize(stmt); - return ret; + return PMINFO_R_OK; } static void __free_applications(gpointer data) @@ -582,7 +592,7 @@ static int _appinfo_get_applications(uid_t db_uid, uid_t uid, is_check_storage = __check_app_storage_status(filter); - ret = _get_filtered_query(filter, locale, &constraint, &bind_params); + ret = _get_filtered_query(filter, locale, uid, &constraint, &bind_params); if (ret != PMINFO_R_OK) { LOGE("Failed to get WHERE clause"); goto catch; @@ -674,6 +684,7 @@ static int _appinfo_get_applications(uid_t db_uid, uid_t uid, if (db_uid == GLOBAL_USER) { ret = __get_appinfo_for_uid(db, info, uid); if (ret != PMINFO_R_OK) { + LOGI("Failed to get appinfo for given uid[%d]", (int)uid); pkgmgrinfo_basic_free_application(info); info = NULL; continue; @@ -796,7 +807,7 @@ static int _pkgmgrinfo_get_appinfo(const char *appid, uid_t uid, ret = _appinfo_get_applications(uid, uid, locale, filter, PMINFO_APPINFO_GET_ALL, list); if (!g_hash_table_size(list) && uid != GLOBAL_USER) - ret = _appinfo_get_applications(GLOBAL_USER, GLOBAL_USER, locale, filter, + ret = _appinfo_get_applications(GLOBAL_USER, uid, locale, filter, PMINFO_APPINFO_GET_ALL, list); if (!g_hash_table_size(list)) { diff --git a/src/pkgmgrinfo_pkginfo.c b/src/pkgmgrinfo_pkginfo.c index 5add4b0..5c0792c 100644 --- a/src/pkgmgrinfo_pkginfo.c +++ b/src/pkgmgrinfo_pkginfo.c @@ -220,7 +220,7 @@ static const char join_privilege_info[] = " ON pi.package=package_privilege_info.package"; static int _get_filtered_query(pkgmgrinfo_filter_x *filter, - const char *locale, char **query, GList **bind_params) + const char *locale, uid_t uid, char **query, GList **bind_params) { int joined = 0; char buf[MAX_QUERY_LEN] = { '\0' }; @@ -235,7 +235,7 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter, len += strlen(" WHERE 1=1 "); strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1); for (list = filter->list; list; list = list->next) { - joined |= __get_filter_condition(list->data, &condition, + joined |= __get_filter_condition(list->data, uid, &condition, bind_params); if (condition == NULL) continue; @@ -419,7 +419,7 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale, strncat(query, query_from_clause, MAX_QUERY_LEN - query_len - 1); query_len += strlen(query_from_clause); - ret = _get_filtered_query(tmp_filter, locale, &constraints, &bind_params); + ret = _get_filtered_query(tmp_filter, locale, uid, &constraints, &bind_params); if (ret != PMINFO_R_OK) { LOGE("Failed to get WHERE clause"); goto catch; diff --git a/src/pkgmgrinfo_private.c b/src/pkgmgrinfo_private.c index 7e26eb0..1d31430 100644 --- a/src/pkgmgrinfo_private.c +++ b/src/pkgmgrinfo_private.c @@ -235,7 +235,7 @@ inline pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool( return prop; } -int __get_filter_condition(gpointer data, char **condition, GList **params) +int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **params) { pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data; char buf[MAX_QUERY_LEN] = {'\0'}; @@ -386,7 +386,15 @@ int __get_filter_condition(gpointer data, char **condition, GList **params) flag = E_PMINFO_APPINFO_JOIN_METADATA; break; case E_PMINFO_APPINFO_PROP_APP_DISABLE: - snprintf(buf, MAX_QUERY_LEN, "ai.app_disable=? COLLATE NOCASE"); + if (strcasecmp(node->value, "true") == 0) + snprintf(buf, MAX_QUERY_LEN, "(ai.app_disable=? COLLATE NOCASE OR " + "ai.app_id IN (SELECT app_id FROM package_app_info_for_uid " + "WHERE uid=%d AND is_disabled='true'))", uid); + else + snprintf(buf, MAX_QUERY_LEN, "(ai.app_disable=? COLLATE NOCASE AND " + "ai.app_id NOT IN (SELECT app_id FROM package_app_info_for_uid " + "WHERE uid=%d AND is_disabled='true'))", uid); + flag = E_PMINFO_APPINFO_JOIN_APPINFO_FOR_UID; break; case E_PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE: snprintf(buf, MAX_QUERY_LEN, "ai.app_support_disable=? COLLATE NOCASE"); diff --git a/src/pkgmgrinfo_private.h b/src/pkgmgrinfo_private.h index b86d19e..f78c5cb 100644 --- a/src/pkgmgrinfo_private.h +++ b/src/pkgmgrinfo_private.h @@ -176,6 +176,7 @@ typedef enum _pkgmgrinfo_appinfo_join_flag { E_PMINFO_APPINFO_JOIN_CATEGORY = 0x0002, E_PMINFO_APPINFO_JOIN_APP_CONTROL = 0x0004, E_PMINFO_APPINFO_JOIN_METADATA = 0x0008, + E_PMINFO_APPINFO_JOIN_APPINFO_FOR_UID = 0x0010, } pkgmgrinfo_appinfo_join_flag; typedef struct _pkgmgr_pkginfo_x { @@ -240,7 +241,7 @@ int __open_cert_db(uid_t uid, bool readonly); void _save_column_int(sqlite3_stmt *stmt, int idx, int *i); void _save_column_str(sqlite3_stmt *stmt, int idx, char **str); char *_get_system_locale(void); -int __get_filter_condition(gpointer data, char **condition, GList **param); +int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **param); int _add_icon_info_into_list(const char *locale, char *value, GList **icon); int _add_label_info_into_list(const char *locale, char *value, GList **label); int __pkginfo_check_installed_storage(package_x *pkginfo); -- 2.7.4