Add showing log only when process termination is failed
[platform/core/security/ode.git] / server / internal-encryption.cpp
index 192c275..ae410c5 100644 (file)
@@ -21,6 +21,7 @@
 #include <unistd.h>
 #include <sys/mount.h>
 #include <sys/reboot.h>
+#include <sys/inotify.h>
 
 #include <vconf.h>
 #include <tzplatform_config.h>
@@ -64,107 +65,35 @@ namespace {
 std::unique_ptr<INTERNAL_ENGINE> engine;
 KeyManager::data mountKey;
 
-void stopSystemdUserSessions() {
-       std::vector<std::string> userSessionServices;
-       dbus::Connection& systemDBus = dbus::Connection::getSystem();
-       dbus::VariantIterator iter;
-
-       systemDBus.methodcall("org.freedesktop.systemd1",
-                                                       "/org/freedesktop/systemd1",
-                                                       "org.freedesktop.systemd1.Manager",
-                                                       "ListUnits",
-                                                       -1, "(a(ssssssouso))", "")
-                                                               .get("(a(ssssssouso))", &iter);
-
-       while (1) {
-               unsigned int dataUint;
-               char *dataStr[9];
-               int ret;
-
-               ret = iter.get("(ssssssouso)", dataStr, dataStr + 1, dataStr + 2,
-                                               dataStr + 3, dataStr + 4, dataStr + 5,
-                                               dataStr + 6, &dataUint, dataStr + 7,
-                                               dataStr + 8);
-
-               if (!ret) {
-                       break;
-               }
-
-               std::string service(dataStr[0]);
-               if (service.compare(0, 5, "user@") == 0) {
-                       userSessionServices.push_back(service);
-               }
-       }
-
-       for (const std::string& service : userSessionServices) {
-               INFO(SINK, "Stop service - " + service);
-               systemDBus.methodcall("org.freedesktop.systemd1",
-                                                               "/org/freedesktop/systemd1",
-                                                               "org.freedesktop.systemd1.Manager",
-                                                               "StopUnit",
-                                                               -1, "", "(ss)", service.c_str(), "flush");
-       }
+void stopDependedSystemdServices()
+{
+       runtime::File fileToTouch("/tmp/.ode-umount-internal");
+       try {
+               fileToTouch.remove();
+       } catch(runtime::Exception &e) {}
+       fileToTouch.create(O_WRONLY);
 
        sleep(1);
 }
 
-void stopDependedSystemdServices()
+void killDependedProcesses()
 {
-       dbus::Connection& systemDBus = dbus::Connection::getSystem();
-       std::set<std::string> servicesToStop;
-
-       for (pid_t pid : runtime::FileUser::getList(INTERNAL_PATH, true)) {
-               try {
-                       char *service;
-                       systemDBus.methodcall("org.freedesktop.systemd1",
-                                                                       "/org/freedesktop/systemd1",
-                                                                       "org.freedesktop.systemd1.Manager",
-                                                                       "GetUnitByPID",
-                                                                       -1, "(o)", "(u)", (unsigned int)pid)
-                                                                               .get("(o)", &service);
-                       servicesToStop.insert(service);
-               } catch (runtime::Exception &e) {
-                       INFO(SINK, "Close process - " + std::to_string(pid));
-                       ::kill(pid, SIGKILL);
+       INFO(SINK, "killDependedProcesses");
+    for (pid_t pid : runtime::FileUser::getList(INTERNAL_PATH, true)) {
+        INFO(SINK, "Close process - " + std::to_string(pid));
+               int ret = ::kill(pid, SIGKILL);
+               if (ret != 0) {
+                       ERROR(SINK, "Failed to kill process " + std::to_string(pid));
                }
-       }
-
-       for (const std::string& service : servicesToStop) {
-               INFO(SINK, "Close service - " + service);
-               systemDBus.methodcall("org.freedesktop.systemd1",
-                                                               service,
-                                                               "org.freedesktop.systemd1.Unit",
-                                                               "Stop",
-                                                               -1, "", "(s)", "flush");
-       }
+    }
 }
 
 void showProgressUI(const std::string type) {
-       ::tzplatform_set_user(::tzplatform_getuid(TZ_SYS_DEFAULT_USER));
-       std::string defaultUserHome(::tzplatform_getenv(TZ_USER_HOME));
-       ::tzplatform_reset_user();
-
+       runtime::File fileToTouch("/tmp/.ode-progress-internal@" + type);
        try {
-               runtime::File shareDirectory("/opt/home/root/share");
-               if (!shareDirectory.exists()) {
-                       shareDirectory.makeDirectory(true);
-               }
-
-               runtime::File elmConfigDir(shareDirectory.getPath() + "/.elementary");
-               if (!elmConfigDir.exists()) {
-                       runtime::File defaultElmConfigDir(defaultUserHome + "/share/.elementary");
-                       defaultElmConfigDir.copyTo(shareDirectory.getPath());
-               }
-       } catch (runtime::Exception &e) {
-               ERROR(SINK, "Failed to set up elm configuration");
-       }
-
-       std::vector<std::string> args = {
-               "ode", "progress", type, "Internal"
-       };
-
-       runtime::Process proc("/usr/bin/ode", args);
-       proc.execute();
+               fileToTouch.remove();
+       } catch(runtime::Exception &e) {}
+       fileToTouch.create(O_WRONLY);
 }
 
 unsigned int getOptions()
@@ -292,10 +221,9 @@ int InternalEncryption::umount()
                return 0;
        }
 
-       INFO(SINK, "Close all user sessions...");
-       stopSystemdUserSessions();
-       INFO(SINK, "Close all processes using internal storage...");
+       INFO(SINK, "Close all processes that use internal storage...");
        stopDependedSystemdServices();
+       killDependedProcesses();
        INFO(SINK, "Umount internal storage...");
        engine->umount();
 
@@ -318,16 +246,15 @@ int InternalEncryption::encrypt(const std::string& password, unsigned int option
        KeyManager::data MasterKey = keyManager.getMasterKey(pwData);
        auto encryptWorker = [MasterKey, options, this]() {
                try {
-                       INFO(SINK, "Close all user sessions...");
-                       stopSystemdUserSessions();
-                       INFO(SINK, "Close all processes using internal storage...");
+                       INFO(SINK, "Close all processes that use internal storage...");
                        stopDependedSystemdServices();
+                       killDependedProcesses();
                        INFO(SINK, "Umount internal storage...");
                        while (::umount(INTERNAL_PATH) == -1) {
                                if (errno != EBUSY) {
                                        throw runtime::Exception("Umount error - " + std::to_string(errno));
                                }
-                               stopDependedSystemdServices();
+                               killDependedProcesses();
                        }
 
                        showProgressUI("Encrypting");
@@ -370,17 +297,16 @@ int InternalEncryption::decrypt(const std::string& password)
        KeyManager::data MasterKey = keyManager.getMasterKey(pwData);
        auto decryptWorker = [MasterKey, this]() {
                try {
-                       INFO(SINK, "Close all user sessions...");
-                       stopSystemdUserSessions();
-                       INFO(SINK, "Close all processes using internal storage...");
+                       INFO(SINK, "Umount internal storage...");
                        stopDependedSystemdServices();
+                       killDependedProcesses();
                        INFO(SINK, "Umount internal storage...");
                        while (1) {
                                try {
                                        engine->umount();
                                        break;
                                } catch (runtime::Exception& e) {
-                                       stopDependedSystemdServices();
+                                       killDependedProcesses();
                                }
                        }