From: Inkyun Kil Date: Mon, 15 May 2017 11:27:13 +0000 (+0900) Subject: Add apis for datacontrol privileges info X-Git-Tag: accepted/tizen/unified/20170609.204208~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=50e488484683e5df4292c89c9caa53307ec4a0e2;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git Add apis for datacontrol privileges info - pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges - pkgmgrinfo_appinfo_foreach_datacontrol_privileges - Related patches [tpk-manifest-handler] https://review.tizen.org/gerrit/#/c/129211/ [app-installers] https://review.tizen.org/gerrit/#/c/129212/ [data-control] https://review.tizen.org/gerrit/#/c/129882/ [amd] https://review.tizen.org/gerrit/#/c/129881/ [aul-1] https://review.tizen.org/gerrit/#/c/129880/ Change-Id: I34765868c4ad43d9c6aa94827fdb2396de8cf48e Signed-off-by: Inkyun Kil --- diff --git a/include/pkgmgr-info.h b/include/pkgmgr-info.h index bb14ced..781a1ab 100644 --- a/include/pkgmgr-info.h +++ b/include/pkgmgr-info.h @@ -3859,6 +3859,28 @@ int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info(const char *providerid, const char *type, uid_t uid, char **appid, bool *is_trusted); /** + * @fn int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data); + * @brief This API retrieves the privileges and invokes given callback for each privilege. + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] providerid pointer to the providerid of datacontrol. + * @param[in] type pointer to the type of dataconltrol. + * @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_foreach_datacontrol_privileges(const char *providerid, const char *type, + pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data); +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); + +/** * @fn int pkgmgrinfo_appinfo_get_alias_appid(pkgmgrinfo_appinfo_h handle, char **alias_appid) * @brief This API gets the alias_appid of the application * diff --git a/include/pkgmgrinfo_basic.h b/include/pkgmgrinfo_basic.h index b5a63cc..d6a197a 100644 --- a/include/pkgmgrinfo_basic.h +++ b/include/pkgmgrinfo_basic.h @@ -89,6 +89,7 @@ typedef struct datacontrol_x { char *access; char *type; char *trusted; + GList *privileges; } datacontrol_x; typedef struct splashscreen_x { diff --git a/parser/manifest.xsd.in b/parser/manifest.xsd.in index 02d0f09..5934d63 100644 --- a/parser/manifest.xsd.in +++ b/parser/manifest.xsd.in @@ -310,6 +310,11 @@ + + + + + diff --git a/parser/manifest.xsd.ref b/parser/manifest.xsd.ref index a93b7f0..e894a76 100644 --- a/parser/manifest.xsd.ref +++ b/parser/manifest.xsd.ref @@ -363,6 +363,11 @@ + + + + + diff --git a/parser/src/pkgmgr_parser_db.c b/parser/src/pkgmgr_parser_db.c index 74a8f47..5618858 100644 --- a/parser/src/pkgmgr_parser_db.c +++ b/parser/src/pkgmgr_parser_db.c @@ -313,6 +313,7 @@ static const char *parser_init_queries[] = { QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED, /* ? */ QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST, /* ? */ QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL, + QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE, QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID, QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID, QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN, @@ -695,6 +696,52 @@ static int __insert_metadata_info(sqlite3 *db, application_x *app) return 0; } +static int __insert_app_data_control_privilege_info(sqlite3 *db, + datacontrol_x *datacontrol) +{ + static const char query[] = + "INSERT INTO package_app_data_control_privilege (providerid," + " privilege, type) VALUES (?, ?, ?)"; + + int ret; + sqlite3_stmt *stmt; + int idx; + GList *privileges; + + if (datacontrol == 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 (privileges = datacontrol->privileges; privileges; + privileges = privileges->next) { + privilege_x *priv = (privilege_x *)privileges->data; + if (priv == NULL) + continue; + + idx = 1; + __BIND_TEXT(db, stmt, idx++, datacontrol->providerid); + __BIND_TEXT(db, stmt, idx++, priv->value); + __BIND_TEXT(db, stmt, idx++, datacontrol->type); + + 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_datacontrol_info(sqlite3 *db, application_x *app) { static const char query[] = @@ -733,6 +780,12 @@ static int __insert_datacontrol_info(sqlite3 *db, application_x *app) return -1; } + if (dc->privileges && + __insert_app_data_control_privilege_info(db, dc)) { + 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 8f2b906..2e6888e 100644 --- a/parser/src/pkgmgr_parser_db_queries.h +++ b/parser/src/pkgmgr_parser_db_queries.h @@ -223,6 +223,15 @@ " FOREIGN KEY(app_id)\n" \ " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" +#define QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE \ + "CREATE TABLE IF NOT EXISTS package_app_data_control_privilege (\n" \ + " providerid TEXT,\n" \ + " privilege TEXT NOT NULL,\n" \ + " type TEXT NOT NULL,\n" \ + " PRIMARY KEY(providerid, privilege, type)\n" \ + " FOREIGN KEY(providerid, type)\n" \ + " REFERENCES package_app_data_control(providerid, type) ON DELETE CASCADE)" + #define QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID \ "CREATE TABLE IF NOT EXISTS package_app_info_for_uid (\n" \ " app_id TEXT NOT NULL,\n" \ diff --git a/src/pkgmgrinfo_appinfo.c b/src/pkgmgrinfo_appinfo.c index 6b3a1b1..e07bf52 100644 --- a/src/pkgmgrinfo_appinfo.c +++ b/src/pkgmgrinfo_appinfo.c @@ -2316,6 +2316,52 @@ 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) +{ + 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; + + /*open db*/ + ret = __open_manifest_db(uid, true); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*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"); + + /*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); + + while (sqlite3_step(stmt) == SQLITE_ROW) { + char *privilege; + privilege = (char *)sqlite3_column_text(stmt, 0); + ret = privilege_func(privilege, user_data); + if (ret < 0) + break; + } + + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + __close_manifest_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) +{ + 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) { diff --git a/src/pkgmgrinfo_basic.c b/src/pkgmgrinfo_basic.c index 66091b3..ed2f427 100644 --- a/src/pkgmgrinfo_basic.c +++ b/src/pkgmgrinfo_basic.c @@ -85,22 +85,6 @@ static void __ps_free_compatibility(gpointer data) free((void *)compatibility); } -static void __ps_free_datacontrol(gpointer data) -{ - datacontrol_x *datacontrol = (datacontrol_x *)data; - if (datacontrol == NULL) - return; - if (datacontrol->providerid) - free((void *)datacontrol->providerid); - if (datacontrol->access) - free((void *)datacontrol->access); - if (datacontrol->type) - free((void *)datacontrol->type); - if (datacontrol->trusted) - free((void *)datacontrol->trusted); - free((void *)datacontrol); -} - static void __ps_free_appcontrol(gpointer data) { appcontrol_x *appcontrol = (appcontrol_x *)data; @@ -235,6 +219,24 @@ static void __ps_free_privilege(gpointer data) free((void *)privilege); } +static void __ps_free_datacontrol(gpointer data) +{ + datacontrol_x *datacontrol = (datacontrol_x *)data; + if (datacontrol == NULL) + return; + if (datacontrol->providerid) + free((void *)datacontrol->providerid); + if (datacontrol->access) + free((void *)datacontrol->access); + if (datacontrol->type) + free((void *)datacontrol->type); + if (datacontrol->trusted) + free((void *)datacontrol->trusted); + if (datacontrol->privileges) + g_list_free_full(datacontrol->privileges, __ps_free_privilege); + free((void *)datacontrol); +} + static void __ps_free_application(gpointer data) { application_x *application = (application_x *)data; diff --git a/src/pkgmgrinfo_db.c b/src/pkgmgrinfo_db.c index 0ead442..a51019e 100644 --- a/src/pkgmgrinfo_db.c +++ b/src/pkgmgrinfo_db.c @@ -306,6 +306,7 @@ static const char *parserdb_tables[] = { "package_app_icon_section_info", "package_privilege_info", "package_app_image_info", + "package_app_data_control_privilege", NULL };