Match the correct privilege for RFCOMM listen and accept API 00/194300/1
authorDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 3 Dec 2018 01:59:58 +0000 (10:59 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 3 Dec 2018 02:00:43 +0000 (11:00 +0900)
Change-Id: I1a19d3222ec033a55a16f20e8d906a61c6f0b6b7
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
bt-api/bt-common.c
bt-api/bt-rfcomm-server.c
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/include/bt-service-rfcomm.h
bt-service-adaptation/services/rfcomm/bt-service-rfcomm.c
include/bt-internal-types.h

index ce5697b..cee9744 100644 (file)
@@ -588,6 +588,7 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_RFCOMM_SOCKET_WRITE, "BT_RFCOMM_SOCKET_WRITE"},
                {BT_RFCOMM_CREATE_SOCKET, "BT_RFCOMM_CREATE_SOCKET"},
                {BT_RFCOMM_REMOVE_SOCKET, "BT_RFCOMM_REMOVE_SOCKET"},
+               {BT_RFCOMM_LISTEN_AND_ACCEPT, "BT_RFCOMM_LISTEN_AND_ACCEPT"},
                {BT_RFCOMM_LISTEN, "BT_RFCOMM_LISTEN"},
                {BT_RFCOMM_IS_UUID_AVAILABLE, "BT_RFCOMM_IS_UUID_AVAILABLE"},
                {BT_RFCOMM_ACCEPT_CONNECTION, "BT_RFCOMM_ACCEPT_CONNECTION"},
index 05c311d..64d579d 100644 (file)
@@ -1050,7 +1050,7 @@ err:
        return FALSE;
 }
 
