From: Samuel Cabrero Date: Mon, 6 Feb 2023 17:11:33 +0000 (+0100) Subject: winbind:varlink: Add a function to craft a winbindd_cli_state structure X-Git-Tag: tevent-0.17.0~745 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d40f5591bc19c0b3b3e37af005d6055d92e70174;p=thirdparty%2Fsamba.git winbind:varlink: Add a function to craft a winbindd_cli_state structure Signed-off-by: Samuel Cabrero Reviewed-by: Andreas Schneider --- diff --git a/source3/winbindd/winbindd_varlink.c b/source3/winbindd/winbindd_varlink.c index 85ec59eb7e9..6e5091a8c68 100644 --- a/source3/winbindd/winbindd_varlink.c +++ b/source3/winbindd/winbindd_varlink.c @@ -18,6 +18,7 @@ */ #include "includes.h" +#include "winbindd.h" #include "lib/util/mkdir_p.h" #include "winbindd_varlink.h" @@ -57,6 +58,58 @@ struct wb_vl_state { int fd; }; +static int get_peer_creds(int fd, uid_t *uid, gid_t *gid, pid_t *pid) +{ +#if defined(HAVE_PEERCRED) + struct ucred cr; + socklen_t crl = sizeof(struct ucred); + int ret; + + ret = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &crl); + if (ret == 0) { + *uid = cr.uid; + *gid = cr.gid; + *pid = cr.pid; + } + return ret; +#else + errno = ENOSYS; + return -1; +#endif +} + +NTSTATUS wb_vl_fake_cli_state(VarlinkCall *call, + const char *service, + struct winbindd_cli_state *cli) +{ + int fd; + int ret; + uid_t uid; + gid_t gid; + pid_t pid; + + fd = varlink_call_get_connection_fd(call); + if (fd < 0) { + DBG_ERR("varlink_call_get_connection_fd failed: %d (%s)\n", + fd, varlink_error_string(fd)); + return NT_STATUS_UNSUCCESSFUL; + } + + ret = get_peer_creds(fd, &uid, &gid, &pid); + if (ret < 0) { + int saved_errno = errno; + DBG_ERR("Failed to get peer credentials: %s\n", + strerror(saved_errno)); + return map_nt_error_from_unix_common(saved_errno); + } + cli->sock = fd; + cli->pid = pid; + + strncpy(cli->client_name, service, sizeof(cli->client_name)); + + return NT_STATUS_OK; +} + static long io_systemd_getuserrecord(VarlinkService *service, VarlinkCall *call, VarlinkObject *parameters, diff --git a/source3/winbindd/winbindd_varlink.h b/source3/winbindd/winbindd_varlink.h index 997c0422970..1f0290723ab 100644 --- a/source3/winbindd/winbindd_varlink.h +++ b/source3/winbindd/winbindd_varlink.h @@ -37,6 +37,9 @@ #define WB_VL_REPLY_ERROR_ENUMERATION_NOT_SUPPORTED \ "io.systemd.UserDatabase.EnumerationNotSupported" +NTSTATUS wb_vl_fake_cli_state(VarlinkCall *call, + const char *service, + struct winbindd_cli_state *cli); bool winbind_setup_varlink(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx);