dom0/qrexec: implement default user handling in qrexec_daemon
This will simplify using qrexec from utilities which doen't load qubes.xml normally (like qrexec_policy, gui daemon).
This commit is contained in:
		
							parent
							
								
									4e2f47d95c
								
							
						
					
					
						commit
						46fd664ba3
					
				@ -1441,7 +1441,7 @@ class QubesVm(object):
 | 
			
		||||
        if verbose:
 | 
			
		||||
            print >> sys.stderr, "--> Starting the qrexec daemon..."
 | 
			
		||||
        xid = self.get_xid()
 | 
			
		||||
        retcode = subprocess.call ([qrexec_daemon_path, str(xid)])
 | 
			
		||||
        retcode = subprocess.call ([qrexec_daemon_path, str(xid), self.default_user])
 | 
			
		||||
        if (retcode != 0) :
 | 
			
		||||
            self.force_shutdown()
 | 
			
		||||
            raise OSError ("ERROR: Cannot execute qrexec_daemon!")
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,9 @@ struct _client clients[MAX_CLIENTS];	// data on all qrexec_client connections
 | 
			
		||||
 | 
			
		||||
int max_client_fd = -1;		// current max fd of all clients; so that we need not to scan all the "clients" table
 | 
			
		||||
int qrexec_daemon_unix_socket_fd;	// /var/run/qubes/qrexec.xid descriptor
 | 
			
		||||
char *default_user = "user";
 | 
			
		||||
char default_user_keyword[] = "DEFAULT:";
 | 
			
		||||
#define default_user_keyword_len_without_colon (sizeof(default_user_keyword)-2)
 | 
			
		||||
 | 
			
		||||
void sigusr1_handler(int x)
 | 
			
		||||
{
 | 
			
		||||
@ -193,12 +196,22 @@ int get_cmdline_body_from_client_and_pass_to_agent(int fd, struct server_header
 | 
			
		||||
{
 | 
			
		||||
	int len = s_hdr->len;
 | 
			
		||||
	char buf[len];
 | 
			
		||||
	int use_default_user = 0;
 | 
			
		||||
	if (!read_all(fd, buf, len)) {
 | 
			
		||||
		terminate_client_and_flush_data(fd);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	if (!strncmp(buf, default_user_keyword, default_user_keyword_len_without_colon+1)) {
 | 
			
		||||
		use_default_user = 1;
 | 
			
		||||
		s_hdr->len -= default_user_keyword_len_without_colon; // -1 because of colon
 | 
			
		||||
		s_hdr->len += strlen(default_user);
 | 
			
		||||
	}
 | 
			
		||||
	write_all_vchan_ext(s_hdr, sizeof(*s_hdr));
 | 
			
		||||
	write_all_vchan_ext(buf, len);
 | 
			
		||||
	if (use_default_user) {
 | 
			
		||||
		write_all_vchan_ext(default_user, strlen(default_user));
 | 
			
		||||
		write_all_vchan_ext(buf+default_user_keyword_len_without_colon, len-default_user_keyword_len_without_colon);
 | 
			
		||||
	} else
 | 
			
		||||
		write_all_vchan_ext(buf, len);
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -580,10 +593,12 @@ int main(int argc, char **argv)
 | 
			
		||||
	int max;
 | 
			
		||||
	sigset_t chld_set;
 | 
			
		||||
 | 
			
		||||
	if (argc != 2) {
 | 
			
		||||
		fprintf(stderr, "usage: %s domainid\n", argv[0]);
 | 
			
		||||
	if (argc != 2 && argc != 3) {
 | 
			
		||||
		fprintf(stderr, "usage: %s domainid [default user]\n", argv[0]);
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
	if (argc == 3)
 | 
			
		||||
		default_user = argv[2];
 | 
			
		||||
	init(atoi(argv[1]));
 | 
			
		||||
	sigemptyset(&chld_set);
 | 
			
		||||
	sigaddset(&chld_set, SIGCHLD);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user