Send provider info when requesting socket pair 82/129882/5
authorJiwoong Im <jiwoong.im@samsung.com>
Thu, 18 May 2017 08:39:11 +0000 (17:39 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Wed, 7 Jun 2017 06:29:58 +0000 (15:29 +0900)
- To check privilege in amd, send provider information
  when requesting socket pair
- Related patches
  [amd] https://review.tizen.org/gerrit/#/c/129881/
  [aul-1] https://review.tizen.org/gerrit/#/c/129880/
  [tpk-manifest-handler] https://review.tizen.org/gerrit/#/c/129211/
  [app-installers] https://review.tizen.org/gerrit/#/c/129212/
  [pkgmgr-info] https://review.tizen.org/gerrit/#/c/129210/

Change-Id: I43822defc3068c2ab691bda0d2f586b0e9a58866
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
src/data-control-internal.c
src/data-control-internal.h
src/data-control-map.c
src/data-control-provider.c
src/data-control-sql.c

index 9701758..e657ada 100755 (executable)
@@ -481,21 +481,36 @@ void _socket_info_free(gpointer socket)
 
 }
 
-datacontrol_socket_info *_add_watch_on_socket_info(const char *caller_id, const char *callee_id, const char *type,
-               GIOFunc cb, void *data)
+int _add_watch_on_socket_info(const char *caller_id,
+               const char *callee_id, const char *type, const char *provider_id,
+               const char *data_type, GIOFunc cb, void *data,
+               datacontrol_socket_info **socket_info)
 {
        char err_buf[ERR_BUFFER_SIZE];
        int socketpair = 0;
        int g_src_id;
+       int ret;
 
-       datacontrol_socket_info *socket_info = NULL;
+       datacontrol_socket_info *_socket_info = NULL;
        bundle *sock_bundle = bundle_create();
        bundle_add_str(sock_bundle, AUL_K_CALLER_APPID, caller_id);
        bundle_add_str(sock_bundle, AUL_K_CALLEE_APPID, callee_id);
-       bundle_add_str(sock_bundle, "DATA_CONTOL_TYPE", type);
+       bundle_add_str(sock_bundle, "DATA_CONTROL_TYPE", type);
+       if (provider_id)
+               bundle_add_str(sock_bundle, OSP_K_DATACONTROL_PROVIDER, provider_id);
+       if (data_type)
+               bundle_add_str(sock_bundle, "DATA_CONTROL_DATA_TYPE", data_type);
 
-       aul_request_data_control_socket_pair(sock_bundle, &socketpair);
+       ret = aul_request_data_control_socket_pair(sock_bundle, &socketpair);
        bundle_free(sock_bundle);
+       if (ret != AUL_R_OK) {
+               if (ret == AUL_R_EILLACC) {
+                       LOGE("Permission denied. Consumer need privilege.");
+                       return DATACONTROL_ERROR_PERMISSION_DENIED;
+               }
+
+               return DATACONTROL_ERROR_IO_ERROR;
+       }
 
        LOGI("consumer socket pair : %d", socketpair);
 
@@ -504,7 +519,7 @@ datacontrol_socket_info *_add_watch_on_socket_info(const char *caller_id, const
                gio_read = g_io_channel_unix_new(socketpair);
                if (!gio_read) {
                        LOGE("Error is %s\n", strerror_r(errno, err_buf, sizeof(err_buf)));
-                       return NULL;
+                       return DATACONTROL_ERROR_IO_ERROR;
                }
 
                g_src_id = g_io_add_watch(gio_read, G_IO_IN | G_IO_HUP,
@@ -512,25 +527,27 @@ datacontrol_socket_info *_add_watch_on_socket_info(const char *caller_id, const
                if (g_src_id == 0) {
                        g_io_channel_unref(gio_read);
                        LOGE("fail to add watch on socket");
-                       return NULL;
+                       return DATACONTROL_ERROR_IO_ERROR;
                }
 
-               socket_info = (datacontrol_socket_info *)calloc(1, sizeof(datacontrol_socket_info));
-               if (socket_info == NULL) {
+               _socket_info = (datacontrol_socket_info *)calloc(1, sizeof(datacontrol_socket_info));
+               if (_socket_info == NULL) {
                        g_io_channel_unref(gio_read);
                        g_source_remove(g_src_id);
                        LOGE("fail to calloc socket_info");
-                       return NULL;
+                       return DATACONTROL_ERROR_IO_ERROR;
                }
-               socket_info->socket_fd = socketpair;
-               socket_info->gio_read = gio_read;
-               socket_info->g_src_id = g_src_id;
+               _socket_info->socket_fd = socketpair;
+               _socket_info->gio_read = gio_read;
+               _socket_info->g_src_id = g_src_id;
                LOGI("Watch on socketpair done.");
        } else {
                LOGE("fail to get socket pair");
-               return NULL;
+               return DATACONTROL_ERROR_IO_ERROR;
        }
-       return socket_info;
+
+       *socket_info = _socket_info;
+       return DATACONTROL_ERROR_NONE;
 }
 
 int _request_appsvc_run(const char *caller_id, const char *callee_id)
index 35eb7d2..786f33a 100755 (executable)
@@ -109,7 +109,10 @@ int _write_socket(int fd, void *buffer, unsigned int nbytes, unsigned int *bytes
 gboolean _datacontrol_recv_message(GIOChannel *channel, GIOCondition cond, gpointer data);
 int _get_gdbus_shared_connection(GDBusConnection **connection, char *provider_id);
 void _socket_info_free(gpointer socket);
-datacontrol_socket_info *_add_watch_on_socket_info(const char *caller_id, const char *callee_id, const char *type, GIOFunc cb, void *data);
+int _add_watch_on_socket_info(const char *caller_id,
+               const char *callee_id, const char *type, const char *provider_id,
+               const char *data_type, GIOFunc cb, void *data,
+               datacontrol_socket_info **socket_info);
 int _request_appsvc_run(const char *caller_id, const char *callee_id);
 
 GDBusConnection *_get_dbus_connection();
index ccabaf0..944bd0f 100755 (executable)
@@ -558,16 +558,20 @@ static int __map_request_provider(datacontrol_h provider, datacontrol_request_ty
        do {
                datacontrol_socket_info *socket_info = g_hash_table_lookup(__socket_pair_hash, provider->provider_id);
                if (socket_info == NULL) {
-                       ret = _request_appsvc_run(caller_app_id, app_id);
+                       ret = _add_watch_on_socket_info(caller_app_id, app_id,
+                                       "consumer", provider->provider_id, "Map",
+                                       __recv_map_message, data,
+                                       &socket_info);
                        if (ret != DATACONTROL_ERROR_NONE) {
                                bundle_free(send_data);
                                return ret;
                        }
 
-                       socket_info = _add_watch_on_socket_info(caller_app_id, app_id, "consumer", __recv_map_message, data);
-                       if (socket_info == NULL) {
+                       ret = _request_appsvc_run(caller_app_id, app_id);
+                       if (ret != DATACONTROL_ERROR_NONE) {
+                               _socket_info_free(socket_info);
                                bundle_free(send_data);
-                               return DATACONTROL_ERROR_IO_ERROR;
+                               return ret;
                        }
 
                        g_hash_table_insert(__socket_pair_hash, strdup(provider->provider_id), socket_info);
index e9b05c8..6bd39d4 100755 (executable)
@@ -1708,9 +1708,11 @@ int __datacontrol_handler_cb(bundle *b, int request_id, void *data)
                if (socket_info != NULL)
                        g_hash_table_remove(__socket_pair_hash, dup_caller);
 
-               socket_info = _add_watch_on_socket_info(dup_caller, callee, "provider", __provider_recv_message, dup_caller);
-               if (socket_info == NULL)
-                       return DATACONTROL_ERROR_IO_ERROR;
+               ret = _add_watch_on_socket_info(dup_caller, callee, "provider",
+                               NULL, NULL, __provider_recv_message,
+                               dup_caller, &socket_info);
+               if (ret != DATACONTROL_ERROR_NONE)
+                       return ret;
 
                g_hash_table_insert(__socket_pair_hash, dup_caller, socket_info);
        } else {
index 885d9ec..3f5ee68 100755 (executable)
@@ -927,18 +927,22 @@ static int __sql_request_provider(datacontrol_h provider, datacontrol_request_ty
                datacontrol_socket_info *socket_info = g_hash_table_lookup(__socket_pair_hash, provider->provider_id);
 
                if (socket_info == NULL) {
-                       ret = _request_appsvc_run(caller_app_id, app_id);
+                       ret = _add_watch_on_socket_info(caller_app_id, app_id,
+                                       "consumer", provider->provider_id, "Sql",
+                                       __consumer_recv_sql_message, response_cb_data,
+                                       &socket_info);
                        if (ret != DATACONTROL_ERROR_NONE) {
-                               LOGE("_request_appsvc_run error !!!");
+                               LOGE("_get_socket_info error !!!");
                                bundle_free(send_data);
                                return ret;
                        }
 
-                       socket_info = _add_watch_on_socket_info(caller_app_id, app_id, "consumer", __consumer_recv_sql_message, response_cb_data);
-                       if (socket_info == NULL) {
-                               LOGE("_get_socket_info error !!!");
+                       ret = _request_appsvc_run(caller_app_id, app_id);
+                       if (ret != DATACONTROL_ERROR_NONE) {
+                               LOGE("_request_appsvc_run error !!!");
                                bundle_free(send_data);
-                               return DATACONTROL_ERROR_IO_ERROR;
+                               _socket_info_free(socket_info);
+                               return ret;
                        }
 
                        socket_info_key = strdup(provider->provider_id);