User authentication to services
Kay Sievers
kay.sievers at vrfy.org
Thu Jun 17 19:29:14 PDT 2004
On Thu, Jun 17, 2004 at 09:15:07PM -0400, Havoc Pennington wrote:
> Hi,
>
> Thanks for the patch, looks good overall. Some small comments:
Many thanks for your help. HAL will be happy to be able to get the sender's uid :)
> - D-BUS code generally avoids assignment and declaration at once,
> i.e.:
> char *service;
> service = NULL;
> is preferred.
Fixed.
> - I'd probably capitalize all of "UID"
Fixed.
> - the BaseName property replicates the functionality of
> the GetServiceOwner, so we need to decide between these two.
I've replaced it by GetProperty and changed:
dbus/glib/dbus-gproxy.c:dbus_gproxy_new_for_service_owner() to call
it instead. (Hmm, needs to be tested if it still works)
Is it ok, this way? If yes, I will change the spec too.
> - bus_connection_get_name() should not be able to return NULL for
> a connection that owns a service, and we know this one does.
> So you should _dbus_assert (base_name != NULL) rather than
> setting an error in that case I'm pretty sure.
Fixed.
> - the name "GetServiceProperty" isn't a bit funny; it's a
> property of the connection, not the service.
> Suggest just "GetProperty"
Renamed.
Huh, so many new names in the last days. I need to get used to :)
> - dbus_bus_get_service_uid() should be consistent with
> dbus_connection_get_unix_user() (in naming, and
> in dbus_uint32_t vs. unsigned long)
Fixed to return usigned long, but on the wire we still send 32bit, ok?
> - though I'm not sure we'll keep all of dbus-bus.[ch]
> in the long run, this seems fine for now
>
> - can't return -1 to uint32 without a cast; just use
> DBUS_UID_UNSET probably
Fixed.
Thanks,
Kay
-------------- next part --------------
Index: bus/driver.c
===================================================================
RCS file: /cvs/dbus/dbus/bus/driver.c,v
retrieving revision 1.49
diff -u -r1.49 driver.c
--- bus/driver.c 9 Jun 2004 18:15:09 -0000 1.49
+++ bus/driver.c 18 Jun 2004 02:15:11 -0000
@@ -757,64 +757,94 @@
}
static dbus_bool_t
-bus_driver_handle_get_service_owner (DBusConnection *connection,
- BusTransaction *transaction,
- DBusMessage *message,
- DBusError *error)
+bus_driver_handle_get_service_property (DBusConnection *connection,
+ BusTransaction *transaction,
+ DBusMessage *message,
+ DBusError *error)
{
- char *text;
- const char *base_name;
+ char *service;
+ char *property;
DBusString str;
BusRegistry *registry;
- BusService *service;
+ BusService *serv;
+ DBusConnection *conn;
DBusMessage *reply;
-
+ unsigned long uid;
+ const char *base_name;
+
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
registry = bus_connection_get_registry (connection);
- text = NULL;
reply = NULL;
if (! dbus_message_get_args (message, error,
- DBUS_TYPE_STRING, &text,
+ DBUS_TYPE_STRING, &service,
+ DBUS_TYPE_STRING, &property,
DBUS_TYPE_INVALID))
goto failed;
- _dbus_string_init_const (&str, text);
- service = bus_registry_lookup (registry, &str);
- if (service == NULL)
+ _dbus_verbose ("asked for %s on %s\n", property, service);
+
+ _dbus_string_init_const (&str, service);
+ serv = bus_registry_lookup (registry, &str);
+ if (serv == NULL)
{
dbus_set_error (error,
DBUS_ERROR_SERVICE_HAS_NO_OWNER,
- "Could not get owner of service '%s': no such service", text);
+ "Could not get owner of service '%s': no such service", service);
goto failed;
}
- base_name = bus_connection_get_name (bus_service_get_primary_owner (service));
- if (base_name == NULL)
- {
- dbus_set_error (error,
- DBUS_ERROR_FAILED,
- "Could not determine base service for '%s'", text);
- goto failed;
- }
- _dbus_assert (*base_name == ':');
+ conn = bus_service_get_primary_owner (serv);
reply = dbus_message_new_method_return (message);
if (reply == NULL)
goto oom;
- if (! dbus_message_append_args (reply,
- DBUS_TYPE_STRING, base_name,
- DBUS_TYPE_INVALID))
- goto oom;
-
+ if (strcmp ("UID", property) == 0)
+ {
+
+ if (!dbus_connection_get_unix_user (conn, &uid))
+ {
+ dbus_set_error (error,
+ DBUS_ERROR_FAILED,
+ "Could not determine UID for '%s'", service);
+ goto failed;
+ }
+
+ _dbus_verbose (" found UID=%i\n", (dbus_uint32_t) uid);
+ if (! dbus_message_append_args (reply,
+ DBUS_TYPE_UINT32, (dbus_uint32_t) uid,
+ DBUS_TYPE_INVALID))
+ goto oom;
+ }
+ else if (strcmp ("BaseName", property) == 0)
+ {
+ base_name = bus_connection_get_name (conn);
+ _dbus_assert (base_name != NULL);
+ _dbus_assert (base_name[0] == ':');
+
+ _dbus_verbose (" found base_name=%s\n", base_name);
+ if (! dbus_message_append_args (reply,
+ DBUS_TYPE_STRING, base_name,
+ DBUS_TYPE_INVALID))
+ goto oom;
+ }
+ else
+ {
+ dbus_set_error (error,
+ DBUS_ERROR_FAILED,
+ "Unknown property '%s'", property);
+ goto failed;
+ }
+
if (! bus_transaction_send_from_driver (transaction, connection, reply))
goto oom;
dbus_message_unref (reply);
- dbus_free (text);
+ dbus_free (service);
+ dbus_free (property);
return TRUE;
@@ -825,7 +855,8 @@
_DBUS_ASSERT_ERROR_IS_SET (error);
if (reply)
dbus_message_unref (reply);
- dbus_free (text);
+ dbus_free (service);
+ dbus_free (property);
return FALSE;
}
@@ -874,7 +905,7 @@
{ "ListServices", bus_driver_handle_list_services },
{ "AddMatch", bus_driver_handle_add_match },
{ "RemoveMatch", bus_driver_handle_remove_match },
- { "GetServiceOwner", bus_driver_handle_get_service_owner },
+ { "GetProperty", bus_driver_handle_get_service_property },
{ "ReloadConfig", bus_driver_handle_reload_config }
};
Index: dbus/dbus-bus.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-bus.c,v
retrieving revision 1.29
diff -u -r1.29 dbus-bus.c
--- dbus/dbus-bus.c 9 Jun 2004 18:15:09 -0000 1.29
+++ dbus/dbus-bus.c 18 Jun 2004 02:15:12 -0000
@@ -627,6 +627,79 @@
}
/**
+ * Asks the bus to return the uid of a service.
+ *
+ * @param connection the connection
+ * @param service_name the service name
+ * @param error location to store the error
+ * @returns a result code, -1 if error is set
+ */
+unsigned long
+dbus_bus_get_unix_user (DBusConnection *connection,
+ const char *service,
+ DBusError *error)
+{
+ DBusMessage *message, *reply;
+ dbus_uint32_t uid;
+
+ _dbus_return_val_if_fail (connection != NULL, DBUS_UID_UNSET);
+ _dbus_return_val_if_fail (service != NULL, DBUS_UID_UNSET);
+ _dbus_return_val_if_error_is_set (error, DBUS_UID_UNSET);
+
+ message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
+ DBUS_PATH_ORG_FREEDESKTOP_DBUS,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "GetProperty");
+
+ if (message == NULL)
+ {
+ _DBUS_SET_OOM (error);
+ return DBUS_UID_UNSET;
+ }
+
+ if (!dbus_message_append_args (message,
+ DBUS_TYPE_STRING, service,
+ DBUS_TYPE_STRING, "UID",
+ DBUS_TYPE_INVALID))
+ {
+ dbus_message_unref (message);
+ _DBUS_SET_OOM (error);
+ return DBUS_UID_UNSET;
+ }
+
+ reply = dbus_connection_send_with_reply_and_block (connection, message, -1,
+ error);
+
+ dbus_message_unref (message);
+
+ if (reply == NULL)
+ {
+ _DBUS_ASSERT_ERROR_IS_SET (error);
+ return DBUS_UID_UNSET;
+ }
+
+ if (dbus_set_error_from_message (error, reply))
+ {
+ _DBUS_ASSERT_ERROR_IS_SET (error);
+ dbus_message_unref (reply);
+ return DBUS_UID_UNSET;
+ }
+
+ if (!dbus_message_get_args (reply, error,
+ DBUS_TYPE_UINT32, &uid,
+ DBUS_TYPE_INVALID))
+ {
+ _DBUS_ASSERT_ERROR_IS_SET (error);
+ dbus_message_unref (reply);
+ return DBUS_UID_UNSET;
+ }
+
+ dbus_message_unref (reply);
+
+ return (unsigned long) uid;
+}
+
+/**
* Checks whether a certain service exists.
*
* @param connection the connection
Index: dbus/dbus-bus.h
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-bus.h,v
retrieving revision 1.9
diff -u -r1.9 dbus-bus.h
--- dbus/dbus-bus.h 2 Dec 2003 10:44:21 -0000 1.9
+++ dbus/dbus-bus.h 18 Jun 2004 02:15:12 -0000
@@ -45,6 +45,9 @@
dbus_bool_t dbus_bus_set_base_service (DBusConnection *connection,
const char *base_service);
const char* dbus_bus_get_base_service (DBusConnection *connection);
+unsigned long dbus_bus_get_unix_user (DBusConnection *connection,
+ const char *service,
+ DBusError *error);
int dbus_bus_acquire_service (DBusConnection *connection,
const char *service_name,
unsigned int flags,
Index: glib/dbus-gproxy.c
===================================================================
RCS file: /cvs/dbus/dbus/glib/dbus-gproxy.c,v
retrieving revision 1.10
diff -u -r1.10 dbus-gproxy.c
--- glib/dbus-gproxy.c 2 Jun 2004 13:13:14 -0000 1.10
+++ glib/dbus-gproxy.c 18 Jun 2004 02:15:13 -0000
@@ -956,12 +956,13 @@
request = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
DBUS_PATH_ORG_FREEDESKTOP_DBUS,
DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
- "GetServiceOwner");
+ "GetProperty");
if (request == NULL)
g_error ("Out of memory");
if (! dbus_message_append_args (request,
DBUS_TYPE_STRING, service_name,
+ DBUS_TYPE_STRING, "BaseName",
DBUS_TYPE_INVALID))
g_error ("Out of memory");
More information about the dbus
mailing list