Add cynara dependency for checking permission
authorSeonah Moon <seonah1.moon@samsung.com>
Mon, 13 Apr 2020 11:34:14 +0000 (20:34 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Mon, 13 Apr 2020 11:34:14 +0000 (20:34 +0900)
CMakeLists.txt
include/wifi-aware.h
packaging/capi-network-wifi-aware.spec
src/include/wifi-aware-private.h
src/wifi-aware-private.c
src/wifi-aware.c

index e5bc6fd..c1b28a8 100644 (file)
@@ -27,7 +27,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")
+SET(COMMON_DEPS "dlog glib-2.0 gio-2.0 capi-base-common capi-system-info gio-unix-2.0 cynara-client")
 SET(PC_DEPS "capi-base-common")
 
 
index bfa605c..8d2d4e1 100644 (file)
@@ -424,6 +424,8 @@ typedef void(*wifi_aware_enabled_cb)(wifi_aware_error_e error, void *user_data);
  * @brief Enables Wi-Fi Aware functions.
  * @remarks If the enable request is sucessfully done, the application can get the MAC address.
  * @since_tizen 6.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.set
  * @param[in] callback The result of enable request is asynchrously delivered
  * @param[in] user_data The user data passed to the callback function
  * @return 0 on success, otherwise a negative error value
@@ -432,6 +434,7 @@ typedef void(*wifi_aware_enabled_cb)(wifi_aware_error_e error, void *user_data);
  * @retval #WIFI_AWARE_ERROR_ALREADY_ENABLED
  * @retval #WIFI_AWARE_ERROR_OUT_OF_MEMORY
  * @retval #WIFI_AWARE_ERROR_OPERATION_FAILED
+ * @retval #WIFI_AWARE_ERROR_PERMISSION_DENIED
  * @see wifi_aware_disable()
  */
 int wifi_aware_enable(wifi_aware_enabled_cb callback, void *user_data);
@@ -550,6 +553,8 @@ typedef void(*wifi_aware_published_cb)(wifi_aware_session_h session,
 /**
  * @brief Publishes a Wi-Fi Aware service so that neighboring devices can find it.
  * @since_tizen 6.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.set
  * @param[in] sesssion  The Wi-Fi Aware Session handle
  * @param[in] publish   The Wi-Fi Aware Publish handle
  * @param[in] callback  The callback which gets called when a service is published
@@ -560,6 +565,7 @@ typedef void(*wifi_aware_published_cb)(wifi_aware_session_h session,
  * @retval #WIFI_AWARE_ERROR_INVALID_PARAMETER
  * @retval #WIFI_AWARE_ERROR_INVALID_OPERATION
  * @retval #WIFI_AWARE_ERROR_OPERATION_FAILED
+ * @retval #WIFI_AWARE_ERROR_PERMISSION_DENIED
  * @see wifi_aware_session_stop()
  */
 int wifi_aware_session_publish(wifi_aware_session_h session,
@@ -570,6 +576,8 @@ int wifi_aware_session_publish(wifi_aware_session_h session,
 /**
  * @brief Updates the configuration for a Wi-Fi Aware service that has already been published.
  * @since_tizen 6.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.set
  * @param[in] sesssion  The Wi-Fi Aware Session handle
  * @param[in] publish   The Wi-Fi Aware Publish handle
  * @param[in] callback  The callback which gets called when a service is updated
@@ -580,6 +588,7 @@ int wifi_aware_session_publish(wifi_aware_session_h session,
  * @retval #WIFI_AWARE_ERROR_INVALID_PARAMETER
  * @retval #WIFI_AWARE_ERROR_INVALID_OPERATION
  * @retval #WIFI_AWARE_ERROR_OPERATION_FAILED
+ * @retval #WIFI_AWARE_ERROR_PERMISSION_DENIED
  * @see wifi_aware_session_publish()
  */
 int wifi_aware_session_update_publish(wifi_aware_session_h session,
@@ -600,6 +609,8 @@ typedef void(*wifi_aware_subscribed_cb)(wifi_aware_session_h session,
 /**
  * @brief Starts to find Wi-Fi Aware services.
  * @since_tizen 6.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.set
  * @param[in] session   The Wi-Fi Aware Session handle
  * @param[in] subscribe The Wi-Fi Aware Subscribe handle
  * @param[in] callback  The callback which get called when request is finished
@@ -610,6 +621,7 @@ typedef void(*wifi_aware_subscribed_cb)(wifi_aware_session_h session,
  * @retval #WIFI_AWARE_ERROR_INVALID_PARAMETER
  * @retval #WIFI_AWARE_ERROR_INVALID_OPERATION
  * @retval #WIFI_AWARE_ERROR_OPERATION_FAILED
+ * @retval #WIFI_AWARE_ERROR_PERMISSION_DENIED
  * @see wifi_aware_session_stop()
  */
 int wifi_aware_session_subscribe(wifi_aware_session_h,
@@ -619,6 +631,8 @@ int wifi_aware_session_subscribe(wifi_aware_session_h,
 /**
  * @brief Updates the configuration for a Wi-Fi Aware service that has already been subscribed.
  * @since_tizen 6.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.set
  * @param[in] session   The Wi-Fi Aware Session handle
  * @param[in] subscribe The Wi-Fi Aware Subscribe handle
  * @param[in] callback  The callback which gets called when service is updated
@@ -629,6 +643,7 @@ int wifi_aware_session_subscribe(wifi_aware_session_h,
  * @retval #WIFI_AWARE_ERROR_INVALID_PARAMETER
  * @retval #WIFI_AWARE_ERROR_INVALID_OPERATION
  * @retval #WIFI_AWARE_ERROR_OPERATION_FAILED
+ * @retval #WIFI_AWARE_ERROR_PERMISSION_DENIED
  * @see wifi_aware_session_subscribe()
  */
 int wifi_aware_session_update_subscribe(wifi_aware_session_h session,
@@ -694,6 +709,8 @@ typedef void(*wifi_aware_send_message_result_cb)(wifi_aware_session_h session,
 /**
  * @brief Sends the message to a peer
  * @since_tizen 6.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/network.set
  * @param[in] session   The Wi-Fi Aware Session handle
  * @param[in] peer      The peer who gets the message
  * @param[in] message   The message sent to a peer
@@ -707,6 +724,7 @@ typedef void(*wifi_aware_send_message_result_cb)(wifi_aware_session_h session,
  * @retval #WIFI_AWARE_ERROR_INVALID_PARAMETER
  * @retval #WIFI_AWARE_ERROR_OUT_OF_MEMORY
  * @retval #WIFI_AWARE_ERROR_OPERATION_FAILED
+ * @retval #WIFI_AWARE_ERROR_PERMISSION_DENIED
  */
 int wifi_aware_session_send_message(
                wifi_aware_session_h session,
index caa3255..00db1aa 100644 (file)
@@ -13,6 +13,7 @@ BuildRequires:  pkgconfig(gio-2.0)
 BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(capi-system-info)
+BuildRequires:  pkgconfig(cynara-client)
 
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
index d9c562d..5f9a12b 100644 (file)
@@ -32,6 +32,7 @@ wifi_aware_error_e _wifi_aware_convert_error_string_to_enum(const char *error);
 wifi_aware_error_e _wifi_aware_convert_gdbus_error(GDBusError error);
 wifi_aware_error_e _wifi_aware_convert_nan_manager_error(int error);
 
+bool _wifi_aware_check_permission();
 bool _wifi_aware_is_initialized();
 int _wifi_aware_init();
 int _wifi_aware_deinit();
index aea6f6d..5f7b042 100644 (file)
@@ -25,6 +25,8 @@
 
 
 #include <glib.h>
+#include <cynara-client.h>
+#include <stdio.h>
 
 #include "wifi-aware.h"
 #include "wifi-aware-gdbus.h"
@@ -33,6 +35,7 @@
 #include "wifi-aware-private.h"
 #include "wifi-aware-utils.h"
 
+
 /**
  * These enum values has dependency with nan-manager daemon.
  * If the daemon changes error enum, It also must be changed. 
@@ -101,6 +104,14 @@ typedef struct {
 static bool __is_init = false;
 static wifi_aware_s *g_wifi_aware = NULL;
 
+/* Check for privilege */
+#define PROC_ATTR_CURRENT_PATH "/proc/self/attr/current"
+#define NETWORK_SET_PRIVILEGE "http://tizen.org/privilege/network.set"
+#define SMACK_LABEL_LEN 255
+
+static bool is_privilege_checked = false;
+static bool access_allowed = false;
+
 const char *_wifi_aware_convert_error_type_to_string(wifi_aware_error_e err)
 {
        switch (err) {
@@ -214,6 +225,51 @@ wifi_aware_error_e _wifi_aware_convert_nan_manager_error(int error)
        }
 }
 
+bool _wifi_aware_check_permission(void)
+{
+    FILE *fd;
+    int ret;
+    char smack_label[SMACK_LABEL_LEN + 1] = {0, };
+    char uid[10] = {0, };
+    char *client_session = "";
+    cynara *p_cynara;
+
+    if (is_privilege_checked) {
+               WIFI_AWARE_LOGI("permission was already checked: %d", access_allowed);
+        return access_allowed;
+       }
+
+    if (CYNARA_API_SUCCESS != cynara_initialize(&p_cynara, NULL))
+               return false;
+
+    bzero(smack_label, SMACK_LABEL_LEN + 1);
+
+    fd = fopen(PROC_ATTR_CURRENT_PATH, "r");
+    if (fd == NULL) {
+               cynara_finish(p_cynara);
+               return false;
+       }
+
+    ret = fread(smack_label, SMACK_LABEL_LEN, 1, fd);
+    if (ret < 0) {
+        fclose(fd);
+               cynara_finish(p_cynara);
+               return false;
+    }
+    fclose(fd);
+
+    snprintf(uid, sizeof(uid), "%d", getuid());
+    ret = cynara_check(p_cynara, smack_label, client_session, uid, NETWORK_SET_PRIVILEGE);
+    cynara_finish(p_cynara);
+
+    is_privilege_checked = true;
+    access_allowed = (ret == CYNARA_API_ACCESS_ALLOWED) ? true : false;
+
+    WIFI_AWARE_LOGI("permission checked[%s/%d]", NETWORK_SET_PRIVILEGE, access_allowed);
+    return access_allowed;
+}
+
+
 static void __session_set_requested(wifi_aware_session_h session_handle, bool requested)
 {
        wifi_aware_session_s *session = (wifi_aware_session_s *)session_handle;
index 18ceabc..7eeb294 100644 (file)
@@ -72,6 +72,7 @@ API int wifi_aware_enable(wifi_aware_enabled_cb callback, void *user_data)
 
        __WIFI_AWARE_FUNC_ENTER__;
        CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_check_permission(), WIFI_AWARE_ERROR_PERMISSION_DENIED, "Permission denied");
        RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
        RET_VAL_IF(_wifi_aware_is_enabled(), WIFI_AWARE_ERROR_ALREADY_ENABLED, "Already enabled");
 
@@ -289,6 +290,7 @@ API int wifi_aware_session_publish(wifi_aware_session_h session,
        int ret = WIFI_AWARE_ERROR_NONE;
 
        CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_check_permission(), WIFI_AWARE_ERROR_PERMISSION_DENIED, "Permission denied");
        RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
        RET_VAL_IF(!_wifi_aware_is_enabled(), WIFI_AWARE_ERROR_INVALID_OPERATION, "Not enabled");
        RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");
@@ -309,6 +311,7 @@ API int wifi_aware_session_update_publish(wifi_aware_session_h session,
        int ret = WIFI_AWARE_ERROR_NONE;
 
        CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_check_permission(), WIFI_AWARE_ERROR_PERMISSION_DENIED, "Permission denied");
        RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
        RET_VAL_IF(!_wifi_aware_is_enabled(), WIFI_AWARE_ERROR_INVALID_OPERATION, "Not enabled");
        RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");
@@ -476,6 +479,7 @@ API int wifi_aware_session_subscribe(wifi_aware_session_h session,
        int ret = WIFI_AWARE_ERROR_NONE;
 
        CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_check_permission(), WIFI_AWARE_ERROR_PERMISSION_DENIED, "Permission denied");
        RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
        RET_VAL_IF(!_wifi_aware_is_enabled(), WIFI_AWARE_ERROR_INVALID_OPERATION, "Not enabled");
        RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");
@@ -512,6 +516,7 @@ API int wifi_aware_session_update_subscribe(wifi_aware_session_h session,
        int ret = WIFI_AWARE_ERROR_NONE;
 
        CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_check_permission(), WIFI_AWARE_ERROR_PERMISSION_DENIED, "Permission denied");
        RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
        RET_VAL_IF(!_wifi_aware_is_enabled(), WIFI_AWARE_ERROR_INVALID_OPERATION, "Not enabled");
        RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");
@@ -557,6 +562,7 @@ API int wifi_aware_session_send_message(wifi_aware_session_h session,
 {
        __WIFI_AWARE_FUNC_ENTER__;
        CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_check_permission(), WIFI_AWARE_ERROR_PERMISSION_DENIED, "Permission denied");
        RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
        RET_VAL_IF(!_wifi_aware_is_enabled(), WIFI_AWARE_ERROR_INVALID_OPERATION, "Not enabled");
        RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");