Update source from tizen 2.3
[platform/core/base/rpm-installer.git] / frontend / src / rpm-cmdline.c
index 794fd15..c6da09a 100755 (executable)
 #include <getopt.h>
 #include <pthread.h>
 #include <stdio.h>
-#include <appcore-efl.h>
 #include <pkgmgr_installer.h>
 #include <security-server.h>
 #include "rpm-frontend.h"
 #include "rpm-installer-util.h"
 #include "rpm-installer.h"
-#include "rpm-homeview.h"
+#include "coretpk-installer.h"
 
 #define _FIX_POP_UP_
 extern struct appdata ad;
@@ -40,6 +39,8 @@ extern pkgmgr_installer *pi;
 ri_frontend_data front_data;
 char scrolllabel[256];
 int move_type;
+#define BUF_SIZE 1024
+#define OTP_USR_APPS "/opt/usr/apps"
 
 static void __ri_show_usage(char **arg);
 static int __ri_process_request(ri_frontend_cmdline_arg *fdata);
@@ -56,39 +57,68 @@ static void __ri_show_usage(char **arg)
                i++;
        }
 
-       _d_msg(DEBUG_INFO, "%s\n", buffer);
-       _d_msg(DEBUG_INFO,
+       _LOGD("%s\n", buffer);
+       _LOGD(
               "\nrpm-backend usage\n   rpm-backend -k <keyid>  <command> <pkgid | pkg_path> [-q] \n\n");
-       _d_msg(DEBUG_INFO, "<Commands> \n");
-       _d_msg(DEBUG_INFO,
+       _LOGD("<Commands> \n");
+       _LOGD(
               "\t -i <package file path>         : install package file \n");
-       _d_msg(DEBUG_INFO,
+       _LOGD(
               "\t -k <keyid>                   : key id file \n");
-       _d_msg(DEBUG_INFO,
+       _LOGD(
               "\t -r : (recover). Must ignore specific package name or path \n");
-       _d_msg(DEBUG_INFO,
+       _LOGD(
               "\t -d <package name>            : delete a package with package name \n");
-       _d_msg(DEBUG_INFO,
+       _LOGD(
               "\t -q : (quiet) run in background without any user interaction \n");
+       _LOGD(
+              "\t -s : (smack) apply smack rule and set smack label\n");
+}
+
+int _ri_parse_hybrid(int argc, char **argv)
+{
+       int i = 0;
+
+       if (argv[1] != NULL) {
+               if (!strcmp(argv[1], "-iv")) {
+                       _LOGE("Hybrid Installation start\n");
+
+                       for (i = 0; i < argc; i++) {
+                               const char* arg_str = argv[i];
+                               if (arg_str)
+                                       _LOGE("argv[%d] = [%s]\n", i, arg_str);
+                       }
+
+                       if (_coretpk_installer_request_hybrid(argv[1][1], argv[2], atoi(argv[4])) == 0) {
+                               return RPM_INSTALLER_SUCCESS;
+                       } else {
+                               return RPM_INSTALLER_ERR_INTERNAL;
+                       }
+               } else if (!strcmp(argv[1], "-uv")) {
+                       _LOGE("Hybrid Uninstallation start\n");
+                       return RPM_INSTALLER_SUCCESS;
+               }
+       }
+
+       return RPM_INSTALLER_ERR_WRONG_PARAM;
 }
 
 int _ri_parse_cmdline(int argc, char **argv, ri_frontend_cmdline_arg *data)
 {
        int req_cmd = INVALID_CMD;
        const char *pkgid = NULL;
-       int quiet = 0;
        const char *pkeyid = NULL;
        int ret = 0;
        int move_type = -1;
        pi = pkgmgr_installer_new();
        if (!pi) {
-               _d_msg(DEBUG_ERR,
+               _LOGE(
                       "Failure in creating the pkgmgr_installer object \n");
                return RPM_INSTALLER_ERR_WRONG_PARAM;
        }
        ret = pkgmgr_installer_receive_request(pi, argc, argv);
        if (ret) {
-               _d_msg(DEBUG_ERR, "pkgmgr_installer_receive_request failed \n");
+               _LOGE("pkgmgr_installer_receive_request failed \n");
                return RPM_INSTALLER_ERR_WRONG_PARAM;
        }
        ret = pkgmgr_installer_get_request_type(pi);
@@ -96,6 +126,9 @@ int _ri_parse_cmdline(int argc, char **argv, ri_frontend_cmdline_arg *data)
        case PKGMGR_REQ_INSTALL:
                req_cmd = INSTALL_CMD;
                break;
+       case PKGMGR_REQ_REINSTALL:
+               req_cmd = CORETPK_REINSTALL_CMD;
+               break;
        case PKGMGR_REQ_UNINSTALL:
                req_cmd = DELETE_CMD;
                break;
@@ -108,6 +141,9 @@ int _ri_parse_cmdline(int argc, char **argv, ri_frontend_cmdline_arg *data)
        case PKGMGR_REQ_MOVE:
                req_cmd = MOVE_CMD;
                break;
+       case PKGMGR_REQ_SMACK:
+               req_cmd = SMACK_CMD;
+               break;
        case PKGMGR_REQ_PERM:
                goto PARSEERROR;
        case PKGMGR_REQ_INVALID:
@@ -119,43 +155,54 @@ int _ri_parse_cmdline(int argc, char **argv, ri_frontend_cmdline_arg *data)
        if (req_cmd != RECOVER_CMD) {
                pkgid = pkgmgr_installer_get_request_info(pi);
                if (!pkgid) {
-                       _d_msg(DEBUG_ERR,
+                       _LOGE(
                               "pkgmgr_installer_get_request_info failed \n");
                        return RPM_INSTALLER_ERR_WRONG_PARAM;
                }
                pkeyid = pkgmgr_installer_get_session_id(pi);
                if (!pkeyid) {
-                       _d_msg(DEBUG_ERR, "pkgmgr_installer_get_session_id failed \n");
-                       return RPM_INSTALLER_ERR_WRONG_PARAM;
-               }
-
-               quiet = pkgmgr_installer_is_quiet(pi);
-               if (quiet != 0 && quiet != 1) {
-                       _d_msg(DEBUG_ERR, "pkgmgr_installer_is_quiet failed \n");
+                       _LOGE("pkgmgr_installer_get_session_id failed \n");
                        return RPM_INSTALLER_ERR_WRONG_PARAM;
                }
-
                move_type = pkgmgr_installer_get_move_type(pi);
        }
-       if ((req_cmd < INSTALL_CMD) ||(req_cmd > MOVE_CMD)) {
-               _d_msg(DEBUG_ERR, "invalid command \n");
+//Logically dead code,the value of req_cmd never satisfies the condition
+#if 0
+       if ((req_cmd < INSTALL_CMD) ||(req_cmd > RPM_CMD_MAX)) {
+               _LOGE("invalid command \n");
                goto PARSEERROR;
        }
-
+#endif
        data->req_cmd = req_cmd;
        data->pkgid = (char *)pkgid;
-       data->quiet = quiet;
        data->keyid = (char *)pkeyid;
        data->move_type = move_type;
+       data->clientid = (char *)pkgmgr_installer_get_caller_pkgid(pi);
+
        return RPM_INSTALLER_SUCCESS;
 
  PARSEERROR:
-       _d_msg(DEBUG_ERR, "Error in parsing input parameter\n");
+       _LOGE("Error in parsing input parameter\n");
        __ri_show_usage(argv);
        return RPM_INSTALLER_ERR_WRONG_PARAM;
 
 }
 
+static int __ri_is_core_tpk_app(char *pkgid)
+{
+       char pkgpath[BUF_SIZE] = {'\0'};
+
+       snprintf(pkgpath, BUF_SIZE, "%s/%s/tizen-manifest.xml", OTP_USR_APPS, pkgid);
+
+       if (access(pkgpath, R_OK) == 0) {
+               _LOGE("This is a core tpk app.");
+               return 0;
+       } else {
+               _LOGE("This is not a core tpk app.");
+               return -1;
+       }
+}
+
 static int __ri_process_request(ri_frontend_cmdline_arg *data)
 {
        int ret = 0;
@@ -165,44 +212,92 @@ static int __ri_process_request(ri_frontend_cmdline_arg *data)
        char *keyid = NULL;
        if (data->req_cmd != RECOVER_CMD) {
                pkgid = strdup(data->pkgid);
-                if (PM_UNLIKELY(pkgid == NULL)) {
-                        _d_msg(DEBUG_ERR, "strdup failed\n");
-                        return RPM_INSTALLER_ERR_WRONG_PARAM;
-                }
-                keyid = strdup(data->keyid);
-                if (PM_UNLIKELY(keyid == NULL)) {
-                        _d_msg(DEBUG_ERR, "strdup failed\n");
-                        free(pkgid);
-                        return RPM_INSTALLER_ERR_WRONG_PARAM;
-                }
+               if (PM_UNLIKELY(pkgid == NULL)) {
+                       _LOGE("strdup failed\n");
+                       return RPM_INSTALLER_ERR_WRONG_PARAM;
+               }
+               keyid = strdup(data->keyid);
+               if (PM_UNLIKELY(keyid == NULL)) {
+                       _LOGE("strdup failed\n");
+                       free(pkgid);
+                       pkgid = NULL;
+                       return RPM_INSTALLER_ERR_WRONG_PARAM;
+               }
+       }
+
+       if (pkgid == NULL) {
+               _LOGE("pkgid is null\n");
+               return -1;
        }
+
        switch (data->req_cmd) {
        case INSTALL_CMD:
-               _d_msg(DEBUG_INFO, "rpm-backend -i %s\n", pkgid);
-               ret = _rpm_backend_interface(keyid, pkgid, "install");
+               _LOGD("rpm-backend -i %s\n", pkgid);
+               ret = _rpm_backend_interface(keyid, pkgid, "install", data->clientid);
                break;
        case DELETE_CMD:
-               _d_msg(DEBUG_INFO, "rpm-backend -d %s\n", pkgid);
-               ret = _rpm_backend_interface(keyid, pkgid, "remove");
+               if (__ri_is_core_tpk_app(pkgid) == 0) {
+                       _LOGD("------------------------------------------------");
+                       _LOGD("uninstallation: tpk, pkgid=[%s]", pkgid);
+                       _LOGD("------------------------------------------------");
+                       ret = _coretpk_backend_interface("coretpk-uninstall", data);
+               } else {
+                       _LOGD("uninstallation for rpm [%s]", pkgid);
+                       ret = _rpm_backend_interface(keyid, pkgid, "remove", NULL);
+               }
                break;
        case CLEARDATA_CMD:
-               _d_msg(DEBUG_INFO, "rpm-backend -c %s\n", pkgid);
-               ret = _rpm_backend_interface(keyid, pkgid, "cleardata");
+               _LOGD("rpm-backend -c %s\n", pkgid);
+               ret = _rpm_backend_interface(keyid, pkgid, "cleardata", NULL);
                break;
        case MOVE_CMD:
-               _d_msg(DEBUG_INFO, "rpm-backend -m %s -t %d\n", pkgid, data->move_type);
-               move_type = data->move_type;
-               ret = _rpm_backend_interface(keyid, pkgid, "move");
+               if (__ri_is_core_tpk_app(pkgid) == 0) {
+                       _LOGD("coretpk-move %s\n", pkgid);
+                       ret = _coretpk_backend_interface("coretpk-move", data);
+               } else {
+                       _LOGD("rpm-backend -m %s -t %d\n", pkgid, data->move_type);
+                       move_type = data->move_type;
+                       ret = _rpm_backend_interface(keyid, pkgid, "move", NULL);
+               }
                break;
        case RECOVER_CMD:
-               _d_msg(DEBUG_INFO, "rpm-backend -r \n");
-               ret = _rpm_backend_interface(keyid, pkgid, "recover");
+               _LOGD("rpm-backend -r \n");
+               ret = _rpm_backend_interface(keyid, pkgid, "recover", NULL);
+               break;
+       case SMACK_CMD:
+               _LOGD("rpm-backend -s %s", pkgid);
+               ret = _rpm_backend_interface(keyid, pkgid, "smack", NULL);
+               break;
+       case EFLWGT_INSTALL_CMD:
+               _LOGD("eflwgt-install %s\n", pkgid);
+               ret = _rpm_backend_interface(keyid, pkgid, "eflwgt-install", data->clientid);
+               break;
+       case CORETPK_INSTALL_CMD:
+               _LOGD("------------------------------------------------");
+               _LOGD("installation: tpk, arg=[%s]", pkgid);
+               _LOGD("------------------------------------------------");
+               ret = _coretpk_backend_interface("coretpk-install", data);
+               break;
+       case CORETPK_REINSTALL_CMD:
+               _LOGD("coretpk-reinstall %s\n", pkgid);
+               ret = _coretpk_backend_interface("coretpk-reinstall", data);
+               break;
+       case CORETPK_DIRECTORY_INSTALL_CMD:
+               _LOGD("coretpk-directory_install %s\n", pkgid);
+               ret = _coretpk_backend_interface("coretpk-directory-install", data);
+               break;
+       case ENABLE_CMD:
+               _LOGD("rpm enable %s\n", pkgid);
+               ret = _rpm_backend_interface(keyid, pkgid, "rpm-enable", NULL);
+               break;
+       case DISABLE_CMD:
+               _LOGD("rpm disable %s\n", pkgid);
+               ret = _rpm_backend_interface(keyid, pkgid, "rpm-disable", NULL);
                break;
        default:
-               _d_msg(DEBUG_ERR,
-                      "Error Never Come Here as Error is already checked\n");
-
+               _LOGE("Error Never Come Here as Error is already checked\n");
        }
+
        if (keyid) {
                free(keyid);
                keyid = NULL;
@@ -219,22 +314,16 @@ void _ri_stat_cb(const char *pkgid, const char *key, const char *val)
 {
 
        if (NULL == pkgid || NULL == key || NULL == val) {
-               _d_msg(DEBUG_ERR, "Either pkgid/key/val is NULL\n");
+               _LOGE("Either pkgid/key/val is NULL\n");
                return;         /*TODO: handle error. */
        }
 
-       char *pkgid_modified = NULL;
+       char pkgid_modified[PATH_MAX] = {0};
        char delims[] = "/";
        char *result = NULL;
        char *pkgid_tmp = NULL;
        char *saveptr = NULL;
 
-       pkgid_modified = (char *)malloc(strlen(pkgid) + 1);
-       if (pkgid_modified == NULL) {
-               _d_msg(DEBUG_ERR, "pkgid_modified is NULL. Malloc failed\n");
-               return;
-       }
-       memset(pkgid_modified, '\0', strlen(pkgid) + 1);
        memcpy(pkgid_modified, pkgid, strlen(pkgid));
 
        result = strtok_r(pkgid_modified, delims, &saveptr);
@@ -254,21 +343,21 @@ void _ri_stat_cb(const char *pkgid, const char *key, const char *val)
                switch (front_data.args->req_cmd) {
                case INSTALL_CMD:
                        snprintf(requesttype, sizeof(requesttype),
-                               _("Installation"));
+                               "installation");
                        break;
                case DELETE_CMD:
-                       snprintf(requesttype, sizeof(requesttype), _("Deletion"));
+                       snprintf(requesttype, sizeof(requesttype), "deletion");
                        break;
                case CLEARDATA_CMD:
                        snprintf(requesttype, sizeof(requesttype),
-                                _("Clear Data"));
+                                "clear data");
                        break;
                case MOVE_CMD:
                        snprintf(requesttype, sizeof(requesttype),
-                                _("Move"));
+                                "move");
                        break;
                default:
-                       snprintf(requesttype, sizeof(requesttype), _("Recovery"));
+                       snprintf(requesttype, sizeof(requesttype), "recovery");
                        break;
                }
 
@@ -276,17 +365,17 @@ void _ri_stat_cb(const char *pkgid, const char *key, const char *val)
                        /* Error Happened */
                        snprintf(scrolllabel, sizeof(scrolllabel),
                                 "%s :: %s:: %s:: %s", requesttype, pkgid_tmp,
-                                dgettext("sys_string", "IDS_COM_POP_ERROR"),
+                                "error",
                                 front_data.error);
-                       _d_msg(DEBUG_ERR, "%s\n", scrolllabel);
+                       _LOGE("%s\n", scrolllabel);
                        ret_val = _ri_string_to_error_no(front_data.error);
-                       _d_msg(DEBUG_ERR, "%d\n", ret_val);
+                       _LOGE("%d\n", ret_val);
 
                } else {
                        snprintf(scrolllabel, sizeof(scrolllabel),
                                 " %s :: %s :: %s", requesttype, pkgid_tmp,
-                                dgettext("sys_string", "IDS_COM_POP_SUCCESS"));
-                       _d_msg(DEBUG_INFO, "%s\n", scrolllabel);
+                               "success");
+                       _LOGD("%s\n", scrolllabel);
                        ret_val = 0;
                }
        }
@@ -294,49 +383,15 @@ void _ri_stat_cb(const char *pkgid, const char *key, const char *val)
 
 int _ri_cmdline_process(ri_frontend_data *data)
 {
-       char *cookie = NULL;
-       int cookie_size = 0;
-       int cookie_ret = 0;
-
        int ret = 0;
        ri_frontend_cmdline_arg *fdata = data->args;
-
-       cookie_size = security_server_get_cookie_size();
-       /* If security server is down or some other
-          error occured, raise failure */
-       if (0 >= cookie_size) {
-               /* TODO: raise error */
-               _d_msg(DEBUG_ERR,
-                      "security_server_get_cookie_size: Security server down \n");
-       } else {
-               cookie = calloc(cookie_size, sizeof(char));
-               cookie_ret =
-                   security_server_request_cookie(cookie, cookie_size);
-               /* TODO: Check cookie_ret...
-                  (See security-server.h to check return code) */
-       }
-
-       if (cookie != NULL)
-               _d_msg(DEBUG_INFO, "Got Cookie with size = %d\n", cookie_size);
-
-       data->security_cookie = cookie;
-
+       /*rpm-installer is invoked by pkgmgr-server hence server should do cookie validation*/
        ret = __ri_process_request(fdata);
        if (ret != RPM_INSTALLER_SUCCESS) {
-               _d_msg(DEBUG_ERR, "__ri_process_request: Error\n");
-               goto RETURN;
+               _LOGE("__ri_process_request: Error\n");
+               return ret;
        }
-
        return RPM_INSTALLER_SUCCESS;
-
- RETURN:
-
-       if (data->security_cookie) {
-               free(data->security_cookie);
-               data->security_cookie = NULL;
-       }
-
-       return ret;
 }
 
 int _ri_cmdline_destroy(ri_frontend_data *data)
@@ -344,8 +399,10 @@ int _ri_cmdline_destroy(ri_frontend_data *data)
        if (data == NULL)
                return 0;
 
-       if (data->security_cookie)
+       if (data->security_cookie){
                free(data->security_cookie);
+               data->security_cookie = NULL;
+       }
 
        return 0;