Support whitelist to limit access to the sticker DB 94/224594/4
authorInHong Han <inhong1.han@samsung.com>
Mon, 10 Feb 2020 02:24:35 +0000 (11:24 +0900)
committerInHong Han <inhong1.han@samsung.com>
Wed, 12 Feb 2020 05:32:01 +0000 (14:32 +0900)
Change-Id: Ifc768961d6f4ab59251bd14a30b827a610c79bf6

client/sticker_dbus.c
client/sticker_dbus.h
consumer/sticker_consumer.c
consumer/sticker_consumer_main.h
server/stickerd_data_manager.c
server/stickerd_db_manager.c
server/stickerd_db_manager.h
sticker-parser/sticker-parser.c

index 7984351..debfc5f 100644 (file)
@@ -741,7 +741,7 @@ int sticker_dbus_get_sticker_info_by_record_id(GDBusConnection *gdbus_connection
     return ret;
 }
 
-int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group_list)
+int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, const char *app_id, GList **group_list)
 {
     int ret;
     GDBusMessage *reply = NULL;
@@ -754,7 +754,7 @@ int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group
         return STICKER_CLIENT_ERROR_INVALID_PARAMETER;
     }
 
-    ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "get_group_list");
+    ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", app_id), &reply, "get_group_list");
     if (ret == STICKER_CLIENT_ERROR_NONE) {
         reply_body = g_dbus_message_get_body(reply);
         g_variant_get(reply_body, "(a(s))", &iter);
@@ -780,7 +780,7 @@ int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group
     return ret;
 }
 
-int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, GList **keyword_list)
+int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, const char *app_id, GList **keyword_list)
 {
     int ret;
     GDBusMessage *reply = NULL;
@@ -793,7 +793,7 @@ int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, GList **key
         return STICKER_CLIENT_ERROR_INVALID_PARAMETER;
     }
 
