Zbigniew Jędrzejewski-Szmek 89ea50
From 2da7d0bc92e2423a5c7225c5d24b99d5d52a0bc6 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 89ea50
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 89ea50
Date: Wed, 7 Jul 2021 18:02:50 +0200
Zbigniew Jędrzejewski-Szmek 89ea50
Subject: [PATCH] sd-bus: allow numerical uids in -M user@.host
Zbigniew Jędrzejewski-Szmek 89ea50
Zbigniew Jędrzejewski-Szmek 89ea50
UIDs don't work well over ssh, but locally or with containers they are OK.
Zbigniew Jędrzejewski-Szmek 89ea50
In particular, user@.service uses UIDs as identifiers, and it's nice to be
Zbigniew Jędrzejewski-Szmek 89ea50
able to copy&paste that UID for interaction with the user's managers.
Zbigniew Jędrzejewski-Szmek 89ea50
---
Zbigniew Jędrzejewski-Szmek 89ea50
 src/libsystemd/sd-bus/sd-bus.c | 27 ++++++++++++++++++---------
Zbigniew Jędrzejewski-Szmek 89ea50
 1 file changed, 18 insertions(+), 9 deletions(-)
Zbigniew Jędrzejewski-Szmek 89ea50
Zbigniew Jędrzejewski-Szmek 89ea50
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
Zbigniew Jędrzejewski-Szmek 89ea50
index a32e2f5e2085..6960161c3658 100644
Zbigniew Jędrzejewski-Szmek 89ea50
--- a/src/libsystemd/sd-bus/sd-bus.c
Zbigniew Jędrzejewski-Szmek 89ea50
+++ b/src/libsystemd/sd-bus/sd-bus.c
Zbigniew Jędrzejewski-Szmek 89ea50
@@ -39,6 +39,7 @@
Zbigniew Jędrzejewski-Szmek 89ea50
 #include "parse-util.h"
Zbigniew Jędrzejewski-Szmek 89ea50
 #include "path-util.h"
Zbigniew Jędrzejewski-Szmek 89ea50
 #include "process-util.h"
Zbigniew Jędrzejewski-Szmek 89ea50
+#include "stdio-util.h"
Zbigniew Jędrzejewski-Szmek 89ea50
 #include "string-util.h"
Zbigniew Jędrzejewski-Szmek 89ea50
 #include "strv.h"
Zbigniew Jędrzejewski-Szmek 89ea50
 #include "user-util.h"
Zbigniew Jędrzejewski-Szmek 89ea50
@@ -1617,7 +1618,7 @@ static int user_and_machine_valid(const char *user_and_machine) {
Zbigniew Jędrzejewski-Szmek 89ea50
                 if (!user)
Zbigniew Jędrzejewski-Szmek 89ea50
                         return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 89ea50
 
Zbigniew Jędrzejewski-Szmek 89ea50
-                if (!isempty(user) && !valid_user_group_name(user, VALID_USER_RELAX))
Zbigniew Jędrzejewski-Szmek 89ea50
+                if (!isempty(user) && !valid_user_group_name(user, VALID_USER_RELAX | VALID_USER_ALLOW_NUMERIC))
Zbigniew Jędrzejewski-Szmek 89ea50
                         return false;
Zbigniew Jędrzejewski-Szmek 89ea50
 
Zbigniew Jędrzejewski-Szmek 89ea50
                 h++;
Zbigniew Jędrzejewski-Szmek 89ea50
@@ -1648,17 +1649,25 @@ static int user_and_machine_equivalent(const char *user_and_machine) {
Zbigniew Jędrzejewski-Szmek 89ea50
 
Zbigniew Jędrzejewski-Szmek 89ea50
         /* Otherwise, if we are root, then we can also allow the ".host" syntax, as that's the user this
Zbigniew Jędrzejewski-Szmek 89ea50
          * would connect to. */
Zbigniew Jędrzejewski-Szmek 89ea50
-        if (geteuid() == 0 && STR_IN_SET(user_and_machine, ".host", "root@.host"))
Zbigniew Jędrzejewski-Szmek 89ea50
+        uid_t uid = geteuid();
Zbigniew Jędrzejewski-Szmek 89ea50
+
Zbigniew Jędrzejewski-Szmek 89ea50
+        if (uid == 0 && STR_IN_SET(user_and_machine, ".host", "root@.host", "0@.host"))
Zbigniew Jędrzejewski-Szmek 89ea50
                 return true;
Zbigniew Jędrzejewski-Szmek 89ea50
 
Zbigniew Jędrzejewski-Szmek 89ea50
-        /* Otherwise, we have to figure our user name, and compare things with that. */
Zbigniew Jędrzejewski-Szmek 89ea50
-        un = getusername_malloc();
Zbigniew Jędrzejewski-Szmek 89ea50
-        if (!un)
Zbigniew Jędrzejewski-Szmek 89ea50
-                return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 89ea50
+        /* Otherwise, we have to figure out our user id and name, and compare things with that. */
Zbigniew Jędrzejewski-Szmek 89ea50
+        char buf[DECIMAL_STR_MAX(uid_t)];
Zbigniew Jędrzejewski-Szmek 89ea50
+        xsprintf(buf, UID_FMT, uid);
Zbigniew Jędrzejewski-Szmek 89ea50
+
Zbigniew Jędrzejewski-Szmek 89ea50
+        f = startswith(user_and_machine, buf);
Zbigniew Jędrzejewski-Szmek 89ea50
+        if (!f) {
Zbigniew Jędrzejewski-Szmek 89ea50
+                un = getusername_malloc();
Zbigniew Jędrzejewski-Szmek 89ea50
+                if (!un)
Zbigniew Jędrzejewski-Szmek 89ea50
+                        return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 89ea50
 
Zbigniew Jędrzejewski-Szmek 89ea50
-        f = startswith(user_and_machine, un);
Zbigniew Jędrzejewski-Szmek 89ea50
-        if (!f)
Zbigniew Jędrzejewski-Szmek 89ea50
-                return false;
Zbigniew Jędrzejewski-Szmek 89ea50
+                f = startswith(user_and_machine, un);
Zbigniew Jędrzejewski-Szmek 89ea50
+                if (!f)
Zbigniew Jędrzejewski-Szmek 89ea50
+                        return false;
Zbigniew Jędrzejewski-Szmek 89ea50
+        }
Zbigniew Jędrzejewski-Szmek 89ea50
 
Zbigniew Jędrzejewski-Szmek 89ea50
         return STR_IN_SET(f, "@", "@.host");
Zbigniew Jędrzejewski-Szmek 89ea50
 }