dbus-sysdeps-unix.h
Ralf Habacker
ralf.habacker at freenet.de
Sun Sep 17 17:11:34 PDT 2006
Havoc Pennington schrieb:
> Peter Kümmel wrote:
>> Thanks for the api changes; it's much faster when you change it directly
>> than waiting for the patches of a whining windows guy. ;)
>>
>> I've updated our svn repository, but now we get an regression in the
>> bus test.
>> Have you changed the error handling?
>>
>
> I haven't, but as I said I made the _unix functions on DBusConnection
> only work on unix. If you run the bus tests with verbose logging then
> I think you'll find it's upset that it can't get the unix user for the
> connections.
>
> You'll probably need to add the equivalent of
> connection_set_unix_user_function and connection_get_unix_user for
> Windows, then use those in the bus.
>
> There may be other issues also, but I'm pretty sure this will be an
> issue.
>
> The simple fix: I bet we don't care about the "system bus" on Windows.
> That means we only care about a bus running in the user's session and
> that bus needs to allow the same user to connect while denying all
> other users. Thus, all you have to do is find a way to authenticate
> that a connecting client is owned by the same user as the bus. There's
> no need for the rest of the user-related configuration to work as it
> does on unix. On Windows, user-based security policy matching in the
> config file could just be disallowed for now (ideally, trying to use
> an unsupported option results in an error message).
>
> If you do it this way, you won't even need the equivalent of
> set_unix_user_function().
>
> Come to think of it if you had this working already I probably broke
> it with my dbus-transport.c change. I'll fix that quickly now though
> I'm not sure it will fully fix the bus.
Seems not, we got the following error messages
...
bin\bus-test.exe: Running SHA1 connection test
NetUserGetInfo() failed: no valid user_info
Using your real home directory for testing, set DBUS_TEST_HOMEDIR to avoid
check_hello_message:837 received message interface "(unset)" member
"(unset)" error name "org.freedesktop.DBus.Error.Fai
led" on 009E1050, expecting not this error
File "F:\daten\windbus\trunk\bus\dispatch.c" line 4054 process 740
should not have been reached: hello message failed
This application has requested the Runtime to terminate it in an unusual
way.
Please contact the application's support team for more information.
DBUS_VERBOSE=1 gives the following error message:
2284: Name :1.0 assigned to 003D9368
2284: LOCK: dbus_connection_get_is_authenticated
2284: UNLOCK: dbus_connection_get_is_authenticated
2284: Appending rule 003D9CE0 with type 0 to policy 009E1CA8
2284: Appending rule 009E5278 with type 1 to policy 009E1CA8
2284: Appending rule 009E1A50 with type 2 to policy 009E1CA8
2284: Failed to create security policy for connection 003D9368
2284: Driver handler returned failure
2284: LOCK: dbus_connection_get_is_connected
2284: UNLOCK: dbus_connection_get_is_connected
2284: Sending error reply org.freedesktop.DBus.Error.Failed "No user ID
known for connection, cannot determine security policy
"
2284: Sending (no interface) (no member)
org.freedesktop.DBus.Error.Failed from driver
2284: LOCK: dbus_connection_get_data
Any idea ?
> If you do want the security policy stuff as found on UNIX, the first
> question is what should that be like on Windows. I think it should
> probably use the normal Windows authorization / acl mechanism, no?
> This looks potentially relevant (see Authorization) though maybe it
> isn't:
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/securityanchor.asp
>
>
> This is maybe even more useful, see Chapter 6 "UNIX and Windows
> Interoperability" scroll down to the authorization and authentication
> section. Also see Chapter 9 "Win32 Code Conversion" which has a bunch
> of stuff on how to port unix user stuff to Windows:
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnucmg/html/ucmglp.asp
>
>
> It looks to me like an SID structure might be what the Windows
> equivalent of "unix user function" should take?
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/sid.asp
>
>
> The auth protocol currently sends a unix uid over the wire. What are
> you sending for this on Windows? I thought you were using some
> process-specific made-up number for dbus_uid_t? Anyway, my wild guess
> from skimming msdn docs is that this should probably be a username and
> then on successful auth the daemon would do something to "log in" as
> that username and get an sid. I don't know though.
>
The current implementation takes windows sid's, which are converted to
unix like uid_t type for authentification see _dbus_win_sid_to_uid_t in
http://svn.sourceforge.net/viewvc/windbus/trunk/dbus/dbus-sysdeps-win.c?revision=318&view=markup
2284: _dbus_win_sid_to_uid_t sid
S-1-5-21-117666728-374750965-3721689867-1006 added with uid 49203 to cache
2284: _dbus_getuid() returns 49203
> In the session bus case, normally no uid is sent over the wire because
> the uid is implicit in the socket credentials. So possibly you've just
> been using that codepath on Windows.
yes
>
> This part of the auth protocol is definitely unix-specific at the
> moment though. I think making parse_uid just barf on Windows might be
> right, because anytime a uid is sent between processes, it does not
> mean anything on Windows.
>
Ralf
More information about the dbus
mailing list