From: seolheui, kim Date: Tue, 11 Sep 2018 10:09:15 +0000 (+0900) Subject: Fix to stop user session X-Git-Tag: accepted/tizen/4.0/unified/20180914.132325~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F91%2F188891%2F6;p=platform%2Fcore%2Fsecurity%2Fode.git Fix to stop user session Change-Id: I3ac1317b762978372ce7857a8aa45df83f49d4fc Signed-off-by: seolheui, kim --- diff --git a/server/internal-encryption.cpp b/server/internal-encryption.cpp index e17a2e0..d29d876 100644 --- a/server/internal-encryption.cpp +++ b/server/internal-encryption.cpp @@ -167,9 +167,65 @@ std::string getDecodedPath(const std::string &path, const std::string &prefix) void stopSystemdUnits() { dbus::Connection& systemDBus = dbus::Connection::getSystem(); - std::set preprocessUnits; + dbus::VariantIterator iter; + std::vector preprocessUnits; std::set unitsToStop; + auto stopUnit = [&systemDBus](const std::string &unit) { + JobWatch watch(systemDBus); + INFO(SINK, "Stopping unit: " + unit); + const char* job = NULL; + try { + systemDBus.methodcall("org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "StopUnit", + -1, "(o)", "(ss)", unit.c_str(), "flush").get("(o)", &job); + INFO(SINK, "Waiting for job: " + std::string(job)); + if (!watch.waitForJob(job)) + ERROR(SINK, "Stopping unit: " + unit + " failed"); + } catch (runtime::Exception &e) { + ERROR(SINK, std::string(e.what())); + } + }; + + try { + systemDBus.methodcall("org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ListUnits", + -1, "(a(ssssssouso))", "").get("(a(ssssssouso))", &iter); + } catch (runtime::Exception &e) { + INFO(SINK, "Get list of systemd unit : " + std::string(e.what())); + } + + while (1) { + unsigned int dataUnit; + char *dataStr[9]; + int ret; + ret = iter.get("(ssssssouso)", dataStr, dataStr + 1, dataStr + 2, + dataStr + 3, dataStr + 4, dataStr + 5, + dataStr + 6, &dataUnit, dataStr + 7, dataStr + 8); + if (!ret) + break; + + std::string unitName(dataStr[0]); + if (unitName == "security-manager.socket" || + unitName == "connman.socket" || + unitName == "msg-server.socket") { + preprocessUnits.insert(preprocessUnits.begin(), unitName); + } else if (unitName.compare(0, 5, "user@") == 0 || + unitName == "tlm.service" || + unitName == "resourced.service" || + unitName == "security-manager.service") { + preprocessUnits.push_back(unitName); + } + } + + for (auto unit : preprocessUnits) { + stopUnit(unit); + } + for (pid_t pid : runtime::FileUser::getList(INTERNAL_PATH, true)) { try { char *unit = nullptr; @@ -181,36 +237,14 @@ void stopSystemdUnits() .get("(o)", &unit); auto unescapedName = getDecodedPath(unit, "/org/freedesktop/systemd1/unit/"); - if (unescapedName.compare(0, 5, "user@") == 0) - preprocessUnits.insert(unescapedName); - else - unitsToStop.insert(unescapedName); + unitsToStop.insert(unescapedName); } catch (runtime::Exception &e) { INFO(SINK, "Killing process: " + std::to_string(pid)); ::kill(pid, SIGKILL); } } - JobWatch watch(systemDBus); - - auto stopUnit = [&watch, &systemDBus](const std::string &unit) { - INFO(SINK, "Stopping unit: " + unit); - const char* job = NULL; - systemDBus.methodcall("org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "StopUnit", - -1, "(o)", "(ss)", unit.c_str(), "flush").get("(o)", &job); - INFO(SINK, "Waiting for job: " + std::string(job)); - if (!watch.waitForJob(job)) - ERROR(SINK, "Stopping unit: " + unit + " failed"); - }; - - for (const std::string &unit : preprocessUnits) { - stopUnit(unit); - } - - for (const std::string &unit : unitsToStop) { + for (auto unit : unitsToStop) { stopUnit(unit); } }