summaryrefslogtreecommitdiff
path: root/gio/gdbusauthmechanismexternal.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2022-01-12 17:43:46 +0400
committerMarc-André Lureau <marcandre.lureau@redhat.com>2022-01-18 22:09:03 +0400
commit7d7b52edbda3cdccaf29262250e37fd84f60ad5f (patch)
treea06e57e5bdb60e555407c2234dc0b27f556f0f60 /gio/gdbusauthmechanismexternal.c
parente66b9489b73b4a28ab6ccf50a0eac98824e759e7 (diff)
downloadglib-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.c27
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;
}