Set real appid before checking app status 05/266605/2
authorHwankyu Jhun <h.jhun@samsung.com>
Tue, 16 Nov 2021 06:39:09 +0000 (15:39 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Tue, 16 Nov 2021 23:29:50 +0000 (08:29 +0900)
To check the app status properly, AMD has to check whether the
application ID is the alias ID or not. Some caller processes want to
send the launch request with the alias app ID to the running application.

Change-Id: I31781c7a0c8d2aedbc1d528e9b31a0b44faba0e3
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/lib/amd_app_control.cc
src/lib/amd_app_property.c
src/lib/amd_app_property.h
src/lib/amd_appinfo.c
src/lib/amd_appinfo.h
src/lib/amd_launch.c
src/lib/amd_request.c
src/modules/rpc-port/amd_rpc_port.cc

index cb475407f1e6c13e75e979fad67608e1a59a1865..cf41d64df5b80aef200e56ffa748c7b03572661f 100644 (file)
@@ -76,7 +76,7 @@ int _app_control_resolve(uid_t uid, bundle* b) {
   std::string app_id = kb.GetString(AUL_K_APPID);
   if (app_id != "@UNKNOWN") {
     __verify_request(kb);
-    return 0;
+    return -1;
   }
 
   kb.Delete(AUL_K_APPID);
index 957913463b83c4f2475fe26e2b3257c41d04ec4d..6d79c0d9fd00800a6ba25bde2fc4f98a88cbc7d6 100644 (file)
@@ -834,6 +834,37 @@ int _app_property_metadata_remove_filter(const char *key, const char *value)
        return 0;
 }
 
+int _app_property_set_real_appid(uid_t uid, bundle *b)
+{
+       const char *alias_appid;
+       const char *appid;
+       const char *alias_info;
+       app_property_h app_property;
+
+       alias_appid = bundle_get_val(b, AUL_K_APPID);
+       if (!alias_appid)
+               return -1;
+
+       alias_info = bundle_get_val(b, AUL_SVC_K_ALIAS_INFO);
+       if (alias_info && !strcmp(alias_info, "disable"))
+               return -1;
+
+       app_property = _app_property_find(uid);
+       if (!app_property)
+               return -1;
+
+       appid = _app_property_get_real_appid(app_property, alias_appid);
+       if (!appid)
+               return -1;
+
+       _W("alias_appid(%s), appid(%s)", alias_appid, appid);
+       bundle_del(b, AUL_K_ORG_APPID);
+       bundle_add(b, AUL_K_ORG_APPID, alias_appid);
+       bundle_del(b, AUL_K_APPID);
+       bundle_add(b, AUL_K_APPID, appid);
+       return 0;
+}
+
 static int __dispatch_app_set_alias_appid(request_h req)
 {
        int ret;
index a10108da51c0cd4dfdf283083f335c54260aafd3..97a1f6af6dd25c70b508ffaffe64a2c37e341aa3 100644 (file)
@@ -18,8 +18,9 @@
 #define __AMD_APP_PROPERTY_H__
 
 #include <stdbool.h>
-#include <unistd.h>
 #include <sys/types.h>
+#include <unistd.h>
+#include <bundle.h>
 #include <glib.h>
 #include <pkgmgr-info.h>
 
@@ -88,6 +89,8 @@ int _app_property_metadata_add_filter(const char *key, const char *value);
 
 int _app_property_metadata_remove_filter(const char *key, const char *value);
 
+int _app_property_set_real_appid(uid_t uid, bundle *b);
+
 #ifdef __cplusplus
 }
 #endif
index 38fa250093e679456f87a2bb1e47fe16e1f06749..4c6f94cc2d9c7d04e89dab20c0dc5071d7e97de6 100644 (file)
 #include <string.h>
 #include <errno.h>
 #include <ctype.h>
-#include <glib.h>
 #include <dirent.h>
+#include <aul.h>
+#include <aul_sock.h>
+#include <bundle_internal.h>
+#include <cert-svc/ccert.h>
+#include <cert-svc/cinstance.h>
+#include <glib.h>
 #include <package-manager.h>
 #include <pkgmgr-info.h>
 #include <request_handler_direct_access.h>
 #include <vconf.h>
-#include <aul_sock.h>
-#include <aul.h>
-#include <cert-svc/ccert.h>
-#include <cert-svc/cinstance.h>
 
 #include "amd_api_noti.h"
-#include "amd_util.h"
+#include "amd_app_property.h"
+#include "amd_app_status.h"
 #include "amd_appinfo.h"
 #include "amd_launch.h"
-#include "amd_app_status.h"
-#include "amd_signal.h"
-#include "amd_app_property.h"
-#include "amd_suspend.h"
 #include "amd_login_monitor.h"
 #include "amd_noti.h"
+#include "amd_signal.h"
+#include "amd_suspend.h"
+#include "amd_util.h"
+#include "aul_svc_priv_key.h"
 
 #define CATEGORY_IME "http://tizen.org/category/ime"
 
@@ -2415,3 +2417,41 @@ bool _appinfo_is_platform_app(const char *appid, uid_t uid)
 
        return false;
 }
