Add codes to check internet privilege 34/146134/1 accepted/tizen/unified/20170901.025936 submit/tizen/20170825.060613 submit/tizen/20170830.065642
authorchleun.moon <chleun.moon@samsung.com>
Fri, 25 Aug 2017 06:00:55 +0000 (15:00 +0900)
committerchleun.moon <chleun.moon@samsung.com>
Fri, 25 Aug 2017 06:01:07 +0000 (15:01 +0900)
Change-Id: Iaed13fc5e5d3e3f38e73b06b59b9d04f482ac413
Signed-off-by: cheoleun <chleun.moon@samsung.com>
CMakeLists.txt
packaging/capi-network-nsd.spec
src/dns-sd/dns-sd.c
src/ssdp/ssdp.c

index 322ebe56feb6f92cd2cf2f6c1de9866f5e19418f..1487a9bbf691ba247114c6ee330e395ee8da96db 100644 (file)
@@ -26,7 +26,7 @@ INCLUDE(FindPkgConfig)
 
 ########################## search for packages ################################
 
-SET(COMMON_DEPS "dlog glib-2.0 gio-2.0 capi-base-common capi-system-info gio-unix-2.0 gssdp-1.0 dns_sd")
+SET(COMMON_DEPS "dlog glib-2.0 gio-2.0 capi-base-common capi-system-info gio-unix-2.0 gssdp-1.0 dns_sd cynara-client")
 SET(PC_DEPS "capi-base-common")
 
 
index 224d1c7d31f82e9927a557b6f07b772bc1d9d821..110ee1208cf784cb004fb791d44e6d33f1ee44c5 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-network-nsd
 Summary:    A Network Service Discovery libraries in Native API
-Version:    0.0.15
+Version:    0.0.16
 Release:    1
 Group:      System/Network
 License:    Apache-2.0
@@ -16,6 +16,7 @@ BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires:  pkgconfig(dns_sd)
 BuildRequires:  pkgconfig(gssdp-1.0)
+BuildRequires:  pkgconfig(cynara-client)
 
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
index 11d3974a0e7ca5ecd000fd34a84a097c76e151e2..07e9b5dc1a5c247b665481b41faba5d2a4adfc09 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdint.h>
 #include <string.h>
 #include <netinet/in.h>
+#include <cynara-client.h>
 #include <dns_sd.h>
 #include "dns-sd-util.h"
 #include "dns-sd.h"
@@ -35,6 +36,8 @@
 #define BROWSE_SIZE (sizeof(dnssd_handle_s) + sizeof(dnssd_browse_data_s))
 #define FOUND_SIZE (sizeof(dnssd_handle_s) + sizeof(dnssd_found_data_s))
 
+#define SMACK_LABEL_LEN 255
+
 static __thread GSList *dnssd_handle_list = NULL;
 static __thread GSList *resolve_handle_list = NULL;
 static __thread bool g_is_init = false;
@@ -66,6 +69,44 @@ static const char *dnssd_error_to_string(dnssd_error_e error)
        }
 }
 
