Gio DebugControllerDBus

自2.72以来

描述 [源代码]

class Gio.DebugControllerDBus : GObject.Object
  implements Gio.DebugController, Gio.Initable {
  /* No available fields */
}

GDebugControllerDBus GDebugController 的实现,它将调试设置作为D-Bus对象公开。

它是一个 GInitable 对象,一旦初始化,就会在给定 GDebugControllerDBus:connection 的bus上注册一个对象到 /org/gtk/Debugging 。当最后一个对 GDebugControllerDBus 的引用被释放时,对象将被注销。

这个D-Bus对象可以被远程进程使用,以在不同的进程中启用或禁用调试输出。调用 org.gtk.Debugging.SetDebugEnabled() 的远程进程将影响 GDebugController:debug-enabled 的值,默认情况下,影响 g_log_get_debug_enabled()

默认情况下,不允许任何进程调用 SetDebugEnabled() ,除非安装了 GDebugControllerDBus::authorize 信号处理程序。这是因为进程可能是特权的,或者可能会在调试输出中暴露敏感信息。您可能希望将启用调试输出的能力限制为特权用户或进程。

一种选择是在 $datadir/dbus-1/system.d/ 中安装D-Bus安全策略,以限制对 SetDebugEnabled() 的访问,例如以下内容:

<?xml version="1.0"?> <!--*-nxml-*-->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
     "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy user="root">
    <allow send_destination="com.example.MyService" send_interface="org.gtk.Debugging"/>
  </policy>
  <policy context="default">
    <deny send_destination="com.example.MyService" send_interface="org.gtk.Debugging"/>
  </policy>
</busconfig>

这将防止除root以外的所有人调用 SetDebugEnabled() 方法。它不会阻止读取 DebugEnabled 属性,因为它通过 org.freedesktop.DBus.Properties 接口访问。

另一个选项是使用polkit根据具体情况允许或拒绝请求,从而允许动态授权。为此,连接到 GDebugControllerDBus::authorize 信号并在其中查询polkit。

  g_autoptr(GError) child_error = NULL;
  g_autoptr(GDBusConnection) connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
  gulong debug_controller_authorize_id = 0;

  // Set up the debug controller.
  debug_controller = G_DEBUG_CONTROLLER (g_debug_controller_dbus_new (priv->connection, NULL, &child_error));
  if (debug_controller == NULL)
    {
      g_error ("Could not register debug controller on bus: %s"),
               child_error->message);
    }

  debug_controller_authorize_id = g_signal_connect (debug_controller,
                                                    "authorize",
                                                    G_CALLBACK (debug_controller_authorize_cb),
                                                    self);

  static gboolean
  debug_controller_authorize_cb (GDebugControllerDBus  *debug_controller,
                                 GDBusMethodInvocation *invocation,
                                 gpointer               user_data)
  {
    g_autoptr(PolkitAuthority) authority = NULL;
    g_autoptr(PolkitSubject) subject = NULL;
    g_autoptr(PolkitAuthorizationResult) auth_result = NULL;
    g_autoptr(GError) local_error = NULL;
    GDBusMessage *message;
    GDBusMessageFlags message_flags;
    PolkitCheckAuthorizationFlags flags = POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE;

    message = g_dbus_method_invocation_get_message (invocation);
    message_flags = g_dbus_message_get_flags (message);

    authority = polkit_authority_get_sync (NULL, &local_error);
    if (authority == NULL)
      {
        g_warning ("Failed to get polkit authority: %s", local_error->message);
        return FALSE;
      }

    if (message_flags & G_DBUS_MESSAGE_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION)
      flags |= POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION;

    subject = polkit_system_bus_name_new (g_dbus_method_invocation_get_sender (invocation));

    auth_result = polkit_authority_check_authorization_sync (authority,
                                                             subject,
                                                             "com.example.MyService.set-debug-enabled",
                                                             NULL,
                                                             flags,
                                                             NULL,
                                                             &local_error);
    if (auth_result == NULL)
      {
        g_warning ("Failed to get check polkit authorization: %s", local_error->message);
        return FALSE;
      }

    return polkit_authorization_result_get_is_authorized (auth_result);
  }

自2.72以来

祖先

构造函数

g_debug_controller_dbus_new

创建一个新的 GDebugControllerDBus 并同步初始化。

自2.72以来

实例方法

g_debug_controller_dbus_stop

停止调试控制器,注销其对象。

自2.72以来

GObject(43)继承的方法

请查阅GObject以获取方法的完整列表。

GDebugController(2)继承的方法
g_debug_controller_get_debug_enabled

获取 GDebugController:debug-enabled 的值。

自2.72以来

g_debug_controller_set_debug_enabled

设置 GDebugController:debug-enabled 的值。

自2.72以来

GInitable(1)继承的方法
g_initable_init

初始化实现接口的对象。

自2.22以来

属性

Gio.DebugControllerDBus:connection

在其上公开调试接口的D-Bus连接。

自2.72以来

继承自 GDebugController 的属性(1)
GDebugController:debug-enabled

TRUE 表示应该公开调试输出(例如通过转发到日志),FALSE 否则。

自2.72以来

信号

Gio.DebugControllerDBus::authorize

当 D-Bus 对等方尝试更改调试设置时发出,用于确定是否有权限更改。

自2.72以来

继承自 GObject 的信号(1)
GObject::notify

当属性值通过 g_object_set_property(), g_object_set() 等设置时,该对象会发出 notify 信号。

类结构

struct GioDebugControllerDBusClass {
  GObjectClass parent_class;
  gboolean (* authorize) (
    GDebugControllerDBus* controller,
    GDBusMethodInvocation* invocation
  );
  None padding;
  
}

GDebugControllerDBus 的虚拟函数表。

类成员
parent_class: GObjectClass

父类。

authorize: gboolean (* authorize) ( GDebugControllerDBus* controller, GDBusMethodInvocation* invocation )

GDebugControllerDBus::authorize 信号的默认处理程序。

padding: None

无描述。

虚拟方法

Gio.DebugControllerDBusClass.authorize

GDebugControllerDBus::authorize 信号的默认处理程序。