+
+void _appinfo_set_effective_appid(uid_t uid, bundle *b)
+{
+       const struct appinfo *ai;
+       const struct appinfo *effective_ai;
+       const char *appid;
+       const char *effective_appid;
+       const char *pkgid;
+       const char *effective_pkgid;
+
+       appid = bundle_get_val(b, AUL_K_APPID);
+       if (!appid)
+               return;
+
+       ai = _appinfo_find(uid, appid);
+       if (!ai)
+               return;
+
+       bundle_del(b, AUL_SVC_K_PKG_NAME);
+       bundle_add(b, AUL_SVC_K_PKG_NAME, appid);
+
+       effective_appid = _appinfo_get_value(ai, AIT_EFFECTIVE_APPID);
+       if (!effective_appid)
+               return;
+
+       effective_ai = _appinfo_find(uid, effective_appid);
+       if (!effective_ai)
+               return;
+
+       pkgid = _appinfo_get_value(ai, AIT_PKGID);
+       effective_pkgid = _appinfo_get_value(effective_ai, AIT_PKGID);
+       if (pkgid && effective_pkgid && !strcmp(pkgid, effective_pkgid)) {
+               _W("Use effective appid(%s) instead of real appid(%s)",
+                               effective_appid, appid);
+               bundle_del(b, AUL_K_APPID);
+               bundle_add(b, AUL_K_APPID, effective_appid);
+       }
+}
index 6419adcbe3e6b42db2269d27eedb63f4e9df60c4..2a5c3fa7ab3848450a9fd6543c780db7430311a9 100644 (file)
 #ifndef __AMD_APPINFO_H__
 #define __AMD_APPINFO_H__
 
+#include <stdbool.h>
 #include <sys/types.h>
+#include <bundle.h>
 #include <glib.h>
-#include <stdbool.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -145,6 +146,8 @@ int _appinfo_get_cert_visibility(const char *pkgid, uid_t uid);
 
 bool _appinfo_is_platform_app(const char *appid, uid_t uid);
 
+void _appinfo_set_effective_appid(uid_t uid, bundle* b);
+
 #ifdef __cplusplus
 }
 #endif
index b6e94d82414a8845dc29621265db7612000c0caf..c0cf57abcb83f49dc30384b63fc80c0d543a09e8 100644 (file)
@@ -46,7 +46,6 @@
 #include "amd_anr_monitor.h"
 #include "amd_api_app_request_broker.h"
 #include "amd_app_com.h"
-#include "amd_app_control.h"
 #include "amd_app_property.h"
 #include "amd_app_status.h"
 #include "amd_appinfo.h"
@@ -1224,74 +1223,6 @@ static int __listen_poweroff_state_signal(void *data)
        return 0;
 }
 