+static bool __dnssd_check_permission()
+{
+       FILE *fd;
+
+       int ret;
+       char smack_label[SMACK_LABEL_LEN + 1];
+       char uid[10];
+       char *client_session = "";
+       char *privilege = "http://tizen.org/privilege/internet";
+
+       cynara *p_cynara;
+
+       if (CYNARA_API_SUCCESS != cynara_initialize(&p_cynara, NULL)) {
+               DNSSD_LOGE("Failed to initialize cynara structure");
+               return false;
+       }
+
+       bzero(smack_label, SMACK_LABEL_LEN + 1);
+
+       fd = fopen("/proc/self/attr/current", "r");
+       if (fd == NULL) {
+               DNSSD_LOGE("Failed to open /proc/self/attr/current");
+               return false;
+       }
+       ret = fread(smack_label, sizeof(smack_label), 1, fd);
+       fclose(fd);
+       if (ret < 0) {
+               DNSSD_LOGE("Failed to read /proc/self/attr/current");
+               return false;
+       }
+
+       snprintf(uid, sizeof(uid), "%d", getuid());
+
+       ret = cynara_check(p_cynara, smack_label, client_session, uid, privilege);
+       cynara_finish(p_cynara);
+
+       return (ret == CYNARA_API_ACCESS_ALLOWED) ? true : false;
+}
 static bool __dnssd_is_init(void)
 {
        return g_is_init;
@@ -781,6 +822,11 @@ int dnssd_register_local_service(dnssd_service_h local_service,
 
        CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE);
 
+       if (__dnssd_check_permission() == false) {
+               DNSSD_LOGE("Permission denied");
+               return DNSSD_ERROR_PERMISSION_DENIED;
+       }
+
        if (__dnssd_is_init() == false) {
                DNSSD_LOGE("Not initialized");  //LCOV_EXCL_LINE
                __DNSSD_LOG_FUNC_EXIT__;        //LCOV_EXCL_LINE
@@ -998,7 +1044,7 @@ static void __dnssd_getaddrinfo_reply_cb(DNSServiceRef sd_ref,
 
 //LCOV_EXCL_START
 static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
-               unsigned int if_index, const char *host_name, char *service_name,
+               unsigned int if_index, const char *host_name,
                const char *fullname, const char *txt_record,
                unsigned short txt_len, int port)
 {
@@ -1024,11 +1070,11 @@ static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
        domain = strtok_r(NULL, ".", &save_str);
        domain = strtok_r(NULL, ".", &save_str);
        domain = strtok_r(NULL, ".", &save_str);
-       g_free(name);
 
        local_handle = g_try_malloc0(FOUND_SIZE);
        if (local_handle == NULL) {
                DNSSD_LOGD("g_try_malloc failed");
+               g_free(name);
                __DNSSD_LOG_FUNC_EXIT__;
                return DNSSD_ERROR_OUT_OF_MEMORY;
        }
@@ -1045,7 +1091,8 @@ static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
                local_handle->service_type = g_strdup(dnssd_handle->service_type);
 
        found->browse_handler = dnssd_handle->service_handler;
-       found->service_name = g_strdup(service_name);
+       found->service_name = g_strdup(name);
+       g_free(name);
        if (txt_record != NULL) {
                found->txt_record = g_strndup(txt_record, txt_len);
                found->txt_len = txt_len;
@@ -1109,8 +1156,8 @@ static void __dnssd_resolve_reply_cb(DNSServiceRef sd_ref, unsigned int flags,
 
        /* Get Address Info details and send browse callback */
        __dnssd_getaddrinfo(resolve_data->dnssd_handle, flags, if_index,
-                       host_name, resolve_data->service_name, fullname,
-                       (const char *) txt_record, txt_len, port);
+                       host_name, fullname, (const char *) txt_record,
+                       txt_len, port);
        g_idle_add_full(G_PRIORITY_HIGH, __remove_service_resolve_socket,
                                        resolve_data, NULL);
 }
@@ -1135,7 +1182,6 @@ static int __dnssd_resolve_dns_service(dnssd_handle_s *dnssd_handle,
 
        data->dnssd_handle =  dnssd_handle;
        data->watch_id = 0;
-       data->service_name = g_strdup(service_name);
 
        resolve_handle_list = g_slist_prepend(resolve_handle_list, data);
 
@@ -1275,6 +1321,11 @@ int dnssd_start_browsing_service(const char *service_type,
 
        CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE);
 
+       if (__dnssd_check_permission() == false) {
+               DNSSD_LOGE("Permission denied");
+               return DNSSD_ERROR_PERMISSION_DENIED;
+       }
+
        if (__dnssd_is_init() == false) {
                DNSSD_LOGE("Not initialized");  //LCOV_EXCL_LINE
                __DNSSD_LOG_FUNC_EXIT__;        //LCOV_EXCL_LINE
@@ -1444,9 +1495,6 @@ static void __dnssd_remove_found_service(gpointer data, gpointer user_data)
        dnssd_handle_list = g_slist_remove(dnssd_handle_list,
                        found_handle);
 
-       if (found_handle->watch_id > 0)
-               __remove_service_getaddrinfo_socket(found_handle);
-
        g_free(found_handle->service_type);
        g_free(found_data->service_name);
        g_free(found_data->host);
@@ -1506,11 +1554,6 @@ int dnssd_stop_browsing_service(dnssd_browser_h dnssd_service)
                if (resolve_data->dnssd_handle == local_handle) {
                        resolve_handle_list = g_slist_remove(resolve_handle_list,
                                        resolve_data);
-
-                       if (resolve_data->watch_id > 0)
-                               __remove_service_resolve_socket(resolve_data);
-
-                       g_free(resolve_data->service_name);
                        g_free(resolve_data);
                }
                //LCOV_EXCL_STOP
index 7d14260d0c5c6db7cf69f20e5f9a03676b5754d3..b27df635cfe0e93cdd5bd3efc995ed101df3c0ee 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <libgssdp/gssdp.h>
 #include <dlog.h>
+#include <cynara-client.h>
 
 /*****************************************************************************
  * Network Service Discovery headers
@@ -42,6 +43,7 @@
 /*****************************************************************************
  * Macros and Typedefs
  *****************************************************************************/
+#define SMACK_LABEL_LEN 255
 
 typedef enum {
        SSDP_SERVICE_STATE_NOT_REGISTERED,
@@ -143,6 +145,45 @@ static void __g_hash_free_service(gpointer key, gpointer value,
 }
 //LCOV_EXCL_STOP
 
+static bool __ssdp_check_permission()
+{
+       FILE *fd;
+
+       int ret;
+       char smack_label[SMACK_LABEL_LEN + 1];
+       char uid[10];
+       char *client_session = "";
+       char *privilege = "http://tizen.org/privilege/internet";
+
+       cynara *p_cynara;
+
+       if (CYNARA_API_SUCCESS != cynara_initialize(&p_cynara, NULL)) {
+               SSDP_LOGE("Failed to initialize cynara structure");
+               return false;
+       }
+
+       bzero(smack_label, SMACK_LABEL_LEN + 1);
+
+       fd = fopen("/proc/self/attr/current", "r");
+       if (fd == NULL) {
+               SSDP_LOGE("Failed to open /proc/self/attr/current");
+               return false;
+       }
+       ret = fread(smack_label, sizeof(smack_label), 1, fd);
+       fclose(fd);
+       if (ret < 0) {
+               SSDP_LOGE("Failed to read /proc/self/attr/current");
+               return false;
+       }
+
+       snprintf(uid, sizeof(uid), "%d", getuid());
+
+       ret = cynara_check(p_cynara, smack_label, client_session, uid, privilege);
+       cynara_finish(p_cynara);
+
+       return (ret == CYNARA_API_ACCESS_ALLOWED) ? true : false;
+}
+
 /**
  * remove remove services found by request of a browser (browser_id is passed to by user_data)
  */
@@ -759,6 +800,11 @@ int ssdp_register_local_service(ssdp_service_h local_service,
 
        CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE);
 
+       if (__ssdp_check_permission() == false) {
+               SSDP_LOGE("Permission denied");
+               return SSDP_ERROR_PERMISSION_DENIED;
+       }
+
        if (local_service == 0) {
                SSDP_LOGE("Invalid parameter");
                return SSDP_ERROR_INVALID_PARAMETER;
@@ -848,8 +894,6 @@ int ssdp_deregister_local_service(ssdp_service_h local_service)
                return SSDP_ERROR_SERVICE_NOT_FOUND;
        }
 
-       gssdp_resource_group_set_available(service->resource_group, FALSE);
-
        if (service->resource_group != NULL && service->resource_id != 0) {
                gssdp_resource_group_remove_resource(service->resource_group,
                                service->resource_id);
@@ -861,6 +905,7 @@ int ssdp_deregister_local_service(ssdp_service_h local_service)
        service->registered_cb = NULL;
        service->cb_user_data = NULL;
 
+       gssdp_resource_group_set_available(service->resource_group, FALSE);
        SSDP_LOGD("Now service is unavailable [%u]", local_service);
 
        __SSDP_LOG_FUNC_EXIT__;
@@ -876,6 +921,11 @@ int ssdp_start_browsing_service(const char* target, ssdp_browser_h* ssdp_browser
 
        CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE);
 
+       if (__ssdp_check_permission() == false) {
+               SSDP_LOGE("Permission denied");
+               return SSDP_ERROR_PERMISSION_DENIED;
+       }
+
        if (!g_is_gssdp_init) {
                SSDP_LOGE("gssdp not initialized");
                __SSDP_LOG_FUNC_EXIT__;