-static int __rfcomm_listen(rfcomm_server_info_t *server_info)
+static int __rfcomm_listen(rfcomm_server_info_t *server_info, bool accept)
 {
        int result;
        GUnixFDList *out_fd_list = NULL;
@@ -1061,9 +1061,15 @@ static int __rfcomm_listen(rfcomm_server_info_t *server_info)
        BT_INIT_PARAMS();
        BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
 
-       g_array_append_vals(in_param1, server_info->uuid, BLUETOOTH_UUID_STRING_MAX);
-       result = _bt_send_request_with_unix_fd_list(BT_BLUEZ_SERVICE, BT_RFCOMM_LISTEN,
-                       in_param1, in_param2, in_param3, in_param4, NULL, &out_param, &out_fd_list);
+       if (accept == false) {
+               g_array_append_vals(in_param1, server_info->uuid, BLUETOOTH_UUID_STRING_MAX);
+               result = _bt_send_request_with_unix_fd_list(BT_BLUEZ_SERVICE, BT_RFCOMM_LISTEN,
+                               in_param1, in_param2, in_param3, in_param4, NULL, &out_param, &out_fd_list);
+       } else {
+               g_array_append_vals(in_param1, server_info->uuid, BLUETOOTH_UUID_STRING_MAX);
+               result = _bt_send_request_with_unix_fd_list(BT_BLUEZ_SERVICE, BT_RFCOMM_LISTEN_AND_ACCEPT,
+                               in_param1, in_param2, in_param3, in_param4, NULL, &out_param, &out_fd_list);
+       }
 
        BT_DBG("result: %x", result);
        if (result != BLUETOOTH_ERROR_NONE) {
@@ -1473,7 +1479,7 @@ BT_EXPORT_API int bluetooth_rfcomm_listen_and_accept(int id, int max_pending_con
        server_info->max_pending_conn = max_pending_connection;
        server_info->auto_accept = TRUE;
 
-       return __rfcomm_listen(server_info);
+       return __rfcomm_listen(server_info, true);
 #endif
 }
 
@@ -1580,7 +1586,7 @@ BT_EXPORT_API int bluetooth_rfcomm_listen(int id, int max_pending_connection)
 
        server_info->max_pending_conn = max_pending_connection;
        server_info->auto_accept = FALSE;
-       return __rfcomm_listen(server_info);
+       return __rfcomm_listen(server_info, false);
 #endif
 }
 
index 3fa19cb..5781ce7 100644 (file)
@@ -203,6 +203,7 @@ static gboolean __bt_is_sync_function(int service_function)
                        || service_function == BT_GET_IS_ALIAS_SET
                        || service_function == BT_GET_CONNECTED_LINK_TYPE
                        || service_function == BT_IS_SERVICE_USED
+                       || service_function == BT_RFCOMM_LISTEN_AND_ACCEPT
                        || service_function == BT_RFCOMM_LISTEN
                        || service_function == BT_HDP_REGISTER_SINK_APP
                        || service_function == BT_HDP_UNREGISTER_SINK_APP
@@ -1312,6 +1313,25 @@ int __bt_bluez_request(int function_name,
                result = BLUETOOTH_ERROR_NONE;
                break;
        }
+       case BT_RFCOMM_LISTEN_AND_ACCEPT: {
+               char *uuid;
+               int socket_fd = -1;
+
+               sender = (char *)g_dbus_method_invocation_get_sender(context);
+               uuid = (char *)g_variant_get_data(in_param1);
+
+               result = _bt_rfcomm_socket_listen(sender, uuid, true);
+               if (result > 0) {
+                       BT_ERR("BT_RFCOMM_LISTEN_AND_ACCEPT success, save context");
+
+                       result = BLUETOOTH_ERROR_NONE;
+                       _bt_save_invocation_context(context,
+                                       result, sender, function_name, NULL);
+               } else {
+                       g_array_append_vals(*out_param1, &socket_fd, sizeof(int));
+               }
+               break;
+       }
        case BT_RFCOMM_LISTEN: {
                char *uuid;
                int socket_fd = -1;
@@ -1319,7 +1339,7 @@ int __bt_bluez_request(int function_name,
                sender = (char *)g_dbus_method_invocation_get_sender(context);
                uuid = (char *)g_variant_get_data(in_param1);
 
-               result = _bt_rfcomm_socket_listen(sender, uuid);
+               result = _bt_rfcomm_socket_listen(sender, uuid, false);
                if (result > 0) {
                        BT_ERR("BT_RFCOMM_LISTEN success, save context");
 
@@ -3721,6 +3741,8 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_PBAP_PULL_VCARD:
        case BT_PBAP_PHONEBOOK_SEARCH:
 
+       case BT_RFCOMM_LISTEN_AND_ACCEPT:
+
        ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
                                                BT_PRIVILEGE_PUBLIC);
 
index fe34848..98ac5ed 100644 (file)
@@ -32,7 +32,7 @@ extern "C" {
 
 int _bt_rfcomm_connect_using_uuid(bluetooth_device_address_t *device_address, char *remote_uuid);
 int _bt_rfcomm_connect_using_channel(bluetooth_device_address_t *device_address, char *chan_str);
-int _bt_rfcomm_socket_listen(char *svc_name, char *uuid);
+int _bt_rfcomm_socket_listen(char *svc_name, char *uuid, bool accept);
 
 #ifdef __cplusplus
 }
index 19c1b07..9bfa821 100644 (file)
@@ -86,6 +86,7 @@ static void __bt_rfcomm_reply_pending_request(int result,
                        g_array_free(out_param, TRUE);
                        break;
                }
+               case BT_RFCOMM_LISTEN_AND_ACCEPT:
                case BT_RFCOMM_LISTEN: {
                        GUnixFDList *fd_list = NULL;
                        GError *error = NULL;
@@ -207,7 +208,19 @@ gboolean __bt_send_rfcomm_server_fd(gpointer user_data)
        return FALSE;
 }
 
-int _bt_rfcomm_socket_listen(char *svc_name, char *uuid)
+gboolean __bt_send_rfcomm_server_fd_with_accept(gpointer user_data)
+{
+       BT_DBG("+");
+
+       __bt_rfcomm_reply_pending_request(BLUETOOTH_ERROR_NONE,
+                       BT_RFCOMM_LISTEN_AND_ACCEPT, user_data, sizeof(int));
+
+       g_free(user_data);
+       BT_DBG("-");
+       return FALSE;
+}
+
+int _bt_rfcomm_socket_listen(char *svc_name, char *uuid, bool accept)
 {
        int channel = 0;
        int sock_fd;
@@ -224,7 +237,11 @@ int _bt_rfcomm_socket_listen(char *svc_name, char *uuid)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       g_idle_add(__bt_send_rfcomm_server_fd, g_memdup(&sock_fd, sizeof(int)));
+       if (accept == false)
+               g_idle_add(__bt_send_rfcomm_server_fd, g_memdup(&sock_fd, sizeof(int)));
+       else
+               g_idle_add(__bt_send_rfcomm_server_fd_with_accept, g_memdup(&sock_fd, sizeof(int)));
+
        BT_DBG("-");
        return sock_fd;
 }
index 7fe236e..949571b 100644 (file)
@@ -300,6 +300,7 @@ typedef enum {
        BT_RFCOMM_SOCKET_WRITE,
        BT_RFCOMM_CREATE_SOCKET,
        BT_RFCOMM_REMOVE_SOCKET,
+       BT_RFCOMM_LISTEN_AND_ACCEPT,
        BT_RFCOMM_LISTEN,
        BT_RFCOMM_IS_UUID_AVAILABLE,
        BT_RFCOMM_ACCEPT_CONNECTION,