Пример #1
0
static gboolean
handle_kill_sessions (CockpitAccount *object,
                      GDBusMethodInvocation *invocation)
{
  Account *acc = ACCOUNT (object);
  GError *error = NULL;

  if (!auth_check_sender_role (invocation, COCKPIT_ROLE_USER_ADMIN))
    return TRUE;

  if (acc->u)
    {
      gs_unref_object GDBusConnection *bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
                                                             NULL,
                                                             &error);
      if (bus == NULL)
        goto out;

      gs_unref_variant GVariant *result =
        g_dbus_connection_call_sync (bus,
                                     "org.freedesktop.login1",
                                     "/org/freedesktop/login1",
                                     "org.freedesktop.login1.Manager",
                                     "KillUser",
                                     g_variant_new ("(ui)",
                                                    act_user_get_uid (acc->u),
                                                    SIGTERM),
                                     NULL,
                                     0,
                                     -1,
                                     NULL,
                                     &error);
    }

out:
  if (error)
    {
      g_dbus_method_invocation_return_error (invocation,
                                             COCKPIT_ERROR, COCKPIT_ERROR_FAILED,
                                             "Failed to kill sessions: %s", error->message);
      g_error_free (error);
    }
  else
    cockpit_account_complete_kill_sessions (object, invocation);

  return TRUE;
}
Пример #2
0
static gboolean
handle_kill_sessions (CockpitAccount *object,
                      GDBusMethodInvocation *invocation)
{
    Account *acc = ACCOUNT (object);
    GError *error = NULL;

    if (!auth_check_sender_role (invocation, COCKPIT_ROLE_USER_ADMIN))
        return TRUE;

    if (acc->u)
    {
        gs_unref_object GDBusConnection *bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
                                               NULL,
                                               &error);
        if (bus == NULL)
            goto out;

        GVariant *result =
            g_dbus_connection_call_sync (bus,
                                         "org.freedesktop.login1",
                                         "/org/freedesktop/login1",
                                         "org.freedesktop.login1.Manager",
                                         "KillUser",
                                         g_variant_new ("(ui)",
                                                 act_user_get_uid (acc->u),
                                                 SIGTERM),
                                         NULL,
                                         0,
                                         -1,
                                         NULL,
                                         &error);

        if (!error)
        {
            g_variant_unref (result);
        }
        else
        {
            /* logind from systemd 208 is buggy, so we use systemd directly if it fails
               https://bugs.freedesktop.org/show_bug.cgi?id=71092
             */
            g_dbus_error_strip_remote_error (error);
            g_warning ("logind.KillUser failed (%s), trying systemd.KillUnit", error->message);
            g_clear_error (&error);
            gs_free gchar *unit = g_strdup_printf ("user-%d.slice", act_user_get_uid (acc->u));
            GVariant *result =
                g_dbus_connection_call_sync (bus,
                                             "org.freedesktop.systemd1",
                                             "/org/freedesktop/systemd1",
                                             "org.freedesktop.systemd1.Manager",
                                             "KillUnit",
                                             g_variant_new ("(ssi)",
                                                     unit,
                                                     "all",
                                                     SIGTERM),
                                             NULL,
                                             0,
                                             -1,
                                             NULL,
                                             &error);
            if (!error)
            {
                g_info ("systemd.KillUnit worked");
                g_variant_unref (result);
            }
        }
    }

out:
    if (error)
    {
        g_dbus_method_invocation_return_error (invocation,
                                               COCKPIT_ERROR, COCKPIT_ERROR_FAILED,
                                               "Failed to kill sessions: %s", error->message);
        g_error_free (error);
    }
    else
        cockpit_account_complete_kill_sessions (object, invocation);

    return TRUE;
}