* dbus/dbus-sysdeps-win.c: added zero byte sending and receiving after connection start up

This commit is contained in:
Ralf Habacker 2007-03-13 16:56:32 +00:00
parent 9362aac398
commit 288d47c783
2 changed files with 70 additions and 23 deletions

View file

@ -1,3 +1,8 @@
2007-03-13 Ralf.Habacker <ralf.habacker@freenet.de>
* dbus/dbus-sysdeps-win.c: added zero byte sending
and receiving after connection start up
2007-03-11 Havoc Pennington <hp@redhat.com>
* tools/dbus-launch.c (do_close_stderr): fix C89 problem and

View file

@ -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;
}