homed: set user.userdb xattrs on homed's userdb socket
We can't make a lot of restrictions here, since users are allowed to basically freely pick their user names and UIDs too. But let's at least exclude system UID ranges and those beyond the 16bit range.
This commit is contained in:
@@ -65,6 +65,7 @@
|
||||
#include "varlink-io.systemd.UserDatabase.h"
|
||||
#include "varlink-io.systemd.service.h"
|
||||
#include "varlink-util.h"
|
||||
#include "xattr-util.h"
|
||||
|
||||
/* Where to look for private/public keys that are used to sign the user records. We are not using
|
||||
* CONF_PATHS_NULSTR() here since we want to insert /var/lib/systemd/home/ in the middle. And we insert that
|
||||
@@ -1102,6 +1103,13 @@ static int manager_bind_varlink(Manager *m) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to bind to varlink socket '%s': %m", socket_path);
|
||||
|
||||
/* Reduce the noise routed to us: advertise that only look-ups for non-system users in the 16bit
|
||||
* range are routed to us (excluding 'nobody', i.e. 0xfffe) */
|
||||
char text[DECIMAL_STR_MAX(uid_t) + 1 + DECIMAL_STR_MAX(gid_t) + 1];
|
||||
xsprintf(text, UID_FMT "-" UID_FMT, (uid_t) (SYSTEM_UID_MAX + 1), UID_NOBODY - 1);
|
||||
FOREACH_STRING(xattr, "user.userdb.uid", "user.userdb.gid")
|
||||
(void) xsetxattr(AT_FDCWD, socket_path, /* at_flags= */ 0, xattr, text);
|
||||
|
||||
r = sd_varlink_server_attach_event(m->varlink_server, m->event, SD_EVENT_PRIORITY_NORMAL);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to attach varlink connection to event loop: %m");
|
||||
|
||||
Reference in New Issue
Block a user