-static void __set_effective_appid(uid_t uid, bundle *kb)
-{
-       const struct appinfo *ai;
-       const struct appinfo *effective_ai;
-       const char *appid;
-       const char *effective_appid;
-       const char *pkgid;
-       const char *effective_pkgid;
-
-       appid = bundle_get_val(kb, AUL_K_APPID);
-       if (appid == NULL)
-               return;
-
-       ai = _appinfo_find(uid, appid);
-       if (ai == NULL)
-               return;
-
-       bundle_del(kb, AUL_SVC_K_PKG_NAME);
-       bundle_add(kb, AUL_SVC_K_PKG_NAME, appid);
-
-       effective_appid = _appinfo_get_value(ai, AIT_EFFECTIVE_APPID);
-       if (effective_appid == NULL)
-               return;
-
-       effective_ai = _appinfo_find(uid, effective_appid);
-       if (effective_ai == NULL)
-               return;
-
-       pkgid = _appinfo_get_value(ai, AIT_PKGID);
-       effective_pkgid = _appinfo_get_value(effective_ai, AIT_PKGID);
-       if (pkgid && effective_pkgid && strcmp(pkgid, effective_pkgid) == 0) {
-               _D("use effective appid instead of the real appid");
-               bundle_del(kb, AUL_K_APPID);
-               bundle_add(kb, AUL_K_APPID, effective_appid);
-       }
-}
-
-static int __set_real_appid(uid_t uid, bundle *kb)
-{
-       const char *alias_appid;
-       const char *appid;
-       const char *alias_info;
-       app_property_h app_property;
-
-       alias_appid = bundle_get_val(kb, AUL_K_APPID);
-       if (alias_appid == NULL)
-               return -1;
-
-       alias_info = bundle_get_val(kb, AUL_SVC_K_ALIAS_INFO);
-       if (alias_info && strcmp(alias_info, "disable") == 0)
-               return -1;
-
-       app_property = _app_property_find(uid);
-       if (app_property == NULL)
-               return -1;
-
-       appid = _app_property_get_real_appid(app_property, alias_appid);
-       if (appid == NULL)
-               return -1;
-
-       _D("alias_appid(%s), appid(%s)", alias_appid, appid);
-       bundle_del(kb, AUL_K_ORG_APPID);
-       bundle_add(kb, AUL_K_ORG_APPID, alias_appid);
-       bundle_del(kb, AUL_K_APPID);
-       bundle_add(kb, AUL_K_APPID, appid);
-       return 0;
-}
-
 static void __check_new_instance(bundle *kb, bool *new_instance)
 {
        const char *str;
@@ -1349,13 +1280,6 @@ static int __dispatch_app_start(request_h req)
        if (kb == NULL)
                return -1;
 
-       _app_control_resolve(_request_get_target_uid(req), kb);
-       ret = __set_real_appid(_request_get_target_uid(req), kb);
-       if (ret == 0 && _request_get_cmd(req) == APP_RESUME)
-               bundle_del(kb, AUL_K_INSTANCE_ID);
-
-       __set_effective_appid(_request_get_target_uid(req), kb);
-
        bundle_del(kb, AUL_K_NEW_INSTANCE);
        _noti_send(AMD_NOTI_MSG_LAUNCH_APP_START_START, 0, 0, req, kb);
        __check_new_instance(kb, &new_instance);
index 7640c69194095649fbe226c7edd6df042d2f98ee..6d93e71e2706ea786f172b44bcb1d39a110c5207 100644 (file)
 #include <aul_app_com.h>
 
 #include "amd_api_noti.h"
-#include "amd_config.h"
-#include "amd_util.h"
-#include "amd_request.h"
+#include "amd_app_control.h"
+#include "amd_app_property.h"
 #include "amd_app_status.h"
+#include "amd_config.h"
 #include "amd_cynara.h"
-#include "amd_socket.h"
-#include "aul_svc_priv_key.h"
-#include "amd_signal.h"
 #include "amd_login_monitor.h"
 #include "amd_noti.h"
+#include "amd_request.h"
+#include "amd_signal.h"
+#include "amd_socket.h"
+#include "amd_util.h"
+#include "aul_svc_priv_key.h"
 
 #define PENDING_REQUEST_TIMEOUT 5000 /* msec */
 #define SYSTEM_REQUEST_TIMEOUT 90000 /* msec */
@@ -461,6 +463,24 @@ static app_status_h __get_app_status(request_h req, const char *appid)
        return app_status;
 }
 
