From: Sangyoon Jang Date: Wed, 9 Aug 2017 03:09:26 +0000 (+0900) Subject: Fix some outdated sqlite query logic X-Git-Tag: accepted/tizen/unified/20170816.160025~1 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git;a=commitdiff_plain;h=c167c513fa3e91619344cf73675b75886dd016b1 Fix some outdated sqlite query logic Change-Id: I165099252ef082801a5d149cae8aad6de0bed535 Signed-off-by: Sangyoon Jang --- diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index e56c602..c978a8e 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -2172,43 +2172,117 @@ API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int * return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid, - const char *type, uid_t uid, char **appid, char **access) +static int _appinfo_get_datacontrol_info(sqlite3 *db, const char *providerid, + const char *type, char **appid, char **access) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - retvm_if(access == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; + static const char query[] = + "SELECT app_id, access FROM package_app_data_control " + "WHERE providerid=? AND type=?"; + int ret; + sqlite3_stmt *stmt; - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } - /*Start constructing query*/ - query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q and type=%Q", providerid, type); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } - /*step query*/ ret = sqlite3_step(stmt); - tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + if (ret != SQLITE_ROW) { + sqlite3_finalize(stmt); + if (ret == SQLITE_DONE) { + return PMINFO_R_ENOENT; + } else { + LOGE("step error: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + } *appid = strdup((char *)sqlite3_column_text(stmt, 0)); - *access = strdup((char *)sqlite3_column_text(stmt, 2)); - - ret = PMINFO_R_OK; + if (*appid == NULL) { + LOGE("out of memory"); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } + *access = strdup((char *)sqlite3_column_text(stmt, 1)); + if (*access == NULL) { + LOGE("out of memory"); + free(*appid); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + return PMINFO_R_OK; +} + +static int _pkgmgrinfo_appinfo_get_datacontrol_info(uid_t uid, + const char *providerid, const char *type, + char **appid, char **access) +{ + int ret; + char *dbpath; + sqlite3 *db; + + dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); + if (dbpath == NULL) + return PMINFO_R_ERROR; + + ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); + free(dbpath); + if (ret != SQLITE_OK) { + LOGE("open db failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + + ret = _appinfo_get_datacontrol_info(db, providerid, type, appid, + access); + sqlite3_close_v2(db); + + return ret; +} + +API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid, + const char *type, uid_t uid, char **appid, char **access) +{ + int ret; + + if (providerid == NULL || type == NULL || appid == NULL || + access == NULL) { + LOGE("invalid parameter"); + return PMINFO_R_EINVAL; + } + + ret = _pkgmgrinfo_appinfo_get_datacontrol_info(GLOBAL_USER, providerid, + type, appid, access); + if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) + ret = _pkgmgrinfo_appinfo_get_datacontrol_info(uid, providerid, + type, appid, access); + + /* FIXME: It should return PMINFO_R_ENOENT but to keep previous + * implementation, return PMINFO_R_ERROR. This should be + * modified later... + */ + if (ret == PMINFO_R_ENOENT) { + LOGE("no datacontrol info of %s", providerid); + ret = PMINFO_R_ERROR; + } + return ret; } @@ -2219,39 +2293,100 @@ API int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, type, _getuid(), appid, access); } -API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, uid_t uid, char **appid) +static int _appinfo_get_datacontrol_appid(sqlite3 *db, const char *providerid, + char **appid) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; - - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + static const char query[] = + "SELECT app_id FROM package_app_data_control " + "WHERE providerid=?"; + int ret; + sqlite3_stmt *stmt; - /*Start constructing query*/ - query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q", providerid); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } - /*step query*/ ret = sqlite3_step(stmt); - tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + if (ret != SQLITE_ROW) { + sqlite3_finalize(stmt); + if (ret == SQLITE_DONE) { + return PMINFO_R_ENOENT; + } else { + LOGE("step error: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + } *appid = strdup((char *)sqlite3_column_text(stmt, 0)); - ret = PMINFO_R_OK; - -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + if (*appid == NULL) { + LOGE("out of memory"); + return PMINFO_R_ERROR; + } + + return PMINFO_R_OK; +} + +static int _pkgmgrinfo_appinfo_get_datacontrol_appid(uid_t uid, + const char *providerid, char **appid) +{ + int ret; + char *dbpath; + sqlite3 *db; + + dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); + if (dbpath == NULL) + return PMINFO_R_ERROR; + + ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); + free(dbpath); + if (ret != SQLITE_OK) { + LOGE("open db failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + + ret = _appinfo_get_datacontrol_appid(db, providerid, appid); + sqlite3_close_v2(db); + + return ret; +} + +API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, + uid_t uid, char **appid) +{ + int ret; + + if (providerid == NULL || appid == NULL) { + LOGE("invalid parameter"); + return PMINFO_R_EINVAL; + } + + ret = _pkgmgrinfo_appinfo_get_datacontrol_appid(GLOBAL_USER, providerid, + appid); + if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) + ret = _pkgmgrinfo_appinfo_get_datacontrol_appid(uid, providerid, + appid); + + /* FIXME: It should return PMINFO_R_ENOENT but to keep previous + * implementation, return PMINFO_R_ERROR. This should be + * modified later... + */ + if (ret == PMINFO_R_ENOENT) { + LOGE("no datacontrol appid of %s", providerid); + ret = PMINFO_R_ERROR; + } + return ret; } @@ -2260,41 +2395,113 @@ API int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char ** return pkgmgrinfo_appinfo_usr_get_datacontrol_appid(providerid, _getuid(), appid); } -API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info(const char *providerid, - const char *type, uid_t uid, char **appid, bool *is_trusted) +static int _appinfo_get_datacontrol_trusted_info(sqlite3 *db, + const char *providerid, const char *type, char **appid, + bool *is_trusted) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; + static const char query[] = + "SELECT app_id, trusted FROM package_app_data_control " + "WHERE providerid=? AND type=?"; + int ret; + sqlite3_stmt *stmt; - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } - /*Start constructing query*/ - query = sqlite3_mprintf("SELECT app_id, trusted FROM package_app_data_control WHERE providerid=%Q AND type=%Q", providerid, type); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } - /*step query*/ ret = sqlite3_step(stmt); - tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + if (ret != SQLITE_ROW) { + sqlite3_finalize(stmt); + if (ret == SQLITE_DONE) { + return PMINFO_R_ENOENT; + } else { + LOGE("step error: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + } - _save_column_str(stmt, 0, appid); + *appid = strdup((char *)sqlite3_column_text(stmt, 0)); *is_trusted = _get_bool_value((char *)sqlite3_column_text(stmt, 1)); - ret = PMINFO_R_OK; - -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + if (*appid == NULL) { + LOGE("out of memory"); + return PMINFO_R_ERROR; + } + + return PMINFO_R_OK; +} + +static int _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(uid_t uid, + const char *providerid, const char *type, char **appid, + bool *is_trusted) +{ + int ret; + char *dbpath; + sqlite3 *db; + + dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); + if (dbpath == NULL) + return PMINFO_R_ERROR; + + ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); + free(dbpath); + if (ret != SQLITE_OK) { + LOGE("open db failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + + ret = _appinfo_get_datacontrol_trusted_info(db, providerid, type, appid, + is_trusted); + sqlite3_close_v2(db); + + return ret; +} + +API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info( + const char *providerid, const char *type, uid_t uid, + char **appid, bool *is_trusted) +{ + int ret; + + if (providerid == NULL || type == NULL || appid == NULL || + is_trusted == NULL) { + LOGE("invalid parameter"); + return PMINFO_R_EINVAL; + } + + ret = _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(GLOBAL_USER, + providerid, type, appid, is_trusted); + if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) + ret = _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(uid, + providerid, type, appid, is_trusted); + + /* FIXME: It should return PMINFO_R_ENOENT but to keep previous + * implementation, return PMINFO_R_ERROR. This should be + * modified later... + */ + if (ret == PMINFO_R_ENOENT) { + LOGE("no datacontrol trusted info of %s", providerid); + ret = PMINFO_R_ERROR; + } + return ret; } @@ -2305,51 +2512,107 @@ API int pkgmgrinfo_appinfo_get_datacontrol_trsuted_info(const char *providerid, type, _getuid(), appid, is_trusted); } -API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid) +static int _appinfo_foreach_datacontrol_privileges(sqlite3 *db, + const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) { - retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); - retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL"); - - int ret = PMINFO_R_OK; - char *query = NULL; - sqlite3_stmt *stmt = NULL; + static const char query[] = + "SELECT privilege FROM package_app_data_control_privilege " + "WHERE providerid=? AND type=?"; + int ret; + sqlite3_stmt *stmt; + int count = 0; - /*open db*/ - ret = __open_manifest_db(uid, true); - retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } - /*Start constructing query*/ - query = sqlite3_mprintf("SELECT privilege FROM package_app_data_control_privilege " - "WHERE providerid=%Q AND type=%Q", providerid, type); - tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory"); + ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } - /*prepare query*/ - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL); - tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return PMINFO_R_ERROR; + } while (sqlite3_step(stmt) == SQLITE_ROW) { - char *privilege; - privilege = (char *)sqlite3_column_text(stmt, 0); - ret = privilege_func(privilege, user_data); + count++; + ret = callback((const char *)sqlite3_column_text(stmt, 0), + user_data); if (ret < 0) break; } - ret = PMINFO_R_OK; - -catch: - sqlite3_free(query); sqlite3_finalize(stmt); - __close_manifest_db(); + + return count ? PMINFO_R_OK : PMINFO_R_ENOENT; +} + +static int _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid_t uid, + const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) +{ + int ret; + char *dbpath; + sqlite3 *db; + + dbpath = getUserPkgParserDBPathUID(GLOBAL_USER); + if (dbpath == NULL) + return PMINFO_R_ERROR; + + ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); + free(dbpath); + if (ret != SQLITE_OK) { + LOGE("open db failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + + ret = _appinfo_foreach_datacontrol_privileges(db, providerid, type, + callback, user_data); + sqlite3_close_v2(db); + return ret; } -API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(const char *providerid, const char *type, - pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data) +API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges( + const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, + void *user_data, uid_t uid) { - return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(providerid, type, privilege_func, - user_data, _getuid()); + int ret; + + if (providerid == NULL || type == NULL || privilege_func == NULL) { + LOGE("invalid parameter"); + return PMINFO_R_EINVAL; + } + + ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(GLOBAL_USER, + providerid, type, privilege_func, user_data); + if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) + ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid, + providerid, type, privilege_func, user_data); + + if (ret == PMINFO_R_ENOENT) + ret = PMINFO_R_OK; + + return ret; +} + +API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges( + const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, + void *user_data) +{ + return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges( + providerid, type, privilege_func, user_data, _getuid()); } API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode) @@ -2416,61 +2679,102 @@ API int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, return PMINFO_R_OK; } -API int pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(const char *appid, - const char *operation, const char *uri, const char *mime, - pkgmgrinfo_pkg_privilege_list_cb privilege_func, - void *user_data, uid_t uid) +static int _appinfo_foreach_appcontrol_privileges(sqlite3 *db, + const char *appid, const char *app_control, + pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) { - static const char query_raw[] = + static const char query[] = "SELECT privilege FROM package_app_app_control_privilege " - "WHERE app_id=%Q AND app_control=%Q"; + "WHERE app_id=? AND app_control=?"; int ret; - char *query; sqlite3_stmt *stmt; - char *privilege; - char app_control[BUFSIZE]; - - if (appid == NULL || operation == NULL || privilege_func == NULL) { - LOGE("invalid parameter"); - return PMINFO_R_EINVAL; - } + int count = 0; - snprintf(app_control, sizeof(app_control), "%s|%s|%s", operation, - uri ? uri : "NULL", mime ? mime : "NULL"); - - ret = __open_manifest_db(uid, true); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); if (ret != SQLITE_OK) { - LOGE("open db failed"); + LOGE("prepare failed: %s", sqlite3_errmsg(db)); return PMINFO_R_ERROR; } - query = sqlite3_mprintf(query_raw, appid, app_control); - if (query == NULL) { - LOGE("out of memory"); - __close_manifest_db(); + ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return PMINFO_R_ERROR; } - ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), - &stmt, NULL); - sqlite3_free(query); - if (ret != PMINFO_R_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(GET_DB(manifest_db))); - __close_manifest_db(); + ret = sqlite3_bind_text(stmt, 2, app_control, -1, SQLITE_STATIC); + if (ret != SQLITE_OK) { + LOGE("bind failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return PMINFO_R_ERROR; } while (sqlite3_step(stmt) == SQLITE_ROW) { - privilege = (char *)sqlite3_column_text(stmt, 0); - ret = privilege_func(privilege, user_data); + count++; + ret = callback((const char *)sqlite3_column_text(stmt, 0), + user_data); if (ret < 0) break; } sqlite3_finalize(stmt); - __close_manifest_db(); - return PMINFO_R_OK; + return count ? PMINFO_R_OK : PMINFO_R_ENOENT; +} + +static int _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(uid_t uid, + const char *appid, const char *app_control, + pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data) +{ + int ret; + char *dbpath; + sqlite3 *db; + + dbpath = getUserPkgParserDBPathUID(uid); + if (dbpath == NULL) + return PMINFO_R_ERROR; + + ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY); + free(dbpath); + if (ret != SQLITE_OK) { + LOGE("open db failed: %s", sqlite3_errmsg(db)); + return PMINFO_R_ERROR; + } + + ret = _appinfo_foreach_appcontrol_privileges(db, appid, app_control, + callback, user_data); + sqlite3_close_v2(db); + + return ret; +} + +API int pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(const char *appid, + const char *operation, const char *uri, const char *mime, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, + void *user_data, uid_t uid) +{ + int ret; + char app_control[BUFSIZE]; + + if (appid == NULL || operation == NULL || privilege_func == NULL) { + LOGE("invalid parameter"); + return PMINFO_R_EINVAL; + } + + snprintf(app_control, sizeof(app_control), "%s|%s|%s", operation, + uri ? uri : "NULL", mime ? mime : "NULL"); + + ret = _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(GLOBAL_USER, + appid, app_control, privilege_func, user_data); + if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER) + ret = _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(uid, + appid, app_control, privilege_func, user_data); + + if (ret == PMINFO_R_ENOENT) + ret = PMINFO_R_OK; + + return ret; } API int pkgmgrinfo_appinfo_foreach_appcontrol_privileges(const char *appid, diff --git a/src/pkgmgrinfo_certinfo.c b/src/pkgmgrinfo_certinfo.c index c626b51..d86be31 100644 --- a/src/pkgmgrinfo_certinfo.c +++ b/src/pkgmgrinfo_certinfo.c @@ -627,14 +627,14 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha if (_pkginfo_save_cert_index_info(db, info->cert_info)) { _LOGE("failed to save cert index info, rollback now"); - sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); sqlite3_close_v2(db); return PMINFO_R_ERROR; } if (_pkginfo_save_cert_info(db, pkgid, info->cert_info)) { _LOGE("failed to save cert info, rollback now"); - sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); sqlite3_close_v2(db); return PMINFO_R_ERROR; } @@ -642,7 +642,7 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL); if (ret != SQLITE_OK) { _LOGE("failed to commit transaction, rollback now"); - sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); sqlite3_close_v2(db); return PMINFO_R_ERROR; } @@ -738,7 +738,7 @@ API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid) if (_pkginfo_delete_certinfo(db, pkgid)) { _LOGE("failed to delete certinfo of %s, rollback now", pkgid); - sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); sqlite3_close_v2(db); return PMINFO_R_ERROR; } @@ -746,7 +746,7 @@ API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid) ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL); if (ret != SQLITE_OK) { _LOGE("failed to commit transaction, rollback now"); - sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); sqlite3_close_v2(db); return PMINFO_R_ERROR; } diff --git a/src/pkgmgrinfo_db.c b/src/pkgmgrinfo_db.c index 37f2771..0075ff1 100644 --- a/src/pkgmgrinfo_db.c +++ b/src/pkgmgrinfo_db.c @@ -21,9 +21,6 @@ #include "pkgmgr_parser.h" #include "pkgmgr_parser_db.h" -__thread db_handle manifest_db; -__thread db_handle cert_db; - typedef int (*sqlite_query_callback)(void *data, int ncols, char **coltxt, char **colname); static int _mkdir_for_user(const char* dir, uid_t uid, gid_t gid) @@ -109,40 +106,6 @@ static char *_get_db_path(uid_t uid) return strdup(path); } -static int __attach_and_create_view(sqlite3 *handle, const char *db, const char *tables[], uid_t uid) -{ - int i; - char *err = NULL; - char query[MAX_QUERY_LEN]; - - if (uid != GLOBAL_USER && uid != ROOT_UID) { - snprintf(query, sizeof(query), "ATTACH DATABASE '%s' AS Global", db); - if (SQLITE_OK != sqlite3_exec(handle, query, NULL, NULL, &err)) { - _LOGD("Don't execute query = %s error message = %s\n", query, err); - sqlite3_free(err); - return SQLITE_ERROR; - } - } - - for (i = 0; tables[i]; i++) { - if (uid != GLOBAL_USER && uid != ROOT_UID) - snprintf(query, sizeof(query), "CREATE TEMP VIEW '%s' AS SELECT * \ - FROM (SELECT *,0 AS for_all_users FROM main.'%s' UNION \ - SELECT *,1 AS for_all_users FROM Global.'%s')", - tables[i], tables[i], tables[i]); - else - snprintf(query, sizeof(query), "CREATE TEMP VIEW '%s' AS SELECT * \ - FROM (SELECT *,1 AS for_all_users FROM main.'%s')", - tables[i], tables[i]); - if (SQLITE_OK != sqlite3_exec(handle, query, NULL, NULL, &err)) { - _LOGD("Don't execute query = %s error message = %s\n", query, err); - sqlite3_free(err); - } - } - - return SQLITE_OK; -} - int _check_create_cert_db(void) { return pkgmgr_parser_initialize_cert_db(); @@ -281,143 +244,6 @@ API const char *getUserManifestPath(uid_t uid, bool readonly) return path; } -int __close_manifest_db(void) -{ - if (manifest_db.ref) { - if (--manifest_db.ref == 0) - sqlite3_close(GET_DB(manifest_db)); - return 0; - } - return -1; -} - -static const char *parserdb_tables[] = { - "package_app_app_category", - "package_app_info", - "package_app_app_control", - "package_app_localized_info", - "package_app_app_metadata", - "package_info", - "package_app_data_control", - "package_localized_info", - "package_privilege_info", - "package_appdefined_privilege_info", - "package_app_data_control_privilege", - NULL -}; - -int __open_manifest_db(uid_t uid, bool readonly) -{ - int ret; - char *user_pkg_parser; - int flags; - - if (manifest_db.ref) { - manifest_db.ref++; - return 0; - } - - user_pkg_parser = getUserPkgParserDBPathUID(uid); - if (user_pkg_parser == NULL) { - _LOGE("Failed to get pkg parser db path - %d", uid); - return -1; - } - - if (access(user_pkg_parser, F_OK) != 0) { - _LOGE("Manifest DB does not exists !!"); - free(user_pkg_parser); - return -1; - } - - flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE; - ret = db_util_open_with_options(user_pkg_parser, &GET_DB(manifest_db), - flags, NULL); - if (ret != SQLITE_OK) { - _LOGE("connect db [%s] failed!\n", user_pkg_parser); - free(user_pkg_parser); - return -1; - } - - manifest_db.ref++; - if (readonly) { - ret = __attach_and_create_view(GET_DB(manifest_db), MANIFEST_DB, - parserdb_tables, uid); - if (ret != SQLITE_OK) { - _LOGE("attach db [%s] failed!\n", user_pkg_parser); - free(user_pkg_parser); - return -1; - } - } - - free(user_pkg_parser); - - return 0; -} - -int __close_cert_db(void) -{ - if (cert_db.ref) { - if (--cert_db.ref == 0) - sqlite3_close_v2(GET_DB(cert_db)); - return 0; - } - _LOGE("Certificate DB is already closed !!\n"); - return -1; -} - -static const char *certdb_tables[] = { - "package_cert_index_info", - "package_cert_info", - NULL -}; - -int __open_cert_db(uid_t uid, bool readonly) -{ - int ret; - char *user_cert_parser; - int flags; - - if (cert_db.ref) { - cert_db.ref++; - return 0; - } - - user_cert_parser = getUserPkgCertDBPathUID(uid); - if (user_cert_parser == NULL) { - _LOGE("Failed to get pkg cert db path - %d", uid); - return -1; - } - - if (access(user_cert_parser, F_OK) != 0) { - _LOGE("Cert DB does not exists !!"); - free(user_cert_parser); - return -1; - } - - flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE; - ret = db_util_open_with_options(user_cert_parser, &GET_DB(cert_db), - flags, NULL); - if (ret != SQLITE_OK) { - _LOGE("connect db [%s] failed!", user_cert_parser); - free(user_cert_parser); - return -1; - } - cert_db.ref++; - if (readonly) { - ret = __attach_and_create_view(GET_DB(cert_db), CERT_DB, - certdb_tables, uid); - if (ret != SQLITE_OK) { - _LOGE("attach db [%s] failed!", user_cert_parser); - free(user_cert_parser); - return -1; - } - } - - free(user_cert_parser); - - return 0; -} - void _save_column_int(sqlite3_stmt *stmt, int idx, int *i) { *i = sqlite3_column_int(stmt, idx); diff --git a/src/pkgmgrinfo_private.h b/src/pkgmgrinfo_private.h index 09e88e9..4ccc425 100644 --- a/src/pkgmgrinfo_private.h +++ b/src/pkgmgrinfo_private.h @@ -74,8 +74,6 @@ #define INTERFACE_NAME "org.tizen.system.deviced.Mmc" #define METHOD_NAME "RequestMountApp2ext" -#define GET_DB(X) (X).dbHandle - /*String properties for filtering based on package info*/ typedef enum _pkgmgrinfo_pkginfo_filter_prop_str { E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR = 101, @@ -289,9 +287,6 @@ typedef struct _pkg_plugin_set { get_pkg_detail_info_from_package; } pkg_plugin_set; -extern __thread db_handle manifest_db; -extern __thread db_handle cert_db; - pkgmgrinfo_pkginfo_filter_prop_str _pminfo_pkginfo_convert_to_prop_str(const char *property); pkgmgrinfo_pkginfo_filter_prop_int _pminfo_pkginfo_convert_to_prop_int(const char *property); pkgmgrinfo_pkginfo_filter_prop_bool _pminfo_pkginfo_convert_to_prop_bool(const char *property); @@ -303,10 +298,6 @@ pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool(const c pkgmgrinfo_pkginfo_filter_prop_range _pminfo_pkginfo_convert_to_prop_range(const char *property); int _check_create_cert_db(void); -int __close_manifest_db(void); -int __open_manifest_db(uid_t uid, bool readonly); -int __close_cert_db(void); -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);