User-aware when detect app on platform v 3.0 65/73465/2
authorKyungwook Tak <k.tak@samsung.com>
Wed, 8 Jun 2016 08:00:54 +0000 (17:00 +0900)
committerkyungwook tak <k.tak@samsung.com>
Thu, 9 Jun 2016 04:59:30 +0000 (21:59 -0700)
Change-Id: I95456b49727481578a29230ea0fa2da09bb5a1a3
Signed-off-by: Kyungwook Tak <k.tak@samsung.com>
src/framework/service/app-deleter.cpp
src/framework/service/app-deleter.h
src/framework/service/file-system.cpp

index fcaf6ea..99920c7 100644 (file)
 #include <memory>
 #include <cstring>
 
+#ifdef PLATFORM_VERSION_3
+#include <vector>
+#include <unistd.h>
+#include <sys/types.h>
+#include <pwd.h>
+#endif
+
 #include <package-manager.h>
 
 #include "common/audit/logger.h"
 #include "common/exception.h"
 
+namespace {
+
+#ifdef PLATFORM_VERSION_3
+uid_t getUid(const std::string &username)
+{
+       auto bufsize = ::sysconf(_SC_GETPW_R_SIZE_MAX);
+       bufsize = (bufsize == -1) ? 16384 : bufsize;
+
+       std::vector<char> buf(bufsize, 0);
+
+       struct passwd pwd;
+       struct passwd *result = nullptr;
+
+       auto ret = ::getpwnam_r(username.c_str(), &pwd, buf.data(), buf.size(), &result);
+
+       if (result == nullptr) {
+               if (ret == 0)
+                       ThrowExc(CSR_ERROR_SERVER, "Uid not found by username: " << username);
+               else
+                       ThrowExc(CSR_ERROR_SERVER, "Failed to getpwnam_r with errno: " << errno);
+       }
+
+       return pwd.pw_uid;
+}
+#endif
+
+} // namespace anonymous
+
 namespace Csr {
 
-void AppDeleter::remove(const std::string &pkgid)
+void AppDeleter::remove(const std::string &pkgid, const std::string &username)
 {
        if (pkgid.empty())
                ThrowExc(CSR_ERROR_SERVER, "pkgid shouldn't be empty in AppDeleter");
@@ -42,8 +77,20 @@ void AppDeleter::remove(const std::string &pkgid)
        if (!client)
                throw std::bad_alloc();
 
-       auto ret = pkgmgr_client_uninstall(client.get(), nullptr, pkgid.c_str(), PM_QUIET,
-                                                                          nullptr, nullptr);
+       int ret = PKGMGR_R_OK;
+#ifdef PLATFORM_VERSION_3
+       if (username.empty())
+               ret = ::pkgmgr_client_uninstall(client.get(), nullptr, pkgid.c_str(), PM_QUIET,
+                                                                               nullptr, nullptr);
+       else
+               ret = ::pkgmgr_client_usr_uninstall(client.get(), nullptr, pkgid.c_str(), PM_QUIET,
+                                                                                       nullptr, nullptr, ::getUid(username));
+#else
+       (void) username;
+       ret = ::pkgmgr_client_uninstall(client.get(), nullptr, pkgid.c_str(), PM_QUIET,
+                                                                       nullptr, nullptr);
+#endif
+
        if (ret < PKGMGR_R_OK)
                ThrowExc(CSR_ERROR_REMOVE_FAILED, "Failed to pkgmgr_client_uninstall for pkg: " <<
                                 pkgid << " ret: " << ret);
index 750855d..11d6ede 100644 (file)
@@ -28,7 +28,8 @@ namespace Csr {
 class AppDeleter {
 public:
        AppDeleter() = delete;
-       static void remove(const std::string &pkgid);
+
+       static void remove(const std::string &pkgid, const std::string &username);
 };
 
 } // namespace Csr
index 973ce54..0ec478e 100644 (file)
@@ -45,17 +45,18 @@ inline std::regex makeRegexpr(const char *str)
 }
 
 std::vector<std::regex> g_regexprs{
-       // Tizen 2.4 app directories
+#ifdef PLATFORM_VERSION_3
+       makeRegexpr("^(/opt/usr/apps/([^/]+))"),               // /opt/usr/apps/{pkgid}/
+       makeRegexpr("^(/home/([^/]+)/apps_rw/([^/]+))"),       // /home/{user}/apps_rw/{pkgid}/
+       makeRegexpr("^(/sdcard/app2sd/([^/]+)/([^/]+))"),      // /sdcard/app2sd/{user}/{pkgid}/
+       makeRegexpr("^(/sdcard/app2sd/([^/]+))"),              // /sdcard/app2sd/{pkgid}/
+       makeRegexpr("^(/sdcard/apps/([^/]+)/apps_rw/([^/]+))") // /sdcard/apps/{user}/apps_rw/{pkgid}/
+#else
        makeRegexpr("^(/usr/apps/([^/]+))"),                   // /usr/apps/{pkgid}/
        makeRegexpr("^(/opt/usr/apps/([^/]+))"),               // /opt/usr/apps/{pkgid}/
        makeRegexpr("^(/sdcard/apps/([^/]+))"),                // /sdcard/apps/{pkgid}/
        makeRegexpr("^(/sdcard/app2sd/([^/]+))"),              // /sdcard/app2sd/{pkgid}/
-       // Tizen 3.0 app directories
-       //makeRegexpr("^(/opt/usr/apps/([^/]+))"),               // /opt/usr/apps/{pkgid}/
-       //makeRegexpr("^(/home/([^/]+)/apps_rw/([^/]+))"),       // /home/{user}/apps_rw/{pkgid}/
-       //makeRegexpr("^(/sdcard/app2sd/([^/]+)/([^/]+))"),      // /sdcard/app2sd/{user}/{pkgid}/
-       //makeRegexpr("^(/sdcard/app2sd/([^/]+))"),              // /sdcard/app2sd/{pkgid}/
-       //makeRegexpr("^(/sdcard/apps/([^/]+)/apps_rw/([^/]+))") // /sdcard/apps/{user}/apps_rw/{pkgid}/
+#endif
 };
 
 bool hasPermToRemove(const std::string &filepath)
@@ -217,7 +218,7 @@ void File::remove() const
 {
        if (this->isInApp()) {
                DEBUG("remove app: " << this->m_appPkgId);
-               AppDeleter::remove(this->m_appPkgId);
+               AppDeleter::remove(this->m_appPkgId, this->m_appUser);
        } else {
                DEBUG("remove file: " << this->m_path);
                if (::remove(this->m_path.c_str()) != 0)