chiark / gitweb /
dbus: when verifying PK privs, bypass PK if uid=0 of client
authorLennart Poettering <lennart@poettering.net>
Fri, 9 Nov 2012 14:54:22 +0000 (15:54 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 9 Nov 2012 14:55:36 +0000 (15:55 +0100)
This reduces the number of roundtrips when the client is privileged and
makes the PK dep optional for root clients.

src/shared/polkit.c

index 14e27cdc608ba3f417a4bd67aa64b1db8ae17654..9ed6ff2717683ce1f4a130a0d7b9f31263349321 100644 (file)
@@ -46,6 +46,7 @@ int verify_polkit(
         DBusMessageIter iter_msg, iter_struct, iter_array, iter_dict, iter_variant;
         int r;
         dbus_bool_t authorized = FALSE, challenge = FALSE;
+        unsigned long ul;
 
         assert(c);
         assert(request);
@@ -54,6 +55,14 @@ int verify_polkit(
         if (!sender)
                 return -EINVAL;
 
+        ul = dbus_bus_get_unix_user(c, sender, error);
+        if (ul == (unsigned) -1)
+                return -EINVAL;
+
+        /* Shortcut things for root, to avoid the PK roundtrip and dependency */
+        if (ul == 0)
+                return 1;
+
         pid_raw = bus_get_unix_process_id(c, sender, error);
         if (pid_raw == 0)
                 return -EINVAL;
@@ -144,7 +153,6 @@ int verify_polkit(
                 r = -EPERM;
 
 finish:
-
         if (m)
                 dbus_message_unref(m);