Add apis for datacontrol privileges info 10/129210/19
authorInkyun Kil <inkyun.kil@samsung.com>
Mon, 15 May 2017 11:27:13 +0000 (20:27 +0900)
committerjongmyeong ko <jongmyeong.ko@samsung.com>
Thu, 1 Jun 2017 01:06:09 +0000 (01:06 +0000)
- 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 <inkyun.kil@samsung.com>
include/pkgmgr-info.h
include/pkgmgrinfo_basic.h
parser/manifest.xsd.in
parser/manifest.xsd.ref
parser/src/pkgmgr_parser_db.c
parser/src/pkgmgr_parser_db_queries.h
src/pkgmgrinfo_appinfo.c
src/pkgmgrinfo_basic.c
src/pkgmgrinfo_db.c

index bb14ced..781a1ab 100644 (file)
@@ -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
  *
index b5a63cc..d6a197a 100644 (file)
@@ -89,6 +89,7 @@ typedef struct datacontrol_x {
        char *access;
        char *type;
        char *trusted;
+       GList *privileges;
 } datacontrol_x;
 
 typedef struct splashscreen_x {
index 02d0f09..5934d63 100644 (file)
   </xs:element>
   <xs:element name="datacontrol">
   <xs:complexType>
+    <xs:sequence>
+      <xs:choice maxOccurs="unbounded" minOccurs="0">
+        <xs:element ref="packages:privilege"/>
+      </xs:choice>
+    </xs:sequence>
     <xs:attribute name="providerid" type="xs:string"/>
     <xs:attribute name="access" type="xs:string"/>
     <xs:attribute name="type" type="xs:string"/>
index a93b7f0..e894a76 100644 (file)
   </xs:element>
   <xs:element name="datacontrol">
   <xs:complexType>
+    <xs:sequence>
+      <xs:choice maxOccurs="unbounded" minOccurs="0">
+        <xs:element ref="packages:privilege"/>
+      </xs:choice>
+    </xs:sequence>
     <xs:attribute name="providerid" type="xs:string"/>
     <xs:attribute name="access" type="xs:string"/>
     <xs:attribute name="type" type="xs:string"/>
index 74a8f47..5618858 100644 (file)
@@ -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);
        }
 
index 8f2b906..2e6888e 100644 (file)
        "  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" \
index 6b3a1b1..e07bf52 100644 (file)
@@ -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)
 {
index 66091b3..ed2f427 100644 (file)
@@ -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;
index 0ead442..a51019e 100644 (file)
@@ -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
 };