mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Add formats for client and server UID and user (for multiuser setups).
This commit is contained in:
		| @@ -31,6 +31,8 @@ | ||||
| #define LIST_CLIENTS_TEMPLATE						\ | ||||
| 	"#{client_name}: #{session_name} "				\ | ||||
| 	"[#{client_width}x#{client_height} #{client_termname}] "	\ | ||||
| 	"#{?#{!=:#{client_uid},#{uid}},"				\ | ||||
| 	"[user #{?client_user,#{client_user},#{client_uid},}] ,}"	\ | ||||
| 	"#{?client_flags,(,}#{client_flags}#{?client_flags,),}" | ||||
|  | ||||
| static enum cmd_retval	cmd_list_clients_exec(struct cmd *, struct cmdq_item *); | ||||
|   | ||||
							
								
								
									
										60
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								format.c
									
									
									
									
									
								
							| @@ -24,6 +24,7 @@ | ||||
| #include <fnmatch.h> | ||||
| #include <libgen.h> | ||||
| #include <math.h> | ||||
| #include <pwd.h> | ||||
| #include <regex.h> | ||||
| #include <stdarg.h> | ||||
| #include <stdlib.h> | ||||
| @@ -1387,6 +1388,35 @@ format_cb_client_tty(struct format_tree *ft) | ||||
| 	return (NULL); | ||||
| } | ||||
|  | ||||
| /* Callback for client_uid. */ | ||||
| static void * | ||||
| format_cb_client_uid(struct format_tree *ft) | ||||
| { | ||||
| 	uid_t	uid; | ||||
|  | ||||
| 	if (ft->c != NULL) { | ||||
| 		uid = proc_get_peer_uid(ft->c->peer); | ||||
| 		if (uid != (uid_t)-1) | ||||
| 			return (format_printf("%ld", (long)uid)); | ||||
| 	} | ||||
| 	return (NULL); | ||||
| } | ||||
|  | ||||
| /* Callback for client_user. */ | ||||
| static void * | ||||
| format_cb_client_user(struct format_tree *ft) | ||||
| { | ||||
| 	uid_t		 uid; | ||||
| 	struct passwd	*pw; | ||||
|  | ||||
| 	if (ft->c != NULL) { | ||||
| 		uid = proc_get_peer_uid(ft->c->peer); | ||||
| 		if (uid != (uid_t)-1 && (pw = getpwuid(uid)) != NULL) | ||||
| 			return (xstrdup(pw->pw_name)); | ||||
| 	} | ||||
| 	return (NULL); | ||||
| } | ||||
|  | ||||
| /* Callback for client_utf8. */ | ||||
| static void * | ||||
| format_cb_client_utf8(struct format_tree *ft) | ||||
| @@ -2521,6 +2551,24 @@ format_cb_tree_mode_format(__unused struct format_tree *ft) | ||||
| 	return (xstrdup(window_tree_mode.default_format)); | ||||
| } | ||||
|  | ||||
| /* Callback for uid. */ | ||||
| static void * | ||||
| format_cb_uid(__unused struct format_tree *ft) | ||||
| { | ||||
| 	return (format_printf("%ld", (long)getuid())); | ||||
| } | ||||
|  | ||||
| /* Callback for user. */ | ||||
| static void * | ||||
| format_cb_user(__unused struct format_tree *ft) | ||||
| { | ||||
| 	struct passwd	*pw; | ||||
|  | ||||
| 	if ((pw = getpwuid(getuid())) != NULL) | ||||
| 		return (xstrdup(pw->pw_name)); | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| /* Format table type. */ | ||||
| enum format_table_type { | ||||
| 	FORMAT_TABLE_STRING, | ||||
| @@ -2627,6 +2675,12 @@ static const struct format_table_entry format_table[] = { | ||||
| 	{ "client_tty", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_client_tty | ||||
| 	}, | ||||
| 	{ "client_uid", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_client_uid | ||||
| 	}, | ||||
| 	{ "client_user", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_client_user | ||||
| 	}, | ||||
| 	{ "client_utf8", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_client_utf8 | ||||
| 	}, | ||||
| @@ -2906,6 +2960,12 @@ static const struct format_table_entry format_table[] = { | ||||
| 	{ "tree_mode_format", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_tree_mode_format | ||||
| 	}, | ||||
| 	{ "uid", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_uid | ||||
| 	}, | ||||
| 	{ "user", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_user | ||||
| 	}, | ||||
| 	{ "version", FORMAT_TABLE_STRING, | ||||
| 	  format_cb_version | ||||
| 	}, | ||||
|   | ||||
							
								
								
									
										11
									
								
								proc.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								proc.c
									
									
									
									
									
								
							| @@ -55,6 +55,7 @@ struct tmuxpeer { | ||||
|  | ||||
| 	struct imsgbuf	 ibuf; | ||||
| 	struct event	 event; | ||||
| 	uid_t		 uid; | ||||
|  | ||||
| 	int		 flags; | ||||
| #define PEER_BAD 0x1 | ||||
| @@ -296,6 +297,7 @@ proc_add_peer(struct tmuxproc *tp, int fd, | ||||
|     void (*dispatchcb)(struct imsg *, void *), void *arg) | ||||
| { | ||||
| 	struct tmuxpeer	*peer; | ||||
| 	gid_t		 gid; | ||||
|  | ||||
| 	peer = xcalloc(1, sizeof *peer); | ||||
| 	peer->parent = tp; | ||||
| @@ -306,6 +308,9 @@ proc_add_peer(struct tmuxproc *tp, int fd, | ||||
| 	imsg_init(&peer->ibuf, fd); | ||||
| 	event_set(&peer->event, fd, EV_READ, proc_event_cb, peer); | ||||
|  | ||||
| 	if (getpeereid(fd, &peer->uid, &gid) != 0) | ||||
| 		peer->uid = (uid_t)-1; | ||||
|  | ||||
| 	log_debug("add peer %p: %d (%p)", peer, fd, arg); | ||||
| 	TAILQ_INSERT_TAIL(&tp->peers, peer, entry); | ||||
|  | ||||
| @@ -361,3 +366,9 @@ proc_fork_and_daemon(int *fd) | ||||
| 		return (pid); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| uid_t | ||||
| proc_get_peer_uid(struct tmuxpeer *peer) | ||||
| { | ||||
| 	return (peer->uid); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm