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,
char *operation;
char *uri;
char *mime;
+ GList *privileges;
} appcontrol_x;
typedef struct compatibility_x {
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, /* ? */
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[] =
return -1;
}
+ if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
sqlite3_reset(stmt);
}
" 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" \
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)
{
/*Free Mime*/
if (appcontrol->mime)
free((void *)appcontrol->mime);
+ if (appcontrol->privileges)
+ g_list_free_full(appcontrol->privileges, free);
free((void *)appcontrol);
}