Handle request from admin user as global request 92/96492/23
authorSangyoon Jang <s89.jang@samsung.com>
Wed, 9 Nov 2016 07:07:21 +0000 (16:07 +0900)
committerjongmyeong ko <jongmyeong.ko@samsung.com>
Wed, 14 Dec 2016 04:03:00 +0000 (20:03 -0800)
Change-Id: I1de150ffc7bc13cd3615e77a168c5c0493a26d39
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
packaging/app-installers.spec
src/common/step/configuration/step_configure.cc
src/common/utils/user_util.cc
src/common/utils/user_util.h

index 352aa419eaa77bfcd6d880999db8f558b07ef529..cd8d961043bc63f00665945234b8e34b1404aed5 100644 (file)
@@ -67,9 +67,15 @@ cp %{SOURCE1000} .
 cp %{SOURCE1001} .
 
 %build
+%if %{profile} == "tv"
+  ADMIN_USER_GLOBAL_INSTALLATION_ONLY=OFF
+%else
+  ADMIN_USER_GLOBAL_INSTALLATION_ONLY=ON
+%endif
 %cmake . -DCMAKE_BUILD_TYPE=%{?build_type:%build_type} \
          -DTIZEN_FULL_VERSION=%{tizen_full_version} \
-        -DUNITDIR=%{_unitdir}
+        -DUNITDIR=%{_unitdir} \
+        -DADMIN_USER_GLOBAL_INSTALLATION_ONLY:BOOL=${ADMIN_USER_GLOBAL_INSTALLATION_ONLY}
 make %{?_smp_mflags}
 
 %install
index 331c6f5cf1eb1eea5e03d2a6bb0f26e6d76eb21b..2ae2c79a770dd65095a3c2d879dc10cbc7eaf225 100644 (file)
@@ -27,6 +27,7 @@ namespace configuration {
 
 const char kStrEmpty[] = "";
 const char kAppFWUser[] = "app_fw";
+const uid_t kGlobalUserUid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
 
 StepConfigure::StepConfigure(InstallerContext* context, PkgMgrPtr pkgmgr)
     : Step(context),
@@ -183,7 +184,8 @@ Step::Status StepConfigure::precheck() {
     return Status::ERROR;
   }
 
-  context_->uid.set(pkgmgr_->GetUid());
+  uid_t uid = pkgmgr_->GetUid();
+  context_->uid.set(uid);
   if (getuid() == 0)
     return Status::OK;
 
@@ -196,6 +198,12 @@ Step::Status StepConfigure::precheck() {
     return Status::OPERATION_NOT_ALLOWED;
   }
 
+#ifdef ADMIN_USER_GLOBAL_INSTALLATION_ONLY
+  // Set target uid as tizenglobalapp if admin user's request
+  if (IsAdminUser(uid))
+    context_->uid.set(kGlobalUserUid);
+#endif
+
   return Status::OK;
 }
 
index d72f290a33094cc9f1fc81b9880efb4b203368f5..90c7f16b28d5acd82bf4159f2e3dfa8f2dd201b5 100644 (file)
@@ -83,6 +83,31 @@ UserList GetUserList() {
   return list;
 }
 
+bool IsAdminUser(uid_t uid) {
+  GumUser* guser;
+  int count = 0;
+  do {
+    guser = gum_user_get_sync(uid, (getuid() == 0) ? TRUE : FALSE);
+    if (guser)
+      break;
+    count++;
+    LOG(WARNING) << "Failed to get gum user! ("
+                 << count << "/" << kRetryMax << ")";
+    usleep(kRetryDelay);
+  } while (count < kRetryMax);
+  if (!guser)
+    return false;
+  GumUserType ut;
+  g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
+  bool is_admin;
+  if (ut == GUM_USERTYPE_ADMIN)
+    is_admin = true;
+  else
+    is_admin = false;
+  g_object_unref(guser);
+  return is_admin;
+}
+
 boost::optional<gid_t> GetGidByGroupName(const char* groupname) {
   boost::optional<gid_t> result;
   char buf[kGRBufSize];
index b50570d31f27b9a977ceb251bdbc7cc6d6f925c8..bae9392ecc6a92748b875c37b7a8445c89026211 100644 (file)
@@ -21,6 +21,7 @@ namespace common_installer {
 typedef std::vector<std::tuple<uid_t, gid_t, bf::path>> UserList;
 
 UserList GetUserList();
+bool IsAdminUser(uid_t uid);
 boost::optional<gid_t> GetGidByUid(uid_t uid);
 std::string GetGroupNameByGid(gid_t gid);
 std::string GetUsernameByUid(uid_t user);