Implement new dbus method for create all external directories 83/80383/17
authorJunghyun Yeon <jungh.yeon@samsung.com>
Mon, 18 Jul 2016 01:15:01 +0000 (10:15 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Tue, 9 Aug 2016 04:27:50 +0000 (13:27 +0900)
Change-Id: I836cd0aaa72fc7e34ea650b55e7e279933fbc569
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/common/shared_dirs.cc
src/common/shared_dirs.h
src/pkgdir_tool/pkgdir_tool.cc

index c616948..e33b0f8 100644 (file)
@@ -67,6 +67,8 @@ const char kSharedDataDir[] = "shared/data";
 const char kSharedTrustedDir[] = "shared/trusted";
 const char kSkelAppDir[] = "/etc/skel/apps_rw";
 const char kLegacyAppDir[] = "/opt/usr/apps";
+const char kExternalStoragePrivilege[] =
+    "http://tizen.org/privilege/externalstorage.appdata";
 const int32_t kPWBufSize = sysconf(_SC_GETPW_R_SIZE_MAX);
 const int32_t kGRBufSize = sysconf(_SC_GETGR_R_SIZE_MAX);
 
@@ -315,6 +317,47 @@ bool PerformExternalDirectoryCreationForAllUsers(const std::string& pkgid) {
   return true;
 }
 
+int PrivilegeCallback(const pkgmgrinfo_pkginfo_h handle, void* user_data) {
+  uid_t uid = (uid_t)user_data;
+  char* pkgid = nullptr;
+
+  int ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
+  if (ret != PMINFO_R_OK)
+    return -1;
+  if (!PerformExternalDirectoryCreationForUser(uid, pkgid))
+    return -1;
+
+  return 0;
+}
+
+bool PerformExternalDirectoryCreationForAllPkgs(void) {
+  user_list list = GetUserList();
+  for (auto l  : list) {
+    uid_t uid = std::get<0>(l);
+    pkgmgrinfo_pkginfo_filter_h filter_handle = nullptr;
+    int ret = pkgmgrinfo_pkginfo_filter_create(&filter_handle);
+    if (ret != PMINFO_R_OK)
+      return false;
+    ret = pkgmgrinfo_pkginfo_filter_add_string(filter_handle,
+        PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE, kExternalStoragePrivilege);
+    if (ret != PMINFO_R_OK) {
+      pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
+      return false;
+    }
+
+    ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(filter_handle,
+        PrivilegeCallback, reinterpret_cast<void*>(uid));
+    if (ret != PMINFO_R_OK) {
+      LOG(DEBUG) << "Failed to create external directoy";
+      pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
+      return false;
+    }
+    pkgmgrinfo_pkginfo_filter_destroy(filter_handle);
+  }
+
+  return true;
+}
+
 bool PerformExternalDirectoryDeletionForAllUsers(const std::string& pkgid) {
   user_list list = GetUserList();
   for (auto l : list) {
index cf3679d..5181fdf 100644 (file)
@@ -47,6 +47,15 @@ bool PerformExternalDirectoryDeletionForUser(uid_t user,
 bool PerformExternalDirectoryCreationForAllUsers(const std::string& pkgid);
 
 /**
+ * \brief Find pkgs which has external storage privilege for each user and make
+ *  directories in external storage (eg. SD card)
+ *
+ * \return true if succeed, false otherwise
+ *
+ */
+bool PerformExternalDirectoryCreationForAllPkgs(void);
+
+/**
  * \brief Performs a removal of directories in external storage (eg. SD card)
  * \param pkgid id of package
  *
index d796742..38e1b51 100644 (file)
@@ -39,6 +39,7 @@ const char kDBusInstropectionXml[] =
   "    </method>"
   "    <method name='DeleteLegacyDirs'>"
   "      <arg type='s' name='pkgid' direction='in'/>"
+  "    <method name='CreateExternalDirsForAllPkgs'>"
   "      <arg type='b' name='result' direction='out'/>"
   "    </method>"
   "  </interface>"
@@ -176,28 +177,34 @@ void PkgdirToolService::HandleMethodCall(GDBusConnection* connection,
   UNUSED(interface_name);
   UNUSED(user_data);
   char* val;
-  g_variant_get(parameters, "(s)", &val);
-
   bool r = false;
-  LOG(INFO) << "Incomming method call: " << method_name;
 
+  LOG(INFO) << "Incomming method call: " << method_name;
   if (g_strcmp0(method_name, "CopyUserDirs") == 0) {
+    g_variant_get(parameters, "(&s)", &val);
     r = ci::CopyUserDirectories(std::string(val));
   } else if (g_strcmp0(method_name, "DeleteUserDirs") == 0) {
+    g_variant_get(parameters, "(&s)", &val);
     r = ci::DeleteUserDirectories(std::string(val));
   } else if (g_strcmp0(method_name, "CreateExternalDirs") == 0) {
+    g_variant_get(parameters, "(&s)", &val);
     r = ci::PerformExternalDirectoryCreationForAllUsers(std::string(val));
   } else if (g_strcmp0(method_name, "DeleteExternalDirs") == 0) {
+    g_variant_get(parameters, "(&s)", &val);
     r = ci::PerformExternalDirectoryDeletionForAllUsers(std::string(val));
   } else if (g_strcmp0(method_name, "CreateLegacyDirs") == 0) {
+    g_variant_get(parameters, "(&s)", &val);
     r = ci::CreateLegacyDirectories(std::string(val));
   } else if (g_strcmp0(method_name, "DeleteLegacyDirs") == 0) {
+    g_variant_get(parameters, "(&s)", &val);
     int sender_uid = GetSenderUnixId(connection, sender);
     if (sender_uid < 0) {
       LOG(ERROR) << "Failed to get sender_uid: " << sender_uid;
     } else {
       r = ci::DeleteLegacyDirectories((uid_t)sender_uid, std::string(val));
     }
+  } else if (g_strcmp0(method_name, "CreateExternalDirsForAllPkgs") == 0) {
+    r = ci::PerformExternalDirectoryCreationForAllPkgs();
   } else {
     LOG(ERROR) << "Unknown method call: " << method_name;
   }