#include <glib.h>
#include <gio/gio.h>
-#include <gum/gum-user.h>
-#include <gum/common/gum-user-types.h>
#include "queue.h"
+#include "pkgmgr-info.h"
#include "pkgmgr-server.h"
#include "package-manager.h"
-#define RETRY_MAX 5
-#define RETRY_WAIT_USEC (1000000 / 2) /* 0.5 sec */
#define PKGMGR_DBUS_SERVICE "org.tizen.pkgmgr"
#define PKGMGR_DBUS_OBJECT_PATH "/org/tizen/pkgmgr"
" <arg type='i' name='ret' direction='out'/>"
" <arg type='s' name='reqkey' direction='out'/>"
" </method>"
+ " <method name='register_pkg_update_info'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='s' name='pkgid' direction='in'/>"
+ " <arg type='s' name='version' direction='in'/>"
+ " <arg type='i' name='type' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
+ " <method name='unregister_pkg_update_info'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='s' name='pkgid' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
+ " <method name='unregister_all_pkg_update_info'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
" <method name='enable_app'>"
" <arg type='u' name='uid' direction='in'/>"
" <arg type='s' name='appid' direction='in'/>"
return str_req_key;
}
-static int __is_admin_user(uid_t uid)
-{
- GumUser *guser;
- GumUserType ut = GUM_USERTYPE_NONE;
- int retry_cnt = 0;
-
- do {
- guser = gum_user_get_sync(uid, FALSE);
- if (guser == NULL) {
- ERR("cannot get user information from gumd, retry");
- retry_cnt++;
- usleep(RETRY_WAIT_USEC);
- continue;
- }
- break;
- } while (retry_cnt <= RETRY_MAX);
-
- if (guser == NULL) {
- ERR("cannot get user information from gumd, failed");
- return -1;
- }
-
- g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
- if (ut == GUM_USERTYPE_NONE) {
- ERR("cannot get user type");
- g_object_unref(guser);
- return -1;
- } else if (ut != GUM_USERTYPE_ADMIN) {
- g_object_unref(guser);
- return 0;
- }
-
- g_object_unref(guser);
-
- return 1;
-}
-
static int __check_caller_permission(uid_t uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
}
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
- pkgtype, pkgpath, args)) {
+ pkgtype, pkgpath, args, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_MOUNT_INSTALL,
- pkgtype, pkgpath, args)) {
+ pkgtype, pkgpath, args, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
return -1;
}
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
return -1;
}
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
snprintf(buf, sizeof(buf), "%d", move_type);
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
- pkgtype, pkgid, buf)) {
+ pkgtype, pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
}
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_ENABLE_PKG,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)",
PKGMGR_R_ESYSTEM, ""));
return 0;
}
+static int __convert_updateinfo_type(const char *type, pkgmgrinfo_updateinfo_update_type *converted_type)
+{
+ if (type == NULL || converted_type == NULL)
+ return -1;
+
+ if (strncmp(type, PMINFO_UPDATEINFO_TYPE_NONE, strlen(PMINFO_UPDATEINFO_TYPE_NONE)) == 0)
+ *converted_type = PMINFO_UPDATEINFO_NONE;
+ else if (strncmp(type, PMINFO_UPDATEINFO_TYPE_FORCE, strlen(PMINFO_UPDATEINFO_TYPE_FORCE)) == 0)
+ *converted_type = PMINFO_UPDATEINFO_FORCE;
+ else if (strncmp(type, PMINFO_UPDATEINFO_TYPE_OPTIONAL, strlen(PMINFO_UPDATEINFO_TYPE_OPTIONAL)) == 0)
+ *converted_type = PMINFO_UPDATEINFO_OPTIONAL;
+ else
+ return -1;
+ return 0;
+}
+
+static int __handle_request_register_pkg_update_info(
+ uid_t caller_uid, GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ char *reqkey;
+ char buf[MAX_PKG_ARGS_LEN];
+ int ret;
+ pkgmgrinfo_pkginfo_h pkg_info;
+ bool is_global_pkg;
+ pkgmgrinfo_updateinfo_h update_info;
+ pkgmgrinfo_updateinfo_update_type converted_type;
+ uid_t target_uid = (uid_t)-1;
+ gchar *pkgid = NULL;
+ gchar *version = NULL;
+
+ g_variant_get(parameters, "(ussi)", &target_uid, &pkgid, &version, &converted_type);
+
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
+ if (ret != PMINFO_R_OK) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+
+ /* return error if given pkg is global pkg but caller is not admin */
+ if (caller_uid >= REGULAR_USER && is_global_pkg
+ && !__is_admin_user(caller_uid)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EPRIV));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_create(&update_info);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_set_pkgid(update_info, (char *)pkgid);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_set_version(update_info, (char *)version);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_set_type(update_info, converted_type);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("register_pkg_update_info");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO, "default",
+ NULL, buf, update_info))
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+ return 0;
+}
+
+static int __handle_request_unregister_pkg_update_info(
+ uid_t caller_uid, GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *pkgid = NULL;
+ char *reqkey;
+ pkgmgrinfo_pkginfo_h pkg_info;
+ bool is_global_pkg;
+ int ret;
+
+ g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+ if (target_uid == (uid_t)-1 || pkgid == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ECOMM));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
+ if (ret != PMINFO_R_OK) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+
+ /* return error if given pkg is global pkg but caller is not admin */
+ if (caller_uid >= REGULAR_USER && is_global_pkg
+ && !__is_admin_user(caller_uid)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EPRIV));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("unregister_pkg_update_info");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_UNREGISTER_PKG_UPDATE_INFO, "default",
+ pkgid, NULL, NULL))
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+
+ return 0;
+
+}
+
+static int __handle_request_unregister_all_pkg_update_info(
+ uid_t caller_uid, GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *reqkey;
+
+ g_variant_get(parameters, "(u)", &target_uid);
+ if (target_uid == (uid_t)-1) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("unregister_all_pkg_update_info");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_UNREGISTER_ALL_PKG_UPDATE_INFO, "default",
+ NULL, NULL, NULL))
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+ return 0;
+}
+
static int __handle_request_disable_pkgs(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
}
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_DISABLE_PKG,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)",
PKGMGR_R_ESYSTEM, ""));
while (g_variant_iter_next(iter, "&s", &appid)) {
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_ENABLE_APP,
- "default", appid, buf)) {
+ "default", appid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)",
PKGMGR_R_ESYSTEM, ""));
while (g_variant_iter_next(iter, "&s", &appid)) {
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_DISABLE_APP,
- "default", appid, buf)) {
+ "default", appid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)",
PKGMGR_R_ESYSTEM, ""));
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_ENABLE_APP, "default",
- appid, NULL)) {
+ appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_DISABLE_APP, "default",
- appid, NULL)) {
+ appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
- "default", appid, NULL)) {
+ "default", appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
- "default", appid, NULL)) {
+ "default", appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
snprintf(buf, sizeof(buf), "%d", get_type);
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
- "pkgtool", pkgid, buf)) {
+ "pkgtool", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
snprintf(buf, sizeof(buf), "%d", get_type);
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE_SYNC,
- "pkgtool", pkgid, buf)) {
+ "pkgtool", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
}
if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARDATA,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(pkgtype);
}
if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(pkgtype);
}
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
- "default", pkgid, NULL)) {
+ "default", pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
free(reqkey);
}
if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
- "default", pkgid, NULL)) {
+ "default", pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
free(reqkey);
if (_push_queue(caller_uid, caller_uid, reqkey,
REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
- "default", NULL, resp_data)) {
+ "default", NULL, resp_data, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
""));
if (_push_queue(caller_uid, caller_uid, reqkey,
REQUEST_TYPE_REGISTER_LICENSE,
- "default", NULL, resp_data)) {
+ "default", NULL, resp_data, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
if (_push_queue(caller_uid, caller_uid, reqkey,
REQUEST_TYPE_DECRYPT_PACKAGE,
"default", drm_file_path,
- decrypted_file_path)) {
+ decrypted_file_path, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
}
if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
- appid, NULL)) {
+ appid, NULL, NULL)) {
ERR("Failed to push request");
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
snprintf(buf, sizeof(buf), "%d", mode);
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_SET_RESTRICTION_MODE,
- "default", pkgid, buf)) {
+ "default", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
snprintf(buf, sizeof(buf), "%d", mode);
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_UNSET_RESTRICTION_MODE,
- "default", pkgid, buf)) {
+ "default", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
if (_push_queue(target_uid, caller_uid, reqkey,
REQUEST_TYPE_GET_RESTRICTION_MODE,
- "default", pkgid, NULL)) {
+ "default", pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
free(reqkey);
if (_push_queue(target_uid, uid, reqkey,
REQUEST_TYPE_SET_APP_LABEL,
- "default", appid, label)) {
+ "default", appid, label, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
if (_push_queue(target_uid, uid, reqkey,
REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE,
- pkgtype, pkgid, NULL)) {
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
ret = __handle_request_enable_pkgs(uid, invocation, parameters);
else if (g_strcmp0(method_name, "disable_pkgs") == 0)
ret = __handle_request_disable_pkgs(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "register_pkg_update_info") == 0)
+ ret = __handle_request_register_pkg_update_info(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "unregister_pkg_update_info") == 0)
+ ret = __handle_request_unregister_pkg_update_info(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "unregister_all_pkg_update_info") == 0)
+ ret = __handle_request_unregister_all_pkg_update_info(uid, invocation, parameters);
else if (g_strcmp0(method_name, "getsize") == 0)
ret = __handle_request_getsize(uid, invocation, parameters);
else if (g_strcmp0(method_name, "getsize_sync") == 0)