From: Sangyoon Jang Date: Tue, 27 Jun 2017 13:09:39 +0000 (+0900) Subject: Add privileges for app_control X-Git-Tag: accepted/tizen/unified/20170710.154514~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=48a1c2fe69e8678a6cf8d6f812b96784d1454346;hp=b60b2c68f073edca34c7a36460f6b40934059cb6;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git Add privileges for app_control - New db table for privileges of app_control: package_app_app_control_privilege - New api for getting privileges of app_control: pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges pkgmgrinfo_appinfo_foreach_appcontrol_privileges Change-Id: If50052f00b83e400adaf5aec80801f2d381a8f16 Signed-off-by: Sangyoon Jang --- diff --git a/include/pkgmgr-info.h b/include/pkgmgr-info.h index 781a1ab..2161088 100644 --- a/include/pkgmgr-info.h +++ b/include/pkgmgr-info.h @@ -4321,6 +4321,35 @@ static int list_metadata(const char *appid, char *key) int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_metadata_list_cb metadata_func, void *user_data); +/** + * @fn int pkgmgrinfo_appinfo_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); + * @brief This API gets the list of privileges for a particular + * appllication's app_control + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * @param[in] appid application id + * @param[in] operation operation of appcontrol + * @param[in] uri uri of appcontrol + * @param[in] mime mime of appcontrol + * @param[in] privilege_func callback function for list + * @param[in] user_data user data to be passed to callback function + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + */ +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 pkgmgrinfo_appinfo_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); /** * @fn int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, diff --git a/include/pkgmgrinfo_basic.h b/include/pkgmgrinfo_basic.h index d6a197a..e78fd61 100644 --- a/include/pkgmgrinfo_basic.h +++ b/include/pkgmgrinfo_basic.h @@ -77,6 +77,7 @@ typedef struct appcontrol_x { char *operation; char *uri; char *mime; + GList *privileges; } appcontrol_x; typedef struct compatibility_x { diff --git a/parser/src/pkgmgr_parser_db.c b/parser/src/pkgmgr_parser_db.c index eac7640..676942e 100644 --- a/parser/src/pkgmgr_parser_db.c +++ b/parser/src/pkgmgr_parser_db.c @@ -307,6 +307,7 @@ static const char *parser_init_queries[] = { QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO, /* ? */ QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO, /* ? */ QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL, + QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE, QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY, QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA, QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION, /* ? */ @@ -558,6 +559,60 @@ static const char *__find_effective_appid(GList *metadata_list) return NULL; } +static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid, + appcontrol_x *ac) +{ + static const char query[] = + "INSERT INTO package_app_app_control_privilege (app_id," + " app_control, privilege) VALUES (?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + char app_control[BUFSIZE]; + GList *tmp; + char *privilege; + + if (ac == NULL) + return 0; + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; + } + + for (tmp = ac->privileges; tmp; tmp = tmp->next) { + privilege = (char *)tmp->data; + if (privilege == NULL || !strlen(privilege)) + continue; + + idx = 1; + snprintf(app_control, sizeof(app_control), "%s|%s|%s", + ac->operation ? (strlen(ac->operation) > 0 ? + ac->operation : "NULL") : "NULL", + ac->uri ? (strlen(ac->uri) > 0 ? + ac->uri : "NULL") : "NULL", + ac->mime ? (strlen(ac->mime) > 0 ? + ac->mime : "NULL") : "NULL"); + __BIND_TEXT(db, stmt, idx++, appid); + __BIND_TEXT(db, stmt, idx++, app_control); + __BIND_TEXT(db, stmt, idx++, privilege); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; + } + + sqlite3_reset(stmt); + } + + sqlite3_finalize(stmt); + + return 0; +} + static int __insert_appcontrol_info(sqlite3 *db, application_x *app) { static const char query[] = @@ -601,6 +656,11 @@ static int __insert_appcontrol_info(sqlite3 *db, application_x *app) return -1; } + if (__insert_appcontrol_privilege_info(db, app->appid, ac)) { + sqlite3_finalize(stmt); + return -1; + } + sqlite3_reset(stmt); } diff --git a/parser/src/pkgmgr_parser_db_queries.h b/parser/src/pkgmgr_parser_db_queries.h index 2e6888e..5576034 100644 --- a/parser/src/pkgmgr_parser_db_queries.h +++ b/parser/src/pkgmgr_parser_db_queries.h @@ -169,6 +169,14 @@ " FOREIGN KEY(app_id)\n" \ " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE \ + "CREATE TABLE IF NOT EXISTS package_app_app_control_privilege (\n" \ + " app_id TEXT NOT NULL,\n" \ + " app_control TEXT NOT NULL,\n" \ + " privilege TEXT NOT NULL,\n" \ + " FOREIGN KEY(app_id,app_control)\n" \ + " REFERENCES package_app_app_control(app_id,app_control) ON DELETE CASCADE)" + #define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY \ "CREATE TABLE IF NOT EXISTS package_app_app_category (\n" \ " app_id TEXT NOT NULL,\n" \ diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index d4f9dc5..6c9a018 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -2474,6 +2474,73 @@ 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 const char query_raw[] = + "SELECT privilege FROM package_app_app_control_privilege " + "WHERE app_id=%Q AND app_control=%Q"; + 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; + } + + snprintf(app_control, sizeof(app_control), "%s|%s|%s", operation, + uri ? uri : "NULL", mime ? mime : "NULL"); + + ret = __open_manifest_db(uid, true); + if (ret != SQLITE_OK) { + LOGE("open db failed"); + return PMINFO_R_ERROR; + } + + query = sqlite3_mprintf(query_raw, appid, app_control); + if (query == NULL) { + LOGE("out of memory"); + __close_manifest_db(); + 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(); + return PMINFO_R_ERROR; + } + + while (sqlite3_step(stmt) == SQLITE_ROW) { + privilege = (char *)sqlite3_column_text(stmt, 0); + ret = privilege_func(privilege, user_data); + if (ret < 0) + break; + } + + sqlite3_finalize(stmt); + __close_manifest_db(); + + return PMINFO_R_OK; +} + +API int pkgmgrinfo_appinfo_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) +{ + return pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(appid, + operation, uri, mime, privilege_func, user_data, + _getuid()); +} + API int pkgmgrinfo_appinfo_foreach_appcontrol(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_control_list_cb appcontrol_func, void *user_data) { diff --git a/src/pkgmgrinfo_basic.c b/src/pkgmgrinfo_basic.c index c75c9a2..f18a359 100644 --- a/src/pkgmgrinfo_basic.c +++ b/src/pkgmgrinfo_basic.c @@ -99,6 +99,8 @@ static void __ps_free_appcontrol(gpointer data) /*Free Mime*/ if (appcontrol->mime) free((void *)appcontrol->mime); + if (appcontrol->privileges) + g_list_free_full(appcontrol->privileges, free); free((void *)appcontrol); }