Remove build warnings
[platform/core/uifw/voice-control.git] / common / vc_command.c
index 1925731..c42e84e 100644 (file)
@@ -14,7 +14,9 @@
 * limitations under the License.
 */
 
-
+#include <cynara-client.h>
+#include <cynara-error.h>
+#include <cynara-session.h>
 #include <libintl.h>
 #include <stdlib.h>
 #include <system_info.h>
 
 static int g_feature_enabled = -1;
 
+static int g_privilege_allowed = 1; /* Always True */
+static cynara *p_cynara = NULL;
+
 static int __vc_cmd_get_feature_enabled()
 {
        if (0 == g_feature_enabled) {
-               SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
                return VC_ERROR_NOT_SUPPORTED;
        } else if (-1 == g_feature_enabled) {
                bool vc_supported = false;
@@ -39,18 +44,18 @@ static int __vc_cmd_get_feature_enabled()
                if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
                        if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
                                if (false == vc_supported || false == mic_supported) {
-                                       SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
+                                       SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
                                        g_feature_enabled = 0;
                                        return VC_ERROR_NOT_SUPPORTED;
                                }
 
                                g_feature_enabled = 1;
                        } else {
-                               SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value");
+                               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
                                return VC_ERROR_NOT_SUPPORTED;
                        }
                } else {
-                       SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value");
+                       SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
                        return VC_ERROR_NOT_SUPPORTED;
                }
        }
@@ -58,11 +63,86 @@ static int __vc_cmd_get_feature_enabled()
        return 0;
 }
 
+static int __check_privilege_initialize()
+{
+       int ret = cynara_initialize(&p_cynara, NULL);
+       if (CYNARA_API_SUCCESS != ret)
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
+       
+       return ret == CYNARA_API_SUCCESS;
+}
+
+static int __check_privilege(const char* uid, const char * privilege)
+{
+       FILE *fp = NULL;
+       char smack_label[1024] = "/proc/self/attr/current";
+
+       if (!p_cynara) {
+           return false;
+       }
+
+       fp = fopen(smack_label, "r");
+       if (fp != NULL) {
+           if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
+
+           fclose(fp);
+       }
+
+       pid_t pid = getpid();
+       char *session = cynara_session_from_pid(pid);
+       int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
+       SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
+       if (session)
+           free(session);
+
+       if (ret != CYNARA_API_ACCESS_ALLOWED)
+           return false;
+       return true;
+}
+
+static void __check_privilege_deinitialize()
+{
+       if (p_cynara)
+               cynara_finish(p_cynara);
+       p_cynara = NULL;
+}
+
+static int __vc_cmd_check_privilege()
+{
+        char uid[16];
+
+       if (0 == g_privilege_allowed) {
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
+               return VC_ERROR_PERMISSION_DENIED;
+       } else if (-1 == g_privilege_allowed) {
+               if (false == __check_privilege_initialize()){
+                       SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
+                       return VC_ERROR_PERMISSION_DENIED;
+               }
+               snprintf(uid, 16, "%d", getuid());
+               if (false == __check_privilege(uid, VC_PRIVILEGE)) {
+                       SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
+                       g_privilege_allowed = 0;
+                       __check_privilege_deinitialize();
+                       return VC_ERROR_PERMISSION_DENIED;
+               }
+               __check_privilege_deinitialize();
+       }
+
+       g_privilege_allowed = 1;
+
+       return VC_ERROR_NONE;
+}
+
 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
 {
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -91,6 +171,9 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -117,6 +200,9 @@ int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list || NULL == count) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
@@ -138,6 +224,9 @@ int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list || NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -166,6 +255,9 @@ int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list || NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -220,6 +312,9 @@ int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        SLOG(LOG_DEBUG, TAG_VCCMD, "===== Destroy all command");
 
