2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <pkgmgr-info.h>
20 #include <tzplatform_config.h>
21 #include <cynara-client.h>
25 #include "package_info.h"
26 #include "package_manager.h"
27 #include "package_manager_internal.h"
29 #define SMACK_LABEL_LEN 255
30 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
32 typedef struct _foreach_pkg_context_{
33 package_manager_package_info_cb callback;
35 } foreach_pkg_context_s;
37 int check_privilege(privilege_type type) {
44 char subject_label[SMACK_LABEL_LEN + 1] = "";
46 char *client_session = "";
48 ret = cynara_initialize(&p_cynara, NULL);
49 if (ret != CYNARA_API_SUCCESS) {
50 LOGE("cannot init cynara [%d] failed!", ret);
51 ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
55 fd = open("/proc/self/attr/current", O_RDONLY);
57 LOGE("open [%d] failed!", errno);
58 ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
62 ret = read(fd, subject_label, SMACK_LABEL_LEN);
64 LOGE("read [%d] failed!", errno);
66 ret = PACKAGE_MANAGER_ERROR_IO_ERROR;
71 snprintf(uid, 10, "%d", getuid());
73 if (type == PRIVILEGE_PACKAGE_MANAGER_INFO) {
74 ret = cynara_check(p_cynara, subject_label, client_session, uid,
75 "http://tizen.org/privilege/packagemanager.info");
76 if (ret != CYNARA_API_ACCESS_ALLOWED) {
77 LOGE("cynara access check [%d] failed!", ret);
78 ret = PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
81 } else if (type == PRIVILEGE_PACKAGE_MANAGER_ADMIN) {
82 ret = cynara_check(p_cynara, subject_label, client_session, uid,
83 "http://tizen.org/privilege/packagemanager.admin");
84 if (ret != CYNARA_API_ACCESS_ALLOWED) {
85 LOGE("cynara access check [%d] failed!", ret);
86 ret = PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
89 } else if (type == PRIVILEGE_PACKAGE_MANAGER_CACHE) {
90 ret = cynara_check(p_cynara, subject_label, client_session, uid,
91 "http://tizen.org/privilege/packagemanager.clearcache");
92 if (ret != CYNARA_API_ACCESS_ALLOWED) {
93 LOGE("cynara access check [%d] failed!", ret);
94 ret = PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
99 ret = PACKAGE_MANAGER_ERROR_NONE;
102 cynara_finish(p_cynara);
107 static const char *package_manager_error_to_string(package_manager_error_e
111 case PACKAGE_MANAGER_ERROR_NONE:
113 case PACKAGE_MANAGER_ERROR_INVALID_PARAMETER:
114 return "INVALID_PARAMETER";
115 case PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY:
116 return "OUT_OF_MEMORY";
117 case PACKAGE_MANAGER_ERROR_IO_ERROR:
119 case PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE:
120 return "NO_SUCH_PACKAGE";
121 case PACKAGE_MANAGER_ERROR_PERMISSION_DENIED:
122 return "PERMISSION_DENIED";
123 case PACKAGE_MANAGER_ERROR_SYSTEM_ERROR:
124 return "SEVERE_SYSTEM_ERROR";
130 int package_manager_error(package_manager_error_e error,
131 const char *function, const char *description)
134 _LOGE("[%s] %s(0x%08x) : %s", function,
135 package_manager_error_to_string(error), error,
138 _LOGE("[%s] %s(0x%08x)", function,
139 package_manager_error_to_string(error), error);
145 int package_info_get_package_info(const char *package, package_info_h *package_info)
147 return package_info_create(package, package_info);
150 static int package_info_foreach_package_info_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data)
152 char *pkg_name = NULL;
153 foreach_pkg_context_s *foreach_pkg_context = user_data;
154 package_info_h package_info = NULL;
157 if (handle == NULL || foreach_pkg_context == NULL)
159 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
160 return PMINFO_R_EINVAL;
163 pkgmgrinfo_pkginfo_get_pkgname(handle, &pkg_name);
165 if (package_info_create(pkg_name, &package_info) == PACKAGE_MANAGER_ERROR_NONE)
167 r = foreach_pkg_context->callback(package_info, foreach_pkg_context->user_data);
168 package_info_destroy(package_info);
171 return (r == true) ? PMINFO_R_OK : PMINFO_R_ERROR;
174 int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data)
176 foreach_pkg_context_s foreach_pkg_context = {
177 .callback = callback,
178 .user_data = user_data,
182 if (callback == NULL)
184 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
186 uid_t uid = getuid();
187 if (uid != GLOBAL_USER)
188 ret = pkgmgrinfo_pkginfo_get_usr_list(package_info_foreach_package_info_cb, &foreach_pkg_context, uid);
190 ret = pkgmgrinfo_pkginfo_get_list(package_info_foreach_package_info_cb, &foreach_pkg_context);
192 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
195 return PACKAGE_MANAGER_ERROR_NONE;
198 int package_info_filter_foreach_package_info(pkgmgrinfo_pkginfo_filter_h handle, package_manager_package_info_cb callback, void *user_data)
200 foreach_pkg_context_s foreach_pkg_context = {
201 .callback = callback,
202 .user_data = user_data,
207 if ((handle == NULL) || (callback == NULL))
208 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
211 if (uid != GLOBAL_USER)
212 ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, package_info_foreach_package_info_cb, &foreach_pkg_context, uid);
214 ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, package_info_foreach_package_info_cb, &foreach_pkg_context);
217 return PACKAGE_MANAGER_ERROR_IO_ERROR;
219 return PACKAGE_MANAGER_ERROR_NONE;