+static bool __can_be_implicit_launch(int cmd)
+{
+       switch (cmd) {
+       case APP_START:
+       case APP_START_ASYNC:
+       case APP_START_RES_ASYNC:
+       case APP_START_RES:
+       case APP_OPEN:
+       case APP_RESUME:
+       case APP_SEND_LAUNCH_REQUEST:
+       case APP_SEND_LAUNCH_REQUEST_SYNC:
+       case APP_SEND_RESUME_REQUEST:
+               return true;
+       default:
+               return false;
+       }
+}
+
 static int __check_request(request_h req)
 {
        int pid;
@@ -477,10 +497,19 @@ static int __check_request(request_h req)
        if (req->kb == NULL)
                return -1;
 
-       appid = bundle_get_val(req->kb, AUL_K_APPID);
-       if (appid == NULL)
+       if (bundle_get_val(req->kb, AUL_K_APPID) == NULL)
                return -1;
 
+       if (__can_be_implicit_launch(req->cmd))
+               _app_control_resolve(req->t_uid, req->kb);
+
+       if (_app_property_set_real_appid(req->t_uid, req->kb) == 0 &&
+                       req->cmd == APP_RESUME)
+               bundle_del(req->kb, AUL_K_INSTANCE_ID);
+
+       _appinfo_set_effective_appid(req->t_uid, req->kb);
+
+       appid = bundle_get_val(req->kb, AUL_K_APPID);
        app_status = __get_app_status(req, appid);
        if (app_status == NULL)
                return 0;
index 42c7cd131683ca2d0a3b5b1eecab54b6e8c01494..54edac3bda39ec0d9aa2688691e8782b16ba4b6b 100644 (file)
@@ -142,31 +142,6 @@ void RpcRemove(int pid) {
   pid_map.erase(found);
 }
 
-void SetRealAppId(uid_t uid, tizen_base::Bundle& b) {
-  std::string alias_appid = b.GetString(AUL_K_APPID);
-  if (alias_appid.empty())
-    return;
-
-  std::string alias_info = b.GetString(AUL_SVC_K_ALIAS_INFO);
-  if (alias_info == "disable")
-    return;
-
-  amd_app_property_h app_property = amd_app_property_find(uid);
-  if (app_property == nullptr)
-    return;
-
-  const char* appid = amd_app_property_get_real_appid(app_property,
-      alias_appid.c_str());
-  if (appid == nullptr)
-    return;
-
-  _D("alias_appid(%s), appid(%s)", alias_appid.c_str(), appid);
-  b.Delete(AUL_K_ORG_APPID);
-  b.Add(AUL_K_ORG_APPID, alias_appid);
-  b.Delete(AUL_K_APPID);
-  b.Add(AUL_K_APPID, appid);
-}
-
 int PassFds(int fd, const int (*fds)[2], int fds_num) {
 #define MAX_NR_OF_DESCRIPTORS 2
   union {
@@ -222,7 +197,6 @@ static int DispatchRpcPortPrepareStub(amd_request_h req) {
 
   tizen_base::Bundle b(kb, false, false);
   uid_t target_uid = amd_request_get_target_uid(req);
-  SetRealAppId(target_uid, b);
   std::string app_id = b.GetString(AUL_K_APPID);
   if (app_id.empty()) {
     _E("Failed to get appid");