]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
winbind:varlink: Add a function to craft a winbindd_cli_state structure
authorSamuel Cabrero <scabrero@samba.org>
Mon, 6 Feb 2023 17:11:33 +0000 (18:11 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 20 Feb 2025 08:07:32 +0000 (08:07 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/winbindd/winbindd_varlink.c
source3/winbindd/winbindd_varlink.h

index 85ec59eb7e9167489269faeb4d3ccf8343cdf436..6e5091a8c680fcddde923612b5b57e65ff1e31f0 100644 (file)
@@ -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,
index 997c04229707f28725164ee876916a017ab86950..1f0290723ab76fcae3a33847ddac4b66d6faf7b4 100644 (file)
@@ -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);