From 288d47c7833c58cef3747b15f2ece36d8612964b Mon Sep 17 00:00:00 2001 From: Ralf Habacker Date: Tue, 13 Mar 2007 16:56:32 +0000 Subject: * dbus/dbus-sysdeps-win.c: added zero byte sending and receiving after connection start up --- dbus/dbus-sysdeps-win.c | 88 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 23 deletions(-) (limited to 'dbus') diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index 734d4ab5..2ffb3e2d 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -3657,30 +3657,61 @@ retry: dbus_bool_t -write_credentials_byte (int server_fd, +write_credentials_byte (int handle, DBusError *error) { - /* FIXME: for the session bus credentials shouldn't matter (?), but - * for the system bus they are presumably essential. A rough outline - * of a way to implement the credential transfer would be this: - * - * client waits to *read* a byte. - * - * server creates a named pipe with a random name, sends a byte - * contining its length, and its name. - * - * client reads the name, connects to it (using Win32 API). - * - * server waits for connection to the named pipe, then calls - * ImpersonateNamedPipeClient(), notes its now-current credentials, - * calls RevertToSelf(), closes its handles to the named pipe, and - * is done. (Maybe there is some other way to get the SID of a named - * pipe client without having to use impersonation?) - * - * client closes its handles and is done. - * - */ +/* FIXME: for the session bus credentials shouldn't matter (?), but + * for the system bus they are presumably essential. A rough outline + * of a way to implement the credential transfer would be this: + * + * client waits to *read* a byte. + * + * server creates a named pipe with a random name, sends a byte + * contining its length, and its name. + * + * client reads the name, connects to it (using Win32 API). + * + * server waits for connection to the named pipe, then calls + * ImpersonateNamedPipeClient(), notes its now-current credentials, + * calls RevertToSelf(), closes its handles to the named pipe, and + * is done. (Maybe there is some other way to get the SID of a named + * pipe client without having to use impersonation?) + * + * client closes its handles and is done. + * + * Ralf: Why not sending credentials over the given this connection ? + * Using named pipes makes it impossible to be connected from a unix client. + * + */ + int bytes_written; + DBusString buf; + + _dbus_string_init_const_len (&buf, "\0", 1); +again: + bytes_written = _dbus_write_socket (handle, &buf, 0, 1 ); + + if (bytes_written < 0 && errno == EINTR) + goto again; + if (bytes_written < 0) + { + dbus_set_error (error, _dbus_error_from_errno (errno), + "Failed to write credentials byte: %s", + _dbus_strerror (errno)); + return FALSE; + } + else if (bytes_written == 0) + { + dbus_set_error (error, DBUS_ERROR_IO_ERROR, + "wrote zero bytes writing credentials byte"); + return FALSE; + } + else + { + _dbus_assert (bytes_written == 1); + _dbus_verbose ("wrote 1 zero byte, credential sending isn't implemented yet\n"); + return TRUE; + } return TRUE; } @@ -3703,12 +3734,23 @@ write_credentials_byte (int server_fd, * @returns #TRUE on success */ dbus_bool_t -_dbus_read_credentials_unix_socket (int client_fd, +_dbus_read_credentials_unix_socket (int handle, DBusCredentials *credentials, DBusError *error) { - /* FIXME bogus testing credentials */ + int bytes_read; + DBusString buf; + _dbus_string_init(&buf); + + bytes_read = _dbus_read_socket(handle, &buf, 1 ); + if (bytes_read > 0) + { + _dbus_verbose("got one zero byte from server"); + } + + _dbus_string_free(&buf); _dbus_credentials_from_current_process (credentials); + _dbus_verbose("FIXME: get faked credentials from current process"); return TRUE; } -- cgit