@@ -268,6 +363,9 @@ int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callb
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -286,6 +384,11 @@ int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callb
        iter = g_slist_nth(list->list, 0);
 
        for (i = 0; i < count; i++) {
+               if (NULL == iter) {
+                       SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
+                       return VC_ERROR_OPERATION_FAILED;
+               }
+
                temp_cmd = iter->data;
 
                if (NULL != temp_cmd) {
@@ -302,11 +405,107 @@ int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callb
        return VC_ERROR_NONE;
 }
 
+int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
+{
+       SLOG(LOG_DEBUG, TAG_VCCMD, "===== Filter by type");
+
+       if (0 != __vc_cmd_get_feature_enabled()) {
+               return VC_ERROR_NOT_SUPPORTED;
+       }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
+
+       if (NULL == original) {
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
+               return VC_ERROR_INVALID_PARAMETER;
+       }
+
+       if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
+               return VC_ERROR_INVALID_PARAMETER;
+       }
+
+       vc_cmd_list_s* list = NULL;
+       list = (vc_cmd_list_s*)original;
+
+       vc_cmd_list_h temp_list;
+       if (0 != vc_cmd_list_create(&temp_list)) {
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
+               return VC_ERROR_OPERATION_FAILED;
+       }
+
+       int count = g_slist_length(list->list);
+       int i;
+
+       GSList *iter = NULL;
+       vc_cmd_s *iter_cmd;
+
+       iter = g_slist_nth(list->list, 0);
+
+       for (i = 0; i < count; i++) {
+               if (NULL == iter) {
+                       SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
+                       return VC_ERROR_OPERATION_FAILED;
+               }
+               if (NULL != iter->data) {
+                       iter_cmd = iter->data;
+
+                       if (NULL != iter_cmd) {
+                               int iter_type;
+                               if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
+                                       SLOG(LOG_ERROR,TAG_VCCMD, "[ERROR] Fail to get command type");
+                                       continue;
+                               }
+
+                               if (iter_type == type) {
+                                       vc_cmd_h temp_cmd;
+                                       if (0 != vc_cmd_create(&temp_cmd)) {
+                                               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
+                                               continue;
+                                       }
+
+                                       memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
+                                       if (NULL != iter_cmd->command) {
+                                               ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command);
+                                       }
+                                       if (NULL != iter_cmd->parameter) {
+                                               ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter);
+                                       }
+
+                                       if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
+                                               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
+                                               vc_cmd_destroy(temp_cmd);
+                                               continue;
+                                       }
+                               }
+                       }
+               }
+               iter = g_slist_next(iter);
+       }
+
+       count = 0;
+       if (0 != vc_cmd_list_get_count(temp_list, &count)) {
+               SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
+       } else {
+               SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
+       }
+
+       *filtered = temp_list;
+
+       SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
+
+       return VC_ERROR_NONE;
+}
+
 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
 {
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -331,6 +530,9 @@ int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -358,6 +560,9 @@ int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -385,6 +590,9 @@ int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -410,6 +618,9 @@ int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_cmd_list || NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -443,6 +654,9 @@ int vc_cmd_create(vc_cmd_h* vc_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -479,6 +693,9 @@ int vc_cmd_destroy(vc_cmd_h vc_command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
@@ -505,6 +722,9 @@ int vc_cmd_set_id(vc_cmd_h vc_command, int id)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -527,6 +747,9 @@ int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == id) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
@@ -549,6 +772,9 @@ int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -578,6 +804,9 @@ int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
@@ -601,6 +830,9 @@ int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -629,6 +861,9 @@ int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
@@ -651,6 +886,9 @@ int vc_cmd_set_type(vc_cmd_h vc_command, int type)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -672,6 +910,9 @@ int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == type) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -693,6 +934,9 @@ int vc_cmd_set_format(vc_cmd_h vc_command, vc_cmd_format_e format)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -714,6 +958,9 @@ int vc_cmd_get_format(vc_cmd_h vc_command, vc_cmd_format_e* format)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == format) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -735,6 +982,9 @@ int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -756,6 +1006,9 @@ int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == pid) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -777,6 +1030,9 @@ int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
@@ -798,6 +1054,9 @@ int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
        if (0 != __vc_cmd_get_feature_enabled()) {
                return VC_ERROR_NOT_SUPPORTED;
        }
+       if (0 != __vc_cmd_check_privilege()) {
+               return VC_ERROR_PERMISSION_DENIED;
+       }
 
        if (NULL == vc_command || NULL == domain) {
                SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");