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.
20 #include <sys/syscall.h>
23 #include <package-manager.h>
24 #include <pkgmgr-info.h>
25 #include <tzplatform_config.h>
26 #include <cynara-client.h>
27 #include <cynara-session.h>
29 #include "package_info.h"
30 #include "package_manager.h"
31 #include "package_manager_internal.h"
33 #define MAX_SMACK_LABEL_LEN 255
34 #define gettid() syscall(SYS_gettid)
36 typedef struct _foreach_pkg_context_ {
37 package_manager_package_info_cb callback;
39 } foreach_pkg_context_s;
41 int check_privilege(privilege_type type)
46 char subject_label[MAX_SMACK_LABEL_LEN + 1] = { 0 };
49 const char *privilege;
50 unsigned long pid = getpid();
51 unsigned long tid = gettid();
54 fd = open("/proc/self/attr/current", O_RDONLY);
56 // Check current thread smack label.
57 char path[256] = { 0 };
59 snprintf(path, sizeof(path), "/proc/%lu/attr/current", tid);
60 fd = open(path, O_RDONLY);
63 LOGE("open failed: %d", errno);
64 return PACKAGE_MANAGER_ERROR_IO_ERROR;
67 ret = read(fd, subject_label, MAX_SMACK_LABEL_LEN);
69 LOGE("read failed: %d", errno);
71 return PACKAGE_MANAGER_ERROR_IO_ERROR;
75 ret = cynara_initialize(&p_cynara, NULL);
76 if (ret != CYNARA_API_SUCCESS) {
77 LOGE("init cynara failed: %d", ret);
78 return PACKAGE_MANAGER_ERROR_IO_ERROR;
81 snprintf(uid, 10, "%d", getuid());
82 session = cynara_session_from_pid(pid);
85 case PRIVILEGE_PACKAGE_MANAGER_INFO:
86 privilege = "http://tizen.org/privilege/packagemanager.info";
88 case PRIVILEGE_PACKAGE_MANAGER_ADMIN:
89 privilege = "http://tizen.org/privilege/packagemanager.admin";
91 case PRIVILEGE_PACKAGE_MANAGER_CACHE:
93 "http://tizen.org/privilege/packagemanager.clearcache";
100 ret = cynara_check(p_cynara, subject_label, session, uid, privilege);
103 cynara_finish(p_cynara);
105 if (ret != CYNARA_API_ACCESS_ALLOWED) {
106 LOGE("cynara access check failed: %d", ret);
107 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
110 return PACKAGE_MANAGER_ERROR_NONE;
113 static const char *package_manager_error_to_string(package_manager_error_e
117 case PACKAGE_MANAGER_ERROR_NONE:
119 case PACKAGE_MANAGER_ERROR_INVALID_PARAMETER:
120 return "INVALID_PARAMETER";
121 case PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY:
122 return "OUT_OF_MEMORY";
123 case PACKAGE_MANAGER_ERROR_IO_ERROR:
125 case PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE:
126 return "NO_SUCH_PACKAGE";
127 case PACKAGE_MANAGER_ERROR_PERMISSION_DENIED:
128 return "PERMISSION_DENIED";
129 case PACKAGE_MANAGER_ERROR_SYSTEM_ERROR:
130 return "SEVERE_SYSTEM_ERROR";
136 int package_manager_convert_internal_error(int internal_error)
138 switch (internal_error) {
141 case PKGMGR_R_ESYSTEM:
142 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
143 case PKGMGR_R_EINVAL:
144 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
145 case PKGMGR_R_ETIMEOUT:
147 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
148 case PKGMGR_R_ENOPKG:
149 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
150 case PKGMGR_R_ENOMEM:
151 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
153 return PACKAGE_MANAGER_ERROR_IO_ERROR;
155 _LOGE("Unexpected error");
156 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
160 int package_manager_error(package_manager_error_e error,
161 const char *function, const char *description)
164 _LOGE("[%s] %s(0x%08x) : %s", function,
165 package_manager_error_to_string(error), error,
168 _LOGE("[%s] %s(0x%08x)", function,
169 package_manager_error_to_string(error), error);
175 int package_info_get_package_info(const char *package, package_info_h *package_info)
177 return package_info_create(package, package_info);
180 static int package_info_foreach_package_info_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data)
182 foreach_pkg_context_s *foreach_pkg_context = user_data;
183 package_info_h package_info = NULL;
187 if (handle == NULL || foreach_pkg_context == NULL) {
188 package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
189 return PMINFO_R_EINVAL;
192 ret = package_info_create_with_pkginfo(handle, &package_info);
193 if (ret != PACKAGE_MANAGER_ERROR_NONE)
194 return package_manager_error(ret, __FUNCTION__, NULL);
196 r = foreach_pkg_context->callback(package_info, foreach_pkg_context->user_data);
198 package_info_destroy_handle(package_info);
200 return (r == true) ? PMINFO_R_OK : PMINFO_R_ERROR;
203 int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data)
205 foreach_pkg_context_s foreach_pkg_context = {
206 .callback = callback,
207 .user_data = user_data,
211 if (callback == NULL)
212 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
214 ret = pkgmgrinfo_pkginfo_get_list(package_info_foreach_package_info_cb, &foreach_pkg_context);
217 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
219 return PACKAGE_MANAGER_ERROR_NONE;
222 int package_info_filter_foreach_package_info(pkgmgrinfo_pkginfo_filter_h handle, package_manager_package_info_cb callback, void *user_data)
224 foreach_pkg_context_s foreach_pkg_context = {
225 .callback = callback,
226 .user_data = user_data,
230 if ((handle == NULL) || (callback == NULL))
231 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
233 ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, package_info_foreach_package_info_cb, &foreach_pkg_context);
236 return PACKAGE_MANAGER_ERROR_IO_ERROR;
238 return PACKAGE_MANAGER_ERROR_NONE;