mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-23 09:28:54 +02:00
Bug 623815 – Don't check sender for GDBusProxy objects where name is not set
Based on a patch from Peng Huang <shawn.p.huang@gmail.com>, thanks! https://bugzilla.gnome.org/show_bug.cgi?id=623815 Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
@@ -737,7 +737,7 @@ on_signal_received (GDBusConnection *connection,
|
|||||||
if (!proxy->priv->initialized)
|
if (!proxy->priv->initialized)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (g_strcmp0 (sender_name, proxy->priv->name_owner) != 0)
|
if (proxy->priv->name_owner != NULL && g_strcmp0 (sender_name, proxy->priv->name_owner) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
g_signal_emit (proxy,
|
g_signal_emit (proxy,
|
||||||
@@ -778,7 +778,7 @@ on_properties_changed (GDBusConnection *connection,
|
|||||||
if (!proxy->priv->initialized)
|
if (!proxy->priv->initialized)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (g_strcmp0 (sender_name, proxy->priv->name_owner) != 0)
|
if (proxy->priv->name_owner != NULL && g_strcmp0 (sender_name, proxy->priv->name_owner) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sa{sv}as)")))
|
if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sa{sv}as)")))
|
||||||
|
@@ -68,6 +68,7 @@ static const gchar *test_interface_introspection_xml =
|
|||||||
" <arg type='s' name='response' direction='out'/>"
|
" <arg type='s' name='response' direction='out'/>"
|
||||||
" </method>"
|
" </method>"
|
||||||
" <method name='EmitSignal'/>"
|
" <method name='EmitSignal'/>"
|
||||||
|
" <method name='EmitSignalWithNameSet'/>"
|
||||||
" <method name='OpenFile'>"
|
" <method name='OpenFile'>"
|
||||||
" <arg type='s' name='path' direction='in'/>"
|
" <arg type='s' name='path' direction='in'/>"
|
||||||
" </method>"
|
" </method>"
|
||||||
@@ -122,6 +123,25 @@ test_interface_method_call (GDBusConnection *connection,
|
|||||||
NULL,
|
NULL,
|
||||||
&error);
|
&error);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
|
g_dbus_method_invocation_return_value (invocation, NULL);
|
||||||
|
}
|
||||||
|
else if (g_strcmp0 (method_name, "EmitSignalWithNameSet") == 0)
|
||||||
|
{
|
||||||
|
GError *error;
|
||||||
|
gboolean ret;
|
||||||
|
GDBusMessage *message;
|
||||||
|
|
||||||
|
message = g_dbus_message_new_signal ("/org/gtk/GDBus/PeerTestObject",
|
||||||
|
"org.gtk.GDBus.PeerTestInterface",
|
||||||
|
"PeerSignalWithNameSet");
|
||||||
|
g_dbus_message_set_sender (message, ":1.42");
|
||||||
|
|
||||||
|
error = NULL;
|
||||||
|
ret = g_dbus_connection_send_message (connection, message, NULL, &error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
g_assert (ret);
|
||||||
|
g_object_unref (message);
|
||||||
|
|
||||||
g_dbus_method_invocation_return_value (invocation, NULL);
|
g_dbus_method_invocation_return_value (invocation, NULL);
|
||||||
}
|
}
|
||||||
else if (g_strcmp0 (method_name, "OpenFile") == 0)
|
else if (g_strcmp0 (method_name, "OpenFile") == 0)
|
||||||
@@ -207,6 +227,22 @@ on_proxy_signal_received (GDBusProxy *proxy,
|
|||||||
g_main_loop_quit (loop);
|
g_main_loop_quit (loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_proxy_signal_received_with_name_set (GDBusProxy *proxy,
|
||||||
|
gchar *sender_name,
|
||||||
|
gchar *signal_name,
|
||||||
|
GVariant *parameters,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
PeerData *data = user_data;
|
||||||
|
|
||||||
|
data->signal_received = TRUE;
|
||||||
|
|
||||||
|
g_assert_cmpstr (sender_name, ==, ":1.42");
|
||||||
|
g_assert_cmpstr (signal_name, ==, "PeerSignalWithNameSet");
|
||||||
|
g_main_loop_quit (loop);
|
||||||
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -474,6 +510,7 @@ test_peer (void)
|
|||||||
GVariant *result;
|
GVariant *result;
|
||||||
const gchar *s;
|
const gchar *s;
|
||||||
GThread *service_thread;
|
GThread *service_thread;
|
||||||
|
gulong signal_handler_id;
|
||||||
|
|
||||||
memset (&data, '\0', sizeof (PeerData));
|
memset (&data, '\0', sizeof (PeerData));
|
||||||
data.current_connections = g_ptr_array_new_with_free_func (g_object_unref);
|
data.current_connections = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
@@ -555,10 +592,10 @@ test_peer (void)
|
|||||||
g_assert_cmpint (data.num_method_calls, ==, 1);
|
g_assert_cmpint (data.num_method_calls, ==, 1);
|
||||||
|
|
||||||
/* make the other peer emit a signal - catch it */
|
/* make the other peer emit a signal - catch it */
|
||||||
g_signal_connect (proxy,
|
signal_handler_id = g_signal_connect (proxy,
|
||||||
"g-signal",
|
"g-signal",
|
||||||
G_CALLBACK (on_proxy_signal_received),
|
G_CALLBACK (on_proxy_signal_received),
|
||||||
&data);
|
&data);
|
||||||
g_assert (!data.signal_received);
|
g_assert (!data.signal_received);
|
||||||
g_dbus_proxy_call (proxy,
|
g_dbus_proxy_call (proxy,
|
||||||
"EmitSignal",
|
"EmitSignal",
|
||||||
@@ -571,6 +608,31 @@ test_peer (void)
|
|||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
g_assert (data.signal_received);
|
g_assert (data.signal_received);
|
||||||
g_assert_cmpint (data.num_method_calls, ==, 2);
|
g_assert_cmpint (data.num_method_calls, ==, 2);
|
||||||
|
g_signal_handler_disconnect (proxy, signal_handler_id);
|
||||||
|
|
||||||
|
/* Also ensure that messages with the sender header-field set gets
|
||||||
|
* delivered to the proxy - note that this doesn't really make sense
|
||||||
|
* e.g. names are meaning-less in a peer-to-peer case... but we
|
||||||
|
* support it because it makes sense in certain bridging
|
||||||
|
* applications - see e.g. #623815.
|
||||||
|
*/
|
||||||
|
signal_handler_id = g_signal_connect (proxy,
|
||||||
|
"g-signal",
|
||||||
|
G_CALLBACK (on_proxy_signal_received_with_name_set),
|
||||||
|
&data);
|
||||||
|
data.signal_received = FALSE;
|
||||||
|
g_dbus_proxy_call (proxy,
|
||||||
|
"EmitSignalWithNameSet",
|
||||||
|
NULL, /* no arguments */
|
||||||
|
G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
-1,
|
||||||
|
NULL, /* GCancellable */
|
||||||
|
NULL, /* GAsyncReadyCallback - we don't care about the result */
|
||||||
|
NULL); /* user_data */
|
||||||
|
g_main_loop_run (loop);
|
||||||
|
g_assert (data.signal_received);
|
||||||
|
g_assert_cmpint (data.num_method_calls, ==, 3);
|
||||||
|
g_signal_handler_disconnect (proxy, signal_handler_id);
|
||||||
|
|
||||||
/* check for UNIX fd passing */
|
/* check for UNIX fd passing */
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
@@ -708,7 +770,7 @@ test_peer (void)
|
|||||||
g_variant_get (result, "(&s)", &s);
|
g_variant_get (result, "(&s)", &s);
|
||||||
g_assert_cmpstr (s, ==, "You greeted me with 'Hey Again Peer!'.");
|
g_assert_cmpstr (s, ==, "You greeted me with 'Hey Again Peer!'.");
|
||||||
g_variant_unref (result);
|
g_variant_unref (result);
|
||||||
g_assert_cmpint (data.num_method_calls, ==, 4);
|
g_assert_cmpint (data.num_method_calls, ==, 5);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* TODO: THIS TEST DOESN'T WORK YET */
|
/* TODO: THIS TEST DOESN'T WORK YET */
|
||||||
|
Reference in New Issue
Block a user