Add privileges for app_control 60/135960/10
authorSangyoon Jang <jeremy.jang@samsung.com>
Tue, 27 Jun 2017 13:09:39 +0000 (22:09 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Fri, 7 Jul 2017 01:21:15 +0000 (01:21 +0000)
- 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 <jeremy.jang@samsung.com>
include/pkgmgr-info.h
include/pkgmgrinfo_basic.h
parser/src/pkgmgr_parser_db.c
parser/src/pkgmgr_parser_db_queries.h
src/pkgmgrinfo_appinfo.c
src/pkgmgrinfo_basic.c

index 781a1ab..2161088 100644 (file)
@@ -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,
index d6a197a..e78fd61 100644 (file)
@@ -77,6 +77,7 @@ typedef struct appcontrol_x {
        char *operation;
        char *uri;
        char *mime;
+       GList *privileges;
 } appcontrol_x;
 
 typedef struct compatibility_x {
index eac7640..676942e 100644 (file)
@@ -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);
        }
 
index 2e6888e..5576034 100644 (file)
        "  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" \
index d4f9dc5..6c9a018 100644 (file)
@@ -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)
 {
index c75c9a2..f18a359 100644 (file)
@@ -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);
 }