类
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以来
实例方法
从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)继承的方法
信号
继承自 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
无描述。