diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2022-01-12 17:43:46 +0400 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2022-01-18 22:09:03 +0400 |
commit | 7d7b52edbda3cdccaf29262250e37fd84f60ad5f (patch) | |
tree | a06e57e5bdb60e555407c2234dc0b27f556f0f60 /gio/gdbusauthmechanismexternal.c | |
parent | e66b9489b73b4a28ab6ccf50a0eac98824e759e7 (diff) | |
download | glib-7d7b52edbda3cdccaf29262250e37fd84f60ad5f.tar.gz |
gio: make client connection work with EXTERNAL on win32
D-Bus reference implementation doesn't require more than the claimed
process SID as part of the AUTH initial data for EXTERNAL.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Diffstat (limited to 'gio/gdbusauthmechanismexternal.c')
-rw-r--r-- | gio/gdbusauthmechanismexternal.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/gio/gdbusauthmechanismexternal.c b/gio/gdbusauthmechanismexternal.c index 182c57278..b3f21175b 100644 --- a/gio/gdbusauthmechanismexternal.c +++ b/gio/gdbusauthmechanismexternal.c @@ -29,6 +29,10 @@ #include "glibintl.h" +#ifdef G_OS_WIN32 +#include "gwin32sid.h" +#endif + struct _GDBusAuthMechanismExternalPrivate { gboolean is_client; @@ -124,11 +128,17 @@ static gboolean mechanism_is_supported (GDBusAuthMechanism *mechanism) { g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), FALSE); + +#if defined(G_OS_WIN32) + /* all that is required is current process SID */ + return TRUE; +#else /* This mechanism is only available if credentials has been exchanged */ if (_g_dbus_auth_mechanism_get_credentials (mechanism) != NULL) return TRUE; else return FALSE; +#endif } static gint @@ -329,32 +339,39 @@ mechanism_client_initiate (GDBusAuthMechanism *mechanism, { GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); gchar *initial_response = NULL; +#if defined(G_OS_UNIX) GCredentials *credentials; +#endif g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), NULL); g_return_val_if_fail (!m->priv->is_server && !m->priv->is_client, NULL); m->priv->is_client = TRUE; - m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; *out_initial_response_len = 0; + /* return the uid */ +#if defined(G_OS_UNIX) credentials = _g_dbus_auth_mechanism_get_credentials (mechanism); g_assert (credentials != NULL); - /* return the uid */ -#if defined(G_OS_UNIX) initial_response = g_strdup_printf ("%" G_GINT64_FORMAT, (gint64) g_credentials_get_unix_user (credentials, NULL)); - *out_initial_response_len = strlen (initial_response); #elif defined(G_OS_WIN32) + initial_response = _g_win32_current_process_sid_string (NULL); +#else #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wcpp" #warning Dont know how to send credentials on this OS. The EXTERNAL D-Bus authentication mechanism will not work. #pragma GCC diagnostic pop #endif - m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; #endif + if (initial_response) + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + *out_initial_response_len = strlen (initial_response); + } return initial_response; } |