Adjust privilege API changes 58/174358/4
authorYunjin Lee <yunjin-.lee@samsung.com>
Fri, 30 Mar 2018 08:28:42 +0000 (17:28 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Mon, 20 Aug 2018 05:06:51 +0000 (14:06 +0900)
- Related changes: https://review.tizen.org/gerrit/#/c/174356/

Change-Id: Ia96361087c17b2a0afc5f970d39914d434252e27
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
ui/src/privacy_package_list_view.c

index 841168e81f170b1e0c29c1f967c4aa63bbd2d23c..4d5f47b0a99c5b068fa4f21fe5e747484fc04c78 100644 (file)
@@ -42,7 +42,6 @@ static char* privacy_display = NULL;
 static char* privacy_name = NULL;
 
 #define DEFAULT_ICON_PATH _TZ_SYS_RO_APP"/org.tizen.privacy-setting/res/icon/default.png"
-#define UIDMAXLEN 10
 #define SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
 
 static void privacy_package_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
@@ -112,12 +111,13 @@ static void privacy_package_selected_cb(void *data, Evas_Object *obj, void *even
        evas_object_smart_callback_call(check, "changed", data);
 }
 
-static void __get_package_privacy_status(pkg_data_s* pkg_data, char* privilege_name)
+static void __get_package_privacy_status(pkg_data_s* pkg_data)
 {
-       GList* l;
+       GList* l = NULL;
 
        for (l = pkg_data->applist; l != NULL; l = l->next) {
                char* appid = (char*)l->data;
+               char* privilege_name = (char*)g_list_first(pkg_data->privlist)->data; /* Assume that privileges in the same privacy group are subject to the same policy */
 
                /* Make policy filter to get specific uid, appid and privilege's status */
                policy_entry* p_filter;
@@ -125,6 +125,7 @@ static void __get_package_privacy_status(pkg_data_s* pkg_data, char* privilege_n
                ret = security_manager_policy_entry_new(&p_filter);
                log_if(ret != SECURITY_MANAGER_SUCCESS, 1, "security_manager_policy_entry_new failed. ret = %s", ret);
                log_if(p_filter == NULL, 1, "security_manager_policy_entry_new failed failed. creation of new policy entry did not allocate memory");
+
                ret = security_manager_policy_entry_set_application(p_filter, appid);
                log_if(ret != SECURITY_MANAGER_SUCCESS, 1, "security_manager_policy_entry_set_application failed. ret = %d", ret);
 
@@ -142,7 +143,7 @@ static void __get_package_privacy_status(pkg_data_s* pkg_data, char* privilege_n
                for (i = 0; i < pp_policy_size; ++i) {
                        char* result = (char*)security_manager_policy_entry_get_level(pp_policy[i]);
                        log_if(result == NULL, 1, "security_manager_policy_entry_get_level failed. No policy is declared for pkgid: %s, appid: %s, privilege: %s", pkg_data->pkgid, appid, privilege_name);
-                       LOGD("policy status = %s", result);
+                       LOGD("app <%s> privilege <%s> status = %s", appid, privilege_name, result);
                        if (strcmp("Allow", result) == 0) {
                                pkg_data->status = EINA_TRUE;
                                break;
@@ -163,21 +164,6 @@ static void __get_package_privacy_status(pkg_data_s* pkg_data, char* privilege_n
                        break;
        }
 }
-static Eina_Bool get_package_privacy_status(char* package)
-{
-       Eina_Bool status = EINA_FALSE;
-
-       GList* l;
-       for (l = pkg_data_list; l != NULL; l = l->next) {
-               pkg_data_s* pkg_data = (pkg_data_s*)l->data;
-               if (strcmp(pkg_data->pkgid, package) == 0) {
-                       status = pkg_data->status;
-                       break;
-               }
-       }
-
-       return status;
-}
 
 static Evas_Object* create_icon(Evas_Object *parent, Evas_Coord w, Evas_Coord h, char* icon_path)
 {
@@ -267,7 +253,7 @@ static void privacy_package_check_changed_cb(void *data, Evas_Object *obj, void
                        char* level;
                        if (pd->status) {
                                bool privacy_requestable = false;
-                               ret = privilege_package_info_is_privacy_requestable(getuid(), pkgid, &privacy_requestable);
+                               ret = privilege_package_info_is_privacy_requestable(getuid(), pkgid, g_list_first(pkg_data->privlist)->data,&privacy_requestable);
                                log_if(ret != PRVMGR_ERR_NONE, 1, "privilege_package_info_is_privacy_requestable failed. ret = %d", ret);
                                if (privacy_requestable) {
                                        level = "Ask user";
@@ -277,6 +263,7 @@ static void privacy_package_check_changed_cb(void *data, Evas_Object *obj, void
                                        log_if(ret != NOTIFICATION_ERROR_NONE, 1, "notification_status_message_post failed. ret = %s", get_error_message(ret));
                                }
                                pd->status = false;
+                               __terminate_app(pkgid);
                        } else {
                                level = "Allow";
                                pd->status = true;
@@ -348,119 +335,100 @@ static int pkg_app_list_cb(pkgmgrinfo_appinfo_h pkg_handle, void* user_data)
        return ret;
 }
 
-static int pkg_list_cb(pkgmgrinfo_pkginfo_h filter_handle, void *user_data)
-{
-       char *pkgid = NULL;
-       int ret = pkgmgrinfo_pkginfo_get_pkgid(filter_handle, &pkgid);
-       return_if(ret != PMINFO_R_OK, , -1, "pkgmgrinfo_pkginfo_get_pkgid failed");
-
-       char* privilege_name = strdup((char*)user_data);
-       return_if(privilege_name == NULL, , -1, "strdup failed");
-       GList* find = g_list_find_custom(pkg_list, pkgid, (GCompareFunc)strcmp);
-       if (find != NULL) {
-               /* Add privilege info to package data list */
-               GList* l;
-               for (l = pkg_data_list; l != NULL; l = l->next) {
-                       pkg_data_s* temp = (pkg_data_s*)l->data;
-                       char* temp_pkgid = (char*)temp->pkgid;
-                       if (strcmp(temp_pkgid, pkgid) == 0) {
-                               temp->privlist = g_list_append(temp->privlist, privilege_name);
-                               if (!temp->status) /* If any privilege is allowed then status of privacy should be displayed as on hence previously checked staus is off then do check again. */
-                                       __get_package_privacy_status(temp, privilege_name);
-                               break;
-                       }
-               }
-               return ret;
-       }
-
-       /* Add app list to package data item */
-       pkgmgrinfo_pkginfo_h pkg_handle;
-       ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkg_handle);
-       return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name), -1, "pkgmgrinfo_pkginfo_get_pkginfo failed");
-
+static int __make_package_data(const char* pkgid, const char* privacy_name) {
        /* See if the package is user-settable */
-       int is_settable = privilege_info_is_user_settable(pkgid, privacy_name);
+       int ret = privilege_info_is_user_settable(pkgid, privacy_name);
+       log_if(ret == -1, 1, "privilege_info_is_user_settable failed. ret = %d", ret);
 
-       if (is_settable == 1) {
-               char *pkgidd = strdup(pkgid);
-               return_if(pkgidd == NULL, SAFE_FREE(privilege_name); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup failed");
-               pkg_list = g_list_append(pkg_list, pkgidd);
+       if (ret == 1) {
 
                /* Make package data item */
                pkg_data_s *pkg_data = (pkg_data_s *)malloc(sizeof(pkg_data_s));
-               return_if(pkg_data == NULL, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "malloc of pkg_data failed.");
-               pkg_data->label=NULL;
-               pkg_data->icon=NULL;
-               pkg_data->applist=NULL;
-               pkg_data->privlist=NULL;
-               pkg_data->pkgid=pkgidd;
+               return_if(pkg_data == NULL, , -1, "malloc of pkg_data failed.");
+
+               /* Add pkg id to package data item */
+               pkg_data->pkgid = strdup(pkgid);
+               return_if(pkg_data->pkgid == NULL, free_pkg_data(pkg_data), -1, "strdup of pkg_data->pkgid failed");
 
                /* Add privilege info to package data item */
                pkg_data->privlist = NULL;
-               pkg_data->privlist = g_list_append(pkg_data->privlist, privilege_name);
+               ret = privilege_package_info_get_privilege_list_by_pkgid_and_privacy(getuid(), pkgid, privacy_name, &pkg_data->privlist);
+               return_if(ret != PRVMGR_ERR_NONE, free_pkg_data(pkg_data), -1, "privilege_package_info_get_privilege_list_by_pkgid_and_privacy failed. ret = %d", ret);
+
+               /* Add app list to package data item */
+               pkgmgrinfo_pkginfo_h pkg_handle;
+               ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkg_handle);
+               return_if(ret != PMINFO_R_OK, free_pkg_data(pkg_data), -1, "pkgmgrinfo_pkginfo_get_pkginfo failed. ret = %d", ret);
 
                /* Add app list to package data item */
                pkg_data->applist = NULL;
                ret = pkgmgrinfo_appinfo_get_list(pkg_handle, PMINFO_ALL_APP, pkg_app_list_cb, pkg_data);
-               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_appinfo_get_list failed");
+               return_if(ret != PMINFO_R_OK, free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_appinfo_get_list failed. ret = %d", ret);
 
                /* See if the package is global. TBD: If notion for handling of global app is required. */
                pkg_data->is_global = false;
                ret = pkgmgrinfo_pkginfo_is_global(pkg_handle, &pkg_data->is_global);
-               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_is_global failed");
+               return_if(ret != PMINFO_R_OK, free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_is_global failed. ret = %d", ret);
 
                /* Get package label */
                char* label = NULL;
                ret = pkgmgrinfo_pkginfo_get_label(pkg_handle, &label);
-               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_label failed");
+               return_if(ret != PMINFO_R_OK, free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_label failed. ret = %d", ret);
                pkg_data->label = strdup(label);
-               return_if(pkg_data->label == NULL, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->label failed");
+               return_if(pkg_data->label == NULL, free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->label failed");
 
                /* Get package icon path */
                char* icon = NULL;
                ret = pkgmgrinfo_pkginfo_get_icon(pkg_handle, &icon);
-               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_icon failed");
+               return_if(ret != PMINFO_R_OK, free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_icon failed. ret = %d", ret);
                if (EINA_TRUE == ecore_file_exists(icon))
                        pkg_data->icon = strdup(icon);
                else
                        pkg_data->icon = strdup(DEFAULT_ICON_PATH);
-               return_if(pkg_data->icon == NULL, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->icon failed");
+               return_if(pkg_data->icon == NULL, free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->icon failed");
 
                /* Get package privacy status */
                pkg_data->status = false;
-               __get_package_privacy_status(pkg_data, privilege_name);
+               __get_package_privacy_status(pkg_data);
 
                /* Append package data item to package_data_list */
                pkg_data_list = g_list_append(pkg_data_list, pkg_data);
+               pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle);
        }
-       pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle);
+
        return ret;
 }
-static int get_uniq_pkg_list_by_privacy(const char* privacy)
+
+void create_privacy_package_list_view(struct app_data_s* ad)
 {
-       int ret = 0;
-       if (pkg_data_list != NULL) {
-               g_list_free_full(pkg_data_list, free_extension_pkg_data);
-               pkg_data_list = NULL;
-               pkg_list = NULL;
+       /* Add Evas_Object */
+       Evas_Object *genlist;
+       privacy_name = ad->privacy;
+
+       log_if(privilege_info_get_privacy_display(ad->privacy, &privacy_display) != PRVMGR_ERR_NONE, 1, "Couldn't get privacy display : %s", ad->privacy);
+
+       /* Get privilege list by privacy */
+       if (privilege_list != NULL) {
+               g_list_free_full(privilege_list, free);
+               privilege_list = NULL;
        }
-       GList* l;
-       int uid = getuid();
-       for (l = privilege_list; l != NULL; l = l->next) {
-               char* privilege_name = (char*)l->data;
-               /* For each privilege */
-               pkgmgrinfo_pkginfo_filter_h filter_handle;
-               ret = pkgmgrinfo_pkginfo_filter_create(&filter_handle);
-               return_if(ret != PMINFO_R_OK, , -1, "pkgmgrinfo_pkginfo_filter_create failed");
-               ret = pkgmgrinfo_pkginfo_filter_add_string(filter_handle, PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE, privilege_name);
-               LOGD("uid: %d, privacy: %s, privilege: %s", uid, privacy, privilege_name);
-               return_if(ret != PMINFO_R_OK, pkgmgrinfo_pkginfo_filter_destroy(filter_handle), -1, "pkgmgrinfo_pkginfo_filter_add_string failed");
-               /* Get uniq pkg list */
-               ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(filter_handle, pkg_list_cb, privilege_name, uid);
-               return_if(ret != PMINFO_R_OK, pkgmgrinfo_pkginfo_filter_destroy(filter_handle), -1, "pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo failed");
+    if (pkg_list != NULL) {
+        g_list_free_full(pkg_list, free);
+        pkg_list = NULL;
+    }
+    if (pkg_data_list != NULL) {
+        g_list_free_full(pkg_data_list, free_extension_pkg_data);
+        pkg_data_list = NULL;
+    }
+       /* Get unique package list filtered by given privacy related privileges */
+       int ret = privilege_package_info_get_package_list_by_privacy(getuid(), ad->privacy, &pkg_list);
+       log_if(ret != 0, 1, "privilege_package_info_get_package_list_by_privacy() failed");
+       pkg_list = g_list_sort(pkg_list, (GCompareFunc)strcmp);
+       GList* l = NULL;
+       for (l = pkg_list; l != NULL; l = l->next) {
+               __make_package_data((char*)l->data, ad->privacy);
        }
-
-       /* To check : each privacy related package's app, privilege info
+       /* To check : each privacy related package's app, privilege info */
        for (l = pkg_data_list; l != NULL; l = l->next) {
                pkg_data_s* temp = (pkg_data_s*)l->data;
                LOGD(" * PACKAGE ID : %s LABEL: %s is global? %d", temp->pkgid, temp->label, temp->is_global);
@@ -475,33 +443,10 @@ static int get_uniq_pkg_list_by_privacy(const char* privacy)
                        char* temp_privname = (char*)ll->data;
                        LOGD(" - %s", temp_privname);
                }
-       } */
-
-       return ret;
-}
-void create_privacy_package_list_view(struct app_data_s* ad)
-{
-       /* Add Evas_Object */
-       Evas_Object *genlist;
-       privacy_name = ad->privacy;
-
-       log_if(privilege_info_get_privacy_display(ad->privacy, &privacy_display) != PRVMGR_ERR_NONE, 1, "Couldn't get privacy display : %s", ad->privacy);
-
-       /* Get privilege list by privacy */
-       if (privilege_list != NULL) {
-               g_list_free_full(privilege_list, free);
-               privilege_list = NULL;
+               LOGD(" * STATUS : %s", temp->status ? "on" : "off");
        }
-       int ret = privilege_info_get_privilege_list_by_privacy(ad->privacy, &privilege_list);
-       log_if(ret != PRVMGR_ERR_NONE, 1, "Couldn't get privilege list of privacy: %s", ad->privacy);
-
-       /* Get unique package list filtered by given privacy related privileges */
-       ret = get_uniq_pkg_list_by_privacy(ad->privacy);
-       log_if(ret != 0, 1, "get_unique_pkg_list_by_privacy failed");
-       pkg_list = g_list_sort(pkg_list, (GCompareFunc)strcmp);
 
        /* Append privacy related package as genlist item */
-       GList* l;
        Elm_Object_Item *it = NULL;
        if (!pkg_data_list) {
                genlist = elm_layout_add(ad->nf);
@@ -541,9 +486,7 @@ void create_privacy_package_list_view(struct app_data_s* ad)
                for (l = pkg_data_list; l != NULL; l = l->next) {
                        pkg_data_s* pkg_data = (pkg_data_s*)l->data;
                        /* Get privacy status of given package */
-                       LOGD("before add");
                        it = elm_genlist_item_append(genlist, itc, pkg_data, NULL, ELM_GENLIST_ITEM_NONE, privacy_package_selected_cb, pkg_data);
-                       LOGD("after add");
                        log_if(it == NULL, 1, "Error in elm_genlist_item_append");
                }
                elm_genlist_item_class_free(itc);