From: Sabera Djelti (sdi2) Date: Tue, 1 Jul 2014 15:38:14 +0000 (+0200) Subject: Multi user features : X-Git-Tag: submit/tizen_common/20140811.160835~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a5ea228d515fae71d1c971aac42af49ca594e6a;p=platform%2Fcore%2Fappfw%2Fslp-pkgmgr.git Multi user features : ->Add / Use Usr App related fonctions instead of Global App related Functions Change-Id: Ie2bc23ffe5c3d9c9ef27e47ba218ca21b1b2a0e5 Signed-off-by: Sabera Djelti (sdi2) Signed-off-by: Baptiste DURAND --- diff --git a/client/include/package-manager.h b/client/include/package-manager.h index 0908fed..78de658 100755 --- a/client/include/package-manager.h +++ b/client/include/package-manager.h @@ -52,7 +52,8 @@ #include #include - +#include +#include #ifdef __cplusplus extern "C" { @@ -326,7 +327,10 @@ int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type, const char *descriptor_path, const char *pkg_path, const char *optional_file, pkgmgr_mode mode, pkgmgr_handler event_cb, void *data); - +int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type, + const char *descriptor_path, const char *pkg_path, + const char *optional_file, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data, uid_t uid); /** * @brief This API reinstalls package. * @@ -359,6 +363,7 @@ int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type, const char * @param[in] mode installation mode - PM_DEFAULT, PM_QUIET * @param[in] event_cb user callback * @param[in] data user data + * @param[in] uid the addressee user id of the instruction * @return request_id (>0), error code(<0) if fail\n * @retval PKGMGR_R_OK success * @retval PKGMGR_R_EINVAL invalid argument @@ -367,7 +372,10 @@ int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type, const char int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type, const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb, void *data); - +int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data, uid_t uid); + /** * @brief This API moves installed package to SD card or vice versa. * @@ -378,13 +386,15 @@ int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type, * @param[in] pkgid application package id * @param[in] move_type PM_MOVE_TO_INTERNAL or PM_MOVE_TO_SDCARD * @param[in] mode installation mode - PM_DEFAULT, PM_QUIET + * @param[in] uid the addressee user id of the instruction * @retval PKGMGR_R_OK success * @retval PKGMGR_R_EINVAL invalid argument * @retval PKGMGR_R_ERROR general error */ int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode); - +int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, uid_t uid); /** * @brief This API moves installed package to SD card or vice versa. * @@ -420,7 +430,8 @@ int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type, */ int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type, const char *pkgid); - +int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, uid_t uid); /** * @brief This API deactivates package. * @@ -436,7 +447,8 @@ int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type, */ int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type, const char *pkgid); - +int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, uid_t uid); /** * @brief This API activates package. * @@ -450,7 +462,7 @@ int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type, * @retval PKGMGR_R_ECOMM communication error */ int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid); - +int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid, uid_t uid); /** * @brief This API activates package. * @@ -465,7 +477,7 @@ int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid); * @retval PKGMGR_R_ECOMM communication error */ int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[]); - +int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid); /** * @brief This API deactivates package. * @@ -479,7 +491,7 @@ int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *con * @retval PKGMGR_R_ECOMM communication error */ int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid); - +int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, uid_t uid); /** * @brief This API deletes application's private data. * @@ -496,7 +508,8 @@ int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid); */ int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type, const char *appid, pkgmgr_mode mode); - +int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, const char *pkg_type, + const char *appid, pkgmgr_mode mode, uid_t uid); /** * @brief This API set status type to listen for the pkgmgr's broadcasting * @@ -584,7 +597,9 @@ int pkgmgr_client_free_pkginfo(pkgmgr_info * pkg_info); int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode, pkgmgr_client * pc, const char *pkg_type, const char *pkgid, const char *custom_info, pkgmgr_handler event_cb, void *data); - +int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode, + pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid, + const char *custom_info, pkgmgr_handler event_cb, void *data); /** * @brief This API get package size * @@ -614,7 +629,7 @@ int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid, pkgmgr_getsize * @retval PKGMGR_R_EINVAL invalid argument * @retval PKGMGR_R_ERROR internal error */ -int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data); +int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data, uid_t uid); /** @} */ /** @@ -637,9 +652,11 @@ int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data); * * @param[in] pkg_type package type for the package to get infomation * @param[in] pkgid package id for the package to get infomation + * @param[in] uid the addressee user id of the instruction * @return package entry pointer if success, NULL if fail\n */ pkgmgr_info * pkgmgr_info_new(const char *pkg_type, const char *pkgid); +pkgmgr_info * pkgmgr_info_usr_new(const char *pkg_type, const char *pkgid, uid_t uid); /** * @brief This API gets the package's information. @@ -695,6 +712,7 @@ int pkgmgr_pkginfo_get_list(pkgmgr_info_pkg_list_cb pkg_list_cb, void *user_data * @return 0 if success, error code(<0) if fail\n */ int pkgmgr_pkginfo_get_pkginfo(const char *pkgid, pkgmgr_pkginfo_h *handle); +int pkgmgr_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid,pkgmgr_pkginfo_h *handle); /** * @brief This API gets type of the given package. diff --git a/client/include/pkgmgr-dbinfo.h b/client/include/pkgmgr-dbinfo.h index cd9d17e..22b94db 100755 --- a/client/include/pkgmgr-dbinfo.h +++ b/client/include/pkgmgr-dbinfo.h @@ -45,6 +45,8 @@ #include +#define GLOBAL_USER 0 //@TODO tzpl + #ifdef __cplusplus extern "C" { #endif @@ -66,11 +68,12 @@ typedef void* pkgmgr_pkgdbinfo_h; * This API is for backend installers.\n * * @param[in] pkgid package id. + * @param[in] uid the addressee user id of the instruction * @param[out] handle package info handle. * @return 0 if success, error code(<0) if fail\n */ int pkgmgr_create_pkgdbinfo(const char *pkgid, pkgmgr_pkgdbinfo_h *handle); - +int pkgmgr_create_pkgusrdbinfo(const char *pkgid, uid_t uid, pkgmgr_pkgdbinfo_h *handle); /** * @brief This API sets the package type in DB. * @@ -194,9 +197,11 @@ int pkgmgr_set_preload_to_pkgdbinfo(pkgmgr_pkgdbinfo_h handle, int preload); * This API is for backend installers.\n * * @param[in] handle package info handle. + * @param[in] uid the addressee user id of the instruction * @return 0 if success, error code(<0) if fail\n */ int pkgmgr_save_pkgdbinfo(pkgmgr_pkgdbinfo_h handle); +int pkgmgr_save_pkgusrdbinfo(pkgmgr_pkgdbinfo_h handle, uid_t uid); /** * @brief This API destroy pakage info handle and free the resources. diff --git a/client/include/pkgmgr-internal.h b/client/include/pkgmgr-internal.h index fa4b216..75d5722 100755 --- a/client/include/pkgmgr-internal.h +++ b/client/include/pkgmgr-internal.h @@ -35,7 +35,7 @@ typedef package_manager_pkg_info_t package_manager_app_info_t; -char *_get_pkg_type_from_desktop_file(const char *pkgid); +char *_get_pkg_type_from_desktop_file(const char *pkgid, uid_t uid); package_manager_pkg_info_t *_pkg_malloc_appinfo(int num); diff --git a/client/src/pkgmgr-dbinfo.c b/client/src/pkgmgr-dbinfo.c index 1688d8f..718dc83 100755 --- a/client/src/pkgmgr-dbinfo.c +++ b/client/src/pkgmgr-dbinfo.c @@ -45,6 +45,12 @@ API int pkgmgr_create_pkgdbinfo(const char *pkgid, pkgmgr_pkgdbinfo_h *handle) ret = pkgmgrinfo_create_pkgdbinfo(pkgid, handle); return ret; } +API int pkgmgr_create_pkgusrdbinfo(const char *pkgid, uid_t uid, pkgmgr_pkgdbinfo_h *handle) +{ + int ret = 0; + ret = pkgmgrinfo_create_pkgusrdbinfo(pkgid, uid, handle); + return ret; +} API int pkgmgr_set_type_to_pkgdbinfo(pkgmgr_pkgdbinfo_h handle, const char *type) { @@ -124,6 +130,13 @@ API int pkgmgr_save_pkgdbinfo(pkgmgr_pkgdbinfo_h handle) return ret; } +API int pkgmgr_save_pkgusrdbinfo(pkgmgr_pkgdbinfo_h handle, uid_t uid) +{ + int ret = 0; + ret = pkgmgrinfo_save_pkgusrdbinfo(handle, uid); + return ret; +} + API int pkgmgr_destroy_pkgdbinfo(pkgmgr_pkgdbinfo_h handle) { int ret = 0; diff --git a/client/src/pkgmgr-internal.c b/client/src/pkgmgr-internal.c index 1c546db..4c16e34 100755 --- a/client/src/pkgmgr-internal.c +++ b/client/src/pkgmgr-internal.c @@ -48,6 +48,8 @@ #define LOG_TAG "PKGMGR" #endif /* LOG_TAG */ +#define GLOBAL_USER 0 //#define tzplatform_getenv(TZ_GLOBAL) //TODO + #define IS_WHITESPACE(CHAR) \ ((CHAR == ' ' || CHAR == '\t' || CHAR == '\r' || CHAR == '\n') ? \ true : false) @@ -265,15 +267,20 @@ int _get_mime_extension(const char *mimetype, char *ext, int len) return 0; } -char *_get_pkg_type_from_desktop_file(const char *pkgid) +char *_get_pkg_type_from_desktop_file(const char *pkgid, uid_t uid) { static char pkg_type[PKG_EXT_LEN_MAX]; ail_appinfo_h handle; ail_error_e ret; char *str; - - ret = ail_package_get_appinfo(pkgid, &handle); + if(uid != GLOBAL_USER) + { + ret = ail_package_get_usr_appinfo(pkgid, &handle, uid); + }else + { + ret = ail_package_get_appinfo(pkgid, &handle); + } if (ret != AIL_ERROR_OK) { return NULL; } diff --git a/client/src/pkgmgr.c b/client/src/pkgmgr.c index 932a7f6..553ed04 100755 --- a/client/src/pkgmgr.c +++ b/client/src/pkgmgr.c @@ -59,6 +59,8 @@ #define BINSH_NAME "/bin/sh" #define BINSH_SIZE 7 +#define GLOBAL_USER 0 //#define tzplatform_getenv(TZ_GLOBAL) //TODO + static int _get_request_id() { static int internal_req_id = 1; @@ -488,7 +490,7 @@ static inline ail_cb_ret_e __appinfo_cb(const ail_appinfo_h appinfo, void *user_ return ret; } -static char *__get_app_info_from_db_by_apppath(const char *apppath) +static char *__get_app_info_from_db_by_apppath(const char *apppath, uid_t uid) { char *caller_appid = NULL; ail_filter_h filter; @@ -508,8 +510,12 @@ static char *__get_app_info_from_db_by_apppath(const char *apppath) ail_filter_destroy(filter); return NULL; } + + if(uid != GLOBAL_USER) + ret = ail_filter_count_usr_appinfo(filter, &count, uid); + else + ret = ail_filter_count_appinfo(filter, &count); - ret = ail_filter_count_appinfo(filter, &count); if (ret != AIL_ERROR_OK) { ail_filter_destroy(filter); return NULL; @@ -518,8 +524,11 @@ static char *__get_app_info_from_db_by_apppath(const char *apppath) ail_filter_destroy(filter); return NULL; } + if(uid != GLOBAL_USER) + ail_filter_list_usr_appinfo_foreach(filter, __appinfo_cb, &caller_appid,uid); - ail_filter_list_appinfo_foreach(filter, __appinfo_cb, &caller_appid); + else + ail_filter_list_appinfo_foreach(filter, __appinfo_cb, &caller_appid); ail_filter_destroy(filter); @@ -567,7 +576,7 @@ char *__proc_get_cmdline_bypid(int pid) return strdup(buf); } -static int __get_appid_bypid(int pid, char *pkgname, int len) +static int __get_appid_bypid(int pid, char *pkgname, int len, uid_t uid) { char *cmdline = NULL; char *caller_appid = NULL; @@ -576,7 +585,7 @@ static int __get_appid_bypid(int pid, char *pkgname, int len) if (cmdline == NULL) return -1; - caller_appid = __get_app_info_from_db_by_apppath(cmdline); + caller_appid = __get_app_info_from_db_by_apppath(cmdline, uid); snprintf(pkgname, len, "%s", caller_appid); free(cmdline); @@ -585,12 +594,12 @@ static int __get_appid_bypid(int pid, char *pkgname, int len) return 0; } -static char *__get_caller_pkgid() +static char *__get_caller_pkgid(uid_t uid) { char *caller_appid[PKG_STRING_LEN_MAX] = {0, }; char *caller_pkgid = NULL; - if (__get_appid_bypid(getpid(), caller_appid, sizeof(caller_appid)) < 0) { + if (__get_appid_bypid(getpid(), caller_appid, sizeof(caller_appid), uid) < 0) { _LOGE("get appid fail!!!\n"); return NULL; } @@ -883,7 +892,7 @@ catch: return ret; } -static int __move_pkg_process(pkgmgr_client * pc, const char *pkgid, pkgmgr_move_type move_type, pkgmgr_handler event_cb, void *data) +static int __move_pkg_process(pkgmgr_client * pc, const char *pkgid, uid_t uid, pkgmgr_move_type move_type, pkgmgr_handler event_cb, void *data) { char *req_key = NULL; int req_id = 0; @@ -904,7 +913,10 @@ static int __move_pkg_process(pkgmgr_client * pc, const char *pkgid, pkgmgr_move pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if(uid != GLOBAL_USER) + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); + else + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgr_pkginfo_get_pkginfo failed"); ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); @@ -980,7 +992,7 @@ catch: return ret; } -static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_client * pc, const char *pkgid, void *data) +static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_client * pc, const char *pkgid, uid_t uid, void *data) { const char *pkgtype; char *req_key; @@ -992,7 +1004,10 @@ static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_ pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (uid != GLOBAL_USER) + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); + else + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgr_pkginfo_get_pkginfo failed"); ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); @@ -1128,7 +1143,145 @@ API int pkgmgr_client_install(pkgmgr_client * pc, const char *pkg_type, char *cookie = NULL; char *caller_pkgid = NULL; - caller_pkgid = __get_caller_pkgid(); + caller_pkgid = __get_caller_pkgid(GLOBAL_USER); + if (caller_pkgid == NULL) + _LOGE("caller dont have pkgid..\n"); + + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL"); + + /* 0. check the pc type */ + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + + /* 1. check argument */ + if (descriptor_path) { + retvm_if(strlen(descriptor_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "descriptor_path over PKG_STRING_LEN_MAX"); + retvm_if(access(descriptor_path, F_OK) != 0, PKGMGR_R_EINVAL, "descriptor_path access fail"); + } + + retvm_if(pkg_path == NULL, PKGMGR_R_EINVAL, "pkg_path is NULL"); + retvm_if(strlen(pkg_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkg_path over PKG_STRING_LEN_MAX"); + retvm_if(access(pkg_path, F_OK) != 0, PKGMGR_R_EINVAL, "pkg_path access fail"); + + if (optional_file) + retvm_if(strlen(optional_file) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX"); + + /* 2. get installer path using pkg_path */ + if (pkg_type) { + installer_path = _get_backend_path_with_type(pkg_type); + pkgtype = strdup(pkg_type); + } else { + installer_path = _get_backend_path(pkg_path); + pkgtype = __get_type_from_path(pkg_path); + } + if (installer_path == NULL) { + free(pkgtype); + _LOGE("installer_path is NULL\n"); + return PKGMGR_R_EINVAL; + } + + /* 3. generate req_key */ + req_key = __get_req_key(pkg_path); + + /* 4. add callback info - add callback info to pkgmgr_client */ + req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, data); + + /* 5. generate argv */ + + /* argv[0] installer path */ + argv[argcnt++] = installer_path; + /* argv[1] */ + argv[argcnt++] = strdup("-k"); + /* argv[2] */ + argv[argcnt++] = req_key; + /* argv[3] */ + argv[argcnt++] = strdup("-i"); + /* argv[(4)] if exists */ + if (descriptor_path) + argv[argcnt++] = strdup(descriptor_path); + /* argv[4] */ + argv[argcnt++] = strdup(pkg_path); + /* argv[(5)] if exists */ + if (optional_file){ + argv[argcnt++] = strdup("-o"); + argv[argcnt++] = strdup(optional_file); + } + if (caller_pkgid) { + argv[argcnt++] = strdup("-p"); + argv[argcnt++] = strdup(caller_pkgid); + } + + +/* argv[6] -q option should be located at the end of command !! */ + if (mode == PM_QUIET) + argv[argcnt++] = strdup("-q"); + + /*** add quote in all string for special charactor like '\n'*** FIX */ + for (i = 0; i < argcnt; i++) { + temp = g_shell_quote(argv[i]); + len += (strlen(temp) + 1); + g_free(temp); + } + + args = (char *)calloc(len, sizeof(char)); + tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); + + strncpy(args, argv[0], len - 1); + + for (i = 1; i < argcnt; i++) { + strncat(args, " ", strlen(" ")); + temp = g_shell_quote(argv[i]); + strncat(args, temp, strlen(temp)); + g_free(temp); + } + _LOGD("[args] %s [len] %d\n", args, len); + + /* get cookie from security-server */ + cookie = __get_cookie_from_security_server(); + tryvm_if(cookie == NULL, ret = PKGMGR_R_ERROR, "__get_cookie_from_security_server is NULL"); + /******************* end of quote ************************/ + + /* 6. request install */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_INSTALLER, pkgtype, pkg_path, args, cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + + ret = req_id; + +catch: + for (i = 0; i < argcnt; i++) + free(argv[i]); + + if (args) + free(args); + if (pkgtype) + free(pkgtype); + if (cookie) + free(cookie); + + return ret; +} +API int pkgmgr_client_usr_install(pkgmgr_client * pc, const char *pkg_type, + const char *descriptor_path, const char *pkg_path, + const char *optional_file, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data, uid_t uid) +{ + char *pkgtype = NULL; + char *installer_path = NULL; + char *req_key = NULL; + int req_id = 0; + int i = 0; + char *argv[PKG_ARGC_MAX] = { NULL, }; + char *args = NULL; + int argcnt = 0; + int len = 0; + char *temp = NULL; + int ret = 0; + char *cookie = NULL; + char *caller_pkgid = NULL; + + caller_pkgid = __get_caller_pkgid(uid); if (caller_pkgid == NULL) _LOGE("caller dont have pkgid..\n"); @@ -1380,7 +1533,7 @@ API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type, bool removable = false; char *caller_pkgid = NULL; - caller_pkgid = __get_caller_pkgid(); + caller_pkgid = __get_caller_pkgid(GLOBAL_USER); if (caller_pkgid == NULL) _LOGE("caller dont have pkgid..\n"); @@ -1499,62 +1652,82 @@ catch: PKGMGR_END();\ return ret; } - -API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode) +API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data, uid_t uid) { - const char *pkgtype = NULL; - char *installer_path = NULL; - char *req_key = NULL; + char *pkgtype; + char *installer_path; + char *req_key; + int req_id; int i = 0; char *argv[PKG_ARGC_MAX] = { NULL, }; char *args = NULL; int argcnt = 0; int len = 0; char *temp = NULL; - int ret = 0; - int req_id = 0; + int ret = -1; char *cookie = NULL; - char buf[128] = {'\0'}; + bool removable = false; + char *caller_pkgid = NULL; + + caller_pkgid = __get_caller_pkgid(uid); + if (caller_pkgid == NULL) + _LOGE("caller dont have pkgid..\n"); /* Check for NULL value of pc */ - if (pc == NULL) { - _LOGD("package manager client handle is NULL\n"); - return PKGMGR_R_EINVAL; - } + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - /*check the pc type */ - if (mpc->ctype != PC_REQUEST) - return PKGMGR_R_EINVAL; - /*check argument */ - if (pkgid == NULL) - return PKGMGR_R_EINVAL; + /* 0. check the pc type */ + retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL); - if (pkg_type == NULL) { - pkgtype = _get_pkg_type_from_desktop_file(pkgid); - if (pkgtype == NULL) - return PKGMGR_R_EINVAL; - } else - pkgtype = pkg_type; + /* 1. check argument */ + retv_if(pkgid == NULL, PKGMGR_R_EINVAL); - if (strlen(pkgid) >= PKG_STRING_LEN_MAX) - return PKGMGR_R_EINVAL; + pkgmgr_pkginfo_h handle; + ret = pkgmgr_pkginfo_get_pkginfo(pkgid, &handle); - if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD)) - return PKGMGR_R_EINVAL; + /*check package id */ + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_pkginfo_get_pkginfo fail"); + tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid); - /* get installer path using pkg_path */ + /*check running app , terminate app if it is running*/ + ret = pkgmgr_appinfo_get_list(handle, PM_UI_APP, __app_list_cb, NULL); + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_appinfo_get_list : PM_UI_APP fail"); + + /*check running app , terminate app if it is running*/ + ret = pkgmgr_appinfo_get_list(handle, PM_SVC_APP, __app_list_cb, NULL); + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_appinfo_get_list : PM_SVC_APP fail"); + + /*check type */ + ret = pkgmgr_pkginfo_get_type(handle, &pkgtype); + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_pkginfo_get_type fail"); + tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL"); + + /*check removable, execpt "rpm" type */ + if (strcmp(pkgtype, "rpm")) { + pkgmgr_pkginfo_is_removable(handle, &removable); + tryvm_if(removable == false, ret = PKGMGR_R_ERROR, "Pkgid(%s) can not be removed, This is non-removalbe package...\n", pkgid); + } + + /*check pkgid length */ + tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long"); + + /* 2. get installer path using pkgtype */ installer_path = _get_backend_path_with_type(pkgtype); - if (installer_path == NULL) - return PKGMGR_R_EINVAL; + tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - /* generate req_key */ + /* 3. generate req_key */ req_key = __get_req_key(pkgid); + + /* 4. add callback info - add callback info to pkgmgr_client */ req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, data); + + /* 5. generate argv */ - /* generate argv */ - snprintf(buf, 128, "%d", move_type); /* argv[0] installer path */ argv[argcnt++] = installer_path; /* argv[1] */ @@ -1562,14 +1735,14 @@ API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, /* argv[2] */ argv[argcnt++] = req_key; /* argv[3] */ - argv[argcnt++] = strdup("-m"); + argv[argcnt++] = strdup("-d"); /* argv[4] */ argv[argcnt++] = strdup(pkgid); - /* argv[5] */ - argv[argcnt++] = strdup("-t"); - /* argv[6] */ - argv[argcnt++] = strdup(buf); - /* argv[7] -q option should be located at the end of command !! */ + if (caller_pkgid) { + argv[argcnt++] = strdup("-p"); + argv[argcnt++] = caller_pkgid; + } + /* argv[5] -q option should be located at the end of command !! */ if (mode == PM_QUIET) argv[argcnt++] = strdup("-q"); @@ -1581,14 +1754,8 @@ API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, } args = (char *)calloc(len, sizeof(char)); - if (args == NULL) { - _LOGD("calloc failed"); - - for (i = 0; i < argcnt; i++) - free(argv[i]); + tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - return PKGMGR_R_ERROR; - } strncpy(args, argv[0], len - 1); for (i = 1; i < argcnt; i++) { @@ -1598,15 +1765,261 @@ API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, g_free(temp); } _LOGD("[args] %s [len] %d\n", args, len); + + /* get cookie from security-server */ + cookie = __get_cookie_from_security_server(); + tryvm_if(cookie == NULL, ret = PKGMGR_R_ERROR, "__get_cookie_from_security_server is NULL"); /******************* end of quote ************************/ /* 6. request install */ - ret = comm_client_request(mpc->info.request.cc, req_key, - COMM_REQ_TO_MOVER, pkgtype, pkgid, - args, cookie, 1); - if (ret < 0) { - _LOGE("request failed, ret=%d\n", ret); - + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_INSTALLER, pkgtype, pkgid, args, cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed"); + + ret = req_id; + +catch: + for (i = 0; i < argcnt; i++) + free(argv[i]); + + if(args) + free(args); + if (cookie) + free(cookie); + + pkgmgr_pkginfo_destroy_pkginfo(handle); + PKGMGR_END();\ + return ret; +} + +API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode) +{ + const char *pkgtype = NULL; + char *installer_path = NULL; + char *req_key = NULL; + int i = 0; + char *argv[PKG_ARGC_MAX] = { NULL, }; + char *args = NULL; + int argcnt = 0; + int len = 0; + char *temp = NULL; + int ret = 0; + int req_id = 0; + char *cookie = NULL; + char buf[128] = {'\0'}; + + /* Check for NULL value of pc */ + if (pc == NULL) { + _LOGD("package manager client handle is NULL\n"); + return PKGMGR_R_EINVAL; + } + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + /*check the pc type */ + if (mpc->ctype != PC_REQUEST) + return PKGMGR_R_EINVAL; + + /*check argument */ + if (pkgid == NULL) + return PKGMGR_R_EINVAL; + + if (pkg_type == NULL) { + pkgtype = _get_pkg_type_from_desktop_file(pkgid, GLOBAL_USER); + if (pkgtype == NULL) + return PKGMGR_R_EINVAL; + } else + pkgtype = pkg_type; + + if (strlen(pkgid) >= PKG_STRING_LEN_MAX) + return PKGMGR_R_EINVAL; + + if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD)) + return PKGMGR_R_EINVAL; + + /* get installer path using pkg_path */ + installer_path = _get_backend_path_with_type(pkgtype); + if (installer_path == NULL) + return PKGMGR_R_EINVAL; + + /* generate req_key */ + req_key = __get_req_key(pkgid); + req_id = _get_request_id(); + + /* generate argv */ + snprintf(buf, 128, "%d", move_type); + /* argv[0] installer path */ + argv[argcnt++] = installer_path; + /* argv[1] */ + argv[argcnt++] = strdup("-k"); + /* argv[2] */ + argv[argcnt++] = req_key; + /* argv[3] */ + argv[argcnt++] = strdup("-m"); + /* argv[4] */ + argv[argcnt++] = strdup(pkgid); + /* argv[5] */ + argv[argcnt++] = strdup("-t"); + /* argv[6] */ + argv[argcnt++] = strdup(buf); + /* argv[7] -q option should be located at the end of command !! */ + if (mode == PM_QUIET) + argv[argcnt++] = strdup("-q"); + + /*** add quote in all string for special charactor like '\n'*** FIX */ + for (i = 0; i < argcnt; i++) { + temp = g_shell_quote(argv[i]); + len += (strlen(temp) + 1); + g_free(temp); + } + + args = (char *)calloc(len, sizeof(char)); + if (args == NULL) { + _LOGD("calloc failed"); + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + return PKGMGR_R_ERROR; + } + strncpy(args, argv[0], len - 1); + + for (i = 1; i < argcnt; i++) { + strncat(args, " ", strlen(" ")); + temp = g_shell_quote(argv[i]); + strncat(args, temp, strlen(temp)); + g_free(temp); + } + _LOGD("[args] %s [len] %d\n", args, len); + /******************* end of quote ************************/ + + /* 6. request install */ + ret = comm_client_request(mpc->info.request.cc, req_key, + COMM_REQ_TO_MOVER, pkgtype, pkgid, + args, cookie, 1); + if (ret < 0) { + _LOGE("request failed, ret=%d\n", ret); + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + free(args); + return PKGMGR_R_ECOMM; + } + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + if (args) + free(args); + + return req_id; +} +API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, uid_t uid) +{ + const char *pkgtype = NULL; + char *installer_path = NULL; + char *req_key = NULL; + int i = 0; + char *argv[PKG_ARGC_MAX] = { NULL, }; + char *args = NULL; + int argcnt = 0; + int len = 0; + char *temp = NULL; + int ret = 0; + int req_id = 0; + char *cookie = NULL; + char buf[128] = {'\0'}; + + /* Check for NULL value of pc */ + if (pc == NULL) { + _LOGD("package manager client handle is NULL\n"); + return PKGMGR_R_EINVAL; + } + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + /*check the pc type */ + if (mpc->ctype != PC_REQUEST) + return PKGMGR_R_EINVAL; + + /*check argument */ + if (pkgid == NULL) + return PKGMGR_R_EINVAL; + + if (pkg_type == NULL) { + pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid); + if (pkgtype == NULL) + return PKGMGR_R_EINVAL; + } else + pkgtype = pkg_type; + + if (strlen(pkgid) >= PKG_STRING_LEN_MAX) + return PKGMGR_R_EINVAL; + + if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD)) + return PKGMGR_R_EINVAL; + + /* get installer path using pkg_path */ + installer_path = _get_backend_path_with_type(pkgtype); + if (installer_path == NULL) + return PKGMGR_R_EINVAL; + + /* generate req_key */ + req_key = __get_req_key(pkgid); + req_id = _get_request_id(); + + /* generate argv */ + snprintf(buf, 128, "%d", move_type); + /* argv[0] installer path */ + argv[argcnt++] = installer_path; + /* argv[1] */ + argv[argcnt++] = strdup("-k"); + /* argv[2] */ + argv[argcnt++] = req_key; + /* argv[3] */ + argv[argcnt++] = strdup("-m"); + /* argv[4] */ + argv[argcnt++] = strdup(pkgid); + /* argv[5] */ + argv[argcnt++] = strdup("-t"); + /* argv[6] */ + argv[argcnt++] = strdup(buf); + /* argv[7] -q option should be located at the end of command !! */ + if (mode == PM_QUIET) + argv[argcnt++] = strdup("-q"); + + /*** add quote in all string for special charactor like '\n'*** FIX */ + for (i = 0; i < argcnt; i++) { + temp = g_shell_quote(argv[i]); + len += (strlen(temp) + 1); + g_free(temp); + } + + args = (char *)calloc(len, sizeof(char)); + if (args == NULL) { + _LOGD("calloc failed"); + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + return PKGMGR_R_ERROR; + } + strncpy(args, argv[0], len - 1); + + for (i = 1; i < argcnt; i++) { + strncat(args, " ", strlen(" ")); + temp = g_shell_quote(argv[i]); + strncat(args, temp, strlen(temp)); + g_free(temp); + } + _LOGD("[args] %s [len] %d\n", args, len); + /******************* end of quote ************************/ + + /* 6. request install */ + ret = comm_client_request(mpc->info.request.cc, req_key, + COMM_REQ_TO_MOVER, pkgtype, pkgid, + args, cookie, 1); + if (ret < 0) { + _LOGE("request failed, ret=%d\n", ret); + for (i = 0; i < argcnt; i++) free(argv[i]); @@ -1617,14 +2030,145 @@ API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, for (i = 0; i < argcnt; i++) free(argv[i]); - if (args) + if (args) + free(args); + + return req_id; +} + +API int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data) +{ + char *pkgtype; + char *installer_path; + char *req_key; + int req_id; + int i = 0; + char *argv[PKG_ARGC_MAX] = { NULL, }; + char *args = NULL; + int argcnt = 0; + int len = 0; + char *temp = NULL; + int ret = -1; + char *cookie = NULL; + char buf[128] = {'\0'}; + + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL); + + /* 1. check argument */ + retv_if(pkgid == NULL, PKGMGR_R_EINVAL); + + pkgmgr_pkginfo_h handle; + ret = pkgmgr_pkginfo_get_pkginfo(pkgid, &handle); + + /*check package id */ + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_pkginfo_get_pkginfo fail"); + tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid); + + /*check running app , terminate app if it is running*/ + ret = pkgmgr_appinfo_get_list(handle, PM_UI_APP, __app_list_cb, NULL); + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_appinfo_get_list : PM_UI_APP fail"); + + /*check running app , terminate app if it is running*/ + ret = pkgmgr_appinfo_get_list(handle, PM_SVC_APP, __app_list_cb, NULL); + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_appinfo_get_list : PM_SVC_APP fail"); + + /*check type */ + ret = pkgmgr_pkginfo_get_type(handle, &pkgtype); + tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_pkginfo_get_type fail"); + tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL"); + + /*check pkgid length */ + tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long"); + + /*check move_type */ + tryvm_if((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "move_type is not supported"); + + /* 2. get installer path using pkgtype */ + installer_path = _get_backend_path_with_type(pkgtype); + tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); + + /* 3. generate req_key */ + req_key = __get_req_key(pkgid); + + /* 4. add callback info - add callback info to pkgmgr_client */ + req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, data); + + /* 5. generate argv */ + snprintf(buf, 128, "%d", move_type); + /* argv[0] installer path */ + argv[argcnt++] = installer_path; + /* argv[1] */ + argv[argcnt++] = strdup("-k"); + /* argv[2] */ + argv[argcnt++] = req_key; + /* argv[3] */ + argv[argcnt++] = strdup("-m"); + /* argv[4] */ + argv[argcnt++] = strdup(pkgid); + /* argv[5] */ + argv[argcnt++] = strdup("-t"); + /* argv[6] */ + argv[argcnt++] = strdup(buf); + /* argv[5] -q option should be located at the end of command !! */ + if (mode == PM_QUIET) + argv[argcnt++] = strdup("-q"); + + /*** add quote in all string for special charactor like '\n'*** FIX */ + for (i = 0; i < argcnt; i++) { + temp = g_shell_quote(argv[i]); + len += (strlen(temp) + 1); + g_free(temp); + } + + args = (char *)calloc(len, sizeof(char)); + tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); + + strncpy(args, argv[0], len - 1); + + for (i = 1; i < argcnt; i++) { + strncat(args, " ", strlen(" ")); + temp = g_shell_quote(argv[i]); + strncat(args, temp, strlen(temp)); + g_free(temp); + } + _LOGD("[args] %s [len] %d\n", args, len); + + /* get cookie from security-server */ + cookie = __get_cookie_from_security_server(); + tryvm_if(cookie == NULL, ret = PKGMGR_R_ERROR, "__get_cookie_from_security_server is NULL"); + /******************* end of quote ************************/ + + /* 6. request install */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_MOVER, pkgtype, pkgid, args, cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed"); + + ret = req_id; + +catch: + for (i = 0; i < argcnt; i++) + free(argv[i]); + + if(args) free(args); + if (cookie) + free(cookie); - return req_id; + pkgmgr_pkginfo_destroy_pkginfo(handle); + PKGMGR_END();\ + return ret; } -API int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, +API int pkgmgr_client_move_usr_pkg(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, uid_t uid, pkgmgr_move_type move_type, pkgmgr_mode mode, pkgmgr_handler event_cb, void *data) { char *pkgtype; @@ -1653,7 +2197,7 @@ API int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type, retv_if(pkgid == NULL, PKGMGR_R_EINVAL); pkgmgr_pkginfo_h handle; - ret = pkgmgr_pkginfo_get_pkginfo(pkgid, &handle); + ret = pkgmgr_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); /*check package id */ tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgr_pkginfo_get_pkginfo fail"); @@ -1774,7 +2318,47 @@ API int pkgmgr_client_activate(pkgmgr_client * pc, const char *pkg_type, retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); if (pkg_type == NULL) { - pkgtype = _get_pkg_type_from_desktop_file(pkgid); + pkgtype = _get_pkg_type_from_desktop_file(pkgid, GLOBAL_USER); + retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); + } else + pkgtype = pkg_type; + + /* 2. generate req_key */ + req_key = __get_req_key(pkgid); + retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + + /* 3. request activate */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, pkgid, "1 PKG", cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + + ret = PKGMGR_R_OK; + +catch: + free(req_key); + return ret; +} + +API int pkgmgr_client_usr_activate(pkgmgr_client * pc, const char *pkg_type, + const char *pkgid, uid_t uid) +{ + const char *pkgtype; + char *req_key; + char *cookie = NULL; + int ret; + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + + /* 1. check argument */ + retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); + retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); + + if (pkg_type == NULL) { + pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid); retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); } else pkgtype = pkg_type; @@ -1814,7 +2398,48 @@ API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type, retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); if (pkg_type == NULL) { - pkgtype = _get_pkg_type_from_desktop_file(pkgid); + pkgtype = _get_pkg_type_from_desktop_file(pkgid, GLOBAL_USER); + if (pkgtype == NULL) + return PKGMGR_R_EINVAL; + } else + pkgtype = pkg_type; + + /* 2. generate req_key */ + req_key = __get_req_key(pkgid); + retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + + /* 3. request activate */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, pkgid, "0 PKG", cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + + ret = PKGMGR_R_OK; + +catch: + free(req_key); + return ret; +} + +API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, uid_t uid) +{ + const char *pkgtype; + char *req_key; + char *cookie = NULL; + int ret; + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + + /* 1. check argument */ + retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); + retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); + + if (pkg_type == NULL) { + pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid); if (pkgtype == NULL) return PKGMGR_R_EINVAL; } else @@ -1853,7 +2478,43 @@ API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid) retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - pkgtype = _get_pkg_type_from_desktop_file(appid); + pkgtype = _get_pkg_type_from_desktop_file(appid, GLOBAL_USER); + retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); + + /* 2. generate req_key */ + req_key = __get_req_key(appid); + retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + + /* 3. request activate */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, "1 APP", cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + + ret = PKGMGR_R_OK; + +catch: + free(req_key); + return ret; +} + +API int pkgmgr_client_usr_activate_app(pkgmgr_client * pc, const char *appid, uid_t uid) +{ + const char *pkgtype; + char *req_key; + char *cookie = NULL; + int ret; + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + + /* 1. check argument */ + retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); + retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); + + pkgtype = _get_pkg_type_from_desktop_file(appid, uid); retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); /* 2. generate req_key */ @@ -1895,7 +2556,88 @@ API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - pkgtype = _get_pkg_type_from_desktop_file(appid); + pkgtype = _get_pkg_type_from_desktop_file(appid, GLOBAL_USER); + retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); + + /* 2. generate req_key */ + req_key = __get_req_key(appid); + retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + + /*** add quote in all string for special charactor like '\n'*** FIX */ + if (argv) { + for (i = 0; argv[i]; i++) { + temp = g_shell_quote(argv[i]); + len += (strlen(temp) + 1); + g_free(temp); + argcnt++; + } + + if (argcnt) { + args = (char *)calloc(len, sizeof(char)); + tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); + strncpy(args, argv[0], len - 1); + + for (i = 1; i < argcnt; i++) { + strncat(args, " ", strlen(" ")); + temp = g_shell_quote(argv[i]); + strncat(args, temp, strlen(temp)); + g_free(temp); + } + } + } + + argsr = (char *)calloc(strlen("1 APP")+2+len, sizeof(char)); + tryvm_if(argsr == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); + + strncpy(argsr, "1 APP", strlen("1 APP")); + if (argcnt) { + strncat(argsr, " ", strlen(" ")); + strncat(argsr, args, strlen(args)); + } + + _LOGD("argsr [%s]\n", argsr); + /******************* end of quote ************************/ + + /* 3. request activate */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, argsr, cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + + ret = PKGMGR_R_OK; + +catch: + + free(req_key); + free(args); + free(argsr); + + return ret; +} + +API int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid) +{ + const char *pkgtype; + char *req_key; + char *cookie = NULL; + int ret; + int i = 0; + char *temp = NULL; + int len = 0; + int argcnt = 0; + char *args = NULL; + char *argsr = NULL; + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + + /* 1. check argument */ + retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); + retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); + + pkgtype = _get_pkg_type_from_desktop_file(appid, uid); retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); /* 2. generate req_key */ @@ -1928,31 +2670,68 @@ API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char argsr = (char *)calloc(strlen("1 APP")+2+len, sizeof(char)); tryvm_if(argsr == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - strncpy(argsr, "1 APP", strlen("1 APP")); - if (argcnt) { - strncat(argsr, " ", strlen(" ")); - strncat(argsr, args, strlen(args)); - } + strncpy(argsr, "1 APP", strlen("1 APP")); + if (argcnt) { + strncat(argsr, " ", strlen(" ")); + strncat(argsr, args, strlen(args)); + } + + _LOGD("argsr [%s]\n", argsr); + /******************* end of quote ************************/ + + /* 3. request activate */ + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, argsr, cookie, 1); + tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + + ret = PKGMGR_R_OK; + +catch: + + free(req_key); + free(args); + free(argsr); + + return ret; +} + + +API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid) +{ + const char *pkgtype; + char *req_key; + char *cookie = NULL; + int ret; + /* Check for NULL value of pc */ + retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + + /* 1. check argument */ + retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); + retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); + + pkgtype = _get_pkg_type_from_desktop_file(appid, GLOBAL_USER); + retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); - _LOGD("argsr [%s]\n", argsr); - /******************* end of quote ************************/ + /* 2. generate req_key */ + req_key = __get_req_key(appid); + retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); /* 3. request activate */ - ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, argsr, cookie, 1); + ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, "0 APP", cookie, 1); tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); ret = PKGMGR_R_OK; catch: - free(req_key); - free(args); - free(argsr); - return ret; } -API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid) +API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, uid_t uid) { const char *pkgtype; char *req_key; @@ -1970,7 +2749,7 @@ API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid) retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - pkgtype = _get_pkg_type_from_desktop_file(appid); + pkgtype = _get_pkg_type_from_desktop_file(appid, uid); retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); /* 2. generate req_key */ @@ -1988,7 +2767,6 @@ catch: return ret; } - API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type, const char *appid, pkgmgr_mode mode) { @@ -2021,7 +2799,120 @@ API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type, if (pkg_type == NULL) { - pkgtype = _get_pkg_type_from_desktop_file(appid); + pkgtype = _get_pkg_type_from_desktop_file(appid, GLOBAL_USER); + if (pkgtype == NULL) + return PKGMGR_R_EINVAL; + } else + pkgtype = pkg_type; + + if (strlen(appid) >= PKG_STRING_LEN_MAX) + return PKGMGR_R_EINVAL; + + /* 2. get installer path using pkg_path */ + installer_path = _get_backend_path_with_type(pkgtype); + if (installer_path == NULL) + return PKGMGR_R_EINVAL; + + /* 3. generate req_key */ + req_key = __get_req_key(appid); + + /* 4. generate argv */ + + /* argv[0] installer path */ + argv[argcnt++] = installer_path; + /* argv[1] */ + argv[argcnt++] = strdup("-k"); + /* argv[2] */ + argv[argcnt++] = req_key; + /* argv[3] */ + argv[argcnt++] = strdup("-c"); + /* argv[4] */ + argv[argcnt++] = strdup(appid); + /* argv[5] -q option should be located at the end of command !! */ + if (mode == PM_QUIET) + argv[argcnt++] = strdup("-q"); + + /*** add quote in all string for special charactor like '\n'*** FIX */ + for (i = 0; i < argcnt; i++) { + temp = g_shell_quote(argv[i]); + len += (strlen(temp) + 1); + g_free(temp); + } + + args = (char *)calloc(len, sizeof(char)); + if (args == NULL) { + _LOGD("calloc failed"); + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + return PKGMGR_R_ERROR; + } + strncpy(args, argv[0], len - 1); + + for (i = 1; i < argcnt; i++) { + strncat(args, " ", strlen(" ")); + temp = g_shell_quote(argv[i]); + strncat(args, temp, strlen(temp)); + g_free(temp); + } + _LOGD("[args] %s [len] %d\n", args, len); + /******************* end of quote ************************/ + + /* 6. request clear */ + ret = comm_client_request(mpc->info.request.cc, req_key, + COMM_REQ_TO_CLEARER, pkgtype, appid, + args, cookie, 1); + if (ret < 0) { + _LOGE("request failed, ret=%d\n", ret); + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + free(args); + return PKGMGR_R_ECOMM; + } + + for (i = 0; i < argcnt; i++) + free(argv[i]); + + free(args); + + return PKGMGR_R_OK; +} +API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, const char *pkg_type, + const char *appid, pkgmgr_mode mode, uid_t uid) +{ + const char *pkgtype; + char *installer_path; + char *req_key; + int i = 0; + char *argv[PKG_ARGC_MAX] = { NULL, }; + char *args = NULL; + int argcnt = 0; + int len = 0; + char *temp = NULL; + int ret; + char *cookie = NULL; + + /* Check for NULL value of pc */ + if (pc == NULL) { + _LOGD("package manager client handle is NULL\n"); + return PKGMGR_R_EINVAL; + } + pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + + /* 0. check the pc type */ + if (mpc->ctype != PC_REQUEST) + return PKGMGR_R_EINVAL; + + /* 1. check argument */ + if (appid == NULL) + return PKGMGR_R_EINVAL; + + + if (pkg_type == NULL) { + pkgtype = _get_pkg_type_from_desktop_file(appid, uid); if (pkgtype == NULL) return PKGMGR_R_EINVAL; } else @@ -2258,7 +3149,72 @@ API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n"); tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n"); - ret = __move_pkg_process(pc, pkgid, (pkgmgr_move_type)service_mode, event_cb, data); + ret = __move_pkg_process(pc, pkgid, GLOBAL_USER, (pkgmgr_move_type)service_mode, event_cb, data); + break; + + case PM_REQUEST_GET_SIZE: + tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n"); + tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n"); + tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n"); + + ret = __get_size_process(pc, pkgid, (pkgmgr_getsize_type)service_mode, event_cb, data); + break; + + case PM_REQUEST_KILL_APP: + case PM_REQUEST_CHECK_APP: + tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n"); + tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n"); + + ret = __check_app_process(service_type, pc, pkgid, GLOBAL_USER, data); + if (ret < 0) + _LOGE("__check_app_process fail \n"); + else + ret = PKGMGR_R_OK; + + break; + + default: + _LOGE("Wrong Request\n"); + ret = -1; + break; + } + +catch: + + return ret; +} + +API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode, + pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid, + const char *custom_info, pkgmgr_handler event_cb, void *data) +{ + int ret =0; + + /* Check for NULL value of service type */ + retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n"); + retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n"); + vconf_set_int(VCONFKEY_PKGMGR_STATUS, -1); + + switch (service_type) { + case PM_REQUEST_CSC: + tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n"); + tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX"); + tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n"); + + ret = __csc_process(custom_info, (char *)data); + if (ret < 0) + _LOGE("__csc_process fail \n"); + else + ret = PKGMGR_R_OK; + + break; + + case PM_REQUEST_MOVE: + tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n"); + tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n"); + tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n"); + + ret = __move_pkg_process(pc, pkgid, uid, (pkgmgr_move_type)service_mode, event_cb, data); break; case PM_REQUEST_GET_SIZE: @@ -2274,7 +3230,7 @@ API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n"); tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n"); - ret = __check_app_process(service_type, pc, pkgid, data); + ret = __check_app_process(service_type, pc, pkgid, uid, data); if (ret < 0) _LOGE("__check_app_process fail \n"); else @@ -2392,7 +3348,7 @@ ail_cb_ret_e __appinfo_func(const ail_appinfo_h appinfo, void *user_data) return AIL_CB_RET_CONTINUE; } -API int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data) +API int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data, uid_t uid) { int cnt = -1; ail_filter_h filter; @@ -2417,8 +3373,14 @@ API int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data) ail_filter_destroy(filter); return PKGMGR_R_ERROR; } - - ret = ail_filter_count_appinfo(filter, &cnt); + + if(uid != GLOBAL_USER) + { + ret = ail_filter_count_usr_appinfo(filter, &cnt, uid); + }else + { + ret = ail_filter_count_appinfo(filter, &cnt); + } if (ret != AIL_ERROR_OK) { ail_filter_destroy(filter); return PKGMGR_R_ERROR; @@ -2433,9 +3395,14 @@ API int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data) } udata->iter_fn = iter_fn; udata->data = data; - - ail_filter_list_appinfo_foreach(filter, __appinfo_func, udata); - + + if(uid != GLOBAL_USER) + { + ail_filter_list_usr_appinfo_foreach(filter, __appinfo_func, udata, uid); + }else + { + ail_filter_list_appinfo_foreach(filter, __appinfo_func, udata); + } free(udata); ret = ail_filter_destroy(filter); @@ -2457,7 +3424,59 @@ API pkgmgr_info *pkgmgr_info_new(const char *pkg_type, const char *pkgid) return NULL; if (pkg_type == NULL) { - pkgtype = _get_pkg_type_from_desktop_file(pkgid); + pkgtype = _get_pkg_type_from_desktop_file(pkgid, GLOBAL_USER); + if (pkgtype == NULL) + return NULL; + } else + pkgtype = pkg_type; + + if (strlen(pkgid) >= PKG_STRING_LEN_MAX) + return NULL; + + pkg_detail_info = calloc(1, sizeof(package_manager_pkg_detail_info_t)); + if (pkg_detail_info == NULL) { + _LOGE("*** Failed to alloc package_handler_info.\n"); + return NULL; + } + + plugin_set = _package_manager_load_library(pkgtype); + if (plugin_set == NULL) { + _LOGE("*** Failed to load library"); + free(pkg_detail_info); + return NULL; + } + + if (plugin_set->pkg_is_installed) { + if (plugin_set->pkg_is_installed(pkgid) != 0) { + _LOGE("*** Failed to call pkg_is_installed()"); + free(pkg_detail_info); + return NULL; + } + + if (plugin_set->get_pkg_detail_info) { + if (plugin_set->get_pkg_detail_info(pkgid, + pkg_detail_info) != 0) { + _LOGE("*** Failed to call get_pkg_detail_info()"); + free(pkg_detail_info); + return NULL; + } + } + } + + return (pkgmgr_info *) pkg_detail_info; +} +API pkgmgr_info *pkgmgr_info_usr_new(const char *pkg_type, const char *pkgid, uid_t uid) +{ + const char *pkgtype; + pkg_plugin_set *plugin_set = NULL; + package_manager_pkg_detail_info_t *pkg_detail_info = NULL; + + /* 1. check argument */ + if (pkgid == NULL) + return NULL; + + if (pkg_type == NULL) { + pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid); if (pkgtype == NULL) return NULL; } else @@ -2587,6 +3606,12 @@ API int pkgmgr_pkginfo_get_pkginfo(const char *pkgid, pkgmgr_pkginfo_h *handle) ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, handle); return ret; } +API int pkgmgr_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid, pkgmgr_pkginfo_h *handle) +{ + int ret = 0; + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, handle); + return ret; +} API int pkgmgr_pkginfo_get_pkgname(pkgmgr_pkginfo_h handle, char **pkg_name) { diff --git a/tool/pkg_cmd.c b/tool/pkg_cmd.c index 56d0eca..09c1907 100755 --- a/tool/pkg_cmd.c +++ b/tool/pkg_cmd.c @@ -50,7 +50,7 @@ static int __process_request(); static void __print_usage(); static int __is_authorized(); -static int __is_app_installed(char *pkgid); +static int __is_app_installed(char *pkgid, uid_t uid); static void __print_pkg_info(pkgmgr_info * pkg_info); static int __return_cb(int req_id, const char *pkg_type, const char *pkgid, const char *key, const char *val, const void *pmsg, @@ -266,13 +266,19 @@ static int __convert_to_absolute_path(char *path) return 0; } -static int __is_app_installed(char *pkgid) +static int __is_app_installed(char *pkgid, uid_t uid) { #if 0 ail_appinfo_h handle; ail_error_e ret; char *str = NULL; - ret = ail_package_get_appinfo(pkgid, &handle); + if (uid != GLOBAL_USER) + { + ret = ail_package_get_usr_appinfo(pkgid, &handle, uid); + }else + { + ret = ail_package_get_appinfo(pkgid, &handle); + } if (ret != AIL_ERROR_OK) { return -1; } @@ -508,7 +514,7 @@ static int __pkg_list_cb (const pkgmgrinfo_pkginfo_h handle, void *user_data) return 0; } -static int __process_request() +static int __process_request(uid_t uid) { int ret = -1; int mode = PM_DEFAULT; @@ -536,16 +542,35 @@ static int __process_request() else mode = PM_QUIET; if (data.des_path[0] == '\0') - ret = + { + if(uid != GLOBAL_USER) + { + ret = + pkgmgr_client_usr_install(pc, data.pkg_type, NULL, + data.pkg_path, NULL, mode, + __return_cb, pc, uid); + }else + { + ret = pkgmgr_client_install(pc, data.pkg_type, NULL, data.pkg_path, NULL, mode, __return_cb, pc); - else - ret = - pkgmgr_client_install(pc, data.pkg_type, - data.des_path, data.pkg_path, - NULL, mode, __return_cb, pc); - if (ret < 0){ + } + }else{ + if(uid != GLOBAL_USER) + { + ret = + pkgmgr_client_usr_install(pc, data.pkg_type, + data.des_path, data.pkg_path, + NULL, mode, __return_cb, pc, uid); + }else + { + ret = + pkgmgr_client_install(pc, data.pkg_type, + data.des_path, data.pkg_path, + NULL, mode, __return_cb, pc); + } + }if (ret < 0){ data.result = PKGCMD_ERR_FATAL_ERROR; if (access(data.pkg_path, F_OK) != 0) data.result = PKGCMD_ERR_PACKAGE_NOT_FOUND; @@ -575,7 +600,7 @@ static int __process_request() else mode = PM_QUIET; - ret = __is_app_installed(data.pkgid); + ret = __is_app_installed(data.pkgid, uid); if (ret == -1) { printf("package is not installed\n"); break; @@ -640,13 +665,20 @@ static int __process_request() mode = PM_DEFAULT; else mode = PM_QUIET; - ret = __is_app_installed(data.pkgid); + ret = __is_app_installed(data.pkgid, uid); if (ret == -1) { printf("package is not installed\n"); break; } - ret = pkgmgr_client_clear_user_data(pc, data.pkg_type, + if(uid != GLOBAL_USER) + { + ret = pkgmgr_client_clear_user_data(pc, data.pkg_type, + data.pkgid, mode); + }else + { + ret = pkgmgr_client_clear_user_data(pc, data.pkg_type, data.pkgid, mode); + } if (ret < 0) break; ret = data.result; @@ -669,7 +701,13 @@ static int __process_request() if ( strcmp(data.pkg_type, "app") == 0 ) { if (strlen(data.label) == 0) { - ret = pkgmgr_client_activate_app(pc, data.pkgid); + if (uid != GLOBAL_USER) + { + ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, uid); + }else + { + ret = pkgmgr_client_activate_app(pc, data.pkgid); + } if (ret < 0) break; } else { @@ -677,12 +715,24 @@ static int __process_request() char *largv[3] = {NULL, }; largv[0] = "-l"; largv[1] = data.label; - ret = pkgmgr_client_activate_appv(pc, data.pkgid, largv); + if(uid != GLOBAL_USER) + { + ret = pkgmgr_client_usr_activate_appv(pc, data.pkgid, largv, uid); + }else + { + ret = pkgmgr_client_activate_appv(pc, data.pkgid, largv); + } if (ret < 0) break; } } else { - ret = pkgmgr_client_activate(pc, data.pkg_type, data.pkgid); + if (uid != GLOBAL_USER) + { + ret = pkgmgr_client_usr_activate(pc, data.pkg_type, data.pkgid, uid); + }else + { + ret = pkgmgr_client_activate(pc, data.pkg_type, data.pkgid); + } if (ret < 0) break; } @@ -707,11 +757,23 @@ static int __process_request() } if ( strcmp(data.pkg_type, "app") == 0 ) { - ret = pkgmgr_client_deactivate_app(pc, data.pkgid); + if (uid != GLOBAL_USER) + { + ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, uid); + }else + { + ret = pkgmgr_client_deactivate_app(pc, data.pkgid); + } if (ret < 0) break; - } else { - ret = pkgmgr_client_deactivate(pc, data.pkg_type, data.pkgid); + }else { + if(uid != GLOBAL_USER) + { + ret = pkgmgr_client_usr_deactivate(pc, data.pkg_type, data.pkgid, uid); + }else + { + ret = pkgmgr_client_deactivate(pc, data.pkg_type, data.pkgid); + } if (ret < 0) break; } @@ -738,14 +800,21 @@ static int __process_request() break; } mode = PM_QUIET; - ret = __is_app_installed(data.pkgid); + ret = __is_app_installed(data.pkgid, uid); if (ret == -1) { printf("package is not installed\n"); break; } if (data.quiet == 0) - ret = pkgmgr_client_move(pc, data.pkg_type, data.pkgid, data.type, mode); - else + { + if(uid != GLOBAL_USER) + { + ret = pkgmgr_client_usr_move(pc, data.pkg_type, data.pkgid, data.type, mode, uid); + }else + { + ret = pkgmgr_client_move(pc, data.pkg_type, data.pkgid, data.type, mode); + } + }else ret = pkgmgr_client_request_service(PM_REQUEST_MOVE, data.type, pc, NULL, data.pkgid, NULL, NULL, NULL); printf("pkg[%s] move result = %d\n", data.pkgid, ret); @@ -864,8 +933,16 @@ static int __process_request() case SHOW_REQ: if (data.pkgid[0] != '\0') { - pkgmgr_info *pkg_info = - pkgmgr_info_new(data.pkg_type, data.pkgid); + pkgmgr_info *pkg_info; + if(uid != GLOBAL_USER) + { + pkg_info = + pkgmgr_info_usr_new(data.pkg_type, data.pkgid, uid); + }else + { + pkg_info = + pkgmgr_info_new(data.pkg_type, data.pkgid); + } if (pkg_info == NULL) { printf("Failed to get pkginfo handle\n"); ret = -1; @@ -1116,7 +1193,7 @@ int main(int argc, char *argv[]) } } - ret = __process_request(); + ret = __process_request(getuid()); if ((ret == -1) && (data.result != 0)) data.result = PKGCMD_ERR_ARGUMENT_INVALID; diff --git a/tool/pkg_info.c b/tool/pkg_info.c index 9693a1a..d7c4b7e 100755 --- a/tool/pkg_info.c +++ b/tool/pkg_info.c @@ -37,19 +37,19 @@ static void __print_usage(); -static int __get_pkg_info(char *pkgid); +static int __get_pkg_info(char *pkgid, uid_t uid); static int __get_app_info(char *appid); -static int __get_app_list(char *pkgid); +static int __get_app_list(char *pkgid, uid_t uid); static int __get_app_category_list(char *appid); static int __get_app_metadata_list(char *appid); static int __get_app_control_list(char *appid); static int __get_pkg_list(void); -static int __get_installed_app_list(); +static int __get_installed_app_list(uid_t uid); static int __add_app_filter(void); static int __add_pkg_filter(void); -static int __insert_manifest_in_db(char *manifest); -static int __remove_manifest_from_db(char *manifest); -static int __set_pkginfo_in_db(char *pkgid); +static int __insert_manifest_in_db(char *manifest, uid_t uid); +static int __remove_manifest_from_db(char *manifest, uid_t uid); +static int __set_pkginfo_in_db(char *pkgid, uid_t uid); static int __set_certinfo_in_db(char *pkgid); static int __get_certinfo_from_db(char *pkgid); static int __del_certinfo_from_db(char *pkgid); @@ -1135,7 +1135,7 @@ static int __compare_pkg_certinfo_from_db(char *lhs_pkgid, char *rhs_pkgid) return 0; } -static int __compare_app_certinfo_from_db(char *lhs_appid, char *rhs_appid) +static int __compare_app_certinfo_from_db(char *lhs_appid, char *rhs_appid, uid_t uid) { if (lhs_appid == NULL || rhs_appid == NULL) { printf("appid is NULL\n"); @@ -1144,7 +1144,10 @@ static int __compare_app_certinfo_from_db(char *lhs_appid, char *rhs_appid) int ret = 0; pkgmgrinfo_cert_compare_result_type_e result; - ret = pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_appid, rhs_appid, &result); + if (uid != GLOBAL_USER) + ret = pkgmgrinfo_pkginfo_compare_usr_app_cert_info(lhs_appid, rhs_appid, uid, &result); + else + ret = pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_appid, rhs_appid, &result); if (ret != PMINFO_R_OK) { return -1; } @@ -1325,7 +1328,7 @@ err: return ret; } -static int __set_pkginfo_in_db(char *pkgid) +static int __set_pkginfo_in_db(char *pkgid, uid_t uid) { if (pkgid == NULL) { printf("pkgid is NULL\n"); @@ -1340,7 +1343,13 @@ static int __set_pkginfo_in_db(char *pkgid) pkgmgr_pkgdbinfo_h handle = NULL; INSTALL_LOCATION storage = 0; - ret = pkgmgrinfo_create_pkgdbinfo(pkgid, &handle); + if(uid != GLOBAL_USER) + { + ret = pkgmgrinfo_create_pkgusrdbinfo(pkgid, uid, &handle); + }else + { + ret = pkgmgrinfo_create_pkgdbinfo(pkgid, &handle); + } if (ret < 0) { printf("pkgmgrinfo_create_pkgdbinfo failed\n"); return -1; @@ -1543,14 +1552,20 @@ static int __set_pkginfo_in_db(char *pkgid) return 0; } -static int __insert_manifest_in_db(char *manifest) +static int __insert_manifest_in_db(char *manifest, uid_t uid) { int ret = 0; if (manifest == NULL) { printf("Manifest file is NULL\n"); return -1; } - ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL); + if (uid != GLOBAL_USER) + { + ret = pkgmgr_parser_parse_usr_manifest_for_installation(manifest, uid, NULL); + }else + { + ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL); + } if (ret < 0) { printf("insert in db failed\n"); return -1; @@ -1558,7 +1573,7 @@ static int __insert_manifest_in_db(char *manifest) return 0; } -static int __fota_insert_manifest_in_db(char *manifest) +static int __fota_insert_manifest_in_db(char *manifest, uid_t uid) { int ret = 0; char *temp[] = {"fota=true", NULL}; @@ -1567,7 +1582,13 @@ static int __fota_insert_manifest_in_db(char *manifest) printf("Manifest file is NULL\n"); return -1; } - ret = pkgmgr_parser_parse_manifest_for_installation(manifest, temp); + if (uid != GLOBAL_USER) + { + ret = pkgmgr_parser_parse_usr_manifest_for_installation(manifest, uid, NULL); + }else + { + ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL); + } if (ret < 0) { printf("insert in db failed\n"); return -1; @@ -1575,14 +1596,20 @@ static int __fota_insert_manifest_in_db(char *manifest) return 0; } -static int __remove_manifest_from_db(char *manifest) +static int __remove_manifest_from_db(char *manifest, uid_t uid) { int ret = 0; if (manifest == NULL) { printf("Manifest file is NULL\n"); return -1; } - ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL); + if (uid != GLOBAL_USER) + { + ret = pkgmgr_parser_parse_usr_manifest_for_uninstallation(manifest, uid, NULL); + }else + { + ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL); + } if (ret < 0) { printf("remove from db failed\n"); return -1; @@ -1783,10 +1810,13 @@ static int __get_pkg_list() return 0; } -static int __get_installed_app_list() +static int __get_installed_app_list(uid_t uid) { int ret = -1; - ret = pkgmgrinfo_appinfo_get_installed_list(app_func, NULL); + if(uid != GLOBAL_USER) + ret = pkgmgrinfo_appinfo_get_usr_installed_list(app_func, uid, NULL); + else + ret = pkgmgrinfo_appinfo_get_installed_list(app_func, NULL); if (ret < 0) { printf("pkgmgrinfo_appinfo_get_installed_list() failed\n"); return -1; @@ -1937,12 +1967,15 @@ static int __set_app_enabled(char *appid, bool enabled) return 0; } -static int __get_app_list(char *pkgid) +static int __get_app_list(char *pkgid, uid_t uid) { pkgmgr_pkginfo_h handle; int ret = -1; char *test_data = "test data"; - ret = pkgmgr_pkginfo_get_pkginfo(pkgid, &handle); + if(uid != GLOBAL_USER) + ret = pkgmgr_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); + else + ret = pkgmgr_pkginfo_get_pkginfo(pkgid, &handle); if (ret < 0) { printf("Failed to get handle\n"); return -1; @@ -1961,13 +1994,16 @@ static int __get_app_list(char *pkgid) return 0; } -static int __get_pkg_info(char *pkgid) +static int __get_pkg_info(char *pkgid, uid_t uid) { pkgmgrinfo_pkginfo_h handle; int ret = -1; printf("Get Pkg Info Called [%s]\n", pkgid); - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if(uid != GLOBAL_USER) + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); + else + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); if (ret < 0) { printf("Failed to get handle\n"); return -1; @@ -2193,7 +2229,7 @@ int main(int argc, char *argv[]) goto end; } } else if (strcmp(argv[1], "--listapp") == 0) { - ret = __get_installed_app_list(); + ret = __get_installed_app_list(getuid()); if (ret == -1) { printf("get installed app list failed\n"); goto end; @@ -2228,7 +2264,7 @@ int main(int argc, char *argv[]) } goto end; } else if (strcmp(argv[1], "--cmp-appcert") == 0) { - ret = __compare_app_certinfo_from_db(argv[2], argv[3]); + ret = __compare_app_certinfo_from_db(argv[2], argv[3], getuid()); if (ret == -1) { printf("compare certinfo from db failed\n"); goto end; @@ -2260,7 +2296,7 @@ int main(int argc, char *argv[]) } if (strcmp(argv[1], "--pkg") == 0) { - ret = __get_pkg_info(argv[2]); + ret = __get_pkg_info(argv[2], getuid()); if (ret == -1) { printf("get pkg info failed\n"); goto end; @@ -2272,31 +2308,31 @@ int main(int argc, char *argv[]) goto end; } } else if (strcmp(argv[1], "--list") == 0) { - ret = __get_app_list(argv[2]); + ret = __get_app_list(argv[2], getuid()); if (ret == -1) { printf("get app list failed\n"); goto end; } } else if (strcmp(argv[1], "--imd") == 0) { - ret = __insert_manifest_in_db(argv[2]); + ret = __insert_manifest_in_db(argv[2], getuid()); if (ret == -1) { printf("insert in db failed\n"); goto end; } } else if (strcmp(argv[1], "--fota") == 0) { - ret = __fota_insert_manifest_in_db(argv[2]); + ret = __fota_insert_manifest_in_db(argv[2], getuid()); if (ret == -1) { printf("insert in db failed\n"); goto end; } } else if (strcmp(argv[1], "--rmd") == 0) { - ret = __remove_manifest_from_db(argv[2]); + ret = __remove_manifest_from_db(argv[2], getuid()); if (ret == -1) { printf("remove from db failed\n"); goto end; } } else if (strcmp(argv[1], "--setdb") == 0) { - ret = __set_pkginfo_in_db(argv[2]); + ret = __set_pkginfo_in_db(argv[2], getuid()); if (ret == -1) { printf("set pkginfo in db failed\n"); goto end; diff --git a/tool/pkg_initdb.c b/tool/pkg_initdb.c index 8f77297..d7d9b1c 100755 --- a/tool/pkg_initdb.c +++ b/tool/pkg_initdb.c @@ -219,7 +219,6 @@ static int initdb_change_perm(const char *db_file) return 0; } - static int __is_authorized() { /* pkg_init db should be called by as root privilege. */ @@ -255,12 +254,12 @@ int main(int argc, char *argv[]) _D("Some Packages in the Package Info DB."); return 0; } +if (__is_authorized()) { ret = initdb_load_directory(OPT_MANIFEST_DIRECTORY); if (ret == -1) { _E("cannot load opt manifest directory."); } - ret = initdb_load_directory(USR_MANIFEST_DIRECTORY); if (ret == -1) { _E("cannot load usr manifest directory.");