#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"
#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;
}
}
+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;
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
//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)
{
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;
}
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;
/* 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);
}
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);
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
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);
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
#include <libgssdp/gssdp.h>
#include <dlog.h>
+#include <cynara-client.h>
/*****************************************************************************
* Network Service Discovery headers
/*****************************************************************************
* Macros and Typedefs
*****************************************************************************/
+#define SMACK_LABEL_LEN 255
typedef enum {
SSDP_SERVICE_STATE_NOT_REGISTERED,
}
//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)
*/
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;
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);
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__;
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__;