Prevent removing currently active user 83/275583/3
authorAdam Michalski <a.michalski2@partner.samsung.com>
Thu, 26 May 2022 13:29:00 +0000 (15:29 +0200)
committerAdam Michalski <a.michalski2@partner.samsung.com>
Fri, 27 May 2022 10:37:13 +0000 (12:37 +0200)
Change-Id: I718e9bb0e2d1be7b7e19d4c4ec295b335f0cf436

libsessiond/include/sessiond-internal.h
sessiond/src/main.cpp

index 832f425..470cf97 100644 (file)
@@ -35,6 +35,7 @@ static error_mapping_t error_mappings[] = {
        { "org.tizen.sessiond.Error.IOError",                 SUBSESSION_ERROR_IO_ERROR },
        { "org.tizen.sessiond.Error.SubsessionAlreadyExists", SUBSESSION_ERROR_ALREADY_EXISTS },
        { "org.tizen.sessiond.Error.SubsessionDoesNotExist",  SUBSESSION_ERROR_NOT_AVAILABLE },
+       { "org.tizen.sessiond.Error.UserIsActive",            SUBSESSION_ERROR_RESOURCE_BUSY },
 };
 
 #ifdef __cplusplus
index 07a76ea..1e659fc 100644 (file)
@@ -165,6 +165,15 @@ struct sessiond_context {
                if (check_parameters_invalid(invocation, session_uid, subsession_id))
                        return;
 
+               int current_subsession_id = INITIAL_SUB_SESSION_ID;
+               if (last_subsession_per_session.contains(session_uid))
+                       current_subsession_id = last_subsession_per_session.at(session_uid);
+               if (subsession_id == current_subsession_id) {
+                       g_dbus_method_invocation_return_dbus_error(invocation,
+                               sessiond_errors[SUBSESSION_ERROR_RESOURCE_BUSY].second.data(), "Cannot remove currently active user");
+                       return;
+               }
+
                GError *err = nullptr;
                if (!g_dbus_connection_emit_signal(connection, nullptr, bus_object.data(), bus_iface.data(), "RemoveUserStarted",
                                vals_to_g_variant(session_uid, subsession_id), &err))
@@ -506,6 +515,7 @@ struct sessiond_context {
                SUBSESSION_ERROR_IO_ERROR,
                SUBSESSION_ERROR_ALREADY_EXISTS,
                SUBSESSION_ERROR_DOES_NOT_EXIST,
+               SUBSESSION_ERROR_RESOURCE_BUSY,
        };
 
        constexpr static std::array sessiond_errors = {
@@ -513,6 +523,7 @@ struct sessiond_context {
                std::make_pair(SUBSESSION_ERROR_IO_ERROR,          "org.tizen.sessiond.Error.IOError"sv),
                std::make_pair(SUBSESSION_ERROR_ALREADY_EXISTS,    "org.tizen.sessiond.Error.SubsessionAlreadyExists"sv),
                std::make_pair(SUBSESSION_ERROR_DOES_NOT_EXIST,    "org.tizen.sessiond.Error.SubsessionDoesNotExist"sv),
+               std::make_pair(SUBSESSION_ERROR_RESOURCE_BUSY,     "org.tizen.sessiond.Error.UserIsActive"sv),
        };
 
        // TODO: Currently, the first parameter is always a single-element tuple.