-    ret = _send_sync_message(gdbus_connection, g_variant_new("()"), &reply, "get_keyword_list");
+    ret = _send_sync_message(gdbus_connection, g_variant_new("(s)", app_id), &reply, "get_keyword_list");
     if (ret == STICKER_CLIENT_ERROR_NONE) {
         reply_body = g_dbus_message_get_body(reply);
         g_variant_get(reply_body, "(a(s))", &iter);
@@ -840,13 +840,13 @@ int sticker_dbus_get_sticker_count(GDBusConnection *gdbus_connection, const char
     return ret;
 }
 
-int sticker_dbus_get_all_sticker_info(GDBusConnection *gdbus_connection, int offset, int count, GVariantIter **id_iter)
+int sticker_dbus_get_all_sticker_info(GDBusConnection *gdbus_connection, const char *app_id, int offset, int count, GVariantIter **id_iter)
 {
     int ret;
     GDBusMessage *reply = NULL;
     GVariant *reply_body = NULL;
 
-    ret = _send_sync_message(gdbus_connection, g_variant_new("(ii)", offset, count), &reply, "get_all_sticker_info");
+    ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", app_id, offset, count), &reply, "get_all_sticker_info");
     if (ret == STICKER_CLIENT_ERROR_NONE) {
         reply_body = g_dbus_message_get_body(reply);
         g_variant_get(reply_body, "(a(i))", &(*id_iter));
@@ -882,13 +882,13 @@ int sticker_dbus_get_sticker_info_by_appid(GDBusConnection *gdbus_connection, co
     return ret;
 }
 
-int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, sticker_data_uri_type_e type, int offset, int count, GVariantIter **id_iter)
+int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, const char *app_id, sticker_data_uri_type_e type, int offset, int count, GVariantIter **id_iter)
 {
     int ret;
     GDBusMessage *reply = NULL;
     GVariant *reply_body = NULL;
 
-    ret = _send_sync_message(gdbus_connection, g_variant_new("(iii)", (int)type, offset, count), &reply, "get_sticker_info_by_type");
+    ret = _send_sync_message(gdbus_connection, g_variant_new("(siii)", app_id, (int)type, offset, count), &reply, "get_sticker_info_by_type");
     if (ret == STICKER_CLIENT_ERROR_NONE) {
         reply_body = g_dbus_message_get_body(reply);
         g_variant_get(reply_body, "(a(i))", &(*id_iter));
@@ -903,13 +903,13 @@ int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, sti
     return ret;
 }
 
-int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, const char *group, int offset, int count, GVariantIter **id_iter)
+int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, const char *app_id, const char *group, int offset, int count, GVariantIter **id_iter)
 {
     int ret;
     GDBusMessage *reply = NULL;
     GVariant *reply_body = NULL;
 
-    ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", group, offset, count), &reply, "get_sticker_info_by_group");
+    ret = _send_sync_message(gdbus_connection, g_variant_new("(ssii)", app_id, group, offset, count), &reply, "get_sticker_info_by_group");
     if (ret == STICKER_CLIENT_ERROR_NONE) {
         reply_body = g_dbus_message_get_body(reply);
         g_variant_get(reply_body, "(a(i))", &(*id_iter));
@@ -924,13 +924,13 @@ int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, co
     return ret;
 }
 
-int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, const char *keyword, int offset, int count, GVariantIter **id_iter)
+int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, const char *app_id, const char *keyword, int offset, int count, GVariantIter **id_iter)
 {
     int ret;
     GDBusMessage *reply = NULL;
     GVariant *reply_body = NULL;
 
-    ret = _send_sync_message(gdbus_connection, g_variant_new("(sii)", keyword, offset, count), &reply, "get_sticker_info_by_keyword");
+    ret = _send_sync_message(gdbus_connection, g_variant_new("(ssii)", app_id, keyword, offset, count), &reply, "get_sticker_info_by_keyword");
     if (ret == STICKER_CLIENT_ERROR_NONE) {
         reply_body = g_dbus_message_get_body(reply);
         g_variant_get(reply_body, "(a(i))", &(*id_iter));
index 44d2309..52dcd02 100644 (file)
@@ -50,14 +50,14 @@ int sticker_dbus_insert_sticker_info_by_json(GDBusConnection *gdbus_connection,
 int sticker_dbus_delete_sticker_info(GDBusConnection *gdbus_connection, int record_id);
 int sticker_dbus_update_sticker_info(GDBusConnection *gdbus_connection, sticker_data_h sticker_data);
 int sticker_dbus_get_sticker_info_by_record_id(GDBusConnection *gdbus_connection, sticker_data_h sticker_data, int record_id);
-int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, GList **group_list);
-int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, GList **keyword_list);
+int sticker_dbus_get_group_list(GDBusConnection *gdbus_connection, const char *app_id, GList **group_list);
+int sticker_dbus_get_keyword_list(GDBusConnection *gdbus_connection, const char *app_id, GList **keyword_list);
 int sticker_dbus_get_sticker_count(GDBusConnection *gdbus_connection, const char *app_id, int *count);
-int sticker_dbus_get_all_sticker_info(GDBusConnection *gdbus_connection, int offset, int count, GVariantIter **id_iter);
+int sticker_dbus_get_all_sticker_info(GDBusConnection *gdbus_connection, const char *app_id, int offset, int count, GVariantIter **id_iter);
 int sticker_dbus_get_sticker_info_by_appid(GDBusConnection *gdbus_connection, const char *app_id, int offset, int count, GVariantIter **id_iter);
-int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, sticker_data_uri_type_e type, int offset, int count, GVariantIter **id_iter);
-int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, const char *group, int offset, int count, GVariantIter **id_iter);
-int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, const char *keyword, int offset, int count, GVariantIter **id_iter);
+int sticker_dbus_get_sticker_info_by_type(GDBusConnection *gdbus_connection, const char *app_id, sticker_data_uri_type_e type, int offset, int count, GVariantIter **id_iter);
+int sticker_dbus_get_sticker_info_by_group(GDBusConnection *gdbus_connection, const char *app_id, const char *group, int offset, int count, GVariantIter **id_iter);
+int sticker_dbus_get_sticker_info_by_keyword(GDBusConnection *gdbus_connection, const char *app_id, const char *keyword, int offset, int count, GVariantIter **id_iter);
 
 #ifdef __cplusplus
 }
index 8602652..aa760de 100644 (file)
@@ -17,6 +17,7 @@
 #include <dlog.h>
 #include <gio/gio.h>
 #include <dbus/dbus.h>
+#include <app_common.h>
 #include <cynara-client.h>
 #include <cynara-error.h>
 #include <cynara-session.h>
@@ -158,6 +159,13 @@ EXPORT_API int sticker_consumer_create(sticker_consumer_h *consumer_handle)
     if (!consumer_struct)
         return STICKER_ERROR_OUT_OF_MEMORY;
 
+    ret = app_get_id(&consumer_struct->app_id);
+    if (ret != APP_ERROR_NONE) {
+        LOGE("Failed to get app_id : %d", ret);
+        free(consumer_struct);
+        return STICKER_ERROR_OPERATION_FAILED;
+    }
+
     ret = sticker_dbus_init(&consumer_struct->gdbus_connection, &consumer_struct->server_watcher_id,
         &consumer_struct->monitor_id, &consumer_struct->server_monitor_id, STICKER_CLIENT_LIB_CONSUMER, (void *)consumer_struct);
     if (ret != STICKER_ERROR_NONE) {
@@ -191,6 +199,11 @@ EXPORT_API int sticker_consumer_destroy(sticker_consumer_h consumer_handle)
     if (consumer_handle->gdbus_connection)
         g_object_unref(consumer_handle->gdbus_connection);
 
+    if (consumer_handle->app_id) {
+        free(consumer_handle->app_id);
+        consumer_handle->app_id = NULL;
+    }
+
     free(consumer_handle);
 
     return STICKER_ERROR_NONE;
@@ -208,7 +221,7 @@ EXPORT_API int sticker_consumer_data_foreach_all(sticker_consumer_h consumer_han
     if (!consumer_handle || (offset < 0) || (count <= 0) || !result || !callback)
         return STICKER_ERROR_INVALID_PARAMETER;
 
-    ret = sticker_dbus_get_all_sticker_info(consumer_handle->gdbus_connection, offset, count, &id_iter);
+    ret = sticker_dbus_get_all_sticker_info(consumer_handle->gdbus_connection, consumer_handle->app_id, offset, count, &id_iter);
     if (ret != STICKER_ERROR_NONE) {
         LOGE("Failed to get all sticker information : %d", ret);
         ret = STICKER_ERROR_OPERATION_FAILED;
@@ -256,7 +269,7 @@ EXPORT_API int sticker_consumer_data_foreach_by_keyword(sticker_consumer_h consu
     if (!consumer_handle || (offset < 0) || (count <= 0) || !result || !keyword || !callback)
         return STICKER_ERROR_INVALID_PARAMETER;
 
-    ret = sticker_dbus_get_sticker_info_by_keyword(consumer_handle->gdbus_connection, keyword, offset, count, &id_iter);
+    ret = sticker_dbus_get_sticker_info_by_keyword(consumer_handle->gdbus_connection, consumer_handle->app_id, keyword, offset, count, &id_iter);
     if (ret != STICKER_ERROR_NONE) {
         LOGE("Failed to get sticker information by keyword : %d", ret);
         ret = STICKER_ERROR_OPERATION_FAILED;
@@ -304,7 +317,7 @@ EXPORT_API int sticker_consumer_data_foreach_by_group(sticker_consumer_h consume
     if (!consumer_handle || (offset < 0) || (count <= 0) || !result || !group || !callback)
         return STICKER_ERROR_INVALID_PARAMETER;
 
-    ret = sticker_dbus_get_sticker_info_by_group(consumer_handle->gdbus_connection, group, offset, count, &id_iter);
+    ret = sticker_dbus_get_sticker_info_by_group(consumer_handle->gdbus_connection, consumer_handle->app_id, group, offset, count, &id_iter);
     if (ret != STICKER_ERROR_NONE) {
         LOGE("Failed to get sticker information by group : %d", ret);
         ret = STICKER_ERROR_OPERATION_FAILED;
@@ -352,7 +365,7 @@ EXPORT_API int sticker_consumer_data_foreach_by_type(sticker_consumer_h consumer
     if (!consumer_handle || (offset < 0) || (count <= 0) || !result || (type < 1) || !callback)
         return STICKER_ERROR_INVALID_PARAMETER;
 
-    ret = sticker_dbus_get_sticker_info_by_type(consumer_handle->gdbus_connection, type, offset, count, &id_iter);
+    ret = sticker_dbus_get_sticker_info_by_type(consumer_handle->gdbus_connection, consumer_handle->app_id, type, offset, count, &id_iter);
     if (ret != STICKER_ERROR_NONE) {
         LOGE("Failed to get sticker information by group : %d", ret);
         ret = STICKER_ERROR_OPERATION_FAILED;
@@ -398,7 +411,7 @@ EXPORT_API int sticker_consumer_group_list_foreach_all(sticker_consumer_h consum
     if (!consumer_handle || !callback)
         return STICKER_ERROR_INVALID_PARAMETER;
 
-    ret = sticker_dbus_get_group_list(consumer_handle->gdbus_connection, &list);
+    ret = sticker_dbus_get_group_list(consumer_handle->gdbus_connection, consumer_handle->app_id, &list);
     if (ret != STICKER_ERROR_NONE) {
         LOGE("Failed to get group list : %d", ret);
         ret = STICKER_ERROR_OPERATION_FAILED;
@@ -426,7 +439,7 @@ EXPORT_API int sticker_consumer_keyword_list_foreach_all(sticker_consumer_h cons
     if (!consumer_handle || !callback)
         return STICKER_ERROR_INVALID_PARAMETER;
 
-    ret = sticker_dbus_get_keyword_list(consumer_handle->gdbus_connection, &list);
+    ret = sticker_dbus_get_keyword_list(consumer_handle->gdbus_connection, consumer_handle->app_id, &list);
     if (ret != STICKER_ERROR_NONE) {
         LOGE("Failed to get keyword list : %d", ret);
         ret = STICKER_ERROR_OPERATION_FAILED;
index 7a08ad2..5f72eaf 100644 (file)
@@ -31,6 +31,7 @@ struct sticker_consumer_s {
     int server_watcher_id;
     int monitor_id;
     int server_monitor_id;
+    char *app_id;
 };
 
 #ifdef __cplusplus
index 6581922..f0dc8d2 100644 (file)
@@ -225,10 +225,12 @@ int stickerd_register_dbus_interface(void)
             "        </method>"
 
             "        <method name='get_group_list'>"
+            "          <arg type='s' name='app_id' direction='in'/>"
             "          <arg type='a(s)' name='group_list' direction='out'/>"
             "        </method>"
 
             "        <method name='get_keyword_list'>"
+            "          <arg type='s' name='app_id' direction='in'/>"
             "          <arg type='a(s)' name='keyword_list' direction='out'/>"
             "        </method>"
 
@@ -238,6 +240,7 @@ int stickerd_register_dbus_interface(void)
             "        </method>"
 
             "        <method name='get_all_sticker_info'>"
+            "          <arg type='s' name='app_id' direction='in'/>"
             "          <arg type='i' name='offset' direction='in'/>"
             "          <arg type='i' name='count' direction='in'/>"
             "          <arg type='a(i)' name='id_list' direction='out'/>"
@@ -251,6 +254,7 @@ int stickerd_register_dbus_interface(void)
             "        </method>"
 
             "        <method name='get_sticker_info_by_type'>"
+            "          <arg type='s' name='app_id' direction='in'/>"
             "          <arg type='i' name='type' direction='in'/>"
             "          <arg type='i' name='offset' direction='in'/>"
             "          <arg type='i' name='count' direction='in'/>"
@@ -258,6 +262,7 @@ int stickerd_register_dbus_interface(void)
             "        </method>"
 
             "        <method name='get_sticker_info_by_group'>"
+            "          <arg type='s' name='app_id' direction='in'/>"
             "          <arg type='s' name='group' direction='in'/>"
             "          <arg type='i' name='offset' direction='in'/>"
             "          <arg type='i' name='count' direction='in'/>"
@@ -265,6 +270,7 @@ int stickerd_register_dbus_interface(void)
             "        </method>"
 
             "        <method name='get_sticker_info_by_keyword'>"
+            "          <arg type='s' name='app_id' direction='in'/>"
             "          <arg type='s' name='keyword' direction='in'/>"
             "          <arg type='i' name='offset' direction='in'/>"
             "          <arg type='i' name='count' direction='in'/>"
@@ -1004,10 +1010,12 @@ int stickerd_get_group_list(GVariant *parameters, GVariant **reply_body)
 {
     int ret;
     GVariantBuilder *builder = NULL;
+    char *app_id = NULL;
 
-    builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
-    ret = stickerd_db_get_group_list(builder);
+    g_variant_get(parameters, "(&s)", &app_id);
 
+    builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
+    ret = stickerd_db_get_group_list(builder, app_id);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get sticker group list");
         g_variant_builder_unref(builder);
@@ -1029,9 +1037,12 @@ int stickerd_get_keyword_list(GVariant *parameters, GVariant **reply_body)
 {
     int ret;
     GVariantBuilder *builder = NULL;
+    char *app_id = NULL;
+
+    g_variant_get(parameters, "(&s)", &app_id);
 
     builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
-    ret = stickerd_db_get_keyword_list(builder);
+    ret = stickerd_db_get_keyword_list(builder, app_id);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get sticker keyword list");
         g_variant_builder_unref(builder);
@@ -1158,12 +1169,13 @@ int stickerd_get_all_sticker_info(GVariant *parameters, GVariant **reply_body)
 {
     int ret;
     int offset, count;
+    char *app_id = NULL;
     GList *id_list = NULL;
     GVariantBuilder *id_builder = NULL;
 
-    g_variant_get(parameters, "(ii)", &offset, &count);
+    g_variant_get(parameters, "(&sii)", &app_id, &offset, &count);
 
-    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_ALL, &id_list, NULL, offset, count);
+    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_ALL, &id_list, NULL, app_id, offset, count);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get all sticker id");
         if(id_list)
@@ -1199,7 +1211,7 @@ int stickerd_get_sticker_info_by_app_id(GVariant *parameters, GVariant **reply_b
 
     g_variant_get(parameters, "(&sii)", &app_id, &offset, &count);
 
-    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_APPID, &id_list, (void *)app_id, offset, count);
+    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_APPID, &id_list, NULL, app_id, offset, count);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get all sticker id");
         if(id_list)
@@ -1229,12 +1241,13 @@ int stickerd_get_sticker_info_by_type(GVariant *parameters, GVariant **reply_bod
 {
     int ret;
     GList *id_list = NULL;
+    char *app_id = NULL;
     int type, offset, count;
     GVariantBuilder *id_builder = NULL;
 
-    g_variant_get(parameters, "(iii)", &type, &offset, &count);
+    g_variant_get(parameters, "(&siii)", &app_id, &type, &offset, &count);
 
-    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_TYPE, &id_list, &type, offset, count);
+    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_TYPE, &id_list, &type, app_id, offset, count);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get all sticker id");
         if(id_list)
@@ -1264,13 +1277,14 @@ int stickerd_get_sticker_info_by_group(GVariant *parameters, GVariant **reply_bo
 {
     int ret;
     GList *id_list = NULL;
+    char *app_id = NULL;
     char *group = NULL;
     int offset, count;
     GVariantBuilder *id_builder = NULL;
 
-    g_variant_get(parameters, "(&sii)", &group, &offset, &count);
+    g_variant_get(parameters, "(&s&sii)", &app_id, &group, &offset, &count);
 
-    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_GROUP, &id_list, (void *)group, offset, count);
+    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_GROUP, &id_list, (void *)group, app_id, offset, count);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get all sticker id");
         if(id_list)
@@ -1300,13 +1314,14 @@ int stickerd_get_sticker_info_by_keyword(GVariant *parameters, GVariant **reply_
 {
     int ret;
     GList *id_list = NULL;
+    char *app_id = NULL;
     char *keyword = NULL;
     int offset, count;
     GVariantBuilder *id_builder = NULL;
 
-    g_variant_get(parameters, "(&sii)", &keyword, &offset, &count);
+    g_variant_get(parameters, "(&s&sii)", &app_id, &keyword, &offset, &count);
 
-    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_KEYWORD, &id_list, (void *)keyword, offset, count);
+    ret = stickerd_db_get_record_id(STICKER_DB_STICKER_KEYWORD, &id_list, (void *)keyword, app_id, offset, count);
     if (ret != STICKERD_SERVER_ERROR_NONE) {
         LOGE("Failed to get all sticker id");
         if(id_list)
index 8f62916..02c4691 100644 (file)
  * | keyword_id | sticker_info_id | keyword |
  * +------------+-----------------+---------+
  *
+ * sticker_whitelist_info
+ * +--------------+-------------+-------------+
+ * | INT          | TEXT        | TEXT        |
+ * +--------------+-------------+-------------+
+ * | whitelist_id | provider_id | consumer_id |
+ * +------------+---------------+-------------+
+ *
  */
 
 #define STICKER_DB_PATH tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db")
-#define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL);"
+#define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL)"
 #define STICKER_KEYWORD_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_keyword_info(keyword_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, keyword TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)"
+#define STICKER_WHITELIST_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_whitelist_info(whitelist_id INTEGER PRIMARY KEY AUTOINCREMENT, provider_id TEXT NOT NULL, consumer_id TEXT NOT NULL)"
 
 #define STICKER_DB_INSERT_STICKER_INFO "INSERT INTO sticker_info (app_id, type, uri, thumbnail, description, group_name, date) VALUES (?, ?, ?, ?, ?, ?, DateTime('now','localtime'))"
 #define STICKER_DB_INSERT_STICKER_KEYWORD_INFO "INSERT INTO sticker_keyword_info (sticker_info_id, keyword) VALUES (?, ?)"
 #define STICKER_DB_GET_LATEST_RECORD_ID "SELECT sticker_info_id FROM sticker_info ORDER BY sticker_info_id DESC LIMIT 1"
 #define STICKER_DB_GET_STICKER_INFO_BY_RECORD_ID "SELECT * FROM sticker_info WHERE sticker_info_id = ?"
 #define STICKER_DB_GET_KEYWORD_INFO_BY_RECORD_ID "SELECT keyword FROM sticker_keyword_info WHERE sticker_info_id = ?"
-#define STICKER_DB_GET_ALL_GROUP_LIST "SELECT group_name from (SELECT DISTINCT group_name from sticker_info)"
-#define STICKER_DB_GET_ALL_KEYWORD_LIST "SELECT keyword from (SELECT DISTINCT keyword from sticker_keyword_info)"
+#define STICKER_DB_GET_ALL_GROUP_LIST "SELECT DISTINCT group_name FROM sticker_info WHERE app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?))"
+#define STICKER_DB_GET_ALL_KEYWORD_LIST "SELECT DISTINCT keyword FROM sticker_keyword_info WHERE sticker_info_id IN (SELECT sticker_info_id from sticker_info WHERE app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)))"
 #define STICKER_DB_GET_STICKER_COUNT "SELECT count(*) FROM sticker_info WHERE app_id = ?"
-#define STICKER_DB_GET_ALL_RECORD_ID "SELECT sticker_info_id from sticker_info LIMIT ?, ?"
+#define STICKER_DB_GET_ALL_RECORD_ID "SELECT sticker_info_id FROM sticker_info WHERE app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
 #define STICKER_DB_GET_RECORD_ID_BY_APP_ID "SELECT sticker_info_id from sticker_info WHERE app_id = ? LIMIT ?, ?"
-#define STICKER_DB_GET_RECORD_ID_BY_TYPE "SELECT sticker_info_id from sticker_info WHERE type = ? LIMIT ?, ?"
-#define STICKER_DB_GET_RECORD_ID_BY_GROUP "SELECT sticker_info_id from sticker_info WHERE group_name = ? LIMIT ?, ?"
-#define STICKER_DB_GET_RECORD_ID_BY_KEYWORD "SELECT sticker_info_id from sticker_keyword_info WHERE keyword = ? LIMIT ?, ?"
+#define STICKER_DB_GET_RECORD_ID_BY_TYPE "SELECT sticker_info_id FROM sticker_info WHERE type = ? AND app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
+#define STICKER_DB_GET_RECORD_ID_BY_GROUP "SELECT sticker_info_id from sticker_info WHERE group_name = ? AND app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
+#define STICKER_DB_GET_RECORD_ID_BY_KEYWORD "SELECT sticker_info_id FROM sticker_keyword_info WHERE keyword = ? INTERSECT SELECT sticker_info_id from sticker_info WHERE app_id NOT IN (SELECT DISTINCT provider_id FROM sticker_whitelist_info WHERE provider_id NOT IN (SELECT provider_id FROM sticker_whitelist_info WHERE consumer_id = ?)) LIMIT ?, ?"
 
 typedef enum
 {
@@ -169,6 +177,12 @@ static int _recover_db(void)
         ret = STICKERD_SERVER_ERROR_DB_FAILED;
     }
 
+    ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
+    if (ret != SQLITE_OK) {
+        LOGE("Failed to create sticker_whitelist_info table : %s", err);
+        ret = STICKERD_SERVER_ERROR_DB_FAILED;
+    }
+
     is_corrupted = FALSE;
 
 cleanup:
@@ -220,6 +234,12 @@ int stickerd_db_init(void)
         goto cleanup;
     }
 
+    ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
+    if (ret != SQLITE_OK) {
+        LOGE("Failed to create sticker_whitelist_info table : %s", err);
+        ret = STICKERD_SERVER_ERROR_DB_FAILED;
+    }
+
     ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err);
     if (ret != SQLITE_OK) {
         LOGE("Failed to set journal_mode : %s", err);
@@ -550,7 +570,7 @@ cleanup:
     return STICKERD_SERVER_ERROR_DB_FAILED;
 }
 
-int stickerd_db_get_group_list(GVariantBuilder *builder)
+int stickerd_db_get_group_list(GVariantBuilder *builder, char *app_id)
 {
     int ret;
     sqlite3 *db = NULL;
@@ -566,6 +586,8 @@ int stickerd_db_get_group_list(GVariantBuilder *builder)
         goto cleanup;
     }
 
+    sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
+
     while (sqlite3_step(stmt) == SQLITE_ROW) {
         const unsigned char *group = sqlite3_column_text(stmt, 0);
         if (group)
@@ -584,7 +606,7 @@ cleanup:
     return STICKERD_SERVER_ERROR_DB_FAILED;
 }
 
-int stickerd_db_get_keyword_list(GVariantBuilder *builder)
+int stickerd_db_get_keyword_list(GVariantBuilder *builder, char *app_id)
 {
     int ret;
     sqlite3 *db = NULL;
@@ -594,6 +616,8 @@ int stickerd_db_get_keyword_list(GVariantBuilder *builder)
     if (!db)
         return STICKERD_SERVER_ERROR_DB_FAILED;
 
+    sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
+
     ret = sqlite3_prepare_v2(db, STICKER_DB_GET_ALL_KEYWORD_LIST, -1, &stmt, NULL);
     if (ret != SQLITE_OK) {
         LOGE("fail to get keyword list : %s", sqlite3_errmsg(db));
@@ -656,7 +680,7 @@ cleanup:
     return STICKERD_SERVER_ERROR_DB_FAILED;
 }
 
-int stickerd_db_get_record_id(sticker_info_db_type type, GList **id_list, void *data, int offset, int count)
+int stickerd_db_get_record_id(sticker_info_db_type type, GList **id_list, void *data, char *app_id, int offset, int count)
 {
     int ret;
     sqlite3 *db = NULL;
@@ -673,17 +697,19 @@ int stickerd_db_get_record_id(sticker_info_db_type type, GList **id_list, void *
         goto cleanup;
     }
 
-    if (type == STICKER_DB_STICKER_TYPE)
-        sqlite3_bind_int(stmt, 1, *(int *)data);
-    else if (type != STICKER_DB_STICKER_ALL)
-        sqlite3_bind_text(stmt, 1, (char *)data, -1, SQLITE_TRANSIENT);
-
-    if (type == STICKER_DB_STICKER_ALL) {
-        sqlite3_bind_int(stmt, 1, offset);
-        sqlite3_bind_int(stmt, 2, count);
-    } else {
+    if (type == STICKER_DB_STICKER_ALL || type == STICKER_DB_STICKER_APPID) {
+        sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
         sqlite3_bind_int(stmt, 2, offset);
         sqlite3_bind_int(stmt, 3, count);
+    } else {
+        if (type == STICKER_DB_STICKER_TYPE)
+            sqlite3_bind_int(stmt, 1, *(int *)data);
+        else
+            sqlite3_bind_text(stmt, 1, (char *)data, -1, SQLITE_TRANSIENT);
+
+        sqlite3_bind_text(stmt, 2, app_id, -1, SQLITE_TRANSIENT);
+        sqlite3_bind_int(stmt, 3, offset);
+        sqlite3_bind_int(stmt, 4, count);
     }
 
     while (sqlite3_step(stmt) == SQLITE_ROW) {
index 6e6ebb5..b2ff9bb 100644 (file)
@@ -51,10 +51,10 @@ int stickerd_db_insert_sticker_info(int *record_id, sticker_info_db *sticker_inf
 int stickerd_db_delete_sticker_info(int record_id);
 int stickerd_db_update_sticker_info(int record_id, sticker_info_db_type type, void *data);
 int stickerd_db_get_sticker_info_by_record_id(int record_id, sticker_info_db *sticker_info);
-int stickerd_db_get_group_list(GVariantBuilder *builder);
-int stickerd_db_get_keyword_list(GVariantBuilder *builder);
+int stickerd_db_get_group_list(GVariantBuilder *builder, char *app_id);
+int stickerd_db_get_keyword_list(GVariantBuilder *builder, char *app_id);
 int stickerd_db_get_sticker_count(int *count, char *app_id);
-int stickerd_db_get_record_id(sticker_info_db_type type, GList **id_list, void *data, int offset, int count);
+int stickerd_db_get_record_id(sticker_info_db_type type, GList **id_list, void *data, char *app_id, int offset, int count);
 
 #ifdef __cplusplus
 }
index f8fba16..11e7e91 100644 (file)
@@ -41,8 +41,9 @@
 #define LOG_TAG "STICKER_PARSER"
 
 #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data")
-#define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL);"
+#define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL)"
 #define STICKER_KEYWORD_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_keyword_info(keyword_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, keyword TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)"
+#define STICKER_WHITELIST_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_whitelist_info(whitelist_id INTEGER PRIMARY KEY AUTOINCREMENT, provider_id TEXT NOT NULL, consumer_id TEXT NOT NULL)"
 #define UIFW_ID           502
 #define APPFW_ID          301
 #define MAX_ERROR_BUFFER  256
@@ -77,6 +78,21 @@ static int __get_int_from_object(JsonObject *object, const char *key)
     return type;
 }
 
+static int __change_ownership(const char *path, int user, int group)
+{
+    int ret;
+    uid_t uid = (uid_t)user;
+    gid_t gid = (gid_t)group;
+
+    ret = chown(path, uid, gid);
+    if (ret != 0) {
+        strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
+        LOGE("chown() failed : %s", error_buffer);
+    }
+
+    return ret;
+}
+
 static void __recover_db()
 {
     int ret;
@@ -108,6 +124,12 @@ static void __recover_db()
         goto cleanup;
     }
 
+    ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
+    if (ret != SQLITE_OK) {
+        LOGE("Failed to create sticker_whitelist_info table : %s", err);
+        goto cleanup;
+    }
+
     is_corrupted = FALSE;
 
 cleanup:
@@ -143,6 +165,9 @@ static void __db_init()
         goto cleanup;
     }
 
+    if (__change_ownership(db_path, UIFW_ID, UIFW_ID) != 0)
+        LOGE("failed to change ownership");
+
     ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err);
     if (ret != SQLITE_OK) {
         LOGE("Failed to create sticker_info table : %s" , err);
@@ -155,6 +180,12 @@ static void __db_init()
         goto cleanup;
     }
 
+    ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
+    if (ret != SQLITE_OK) {
+        LOGE("Failed to create sticker_whitelist_info table : %s", err);
+        goto cleanup;
+    }
+
     ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err);
     if (ret != SQLITE_OK) {
         LOGE("Failed to set journal_mode : %s", err);
@@ -199,21 +230,6 @@ static sqlite3 *__db_open(const char *path)
     return db;
 }
 
-static int __change_ownership(const char *path, int user, int group)
-{
-    int ret;
-    uid_t uid = (uid_t)user;
-    gid_t gid = (gid_t)group;
-
-    ret = chown(path, uid, gid);
-    if (ret != 0) {
-        strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
-        LOGE("chown() failed : %s", error_buffer);
-    }
-
-    return ret;
-}
-
 static int __remove_app_path(char *uri, const char *app_path)
 {
     int n = 0;
@@ -483,9 +499,44 @@ static void __insert_sticker_keyword_info(const char *keyword)
     return;
 }
 
+static void __insert_sticker_whitelist_info(const char *provider, const char *consumer) {
+    int ret;
+    sqlite3 *db = NULL;
+    sqlite3_stmt *stmt = NULL;
+    const char *db_path;
+
+    db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
+    db = __db_open(db_path);
+    if (!db)
+        return;
+
+    ret = sqlite3_prepare_v2(db, "INSERT INTO sticker_whitelist_info (provider_id, consumer_id) VALUES (?, ?)", -1, &stmt, NULL);
+    if (ret == SQLITE_OK) {
+        sqlite3_bind_text(stmt, 1, provider, -1, SQLITE_TRANSIENT);
+        sqlite3_bind_text(stmt, 2, consumer, -1, SQLITE_TRANSIENT);
+
+        ret = sqlite3_step(stmt);
+        if (ret != SQLITE_OK && ret != SQLITE_DONE)
+            LOGE("sqlite3_step() failed : ret(%d)", ret);
+
+        if (sqlite3_changes(db) == 0)
+            LOGE("No changes to DB");
+
+        sqlite3_finalize(stmt);
+        sqlite3_close(db);
+    } else {
+        LOGE("fail to insert sticker whiltelist : %s", sqlite3_errmsg(db));
+        sqlite3_finalize(stmt);
+        sqlite3_close(db);
+    }
+
+    return;
+}
+
 static int __get_sticker_info_from_json(const char *appid, const char *file_path, const char *app_path)
 {
     int ret = 1;
+    int arr_len = 0;
     JsonParser* parser = NULL;
     GError* err_msg = NULL;
     char *uri = NULL;
@@ -516,6 +567,13 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
         goto cleanup;
     }
 
+    JsonArray *whitelist_arr = json_object_get_array_member(root_obj, "whitelist");
+    if (whitelist_arr != NULL) {
+        for (int i = 0; i < json_array_get_length(whitelist_arr); i++) {
+            __insert_sticker_whitelist_info(appid, json_array_get_string_element(whitelist_arr, i));
+        }
+    }
+
     JsonArray *sticker_arr = json_object_get_array_member(root_obj, "sticker");
     if (sticker_arr == NULL) {
         LOGE("failed to get array member");
@@ -523,7 +581,7 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
         goto cleanup;
     }
 
-    int arr_len = json_array_get_length(sticker_arr);
+    arr_len = json_array_get_length(sticker_arr);
     for (int i = 0; i < arr_len; i++) {
         JsonObject *info_object = json_array_get_object_element(sticker_arr, i);
         if (info_object != NULL) {
@@ -633,6 +691,47 @@ cleanup:
     return ret;
 }
 
+static void __delete_sticker_whitelist(const char *db_path, const char *app_id)
+{
+    int ret;
+    sqlite3 *db = NULL;
+    sqlite3_stmt *stmt = NULL;
+
+    db = __db_open(db_path);
+    if (!db)
+        return;
+
+    ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_whitelist_info WHERE provider_id = ?", -1, &stmt, NULL);
+    if (ret != SQLITE_OK) {
+        LOGE("failed to delete sticker whitelist : %s", sqlite3_errmsg(db));
+        sqlite3_finalize(stmt);
+        sqlite3_close(db);
+        goto cleanup;
+    }
+
+    sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
+
+    ret = sqlite3_step(stmt);
+    if (ret != SQLITE_OK && ret != SQLITE_DONE) {
+        LOGE("sqlite3_step() failed : ret(%d)", ret);
+        goto cleanup;
+    }
+
+    if (sqlite3_changes(db) == 0) {
+        LOGE("No changes to DB");
+        goto cleanup;
+    }
+
+    sqlite3_finalize(stmt);
+    sqlite3_close(db);
+    return;
+
+cleanup:
+    sqlite3_finalize(stmt);
+    sqlite3_close(db);
+    return;
+}
+
 static void __delete_sticker_info(const char *db_path, int record_id)
 {
     int ret;
@@ -722,8 +821,7 @@ int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *
     LOGD("METADATA INSTALL");
     LOGD("pkgid: %s, appid: %s", pkgid, appid);
 
-    metadata *md = NULL;
-    GList *md_list = NULL;
+    metadata *md = (metadata *)list->data;
     package_info_h package_info = NULL;
     char *app_path = NULL;
     char *file_path = NULL;
@@ -743,27 +841,21 @@ int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *
         goto cleanup;
     }
 
-    for(md_list = g_list_first(list); md_list != NULL; md_list = md_list->next) {
-        md = (metadata *)md_list->data;
-        int path_len = strlen(app_path) + strlen((char *)md->value) + 2;
-        file_path = (char *)calloc(path_len, sizeof(char));
-        if (!file_path) {
-            LOGE("failed to alloc memory");
-            continue;
-        }
+    int path_len = strlen(app_path) + strlen((char *)md->value) + 2;
+    file_path = (char *)calloc(path_len, sizeof(char));
+    if (!file_path) {
+        LOGE("failed to alloc memory");
+        goto cleanup;
+    }
 
-        if ((char)md->value[0] == '/')
-            snprintf(file_path, path_len, "%s%s",app_path, (char *)md->value);
-        else
-            snprintf(file_path, path_len, "%s%s%s",app_path, "/", (char *)md->value);
+    if ((char)md->value[0] == '/')
+        snprintf(file_path, path_len, "%s%s",app_path, (char *)md->value);
+    else
+        snprintf(file_path, path_len, "%s%s%s",app_path, "/", (char *)md->value);
 
-        if (__get_sticker_info_from_json(appid, file_path, app_path) == 0)
+    if (__get_sticker_info_from_json(appid, file_path, app_path) == 0)
             LOGE("failed to get sticker information [path : %s]", file_path);
 
-        free(file_path);
-        file_path = NULL;
-    }
-
 cleanup:
     if (package_info)
         package_info_destroy(package_info);
@@ -773,6 +865,11 @@ cleanup:
         app_path = NULL;
     }
 
+    if (file_path) {
+        free(file_path);
+        file_path = NULL;
+    }
+
     return 0;
 }
 
@@ -819,6 +916,8 @@ int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList
         sqlite3_close(db);
     }
 
+    __delete_sticker_whitelist(db_path, appid);
+
     return 0;
 }